textmode.js 0.2.1-beta.8 → 0.3.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
@@ -10,25 +10,40 @@
10
10
 
11
11
  </div>
12
12
 
13
- textmode.js is a lightweight creative-coding library for real‑time ASCII and textmode graphics in the browser. It combines a grid‑based API with a modern `WebGL2` pipeline, multiple render targets, and aggressive instanced rendering to deliver smooth, high‑performance rendering.
13
+ textmode.js is a free, lightweight, and framework-agnostic creative-coding library for real‑time ASCII and textmode graphics in the browser. It combines a grid‑based API with a modern [`WebGL2`](https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext) pipeline, multiple render targets, and aggressive instanced rendering to deliver smooth, high‑performance rendering.
14
14
 
15
15
  The library is designed to be easy to use and accessible to developers of all skill levels. Whether you're a seasoned developer or just starting out, `textmode.js` provides a simple and intuitive API that makes it easy to create stunning textmode art and animations.
16
16
 
17
- Key ideas in one sentence: you draw with simple shape calls; under the hood we batch instances and write to a special framebuffer with five render targets; a conversion pass maps those buffers to a crisp grid of characters on the canvas.
18
-
19
17
  ## Features
18
+
20
19
  - Real‑time* ASCII/textmode rendering with a simple drawing API
