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 +25 -22
- package/dist/textmode.esm.js +81 -81
- package/dist/textmode.esm.min.js +1 -1
- package/dist/textmode.umd.js +4 -4
- package/dist/textmode.umd.min.js +1 -1
- package/package.json +1 -1
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`) | ~
|
|
51
|
-
| **Standard ESM** (`textmode.esm.js`) | ~
|
|
52
|
-
| **Minified UMD** (`textmode.umd.min.js`) | ~
|
|
53
|
-
| **Minified ESM** (`textmode.esm.min.js`) | ~
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
package/dist/textmode.esm.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
208
|
-
for (let n = 0; n < this.
|
|
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.
|
|
224
|
-
for (const e of this.
|
|
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.
|
|
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
|
|
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],
|
|
440
|
+
s.Vt({ U9: r[2] / r[3], Uy: [r[2], r[3]] });
|
|
441
441
|
const n = (l) => {
|
|
442
|
-
if (!l || !l.
|
|
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.
|
|
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],
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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 = {
|
|
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.
|
|
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 = {
|
|
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.
|
|
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 = {
|
|
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.
|
|
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 = {
|
|
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.
|
|
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 = {
|
|
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.
|
|
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 = {
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
1411
|
+
return f.zt(this.Ai), { framebuffer: f, columns: n, rows: o };
|
|
1412
1412
|
}
|
|
1413
1413
|
bi(t, e) {
|
|
1414
|
-
this.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1464
|
+
this.wi.quadraticCurveTo(d, A, E, x), m = p;
|
|
1465
1465
|
}
|
|
1466
1466
|
}
|
|
1467
|
-
this.
|
|
1467
|
+
this.wi.closePath();
|
|
1468
1468
|
}
|
|
1469
1469
|
l = f + 1;
|
|
1470
1470
|
}
|
|
1471
1471
|
}
|
|
1472
|
-
this.
|
|
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
|
-
|
|
1492
|
-
this.Ri.
|
|
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, "
|
|
1746
|
-
a(this, "
|
|
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, "
|
|
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.
|
|
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.
|
|
1777
|
+
return this.yr = t, this;
|
|
1778
1778
|
}
|
|
1779
1779
|
cellColorMode(t) {
|
|
1780
|
-
return 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.
|
|
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.
|
|
2011
|
+
this.yn = t;
|
|
2012
2012
|
}
|
|
2013
2013
|
Qr(t) {
|
|
2014
|
-
this.
|
|
2014
|
+
this.An = t;
|
|
2015
2015
|
}
|
|
2016
2016
|
Tn(t) {
|
|
2017
|
-
this.
|
|
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.
|
|
2026
|
+
if (this.wn) {
|
|
2027
2027
|
const e = { position: { ...this.cn }, previousPosition: { ...this.ln }, originalEvent: t };
|
|
2028
|
-
this.
|
|
2028
|
+
this.wn(e);
|
|
2029
2029
|
}
|
|
2030
2030
|
}
|
|
2031
2031
|
Mn(t) {
|
|
2032
|
-
if (this.
|
|
2032
|
+
if (this.yn) {
|
|
2033
2033
|
const e = { position: { ...this.cn }, previousPosition: { ...this.ln }, button: t.button, originalEvent: t };
|
|
2034
|
-
this.
|
|
2034
|
+
this.yn(e);
|
|
2035
2035
|
}
|
|
2036
2036
|
}
|
|
2037
2037
|
Fn(t) {
|
|
2038
|
-
if (this.
|
|
2038
|
+
if (this.An) {
|
|
2039
2039
|
const e = { position: { ...this.cn }, previousPosition: { ...this.ln }, button: t.button, originalEvent: t };
|
|
2040
|
-
this.
|
|
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
|
-
|
|
2419
|
-
const i = this.
|
|
2418
|
+
yo(t, e) {
|
|
2419
|
+
const i = this.Ao(e);
|
|
2420
2420
|
this.On(t, i, "text/plain;charset=utf-8");
|
|
2421
2421
|
}
|
|
2422
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2442
|
-
this.do.
|
|
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().
|
|
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().
|
|
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.
|
|
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;
|
package/dist/textmode.esm.min.js
CHANGED
|
@@ -2737,7 +2737,7 @@ class Z {
|
|
|
2737
2737
|
$.C(t);
|
|
2738
2738
|
}
|
|
2739
2739
|
static get version() {
|
|
2740
|
-
return "0.
|
|
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;
|