21
20
  - `WebGL2` pipeline with [Multiple Render Targets (MRT)](https://en.wikipedia.org/wiki/Multiple_Render_Targets) for rich per‑cell data
22
21
  - Instanced rendering and batching for low draw call counts
23
- - Font system with runtime font loading and dynamic sizing
22
+ - Font system with runtime font loading and dynamic sizing *(supports TTF/OTF/WOFF)*
24
23
  - Author custom filter shaders in [`GLSL ES 3.00`](https://registry.khronos.org/OpenGL/specs/es/3.0/GLSL_ES_Specification_3.00.pdf) for advanced effects
25
24
  - Flexible exporting: TXT, SVG, and raster images *(PNG/JPG/WebP)*
26
25
  - Animation loop control: `frameRate`, `loop`/`noLoop`, `redraw`, `frameCount`, etc.
26
+ - Framework-agnostic: Use `textmode.js` with any canvas-based framework or library
27
27
  - Zero dependencies, written in TypeScript, with comprehensive type definitions
28
28
 
29
29
  > [!NOTE]
30
30
  > *Performance depends on the complexity of your scene and device capabilities. Consider authoring filter shaders for complex effects at low cost.
31
31
 
32
+ ## Try it online first
33
+
34
+ Before installing anything locally, you can try `textmode.js` directly in your browser using our dedicated web editor:
35
+
36
+ 🌐 **[editor.textmode.art](https://editor.textmode.art)**
37
+
38
+ The web editor is specifically designed for `textmode.js` and provides:
39
+ - ✨ **Zero setup required** - Start coding immediately
40
+ - 🚀 **Live preview** - See your creations in real-time
41
+ - 💾 **Save & share** - Export your sketches and share with others
42
+ - 📚 **Built-in examples** - Learn from interactive examples
43
+ - 🔧 **Full API access** - All `textmode.js` features available
44
+
45
+ The web editor is perfect for learning, prototyping, or creating quick experiments without any local setup!
46
+
32
47
  ## Installation
33
48
 
34
49
  ### Prerequisites
@@ -47,10 +62,10 @@ To get started with `textmode.js`, you'll need:
47
62
 
48
63
  | Bundle type | File size | Font included? | Best for |
49
64
  |-------------|-----------|---------------|----------|
50
- | **Standard UMD** (`textmode.umd.js`) | ~112kB | ✅ [UrsaFont](https://ursafrank.itch.io/ursafont) embedded | Quick setup, prototyping |
51
- | **Standard ESM** (`textmode.esm.js`) | ~130kB | ✅ [UrsaFont](https://ursafrank.itch.io/ursafont) embedded | Quick setup, prototyping |
52
- | **Minified UMD** (`textmode.umd.min.js`) | ~65kB | ❌ Requires external font | Custom fonts |
53
- | **Minified ESM** (`textmode.esm.min.js`) | ~84kB | ❌ Requires external font | Custom fonts |
65
+ | **Standard UMD** (`textmode.umd.js`) | ~86kB | ✅ [UrsaFont](https://ursafrank.itch.io/ursafont) embedded | Quick setup, prototyping |
66
+ | **Standard ESM** (`textmode.esm.js`) | ~111kB | ✅ [UrsaFont](https://ursafrank.itch.io/ursafont) embedded | Quick setup, prototyping |
67
+ | **Minified UMD** (`textmode.umd.min.js`) | ~79kB | ❌ Requires external font | Custom fonts |
68
+ | **Minified ESM** (`textmode.esm.min.js`) | ~103kB | ❌ Requires external font | Custom fonts |
54
69
 
55
70
  **Choose standard bundles for:**
56
71
  - Quick setup with no additional configuration
@@ -62,7 +77,7 @@ To get started with `textmode.js`, you'll need:
62
77
  > [!NOTE]
63
78
  > Apart from the font inclusion, both bundle types are functionally identical and equally minified.
64
79
 
65
- ### UMD
80
+ #### UMD
66
81
 
67
82
  To use `textmode.js` in a UMD environment, download the latest `umd` build from the [**GitHub releases page**](https://github.com/humanbydefinition/textmode.js/releases/) or import it directly from a CDN like [**jsDelivr**](https://www.jsdelivr.com/package/npm/textmode.js). The library is distributed as a single JavaScript file, which you can include in your project by adding the following script tag to your HTML file:
68
83
 
@@ -113,7 +128,7 @@ t.windowResized(() => {
113
128
  });
114
129
  ```
115
130
 
116
- ### ESM
131
+ #### ESM
117
132
 
118
133
  To use `textmode.js` in an ESM environment, you can install it via `npm`:
119
134
 
@@ -171,18 +186,6 @@ t.windowResized(() => {
171
186
  });
172
187
  ```
173
188
 
174
- ## Verification
175
-
176
- To verify your installation is working correctly, try this simple test:
177
-
178
- ```javascript
179
- // Test if textmode.js is available
180
- console.log('textmode.js version:', textmode.version);
181
- ```
182
-
183
- > [!NOTE]
184
- > If you see the version number printed in the console, your installation was successful!
185
-
186
189
  ## Next steps
187
190
 
188
191
  Now that you have `textmode.js` set up, you can start creating your textmode art projects! Going forward, here are some resources to help you get the most out of the library:
@@ -141,34 +141,34 @@ class q {
141
141
  a(this, "u");
142
142
  a(this, "_t", null);
143
143
  a(this, "vt");
144
+ a(this, "yt");
145
+ a(this, "At", []);
144
146
  a(this, "wt");
145
- a(this, "yt", []);
146
- a(this, "At");
147
147
  a(this, "Ct", null);
148
148
  a(this, "bt", []);
149
149
  a(this, "xt", null);
150
150
  a(this, "$t", !1);
151
151
  a(this, "Mt", null);
152
- this.dt = e, this.gt = i, this.u = { filter: "nearest", wrap: "clamp", format: "rgba", type: "unsigned_byte", ...r }, this.vt = t, this.At = Math.min(Math.max(1, s), 8), this.xt = n, this.$t = !!o, this.Mt = this.$t ? new ht() : null;
152
+ this.dt = e, this.gt = i, this.u = { filter: "nearest", wrap: "clamp", format: "rgba", type: "unsigned_byte", ...r }, this.vt = t, this.wt = Math.min(Math.max(1, s), 8), this.xt = n, this.$t = !!o, this.Mt = this.$t ? new ht() : null;
153
153
  const c = t.getParameter(t.MAX_DRAW_BUFFERS), l = t.getParameter(t.MAX_COLOR_ATTACHMENTS);
154
- this.At = Math.min(this.At, c, l), this.wt = t.createFramebuffer(), this.Ft(), this.Rt(), this.bt = Array(this.At).fill(null);
154
+ this.wt = Math.min(this.wt, c, l), this.yt = t.createFramebuffer(), this.Ft(), this.Rt(), this.bt = Array(this.wt).fill(null);
155
155
  }
156
156
  Ft() {
157
157
  const t = this.vt, e = this.u.filter === "linear" ? t.LINEAR : t.NEAREST, i = this.u.wrap === "repeat" ? t.REPEAT : t.CLAMP_TO_EDGE, s = this.u.type === "float" ? t.FLOAT : t.UNSIGNED_BYTE;
158
- for (let r = 0; r < this.At; r++) {
158
+ for (let r = 0; r < this.wt; r++) {
159
159
  const n = t.createTexture();
160
- t.bindTexture(t.TEXTURE_2D, n), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MIN_FILTER, e), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MAG_FILTER, e), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_S, i), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_T, i), t.texImage2D(t.TEXTURE_2D, 0, t.RGBA, this.dt, this.gt, 0, t.RGBA, s, null), this.yt.push(n);
160
+ t.bindTexture(t.TEXTURE_2D, n), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MIN_FILTER, e), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MAG_FILTER, e), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_S, i), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_T, i), t.texImage2D(t.TEXTURE_2D, 0, t.RGBA, this.dt, this.gt, 0, t.RGBA, s, null), this.At.push(n);
161
161
  }
162
162
  t.bindTexture(t.TEXTURE_2D, null);
163
163
  }
164
164
  Rt() {
165
165
  const t = this.vt;
166
- if (t.bindFramebuffer(t.FRAMEBUFFER, this.wt), this.At === 1) t.framebufferTexture2D(t.FRAMEBUFFER, t.COLOR_ATTACHMENT0, t.TEXTURE_2D, this.yt[0], 0);
166
+ if (t.bindFramebuffer(t.FRAMEBUFFER, this.yt), this.wt === 1) t.framebufferTexture2D(t.FRAMEBUFFER, t.COLOR_ATTACHMENT0, t.TEXTURE_2D, this.At[0], 0);
167
167
  else {
168
168
  const i = [];
169
- for (let s = 0; s < this.At; s++) {
169
+ for (let s = 0; s < this.wt; s++) {
170
170
  const r = t.COLOR_ATTACHMENT0 + s;
171
- t.framebufferTexture2D(t.FRAMEBUFFER, r, t.TEXTURE_2D, this.yt[s], 0), i.push(r);
171
+ t.framebufferTexture2D(t.FRAMEBUFFER, r, t.TEXTURE_2D, this.At[s], 0), i.push(r);
172
172
  }
173
173
  t.drawBuffers(i);
174
174
  }
@@ -177,19 +177,19 @@ class q {
177
177
  }
178
178
  zt(t) {
179
179
  const e = this.vt;
180
- e.bindTexture(e.TEXTURE_2D, this.yt[0]), e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL, 1), e.texImage2D(e.TEXTURE_2D, 0, e.RGBA, e.RGBA, e.UNSIGNED_BYTE, t), e.bindTexture(e.TEXTURE_2D, null);
180
+ e.bindTexture(e.TEXTURE_2D, this.At[0]), e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL, 1), e.texImage2D(e.TEXTURE_2D, 0, e.RGBA, e.RGBA, e.UNSIGNED_BYTE, t), e.bindTexture(e.TEXTURE_2D, null);
181
181
  }
182
182
  resize(t, e) {
183
- this.dt = t, this.gt = e, this._t = null, this.bt = Array(this.At).fill(null);
183
+ this.dt = t, this.gt = e, this._t = null, this.bt = Array(this.wt).fill(null);
184
184
  const i = this.vt, s = this.u.type === "float" ? i.FLOAT : i.UNSIGNED_BYTE;
185
- for (const r of this.yt) i.bindTexture(i.TEXTURE_2D, r), i.texImage2D(i.TEXTURE_2D, 0, i.RGBA, this.dt, this.gt, 0, i.RGBA, s, null);
185
+ for (const r of this.At) i.bindTexture(i.TEXTURE_2D, r), i.texImage2D(i.TEXTURE_2D, 0, i.RGBA, this.dt, this.gt, 0, i.RGBA, s, null);
186
186
  i.bindTexture(i.TEXTURE_2D, null);
187
187
  }
188
188
  Pt(t) {
189
189
  const e = this.vt, i = this.bt[t];
190
190
  if (i) return i;
191
191
  const s = this.dt, r = this.gt, n = new Uint8Array(s * r * 4), o = e.getParameter(e.READ_FRAMEBUFFER_BINDING);
192
- e.bindFramebuffer(e.READ_FRAMEBUFFER, this.wt), e.readBuffer(e.COLOR_ATTACHMENT0 + t), e.readPixels(0, 0, s, r, e.RGBA, e.UNSIGNED_BYTE, n), e.bindFramebuffer(e.READ_FRAMEBUFFER, o);
192
+ e.bindFramebuffer(e.READ_FRAMEBUFFER, this.yt), e.readBuffer(e.COLOR_ATTACHMENT0 + t), e.readPixels(0, 0, s, r, e.RGBA, e.UNSIGNED_BYTE, n), e.bindFramebuffer(e.READ_FRAMEBUFFER, o);
193
193
  const c = 4 * s, l = new Uint8Array(n.length);
194
194
  for (let u = 0; u < r; u++) {
195
195
  const f = (r - 1 - u) * c, g = u * c;
@@ -204,8 +204,8 @@ class q {
204
204
  const n = ((i = (e = this.xt).Tt) == null ? void 0 : i.call(e)) ?? null;
205
205
  n && this.xt.St(n), this.$t && this.Mt && ((r = (s = this.xt).Et) == null || r.call(s, this.Mt));
206
206
  }
207
- this.Ct = { framebuffer: t.getParameter(t.FRAMEBUFFER_BINDING), viewport: t.getParameter(t.VIEWPORT) }, t.bindFramebuffer(t.FRAMEBUFFER, this.wt), this.bt = Array(this.At).fill(null);
208
- for (let n = 0; n < this.At; n++) t.clearBufferfv(t.COLOR, n, new Float32Array([0, 0, 0, 0]));
207
+ this.Ct = { framebuffer: t.getParameter(t.FRAMEBUFFER_BINDING), viewport: t.getParameter(t.VIEWPORT) }, t.bindFramebuffer(t.FRAMEBUFFER, this.yt), this.bt = Array(this.wt).fill(null);
208
+ for (let n = 0; n < this.wt; n++) t.clearBufferfv(t.COLOR, n, new Float32Array([0, 0, 0, 0]));
209
209
  t.viewport(0, 0, this.dt, this.gt), H(t, [0, 0, this.dt, this.gt]);
210
210
  }
211
211
  end() {
@@ -220,8 +220,8 @@ class q {
220
220
  }
221
221
  Gt() {
222
222
  const t = this.vt;
223
- t.deleteFramebuffer(this.wt);
224
- for (const e of this.yt) t.deleteTexture(e);
223
+ t.deleteFramebuffer(this.yt);
224
+ for (const e of this.At) t.deleteTexture(e);
225
225
  }
226
226
  get width() {
227
227
  return this.dt;
@@ -230,7 +230,7 @@ class q {
230
230
  return this.gt;
231
231
  }
232
232
  get textures() {
233
- return [...this.yt];
233
+ return [...this.At];
234
234
  }
235
235
  }
236
236
  class I {
@@ -363,7 +363,7 @@ class I {
363
363
  }
364
364
  }
365
365
  const W = `#version 300 es
366
- in vec2 a_position;in vec2 a_texCoord;in vec2 a_instancePosition;in vec2 a_instanceSize;in vec3 a_instanceCharacter;in vec4 a_instancePrimaryColor;in vec4 a_instanceSecondaryColor;in vec2 a_instanceRotation;in vec3 a_instanceTransform;in vec3 a_instanceGlobalRotation;in vec2 a_instanceRotationCenter;in vec2 a_instanceBezierCP1;in vec2 a_instanceBezierCP2;in vec2 a_instanceBezierStart;in vec2 a_instanceBezierEnd;in vec2 a_instanceArcAngles;uniform float U9;uniform vec2 Uw;out vec2 v_uv;out vec3 v_character;out vec4 v_primaryColor;out vec4 v_secondaryColor;out vec2 v_rotation;out vec3 v_transform;mat3 A(float B){float C=sin(B),D=cos(B);return mat3(1,0,0,0,D,-C,0,C,D);}mat3 E(float B){float C=sin(B),D=cos(B);return mat3(D,0,C,0,1,0,-C,0,D);}mat3 F(float B){float C=sin(B),D=cos(B);return mat3(D,-C,0,C,D,0,0,0,1);}vec2 G(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return N*M*I+3.*N*H*J+3.*M*O*K+O*H*L;}vec2 P(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return-3.*N*I+3.*N*J-6.*M*H*J+6.*M*H*K-3.*O*K+3.*O*L;}void main(){v_uv=a_texCoord;v_character=a_instanceCharacter;v_primaryColor=a_instancePrimaryColor;v_secondaryColor=a_instanceSecondaryColor;v_rotation=a_instanceRotation;v_transform=a_instanceTransform;vec2 Q;bool R=length(a_instanceBezierCP1)+length(a_instanceBezierCP2)+length(a_instanceBezierStart)+length(a_instanceBezierEnd)>0.;bool S=a_instanceArcAngles.x!=0.||a_instanceArcAngles.y!=0.;if(R){float H=a_position.x;vec2 T=G(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);vec2 U=P(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);float V=length(U);U=V>0.?U/V:vec2(1,0);Q=T+vec2(-U.y,U.x)*a_position.y*a_instanceSize.y;}else if(S){float C=a_instanceArcAngles.x,W=a_instanceArcAngles.y;C=mod(C,6.28318530718);if(C<0.)C+=6.28318530718;W=mod(W,6.28318530718);if(W<0.)W+=6.28318530718;float X=C-W;if(X<=0.)X+=6.28318530718;float Y=C-a_position.x*X;vec2 Z=vec2(cos(Y),sin(Y))*a_position.y;Q=Z*a_instanceSize*.5+a_instanceSize*.5+a_instancePosition;}else{Q=a_position*a_instanceSize+a_instancePosition;}vec2 a=(Q/Uw)*2.-1.;a.y=-a.y;if(length(a_instanceGlobalRotation)>0.){vec3 b=vec3(a-a_instanceRotationCenter,0);b.x*=U9;if(a_instanceGlobalRotation.x!=0.)b=A(-a_instanceGlobalRotation.x)*b;if(a_instanceGlobalRotation.y!=0.)b=E(-a_instanceGlobalRotation.y)*b;if(a_instanceGlobalRotation.z!=0.)b=F(-a_instanceGlobalRotation.z)*b;b.x/=U9;a=b.xy+a_instanceRotationCenter;}gl_Position=vec4(a,0,1);}`, at = "attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;void main(){v_uv=a_texCoord;gl_Position=vec4(a_position,0.,1.);}";
366
+ in vec2 a_position;in vec2 a_texCoord;in vec2 a_instancePosition;in vec2 a_instanceSize;in vec3 a_instanceCharacter;in vec4 a_instancePrimaryColor;in vec4 a_instanceSecondaryColor;in vec2 a_instanceRotation;in vec3 a_instanceTransform;in vec3 a_instanceGlobalRotation;in vec2 a_instanceRotationCenter;in vec2 a_instanceBezierCP1;in vec2 a_instanceBezierCP2;in vec2 a_instanceBezierStart;in vec2 a_instanceBezierEnd;in vec2 a_instanceArcAngles;uniform float U9;uniform vec2 Uy;out vec2 v_uv;out vec3 v_character;out vec4 v_primaryColor;out vec4 v_secondaryColor;out vec2 v_rotation;out vec3 v_transform;mat3 A(float B){float C=sin(B),D=cos(B);return mat3(1,0,0,0,D,-C,0,C,D);}mat3 E(float B){float C=sin(B),D=cos(B);return mat3(D,0,C,0,1,0,-C,0,D);}mat3 F(float B){float C=sin(B),D=cos(B);return mat3(D,-C,0,C,D,0,0,0,1);}vec2 G(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return N*M*I+3.*N*H*J+3.*M*O*K+O*H*L;}vec2 P(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return-3.*N*I+3.*N*J-6.*M*H*J+6.*M*H*K-3.*O*K+3.*O*L;}void main(){v_uv=a_texCoord;v_character=a_instanceCharacter;v_primaryColor=a_instancePrimaryColor;v_secondaryColor=a_instanceSecondaryColor;v_rotation=a_instanceRotation;v_transform=a_instanceTransform;vec2 Q;bool R=length(a_instanceBezierCP1)+length(a_instanceBezierCP2)+length(a_instanceBezierStart)+length(a_instanceBezierEnd)>0.;bool S=a_instanceArcAngles.x!=0.||a_instanceArcAngles.y!=0.;if(R){float H=a_position.x;vec2 T=G(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);vec2 U=P(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);float V=length(U);U=V>0.?U/V:vec2(1,0);Q=T+vec2(-U.y,U.x)*a_position.y*a_instanceSize.y;}else if(S){float C=a_instanceArcAngles.x,W=a_instanceArcAngles.y;C=mod(C,6.28318530718);if(C<0.)C+=6.28318530718;W=mod(W,6.28318530718);if(W<0.)W+=6.28318530718;float X=C-W;if(X<=0.)X+=6.28318530718;float Y=C-a_position.x*X;vec2 Z=vec2(cos(Y),sin(Y))*a_position.y;Q=Z*a_instanceSize*.5+a_instanceSize*.5+a_instancePosition;}else{Q=a_position*a_instanceSize+a_instancePosition;}vec2 a=(Q/Uy)*2.-1.;a.y=-a.y;if(length(a_instanceGlobalRotation)>0.){vec3 b=vec3(a-a_instanceRotationCenter,0);b.x*=U9;if(a_instanceGlobalRotation.x!=0.)b=A(-a_instanceGlobalRotation.x)*b;if(a_instanceGlobalRotation.y!=0.)b=E(-a_instanceGlobalRotation.y)*b;if(a_instanceGlobalRotation.z!=0.)b=F(-a_instanceGlobalRotation.z)*b;b.x/=U9;a=b.xy+a_instanceRotationCenter;}gl_Position=vec4(a,0,1);}`, at = "attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;void main(){v_uv=a_texCoord;gl_Position=vec4(a_position,0.,1.);}";
367
367
  class ft {
368
368
  constructor(t) {
369
369
  a(this, "vt");
@@ -437,12 +437,12 @@ class gt {
437
437
  }
438
438
  ve(t, e, i) {
439
439
  const { shader: s } = t, r = k(this.vt) || this.vt.getParameter(this.vt.VIEWPORT);
440
- s.Vt({ U9: r[2] / r[3], Uw: [r[2], r[3]] });
440
+ s.Vt({ U9: r[2] / r[3], Uy: [r[2], r[3]] });
441
441
  const n = (l) => {
442
- if (!l || !l.we()) return;
442
+ if (!l || !l.ye()) return;
443
443
  const u = l.unitGeometry, f = l.unitBuffer;
444
444
  try {
445
- this.me.ce(s.Qt, l.type + "", u, f), l.batch.ye(s), l.batch.Ae(u.Ce, u.be);
445
+ this.me.ce(s.Qt, l.type + "", u, f), l.batch.Ae(s), l.batch.we(u.Ce, u.be);
446
446
  } finally {
447
447
  l.batch.xe(s), this.me.pe(), l.$e();
448
448
  }
@@ -468,10 +468,10 @@ class gt {
468
468
  ze(t, e, i, s, r, n, o, c) {
469
469
  e.Xt(), e.Vt(i);
470
470
  const l = this.vt.getParameter(this.vt.VIEWPORT);
471
- if (e.Vt({ U9: l[2] / l[3], Uw: [l[2], l[3]] }), t.$e(), t.Fe({ x: s, y: r, width: n, height: o }, c), t.we()) {
471
+ if (e.Vt({ U9: l[2] / l[3], Uy: [l[2], l[3]] }), t.$e(), t.Fe({ x: s, y: r, width: n, height: o }, c), t.ye()) {
472
472
  const u = t.unitGeometry, f = t.unitBuffer;
473
473
  try {
474
- this.me.ce(e.Qt, t.type + "", u, f), t.batch.ye(e), t.batch.Ae(u.Ce, u.be);
474
+ this.me.ce(e.Qt, t.type + "", u, f), t.batch.Ae(e), t.batch.we(u.Ce, u.be);
475
475
  } finally {
476
476
  t.batch.xe(e), this.me.pe(), t.$e();
477
477
  }
@@ -623,7 +623,7 @@ class mt {
623
623
  }
624
624
  return e;
625
625
  }
626
- ye(t) {
626
+ Ae(t) {
627
627
  if (!this.ss || this.Je.length === 0) return;
628
628
  const e = this.vt, i = t.Qt;
629
629
  this.fs();
@@ -638,7 +638,7 @@ class mt {
638
638
  const e = this.vt, i = this.ds(t.Qt);
639
639
  for (const [, s] of i) e.disableVertexAttribArray(s), e.vertexAttribDivisor(s, 0);
640
640
  }
641
- Ae(t, e) {
641
+ we(t, e) {
642
642
  this.Je.length !== 0 && this.vt.drawArraysInstanced(t, 0, e, this.Je.length);
643
643
  }
644
644
  Gt() {
@@ -655,7 +655,7 @@ class _ {
655
655
  this.vt = t, this.ps = e, this.gs = i, this._s = s;
656
656
  const r = this.vt.createBuffer();
657
657
  if (!r) throw Error("Failed to create unit geometry buffer");
658
- this.vt.bindBuffer(this.vt.ARRAY_BUFFER, r), this.vt.bufferData(this.vt.ARRAY_BUFFER, this._s.ws, this.vt.STATIC_DRAW), this.vt.bindBuffer(this.vt.ARRAY_BUFFER, null), this.vs = r;
658
+ this.vt.bindBuffer(this.vt.ARRAY_BUFFER, r), this.vt.bufferData(this.vt.ARRAY_BUFFER, this._s.As, this.vt.STATIC_DRAW), this.vt.bindBuffer(this.vt.ARRAY_BUFFER, null), this.vs = r;
659
659
  }
660
660
  get type() {
661
661
  return this.gs;
@@ -672,13 +672,13 @@ class _ {
672
672
  $e() {
673
673
  this.ps.clear();
674
674
  }
675
- we() {
675
+ ye() {
676
676
  return !this.ps.isEmpty;
677
677
  }
678
678
  Gt() {
679
679
  this.ps.Gt(), this.vt.deleteBuffer(this.vs);
680
680
  }
681
- As(t, e, i, s, r) {
681
+ ws(t, e, i, s, r) {
682
682
  const n = this.Cs(t, e, i, s, r.N || 0, r.X || 0, r.W || 0);
683
683
  return { le: [t, e], Ee: [i, s], j: r.j || [0, 0, 0], Y: r.Y || [1, 1, 1, 1], q: r.q || [0, 0, 0, 1], L: r.L || [0, 0], We: [r.D ? 1 : 0, r.V ? 1 : 0, r.K ? 1 : 0], N: n.radiansX, X: n.radiansY, W: n.radiansZ, Ve: [n.centerX, n.centerY] };
684
684
  }
@@ -695,27 +695,27 @@ class _ {
695
695
  return { centerX: (t + i / 2) / l * 2 - 1, centerY: 1 - (e + s / 2) / u * 2, radiansX: -r * Math.PI / 180, radiansY: -n * Math.PI / 180, radiansZ: -o * Math.PI / 180, aspectRatio: l / u };
696
696
  }
697
697
  }
698
- const vt = { ws: new Float32Array([0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1]), be: 6, Ce: WebGL2RenderingContext.TRIANGLES, fe: 16, ue: { le: { size: 2, offset: 0 }, de: { size: 2, offset: 8 } } };
698
+ const vt = { As: new Float32Array([0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1]), be: 6, Ce: WebGL2RenderingContext.TRIANGLES, fe: 16, ue: { le: { size: 2, offset: 0 }, de: { size: 2, offset: 8 } } };
699
699
  class At extends _ {
700
700
  constructor(t, e) {
701
701
  super(t, e, y.RECTANGLE, vt);
702
702
  }
703
703
  Fe(t, e) {
704
- const i = this.As(t.x, t.y, t.width, t.height, e);
704
+ const i = this.ws(t.x, t.y, t.width, t.height, e);
705
705
  return this.ps.Fe(i);
706
706
  }
707
707
  }
708
- const xt = { ws: new Float32Array([0, -0.5, 0, 0, 1, -0.5, 1, 0, 0, 0.5, 0, 1, 0, 0.5, 0, 1, 1, -0.5, 1, 0, 1, 0.5, 1, 1]), be: 6, Ce: WebGL2RenderingContext.TRIANGLES, fe: 16, ue: { le: { size: 2, offset: 0 }, de: { size: 2, offset: 8 } } };
708
+ const xt = { As: new Float32Array([0, -0.5, 0, 0, 1, -0.5, 1, 0, 0, 0.5, 0, 1, 0, 0.5, 0, 1, 1, -0.5, 1, 0, 1, 0.5, 1, 1]), be: 6, Ce: WebGL2RenderingContext.TRIANGLES, fe: 16, ue: { le: { size: 2, offset: 0 }, de: { size: 2, offset: 8 } } };
709
709
  class Et extends _ {
710
710
  constructor(t, e) {
711
711
  super(t, e, y.LINE, xt);
712
712
  }
713
713
  Fe(t, e) {
714
- const i = t.x2 - t.x1, s = t.y2 - t.y1, r = Math.hypot(i, s), n = t.thickness || e.I || 1, o = t.x1 + i / 2, c = t.y1 + s / 2, l = o - r / 2, u = c, f = this.As(l, u, r, n, e);
714
+ const i = t.x2 - t.x1, s = t.y2 - t.y1, r = Math.hypot(i, s), n = t.thickness || e.I || 1, o = t.x1 + i / 2, c = t.y1 + s / 2, l = o - r / 2, u = c, f = this.ws(l, u, r, n, e);
715
715
  return this.$s(f, o, c), this.ps.Fe(f);
716
716
  }
717
717
  }
718
- const yt = { ws: function(h = 32) {
718
+ const yt = { As: function(h = 32) {
719
719
  const t = [], e = 2 * Math.PI / h;
720
720
  for (let i = 0; i < h; i++) {
721
721
  const s = i * e, r = (i + 1) % h * e, n = Math.cos(s), o = Math.sin(s), c = 0.5 * (n + 1), l = 0.5 * (o + 1), u = Math.cos(r), f = Math.sin(r), g = 0.5 * (u + 1), v = 0.5 * (f + 1);
@@ -728,11 +728,11 @@ class wt extends _ {
728
728
  super(t, e, y.ELLIPSE, yt);
729
729
  }
730
730
  Fe(t, e) {
731
- const i = this.As(t.x, t.y, t.width, t.height, e);
731
+ const i = this.ws(t.x, t.y, t.width, t.height, e);
732
732
  return this.$s(i, t.x, t.y), this.ps.Fe(i);
733
733
  }
734
734
  }
735
- let bt = { ws: function(h) {
735
+ let bt = { As: function(h) {
736
736
  const t = [];
737
737
  for (let e = 0; e < h; e++) {
738
738
  const i = e / h, s = (e + 1) / h;
@@ -745,17 +745,17 @@ class Rt extends _ {
745
745
  super(t, e, y.ARC, bt);
746
746
  }
747
747
  Fe(t, e) {
748
- const i = t.x - t.width / 2, s = t.y - t.height / 2, r = t.start * Math.PI / 180, n = t.stop * Math.PI / 180, o = this.As(i, s, t.width, t.height, e);
748
+ const i = t.x - t.width / 2, s = t.y - t.height / 2, r = t.start * Math.PI / 180, n = t.stop * Math.PI / 180, o = this.ws(i, s, t.width, t.height, e);
749
749
  return this.$s(o, t.x, t.y), o.Ke = [r, n], this.ps.Fe(o);
750
750
  }
751
751
  }
752
- const Tt = { ws: new Float32Array([0, 0, 0, 0, 1, 0, 1, 0, 0.5, 1, 0.5, 1]), be: 3, Ce: WebGL2RenderingContext.TRIANGLES, fe: 16, ue: { le: { size: 2, offset: 0 }, de: { size: 2, offset: 8 } } };
752
+ const Tt = { As: new Float32Array([0, 0, 0, 0, 1, 0, 1, 0, 0.5, 1, 0.5, 1]), be: 3, Ce: WebGL2RenderingContext.TRIANGLES, fe: 16, ue: { le: { size: 2, offset: 0 }, de: { size: 2, offset: 8 } } };
753
753
  class Ct extends _ {
754
754
  constructor(t, e) {
755
755
  super(t, e, y.TRIANGLE, Tt);
756
756
  }
757
757
  Fe(t, e) {
758
- const i = Math.min(t.x1, t.x2, t.x3), s = Math.max(t.x1, t.x2, t.x3), r = Math.min(t.y1, t.y2, t.y3), n = s - i, o = Math.max(t.y1, t.y2, t.y3) - r, c = this.As(i, r, n, o, e), l = i + 0.5 * n, u = r + o * (1 / 3);
758
+ const i = Math.min(t.x1, t.x2, t.x3), s = Math.max(t.x1, t.x2, t.x3), r = Math.min(t.y1, t.y2, t.y3), n = s - i, o = Math.max(t.y1, t.y2, t.y3) - r, c = this.ws(i, r, n, o, e), l = i + 0.5 * n, u = r + o * (1 / 3);
759
759
  return this.$s(c, l, u), this.ps.Fe(c);
760
760
  }
761
761
  }
@@ -763,7 +763,7 @@ function et(h, t, e, i, s) {
763
763
  const r = 1 - h, n = r * r, o = h * h;
764
764
  return n * r * t + 3 * n * h * e + 3 * r * o * i + o * h * s;
765
765
  }
766
- const Ut = { ws: function(h = 16) {
766
+ const Ut = { As: function(h = 16) {
767
767
  const t = [];
768
768
  for (let e = 0; e < h; e++) {
769
769
  const i = e / h, s = (e + 1) / h;
@@ -776,7 +776,7 @@ class Ft extends _ {
776
776
  super(t, e, y.BEZIER_CURVE, Ut);
777
777
  }
778
778
  Fe(t, e) {
779
- const i = e.I || 1, s = et(0.5, t.x1, t.cp1x, t.cp2x, t.x2), r = et(0.5, t.y1, t.cp1y, t.cp2y, t.y2), n = this.As(0, 0, 1, i, e);
779
+ const i = e.I || 1, s = et(0.5, t.x1, t.cp1x, t.cp2x, t.x2), r = et(0.5, t.y1, t.cp1y, t.cp2y, t.y2), n = this.ws(0, 0, 1, i, e);
780
780
  return this.$s(n, s, r), n.qe = [t.x1, t.y1], n.je = [t.cp1x, t.cp1y], n.Ye = [t.cp2x, t.cp2y], n.Ze = [t.x2, t.y2], this.ps.Fe(n);
781
781
  }
782
782
  }
@@ -1363,7 +1363,7 @@ class Z {
1363
1363
  const i = e / t.head.unitsPerEm, s = t.hhea.ascender * i, r = t.hhea.descender * i, n = t.hhea.lineGap * i;
1364
1364
  return { ascender: s, descender: r, lineGap: n, lineHeight: s - r + n, unitsPerEm: t.head.unitsPerEm, scale: i };
1365
1365
  }
1366
- wi() {
1366
+ yi() {
1367
1367
  this.ci.clear(), this.li.clear();
1368
1368
  }
1369
1369
  fi(t) {
@@ -1398,20 +1398,20 @@ class Z {
1398
1398
  }
1399
1399
  class Gt {
1400
1400
  constructor(t) {
1401
- a(this, "yi");
1402
1401
  a(this, "Ai");
1402
+ a(this, "wi");
1403
1403
  a(this, "xt");
1404
1404
  a(this, "Ci");
1405
- this.xt = t, this.Ci = new Z(), this.yi = document.createElement("canvas"), this.Ai = this.yi.getContext("2d", { willReadFrequently: !0, alpha: !1 });
1405
+ this.xt = t, this.Ci = new Z(), this.Ai = document.createElement("canvas"), this.wi = this.Ai.getContext("2d", { willReadFrequently: !0, alpha: !1 });
1406
1406
  }
1407
1407
  createTextureAtlas(t, e, i, s) {
1408
1408
  const r = t.length, n = Math.ceil(Math.sqrt(r)), o = Math.ceil(r / n), c = e.width * n, l = e.height * o, u = typeof s == "object" ? s : null;
1409
1409
  this.bi(c, l), this.xi(t, e, n, i, u);
1410
1410
  const f = this.xt.Ys(c, l, 1, { filter: "nearest" });
1411
- return f.zt(this.yi), { framebuffer: f, columns: n, rows: o };
1411
+ return f.zt(this.Ai), { framebuffer: f, columns: n, rows: o };
1412
1412
  }
1413
1413
  bi(t, e) {
1414
- this.yi.width = t, this.yi.height = e, this.yi.style.width = t + "px", this.yi.style.height = t + "px", this.Ai.imageSmoothingEnabled = !1, this.yi.style.imageRendering = "pixelated", this.Ai.fillStyle = "black", this.Ai.fillRect(0, 0, t, e), this.Ai.textBaseline = "top", this.Ai.textAlign = "left", this.Ai.fillStyle = "white";
1414
+ this.Ai.width = t, this.Ai.height = e, this.Ai.style.width = t + "px", this.Ai.style.height = t + "px", this.wi.imageSmoothingEnabled = !1, this.Ai.style.imageRendering = "pixelated", this.wi.fillStyle = "black", this.wi.fillRect(0, 0, t, e), this.wi.textBaseline = "top", this.wi.textAlign = "left", this.wi.fillStyle = "white";
1415
1415
  }
1416
1416
  xi(t, e, i, s, r) {
1417
1417
  const n = s / r.head.unitsPerEm;
@@ -1440,36 +1440,36 @@ class Gt {
1440
1440
  if (!t || !t.xs || t.noc === 0) return;
1441
1441
  const { xs: r, ys: n, endPts: o, flags: c } = t;
1442
1442
  if (!(r && n && o && c)) return;
1443
- this.Ai.beginPath();
1443
+ this.wi.beginPath();
1444
1444
  let l = 0;
1445
1445
  for (let u = 0; u < o.length; u++) {
1446
1446
  const f = o[u];
1447
1447
  if (!(f < l)) {
1448
1448
  if (f >= l) {
1449
1449
  const g = e + r[l] * s, v = i - n[l] * s;
1450
- this.Ai.moveTo(g, v);
1450
+ this.wi.moveTo(g, v);
1451
1451
  let m = l + 1;
1452
1452
  for (; m <= f; )
1453
1453
  if (1 & c[m]) {
1454
1454
  const d = e + r[m] * s, A = i - n[m] * s;
1455
- this.Ai.lineTo(d, A), m++;
1455
+ this.wi.lineTo(d, A), m++;
1456
1456
  } else {
1457
1457
  const d = e + r[m] * s, A = i - n[m] * s;
1458
1458
  let p = m + 1 > f ? l : m + 1;
1459
1459
  if (1 & c[p]) {
1460
1460
  const E = e + r[p] * s, x = i - n[p] * s;
1461
- this.Ai.quadraticCurveTo(d, A, E, x), m = p + 1;
1461
+ this.wi.quadraticCurveTo(d, A, E, x), m = p + 1;
1462
1462
  } else {
1463
1463
  const E = (d + (e + r[p] * s)) / 2, x = (A + (i - n[p] * s)) / 2;
1464
- this.Ai.quadraticCurveTo(d, A, E, x), m = p;
1464
+ this.wi.quadraticCurveTo(d, A, E, x), m = p;
1465
1465
  }
1466
1466
  }
1467
- this.Ai.closePath();
1467
+ this.wi.closePath();
1468
1468
  }
1469
1469
  l = f + 1;
1470
1470
  }
1471
1471
  }
1472
- this.Ai.fill();
1472
+ this.wi.fill();
1473
1473
  }
1474
1474
  }
1475
1475
  class zt {
@@ -1488,8 +1488,8 @@ class zt {
1488
1488
  }
1489
1489
  return { width: Math.ceil(s), height: Math.ceil(n) };
1490
1490
  }
1491
- wi() {
1492
- this.Ri.wi();
1491
+ yi() {
1492
+ this.Ri.yi();
1493
1493
  }
1494
1494
  }
1495
1495
  class Wt {
@@ -1742,11 +1742,11 @@ class z {
1742
1742
  a(this, "V", 0);
1743
1743
  a(this, "K", 0);
1744
1744
  a(this, "L", [0, 0]);
1745
- a(this, "wr", "sampled");
1746
- a(this, "yr", "fixed");
1745
+ a(this, "yr", "sampled");
1746
+ a(this, "Ar", "fixed");
1747
1747
  a(this, "Y", [1, 1, 1]);
1748
1748
  a(this, "q", [0, 0, 0]);
1749
- a(this, "Ar", [0, 0, 0, 1]);
1749
+ a(this, "wr", [0, 0, 0, 1]);
1750
1750
  a(this, "Cr", [[0.1, 0, 0]]);
1751
1751
  a(this, "br");
1752
1752
  this.vt = t, this.vr = e, this.dt = i, this.gt = s;
@@ -1771,13 +1771,13 @@ class z {
1771
1771
  return this.L = [i, s], this;
1772
1772
  }
1773
1773
  Is() {
1774
- return { texture: this.vr, invert: this.D, flipX: this.V, flipY: this.K, charRotation: this.L, charColorFixed: this.wr === "fixed", charColor: this.Y, cellColorFixed: this.yr === "fixed", cellColor: this.q, backgroundColor: this.Ar, charCount: this.Cr.length, charList: this.Cr };
1774
+ return { texture: this.vr, invert: this.D, flipX: this.V, flipY: this.K, charRotation: this.L, charColorFixed: this.yr === "fixed", charColor: this.Y, cellColorFixed: this.Ar === "fixed", cellColor: this.q, backgroundColor: this.wr, charCount: this.Cr.length, charList: this.Cr };
1775
1775
  }
1776
1776
  charColorMode(t) {
1777
- return this.wr = t, this;
1777
+ return this.yr = t, this;
1778
1778
  }
1779
1779
  cellColorMode(t) {
1780
- return this.yr = t, this;
1780
+ return this.Ar = t, this;
1781
1781
  }
1782
1782
  charColor(t, e, i) {
1783
1783
  return this.Y = [(t ?? 0) / 255, (e ?? t ?? 0) / 255, (i ?? t ?? 0) / 255], this;
@@ -1786,7 +1786,7 @@ class z {
1786
1786
  return this.q = [(t ?? 0) / 255, (e ?? t ?? 0) / 255, (i ?? t ?? 0) / 255], this;
1787
1787
  }
1788
1788
  background(t, e, i, s) {
1789
- return this.Ar = [(t ?? 0) / 255, (e ?? t ?? 0) / 255, (i ?? t ?? 0) / 255, (s ?? 255) / 255], this;
1789
+ return this.wr = [(t ?? 0) / 255, (e ?? t ?? 0) / 255, (i ?? t ?? 0) / 255, (s ?? 255) / 255], this;
1790
1790
  }
1791
1791
  characters(t) {
1792
1792
  const e = this.br(t).filter((i) => Array.isArray(i)).slice(0, 64);
@@ -1963,9 +1963,9 @@ class jt {
1963
1963
  a(this, "_n");
1964
1964
  a(this, "Nr", !1);
1965
1965
  a(this, "vn");
1966
- a(this, "wn");
1967
1966
  a(this, "yn");
1968
1967
  a(this, "An");
1968
+ a(this, "wn");
1969
1969
  a(this, "Cn");
1970
1970
  this.er = t;
1971
1971
  }
@@ -2008,13 +2008,13 @@ class jt {
2008
2008
  this.vn = t;
2009
2009
  }
2010
2010
  Zr(t) {
2011
- this.wn = t;
2011
+ this.yn = t;
2012
2012
  }
2013
2013
  Qr(t) {
2014
- this.yn = t;
2014
+ this.An = t;
2015
2015
  }
2016
2016
  Tn(t) {
2017
- this.An = t;
2017
+ this.wn = t;
2018
2018
  }
2019
2019
  Sn(t) {
2020
2020
  this.Cn = t;
@@ -2023,21 +2023,21 @@ class jt {
2023
2023
  return { x: this.cn.x, y: this.cn.y };
2024
2024
  }
2025
2025
  $n(t) {
2026
- if (this.An) {
2026
+ if (this.wn) {
2027
2027
  const e = { position: { ...this.cn }, previousPosition: { ...this.ln }, originalEvent: t };
2028
- this.An(e);
2028
+ this.wn(e);
2029
2029
  }
2030
2030
  }
2031
2031
  Mn(t) {
2032
- if (this.wn) {
2032
+ if (this.yn) {
2033
2033
  const e = { position: { ...this.cn }, previousPosition: { ...this.ln }, button: t.button, originalEvent: t };
2034
- this.wn(e);
2034
+ this.yn(e);
2035
2035
  }
2036
2036
  }
2037
2037
  Fn(t) {
2038
- if (this.yn) {
2038
+ if (this.An) {
2039
2039
  const e = { position: { ...this.cn }, previousPosition: { ...this.ln }, button: t.button, originalEvent: t };
2040
- this.yn(e);
2040
+ this.An(e);
2041
2041
  }
2042
2042
  }
2043
2043
  Rn(t) {
@@ -2415,11 +2415,11 @@ class te {
2415
2415
  }
2416
2416
  }
2417
2417
  class ee extends J {
2418
- wo(t, e) {
2419
- const i = this.yo(e);
2418
+ yo(t, e) {
2419
+ const i = this.Ao(e);
2420
2420
  this.On(t, i, "text/plain;charset=utf-8");
2421
2421
  }
2422
- yo(t) {
2422
+ Ao(t) {
2423
2423
  let e = this.In(t);
2424
2424
  return e === ".txt" || e.length <= 4 ? this.Nn() : e;
2425
2425
  }
@@ -2434,12 +2434,12 @@ class rt {
2434
2434
  po(t) {
2435
2435
  return { preserveTrailingSpaces: t.preserveTrailingSpaces ?? !1, lineEnding: t.lineEnding ?? "lf", emptyCharacter: t.emptyCharacter ?? " ", filename: t.filename || this.do.Nn() };
2436
2436
  }
2437
- Ao(t, e = {}) {
2437
+ wo(t, e = {}) {
2438
2438
  const i = this.po(e), s = this.uo._o(this.uo.Bn(t.pipeline), t.grid, t.font, i.emptyCharacter);
2439
2439
  return this.fo.vo(s, i);
2440
2440
  }
2441
- wo(t, e = {}) {
2442
- this.do.wo(this.Ao(t, e), e.filename);
2441
+ yo(t, e = {}) {
2442
+ this.do.yo(this.wo(t, e), e.filename);
2443
2443
  }
2444
2444
  }
2445
2445
  class ie extends $ {
@@ -2527,10 +2527,10 @@ const he = (h) => class extends h {
2527
2527
  this.xt.St(this.To);
2528
2528
  }
2529
2529
  toString(t = {}) {
2530
- return this.Po(), new rt().Ao({ pipeline: this.So, grid: this.hn, font: this.Ei }, t);
2530
+ return this.Po(), new rt().wo({ pipeline: this.So, grid: this.hn, font: this.Ei }, t);
2531
2531
  }
2532
2532
  saveStrings(t = {}) {
2533
- this.Po(), new rt().wo({ pipeline: this.So, grid: this.hn, font: this.Ei }, t);
2533
+ this.Po(), new rt().yo({ pipeline: this.So, grid: this.hn, font: this.Ei }, t);
2534
2534
  }
2535
2535
  toSVG(t = {}) {
2536
2536
  return this.Po(), new st().mo({ pipeline: this.So, grid: this.hn, font: this.Ei }, t);
@@ -2737,7 +2737,7 @@ class Q {
2737
2737
  G.A(t);
2738
2738
  }
2739
2739
  static get version() {
2740
- return "0.2.1-beta.8";
2740
+ return "0.3.0";
2741
2741
  }
2742
2742
  }
2743
2743
  const pe = Object.freeze(Object.defineProperty({ __proto__: null }, Symbol.toStringTag, { value: "Module" })), me = Q.create, ve = Q.setErrorLevel, Ae = Q.version;
@@ -2737,7 +2737,7 @@ class Z {
2737
2737
  $.C(t);
2738
2738
  }
2739
2739
  static get version() {
2740
- return "0.2.1-beta.8";
2740
+ return "0.3.0";
2741
2741
  }
2742
2742
  }
2743
2743
  const pe = Object.freeze(Object.defineProperty({ __proto__: null }, Symbol.toStringTag, { value: "Module" })), me = Z.create, ve = Z.setErrorLevel, xe = Z.version;