html-to-ascii 0.3.2 → 0.4.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/LICENSE +21 -0
- package/README.md +1 -4
- package/dist/components/ASCII.d.ts.map +1 -1
- package/dist/index.es.js +126 -129
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/package.json +2 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Zachariah Watson
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -7,9 +7,6 @@
|
|
|
7
7
|
|
|
8
8
|
```
|
|
9
9
|
|
|
10
|
-
[![NPM Version][npm-image]][npm-url]
|
|
11
|
-
[![Downloads Stats][npm-downloads]][npm-url]
|
|
12
|
-
|
|
13
10
|
html-to-ascii is a React component that dynamically converts an HTML page into pure, selectable, ASCII text. None of that fake Canvas trickery here!
|
|
14
11
|
|
|
15
12
|
[[Changelog](https://github.com/zachariahwatson/html-to-ascii/blob/main/CHANGELOG.md)]
|
|
@@ -17,7 +14,7 @@ html-to-ascii is a React component that dynamically converts an HTML page into p
|
|
|
17
14
|
## Installation
|
|
18
15
|
|
|
19
16
|
```sh
|
|
20
|
-
npm
|
|
17
|
+
npm i html-to-ascii
|
|
21
18
|
```
|
|
22
19
|
|
|
23
20
|
Add `<ASCIIProvider>` to the root of your project:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ASCII.d.ts","sourceRoot":"","sources":["../../lib/components/ASCII.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ASCII.d.ts","sourceRoot":"","sources":["../../lib/components/ASCII.tsx"],"names":[],"mappings":"AAuSA,eAAO,MAAM,KAAK,GAAI,wCAInB;IACF,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;CACpB,4CAgEA,CAAA"}
|
package/dist/index.es.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode('@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--spacing:.25rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.top-0{top:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.m-2{margin:calc(var(--spacing)*2)}.m-4{margin:calc(var(--spacing)*4)}.
|
|
2
|
-
import { jsxs as
|
|
3
|
-
import { createContext as
|
|
4
|
-
const
|
|
1
|
+
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode('@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--spacing:.25rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.top-0{top:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.m-2{margin:calc(var(--spacing)*2)}.m-4{margin:calc(var(--spacing)*4)}.flex{display:flex}.grid{display:grid}.h-8{height:calc(var(--spacing)*8)}.h-12{height:calc(var(--spacing)*12)}.h-24{height:calc(var(--spacing)*24)}.h-32{height:calc(var(--spacing)*32)}.h-64{height:calc(var(--spacing)*64)}.h-72{height:calc(var(--spacing)*72)}.w-64{width:calc(var(--spacing)*64)}.w-96{width:calc(var(--spacing)*96)}.w-\\[500px\\]{width:500px}.w-\\[1000px\\]{width:1000px}.w-full{width:100%}.cursor-grab{cursor:grab}.resize{resize:both}.justify-center{justify-content:center}.border{border-style:var(--tw-border-style);border-width:1px}.border-transparent{border-color:#0000}.bg-transparent{background-color:#0000}.bg-none{background-image:none}.p-4{padding:calc(var(--spacing)*4)}.text-center{text-align:center}.leading-none{--tw-leading:1;line-height:1}.wrap-break-word{overflow-wrap:break-word}.whitespace-pre{white-space:pre}.text-transparent{color:#0000}.underline{text-decoration-line:underline}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}:root{height:100vh;margin:calc(var(--spacing)*0);font-family:Courier New,Courier,monospace}body,#root{height:100vh}a,button,input,textarea,select,area,label,details,summary{pointer-events:auto}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}')),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}})();
|
|
2
|
+
import { jsxs as J, jsx as H } from "react/jsx-runtime";
|
|
3
|
+
import { createContext as K, useContext as Q, useState as M, useEffect as F, useRef as E, useReducer as U, useLayoutEffect as V, useMemo as Y } from "react";
|
|
4
|
+
const I = {
|
|
5
5
|
t: "─",
|
|
6
6
|
ti: "┴",
|
|
7
7
|
b: "─",
|
|
@@ -16,7 +16,7 @@ const B = {
|
|
|
16
16
|
bl: "└",
|
|
17
17
|
i: "┼",
|
|
18
18
|
fill: " "
|
|
19
|
-
},
|
|
19
|
+
}, N = K({
|
|
20
20
|
fontHeight: 0,
|
|
21
21
|
courierRatio: 0,
|
|
22
22
|
fontWidth: 0,
|
|
@@ -27,93 +27,90 @@ const B = {
|
|
|
27
27
|
rows: 0,
|
|
28
28
|
cols: 0,
|
|
29
29
|
grid: [],
|
|
30
|
-
options:
|
|
31
|
-
}),
|
|
32
|
-
function
|
|
33
|
-
const [c,
|
|
34
|
-
return
|
|
35
|
-
let
|
|
30
|
+
options: I
|
|
31
|
+
}), Z = () => Q(N);
|
|
32
|
+
function g(e, t = 1) {
|
|
33
|
+
const [c, a] = M(0);
|
|
34
|
+
return F(() => {
|
|
35
|
+
let s;
|
|
36
36
|
const l = () => {
|
|
37
|
-
|
|
37
|
+
a((r) => r >= e.length ? r : r + t), s = requestAnimationFrame(l);
|
|
38
38
|
};
|
|
39
|
-
return l(), () => cancelAnimationFrame(
|
|
40
|
-
}, [
|
|
39
|
+
return l(), () => cancelAnimationFrame(s);
|
|
40
|
+
}, [e, t]), e.slice(0, c);
|
|
41
41
|
}
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
for (const i of s)
|
|
48
|
-
if (i.startsWith(`ascii-${t}-`))
|
|
49
|
-
return i.slice(`ascii-${t}-`.length);
|
|
42
|
+
const x = (e, t, c) => t * c.cols + e;
|
|
43
|
+
function w(e, t, c) {
|
|
44
|
+
for (const a of e)
|
|
45
|
+
if (a.startsWith(`ascii-${t}-`))
|
|
46
|
+
return a.slice(`ascii-${t}-`.length);
|
|
50
47
|
return c;
|
|
51
48
|
}
|
|
52
|
-
const
|
|
53
|
-
const c =
|
|
54
|
-
if (
|
|
55
|
-
for (let o =
|
|
56
|
-
const
|
|
57
|
-
switch (t.grid[
|
|
49
|
+
const tt = ({ rect: e, grid: t }) => {
|
|
50
|
+
const c = 1 / t.fontWidth, a = 1 / t.fontHeight, s = Math.floor(e.rect.left * c), l = Math.floor(e.rect.right * c), r = Math.floor(e.rect.top * a), f = Math.floor(e.rect.bottom * a), n = e.classList, h = n.contains("ascii"), u = n.contains("ascii-border"), p = n.contains("ascii-border-l"), m = n.contains("ascii-border-r"), b = n.contains("ascii-border-t"), C = n.contains("ascii-border-b"), k = n.contains("ascii-border-tl"), d = n.contains("ascii-border-tr"), R = n.contains("ascii-border-br"), W = n.contains("ascii-border-bl"), T = n.contains("ascii-no-fill"), B = n.contains("ascii-text"), O = w(n, "l", t.options.l), q = w(n, "r", t.options.r), G = w(n, "t", t.options.t), j = w(n, "b", t.options.b), z = w(n, "tl", t.options.tl), D = w(n, "tr", t.options.tr), P = w(n, "br", t.options.br), _ = w(n, "bl", t.options.bl), $ = w(n, "fill", t.options.fill), A = w(n, "li", t.options.li), L = w(n, "ri", t.options.ri), S = w(n, "ti", t.options.ti), y = w(n, "bi", t.options.bi), v = w(n, "i", t.options.i);
|
|
51
|
+
if (p || (h || u) && !m && !b && !C && !k && !d && !R && !W)
|
|
52
|
+
for (let o = r + 1; o < f; o++) {
|
|
53
|
+
const i = x(s, o, t);
|
|
54
|
+
switch (t.grid[i]) {
|
|
58
55
|
case t.options.t:
|
|
59
56
|
case t.options.b:
|
|
60
57
|
case t.options.tr:
|
|
61
58
|
case t.options.br:
|
|
62
|
-
t.grid[
|
|
59
|
+
t.grid[i] = A;
|
|
63
60
|
break;
|
|
64
61
|
default:
|
|
65
|
-
t.grid[
|
|
62
|
+
t.grid[i] = O;
|
|
66
63
|
}
|
|
67
64
|
}
|
|
68
|
-
if (
|
|
69
|
-
for (let o =
|
|
70
|
-
const
|
|
71
|
-
switch (t.grid[
|
|
65
|
+
if (m || (h || u) && !p && !b && !C && !k && !d && !R && !W)
|
|
66
|
+
for (let o = r + 1; o < f; o++) {
|
|
67
|
+
const i = x(l, o, t);
|
|
68
|
+
switch (t.grid[i]) {
|
|
72
69
|
case t.options.t:
|
|
73
70
|
case t.options.b:
|
|
74
71
|
case t.options.tl:
|
|
75
72
|
case t.options.bl:
|
|
76
|
-
t.grid[
|
|
73
|
+
t.grid[i] = L;
|
|
77
74
|
break;
|
|
78
75
|
default:
|
|
79
|
-
t.grid[
|
|
76
|
+
t.grid[i] = q;
|
|
80
77
|
}
|
|
81
78
|
}
|
|
82
|
-
if (
|
|
83
|
-
for (let o =
|
|
84
|
-
const
|
|
85
|
-
switch (t.grid[
|
|
79
|
+
if (b || (h || u) && !p && !m && !C && !k && !d && !R && !W)
|
|
80
|
+
for (let o = s + 1; o < l; o++) {
|
|
81
|
+
const i = x(o, r, t);
|
|
82
|
+
switch (t.grid[i]) {
|
|
86
83
|
case t.options.l:
|
|
87
84
|
case t.options.r:
|
|
88
85
|
case t.options.bl:
|
|
89
86
|
case t.options.br:
|
|
90
|
-
t.grid[
|
|
87
|
+
t.grid[i] = S;
|
|
91
88
|
break;
|
|
92
89
|
default:
|
|
93
|
-
t.grid[
|
|
90
|
+
t.grid[i] = G;
|
|
94
91
|
}
|
|
95
92
|
}
|
|
96
|
-
if (
|
|
97
|
-
for (let o =
|
|
98
|
-
const
|
|
99
|
-
switch (t.grid[
|
|
93
|
+
if (C || (h || u) && !p && !m && !b && !k && !d && !R && !W)
|
|
94
|
+
for (let o = s + 1; o < l; o++) {
|
|
95
|
+
const i = x(o, f, t);
|
|
96
|
+
switch (t.grid[i]) {
|
|
100
97
|
case t.options.l:
|
|
101
98
|
case t.options.r:
|
|
102
99
|
case t.options.tl:
|
|
103
100
|
case t.options.tr:
|
|
104
|
-
t.grid[
|
|
101
|
+
t.grid[i] = y;
|
|
105
102
|
break;
|
|
106
103
|
default:
|
|
107
|
-
t.grid[
|
|
104
|
+
t.grid[i] = j;
|
|
108
105
|
}
|
|
109
106
|
}
|
|
110
|
-
if (
|
|
111
|
-
const o =
|
|
107
|
+
if (k || b && p || (h || u) && !p && !m && !b && !C && !d && !R && !W) {
|
|
108
|
+
const o = x(s, r, t);
|
|
112
109
|
switch (t.grid[o]) {
|
|
113
110
|
case t.options.t:
|
|
114
111
|
case t.options.b:
|
|
115
112
|
case t.options.tr:
|
|
116
|
-
t.grid[o] =
|
|
113
|
+
t.grid[o] = y;
|
|
117
114
|
break;
|
|
118
115
|
case t.options.l:
|
|
119
116
|
case t.options.r:
|
|
@@ -121,57 +118,57 @@ const Z = ({ rect: s, grid: t }) => {
|
|
|
121
118
|
t.grid[o] = L;
|
|
122
119
|
break;
|
|
123
120
|
case t.options.br:
|
|
124
|
-
t.grid[o] =
|
|
121
|
+
t.grid[o] = v;
|
|
125
122
|
break;
|
|
126
123
|
default:
|
|
127
|
-
t.grid[o] =
|
|
124
|
+
t.grid[o] = z;
|
|
128
125
|
}
|
|
129
126
|
}
|
|
130
|
-
if (
|
|
131
|
-
const o =
|
|
127
|
+
if (d || b && m || (h || u) && !p && !m && !b && !C && !k && !R && !W) {
|
|
128
|
+
const o = x(l, r, t);
|
|
132
129
|
switch (t.grid[o]) {
|
|
133
130
|
case t.options.t:
|
|
134
131
|
case t.options.b:
|
|
135
132
|
case t.options.tl:
|
|
136
|
-
t.grid[o] =
|
|
133
|
+
t.grid[o] = y;
|
|
137
134
|
break;
|
|
138
135
|
case t.options.l:
|
|
139
136
|
case t.options.r:
|
|
140
137
|
case t.options.br:
|
|
141
|
-
t.grid[o] =
|
|
138
|
+
t.grid[o] = A;
|
|
142
139
|
break;
|
|
143
140
|
case t.options.bl:
|
|
144
|
-
t.grid[o] =
|
|
141
|
+
t.grid[o] = v;
|
|
145
142
|
break;
|
|
146
143
|
default:
|
|
147
|
-
t.grid[o] =
|
|
144
|
+
t.grid[o] = D;
|
|
148
145
|
}
|
|
149
146
|
}
|
|
150
|
-
if (
|
|
151
|
-
const o =
|
|
152
|
-
if (
|
|
147
|
+
if (R || C && m || (h || u) && !p && !m && !b && !C && !k && !d && !W) {
|
|
148
|
+
const o = x(l, f, t);
|
|
149
|
+
if (e.type === "textarea")
|
|
153
150
|
t.grid[o] = "▼";
|
|
154
151
|
else
|
|
155
152
|
switch (t.grid[o]) {
|
|
156
153
|
case t.options.l:
|
|
157
154
|
case t.options.r:
|
|
158
155
|
case t.options.tr:
|
|
159
|
-
t.grid[o] =
|
|
156
|
+
t.grid[o] = A;
|
|
160
157
|
break;
|
|
161
158
|
case t.options.t:
|
|
162
159
|
case t.options.b:
|
|
163
160
|
case t.options.bl:
|
|
164
|
-
t.grid[o] =
|
|
161
|
+
t.grid[o] = S;
|
|
165
162
|
break;
|
|
166
163
|
case t.options.tl:
|
|
167
|
-
t.grid[o] =
|
|
164
|
+
t.grid[o] = v;
|
|
168
165
|
break;
|
|
169
166
|
default:
|
|
170
|
-
t.grid[o] =
|
|
167
|
+
t.grid[o] = P;
|
|
171
168
|
}
|
|
172
169
|
}
|
|
173
|
-
if (
|
|
174
|
-
const o =
|
|
170
|
+
if (W || C && p || (h || u) && !p && !m && !b && !C && !k && !d && !R) {
|
|
171
|
+
const o = x(s, f, t);
|
|
175
172
|
switch (t.grid[o]) {
|
|
176
173
|
case t.options.l:
|
|
177
174
|
case t.options.r:
|
|
@@ -181,35 +178,35 @@ const Z = ({ rect: s, grid: t }) => {
|
|
|
181
178
|
case t.options.t:
|
|
182
179
|
case t.options.b:
|
|
183
180
|
case t.options.br:
|
|
184
|
-
t.grid[o] =
|
|
181
|
+
t.grid[o] = S;
|
|
185
182
|
break;
|
|
186
183
|
case t.options.tr:
|
|
187
|
-
t.grid[o] =
|
|
184
|
+
t.grid[o] = v;
|
|
188
185
|
break;
|
|
189
186
|
default:
|
|
190
|
-
t.grid[o] =
|
|
187
|
+
t.grid[o] = _;
|
|
191
188
|
}
|
|
192
189
|
}
|
|
193
|
-
if (!
|
|
194
|
-
for (let o =
|
|
195
|
-
for (let
|
|
196
|
-
t.grid[
|
|
197
|
-
(
|
|
198
|
-
const
|
|
199
|
-
t.grid[
|
|
190
|
+
if (!T)
|
|
191
|
+
for (let o = r + 1; o < f; o++)
|
|
192
|
+
for (let i = s + 1; i < l; i++)
|
|
193
|
+
t.grid[x(i, o, t)] = $;
|
|
194
|
+
(h || B) && e.characters.forEach((o) => {
|
|
195
|
+
const i = Math.floor(o.rect.left * c), X = Math.floor(o.rect.bottom * a);
|
|
196
|
+
t.grid[x(i, X, t)] = o.char;
|
|
200
197
|
});
|
|
201
198
|
};
|
|
202
|
-
function
|
|
203
|
-
return
|
|
204
|
-
const c = [],
|
|
205
|
-
for (;
|
|
206
|
-
const
|
|
207
|
-
for (let
|
|
208
|
-
if (l[
|
|
199
|
+
function ot(e) {
|
|
200
|
+
return e.current ? Array.from(e.current.querySelectorAll('[class*="ascii"]')).map((t) => {
|
|
201
|
+
const c = [], a = document.createTreeWalker(t, NodeFilter.SHOW_TEXT);
|
|
202
|
+
for (; a.nextNode(); ) {
|
|
203
|
+
const s = a.currentNode, l = s.textContent ?? "";
|
|
204
|
+
for (let r = 0; r < l.length; r++) {
|
|
205
|
+
if (l[r].trim() === "") continue;
|
|
209
206
|
const f = document.createRange();
|
|
210
|
-
f.setStart(
|
|
211
|
-
const
|
|
212
|
-
c.push({ char: l[
|
|
207
|
+
f.setStart(s, r), f.setEnd(s, r + 1);
|
|
208
|
+
const n = f.getBoundingClientRect();
|
|
209
|
+
c.push({ char: l[r], rect: n });
|
|
213
210
|
}
|
|
214
211
|
}
|
|
215
212
|
return {
|
|
@@ -220,78 +217,78 @@ function g(s) {
|
|
|
220
217
|
};
|
|
221
218
|
}) : [];
|
|
222
219
|
}
|
|
223
|
-
const
|
|
224
|
-
children:
|
|
220
|
+
const rt = ({
|
|
221
|
+
children: e,
|
|
225
222
|
gridReveal: t = !0,
|
|
226
223
|
revealSpeed: c = 30
|
|
227
224
|
}) => {
|
|
228
|
-
const
|
|
229
|
-
|
|
230
|
-
if (!
|
|
231
|
-
let
|
|
225
|
+
const a = E(null), s = Z(), l = E([]), r = t ? g(s.grid, c) : s.grid, [, f] = U((n) => n + 1, 0);
|
|
226
|
+
V(() => {
|
|
227
|
+
if (!a.current) return;
|
|
228
|
+
let n;
|
|
232
229
|
const h = () => {
|
|
233
|
-
l.current =
|
|
230
|
+
l.current = ot(a), n = requestAnimationFrame(h), f();
|
|
234
231
|
};
|
|
235
|
-
return h(), () => cancelAnimationFrame(
|
|
232
|
+
return h(), () => cancelAnimationFrame(n);
|
|
236
233
|
}, []);
|
|
237
|
-
for (let
|
|
238
|
-
|
|
239
|
-
return l.current.forEach((
|
|
240
|
-
|
|
241
|
-
}), /* @__PURE__ */
|
|
242
|
-
/* @__PURE__ */
|
|
234
|
+
for (let n = 0; n < s.grid.length; n++)
|
|
235
|
+
s.grid[n] = " ";
|
|
236
|
+
return l.current.forEach((n) => {
|
|
237
|
+
tt({ rect: n, grid: s });
|
|
238
|
+
}), /* @__PURE__ */ J("div", { ref: a, className: "leading-none", children: [
|
|
239
|
+
/* @__PURE__ */ H(
|
|
243
240
|
"div",
|
|
244
241
|
{
|
|
245
|
-
style: { width:
|
|
246
|
-
className: "absolute
|
|
247
|
-
children:
|
|
242
|
+
style: { width: s.truncWidth, height: s.truncHeight },
|
|
243
|
+
className: "absolute bg-transparent text-transparent border-transparent shadow-none ring-0 top-0 left-0 bg-none pointer-events-none",
|
|
244
|
+
children: e
|
|
248
245
|
}
|
|
249
246
|
),
|
|
250
|
-
|
|
247
|
+
a.current && l.current && /* @__PURE__ */ H("div", { style: { width: s.truncWidth, height: s.truncHeight }, children: Array.from({ length: s.rows }, (n, h) => {
|
|
251
248
|
let u = "";
|
|
252
|
-
const p = h *
|
|
253
|
-
for (let
|
|
254
|
-
u +=
|
|
255
|
-
return /* @__PURE__ */
|
|
249
|
+
const p = h * s.cols, m = p + s.cols;
|
|
250
|
+
for (let b = p; b < m; b++)
|
|
251
|
+
u += r[b] ?? " ";
|
|
252
|
+
return /* @__PURE__ */ H("p", { children: u }, h);
|
|
256
253
|
}) })
|
|
257
254
|
] });
|
|
258
255
|
};
|
|
259
|
-
function
|
|
260
|
-
const [
|
|
256
|
+
function nt() {
|
|
257
|
+
const [e, t] = M({
|
|
261
258
|
width: 0,
|
|
262
259
|
height: 0
|
|
263
260
|
});
|
|
264
|
-
return
|
|
261
|
+
return F(() => {
|
|
265
262
|
const c = () => t({ width: window.innerWidth, height: window.innerHeight });
|
|
266
263
|
return c(), window.addEventListener("resize", c), () => window.removeEventListener("resize", c);
|
|
267
|
-
}, []),
|
|
264
|
+
}, []), e;
|
|
268
265
|
}
|
|
269
|
-
function
|
|
270
|
-
const
|
|
271
|
-
...
|
|
266
|
+
function st({ width: e, height: t, ...c }) {
|
|
267
|
+
const a = {
|
|
268
|
+
...I,
|
|
272
269
|
...c
|
|
273
|
-
},
|
|
270
|
+
}, s = 16, l = 1229 / 2048, r = s * l, f = e - e % r, n = t - t % s, h = Math.floor(n / s), u = Math.floor(f / r), p = Array.from({ length: h * u }, () => a.fill);
|
|
274
271
|
return {
|
|
275
|
-
fontHeight:
|
|
272
|
+
fontHeight: s,
|
|
276
273
|
courierRatio: l,
|
|
277
|
-
fontWidth:
|
|
274
|
+
fontWidth: r,
|
|
278
275
|
truncWidth: f,
|
|
279
|
-
truncHeight:
|
|
280
|
-
windowWidth:
|
|
276
|
+
truncHeight: n,
|
|
277
|
+
windowWidth: e,
|
|
281
278
|
windowHeight: t,
|
|
282
279
|
rows: h,
|
|
283
280
|
cols: u,
|
|
284
281
|
grid: p,
|
|
285
|
-
options:
|
|
282
|
+
options: a
|
|
286
283
|
};
|
|
287
284
|
}
|
|
288
|
-
function
|
|
289
|
-
const { width: c, height:
|
|
290
|
-
return /* @__PURE__ */
|
|
285
|
+
function at({ children: e, ...t }) {
|
|
286
|
+
const { width: c, height: a } = nt(), s = Y(() => st({ width: c, height: a, ...t }), [c, a, t]);
|
|
287
|
+
return /* @__PURE__ */ H(N.Provider, { value: s, children: e });
|
|
291
288
|
}
|
|
292
289
|
export {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
290
|
+
rt as ASCII,
|
|
291
|
+
at as ASCIIProvider,
|
|
292
|
+
Z as useGridContext
|
|
296
293
|
};
|
|
297
294
|
//# sourceMappingURL=index.es.js.map
|
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../lib/utils/defaultOptions.tsx","../lib/contexts/GridContext.tsx","../lib/hooks/useGridContext.tsx","../lib/hooks/useReveal.tsx","../lib/components/ASCII.tsx","../lib/hooks/useWindowDimensions.tsx","../lib/providers/ASCIIProvider.tsx"],"sourcesContent":["import type { GridOptions } from \"../types/GridOptions\"\r\n\r\nexport const defaultOptions: GridOptions = {\r\n\tt: \"─\",\r\n\tti: \"┴\",\r\n\tb: \"─\",\r\n\tbi: \"┬\",\r\n\tl: \"│\",\r\n\tli: \"┤\",\r\n\tr: \"│\",\r\n\tri: \"├\",\r\n\ttl: \"┌\",\r\n\ttr: \"┐\",\r\n\tbr: \"┘\",\r\n\tbl: \"└\",\r\n\ti: \"┼\",\r\n\tfill: String.fromCharCode(160),\r\n}\r\n","import { createContext } from \"react\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport { defaultOptions } from \"../utils/defaultOptions\"\r\n\r\nexport const GridContext = createContext<GridData>({\r\n\tfontHeight: 0,\r\n\tcourierRatio: 0,\r\n\tfontWidth: 0,\r\n\ttruncWidth: 0,\r\n\ttruncHeight: 0,\r\n\twindowWidth: 0,\r\n\twindowHeight: 0,\r\n\trows: 0,\r\n\tcols: 0,\r\n\tgrid: [],\r\n\toptions: defaultOptions,\r\n})\r\n","import { useContext } from \"react\"\r\nimport { GridContext } from \"../contexts/GridContext\"\r\n\r\nexport const useGridContext = () => {\r\n\treturn useContext(GridContext)\r\n}\r\n","import { useEffect, useState } from \"react\"\r\n\r\nexport function useReveal(grid: string[], speed = 1) {\r\n\tconst [index, setIndex] = useState(0)\r\n\tuseEffect(() => {\r\n\t\tlet frame: number\r\n\r\n\t\tconst loop = () => {\r\n\t\t\tsetIndex((i) => {\r\n\t\t\t\tif (i >= grid.length) return i\r\n\t\t\t\treturn i + speed\r\n\t\t\t})\r\n\r\n\t\t\tframe = requestAnimationFrame(loop)\r\n\t\t}\r\n\r\n\t\tloop()\r\n\r\n\t\treturn () => cancelAnimationFrame(frame)\r\n\t}, [grid, speed])\r\n\r\n\treturn grid.slice(0, index)\r\n}\r\n","import { useLayoutEffect, useReducer, useRef } from \"react\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport type { Rect } from \"../types/Rect\"\r\nimport { useGridContext } from \"../hooks/useGridContext\"\r\nimport { useReveal } from \"../hooks/useReveal\"\r\nimport type { GridOptions } from \"../types/GridOptions\"\r\n\r\nconst getIndex = (x: number, y: number, grid: GridData) => {\r\n\tconst col = (x / grid.fontWidth) | 0\r\n\tconst row = (y / grid.fontHeight) | 0\r\n\treturn row * grid.cols + col\r\n}\r\n\r\nfunction getCharOverride(cl: DOMTokenList, option: keyof GridOptions, fallback: string) {\r\n\tfor (const c of cl) {\r\n\t\tif (c.startsWith(`ascii-${option}-`)) {\r\n\t\t\treturn c.slice(`ascii-${option}-`.length)\r\n\t\t}\r\n\t}\r\n\treturn fallback\r\n}\r\n\r\nconst drawRect = ({ rect, grid }: { rect: Rect; grid: GridData }) => {\r\n\tconst rectLeft = Math.floor(rect.rect.left / grid.fontWidth) * grid.fontWidth\r\n\tconst rectRight = Math.floor(rect.rect.right / grid.fontWidth) * grid.fontWidth\r\n\tconst rectTop = Math.floor(rect.rect.top / grid.fontHeight) * grid.fontHeight\r\n\tconst rectBottom = Math.floor(rect.rect.bottom / grid.fontHeight) * grid.fontHeight\r\n\r\n\tconst cl = rect.classList\r\n\r\n\tconst hasASCII = cl.contains(\"ascii\")\r\n\tconst hasBorder = cl.contains(\"ascii-border\")\r\n\tconst hasL = cl.contains(\"ascii-border-l\")\r\n\tconst hasR = cl.contains(\"ascii-border-r\")\r\n\tconst hasT = cl.contains(\"ascii-border-t\")\r\n\tconst hasB = cl.contains(\"ascii-border-b\")\r\n\tconst hasTL = cl.contains(\"ascii-border-tl\")\r\n\tconst hasTR = cl.contains(\"ascii-border-tr\")\r\n\tconst hasBR = cl.contains(\"ascii-border-br\")\r\n\tconst hasBL = cl.contains(\"ascii-border-bl\")\r\n\tconst hasNoFill = cl.contains(\"ascii-no-fill\")\r\n\tconst hasText = cl.contains(\"ascii-text\")\r\n\r\n\tconst lChar = getCharOverride(cl, \"l\", grid.options.l)\r\n\tconst rChar = getCharOverride(cl, \"r\", grid.options.r)\r\n\tconst tChar = getCharOverride(cl, \"t\", grid.options.t)\r\n\tconst bChar = getCharOverride(cl, \"b\", grid.options.b)\r\n\tconst tlChar = getCharOverride(cl, \"tl\", grid.options.tl)\r\n\tconst trChar = getCharOverride(cl, \"tr\", grid.options.tr)\r\n\tconst brChar = getCharOverride(cl, \"br\", grid.options.br)\r\n\tconst blChar = getCharOverride(cl, \"bl\", grid.options.bl)\r\n\tconst fillChar = getCharOverride(cl, \"fill\", grid.options.fill)\r\n\tconst liChar = getCharOverride(cl, \"li\", grid.options.li)\r\n\tconst riChar = getCharOverride(cl, \"ri\", grid.options.ri)\r\n\tconst tiChar = getCharOverride(cl, \"ti\", grid.options.ti)\r\n\tconst biChar = getCharOverride(cl, \"bi\", grid.options.bi)\r\n\tconst iChar = getCharOverride(cl, \"i\", grid.options.i)\r\n\r\n\t//TODO: associate grid cells with the local options of the dom element - right now the intersections only look for the default characters\r\n\r\n\t//verticals\r\n\t//left\r\n\tif (hasL || ((hasASCII || hasBorder) && !hasR && !hasT && !hasB && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let i = rectTop + grid.fontHeight; i < rectBottom; i += grid.fontHeight) {\r\n\t\t\tconst l = getIndex(rectLeft, i, grid)\r\n\r\n\t\t\tswitch (grid.grid[l]) {\r\n\t\t\t\tcase grid.options.t:\r\n\t\t\t\tcase grid.options.b:\r\n\t\t\t\tcase grid.options.tr:\r\n\t\t\t\tcase grid.options.br:\r\n\t\t\t\t\tgrid.grid[l] = liChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[l] = lChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//right\r\n\tif (hasR || ((hasASCII || hasBorder) && !hasL && !hasT && !hasB && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let i = rectTop + grid.fontHeight; i < rectBottom; i += grid.fontHeight) {\r\n\t\t\tconst r = getIndex(rectRight, i, grid)\r\n\r\n\t\t\tswitch (grid.grid[r]) {\r\n\t\t\t\tcase grid.options.t:\r\n\t\t\t\tcase grid.options.b:\r\n\t\t\t\tcase grid.options.tl:\r\n\t\t\t\tcase grid.options.bl:\r\n\t\t\t\t\tgrid.grid[r] = riChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[r] = rChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//horizontals\r\n\t//top\r\n\tif (hasT || ((hasASCII || hasBorder) && !hasL && !hasR && !hasB && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let i = rectLeft + grid.fontWidth; i < rectRight; i += grid.fontWidth) {\r\n\t\t\tconst t = getIndex(i, rectTop, grid)\r\n\r\n\t\t\tswitch (grid.grid[t]) {\r\n\t\t\t\tcase grid.options.l:\r\n\t\t\t\tcase grid.options.r:\r\n\t\t\t\tcase grid.options.bl:\r\n\t\t\t\tcase grid.options.br:\r\n\t\t\t\t\tgrid.grid[t] = tiChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[t] = tChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//bottom\r\n\tif (hasB || ((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let i = rectLeft + grid.fontWidth; i < rectRight; i += grid.fontWidth) {\r\n\t\t\tconst b = getIndex(i, rectBottom, grid)\r\n\t\t\tswitch (grid.grid[b]) {\r\n\t\t\t\tcase grid.options.l:\r\n\t\t\t\tcase grid.options.r:\r\n\t\t\t\tcase grid.options.tl:\r\n\t\t\t\tcase grid.options.tr:\r\n\t\t\t\t\tgrid.grid[b] = biChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[b] = bChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//corners\r\n\t//tl\r\n\tif (\r\n\t\thasTL ||\r\n\t\t(hasT && hasL) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTR && !hasBR && !hasBL)\r\n\t) {\r\n\t\tconst tl = getIndex(rectLeft, rectTop, grid)\r\n\t\tswitch (grid.grid[tl]) {\r\n\t\t\tcase grid.options.t:\r\n\t\t\tcase grid.options.b:\r\n\t\t\tcase grid.options.tr:\r\n\t\t\t\tgrid.grid[tl] = biChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.l:\r\n\t\t\tcase grid.options.r:\r\n\t\t\tcase grid.options.bl:\r\n\t\t\t\tgrid.grid[tl] = riChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[tl] = iChar\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[tl] = tlChar\r\n\t\t}\r\n\t}\r\n\t//tr\r\n\tif (\r\n\t\thasTR ||\r\n\t\t(hasT && hasR) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTL && !hasBR && !hasBL)\r\n\t) {\r\n\t\tconst tr = getIndex(rectRight, rectTop, grid)\r\n\t\tswitch (grid.grid[tr]) {\r\n\t\t\tcase grid.options.t:\r\n\t\t\tcase grid.options.b:\r\n\t\t\tcase grid.options.tl:\r\n\t\t\t\tgrid.grid[tr] = biChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.l:\r\n\t\t\tcase grid.options.r:\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[tr] = liChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.bl:\r\n\t\t\t\tgrid.grid[tr] = iChar\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[tr] = trChar\r\n\t\t}\r\n\t}\r\n\t//br\r\n\tif (\r\n\t\thasBR ||\r\n\t\t(hasB && hasR) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTL && !hasTR && !hasBL)\r\n\t) {\r\n\t\tconst br = getIndex(rectRight, rectBottom, grid)\r\n\t\tif (rect.type === \"textarea\") {\r\n\t\t\tgrid.grid[br] = \"▼\"\r\n\t\t} else {\r\n\t\t\tswitch (grid.grid[br]) {\r\n\t\t\t\tcase grid.options.l:\r\n\t\t\t\tcase grid.options.r:\r\n\t\t\t\tcase grid.options.tr:\r\n\t\t\t\t\tgrid.grid[br] = liChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tcase grid.options.t:\r\n\t\t\t\tcase grid.options.b:\r\n\t\t\t\tcase grid.options.bl:\r\n\t\t\t\t\tgrid.grid[br] = tiChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tcase grid.options.tl:\r\n\t\t\t\t\tgrid.grid[br] = iChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[br] = brChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//bl\r\n\tif (\r\n\t\thasBL ||\r\n\t\t(hasB && hasL) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTL && !hasTR && !hasBR)\r\n\t) {\r\n\t\tconst bl = getIndex(rectLeft, rectBottom, grid)\r\n\t\tswitch (grid.grid[bl]) {\r\n\t\t\tcase grid.options.l:\r\n\t\t\tcase grid.options.r:\r\n\t\t\tcase grid.options.tl:\r\n\t\t\t\tgrid.grid[bl] = riChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.t:\r\n\t\t\tcase grid.options.b:\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[bl] = tiChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.tr:\r\n\t\t\t\tgrid.grid[bl] = iChar\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[bl] = blChar\r\n\t\t}\r\n\t}\r\n\r\n\t//fill\r\n\tif (!hasNoFill) {\r\n\t\tfor (let y = rectTop + grid.fontHeight; y < rectBottom; y += grid.fontHeight) {\r\n\t\t\tfor (let x = rectLeft + grid.fontWidth; x < rectRight; x += grid.fontWidth) {\r\n\t\t\t\tgrid.grid[getIndex(x, y, grid)] = fillChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//characters\r\n\tif (hasASCII || hasText) {\r\n\t\trect.characters.forEach((c) => {\r\n\t\t\tconst cRectLeft = Math.round(c.rect.left / grid.fontWidth) * grid.fontWidth\r\n\t\t\tconst cRectBottom = Math.round(c.rect.bottom / grid.fontHeight) * grid.fontHeight\r\n\t\t\tgrid.grid[getIndex(cRectLeft, cRectBottom, grid)] = c.char\r\n\t\t})\r\n\t}\r\n}\r\n\r\nfunction getElements(ref: React.RefObject<HTMLDivElement | null>): Rect[] {\r\n\tif (!ref.current) return []\r\n\treturn Array.from(ref.current.querySelectorAll<HTMLElement>('[class*=\"ascii\"]')).map((el) => {\r\n\t\t//console.log(\"element\", el)\r\n\t\tconst c: { char: string; rect: DOMRect }[] = []\r\n\t\tconst textWalker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT)\r\n\r\n\t\twhile (textWalker.nextNode()) {\r\n\t\t\tconst textNode = textWalker.currentNode as Text\r\n\t\t\tconst text = textNode.textContent ?? \"\"\r\n\r\n\t\t\tfor (let i = 0; i < text.length; i++) {\r\n\t\t\t\tif (text[i].trim() === \"\") continue\r\n\t\t\t\t//console.log(text[i])\r\n\t\t\t\tconst range = document.createRange()\r\n\t\t\t\trange.setStart(textNode, i)\r\n\t\t\t\trange.setEnd(textNode, i + 1)\r\n\r\n\t\t\t\tconst rect = range.getBoundingClientRect()\r\n\t\t\t\t//if (rect.width === 0 || rect.height === 0) continue\r\n\r\n\t\t\t\tc.push({ char: text[i], rect })\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn {\r\n\t\t\trect: el.getBoundingClientRect(),\r\n\t\t\tcharacters: c,\r\n\t\t\ttype: el.tagName.toLowerCase(),\r\n\t\t\tclassList: el.classList,\r\n\t\t}\r\n\t})\r\n}\r\n\r\nexport const ASCII = ({\r\n\tchildren,\r\n\tgridReveal = true,\r\n\trevealSpeed = 30,\r\n}: {\r\n\tchildren: React.ReactNode\r\n\tgridReveal?: boolean\r\n\trevealSpeed?: number\r\n}) => {\r\n\tconst parentRef = useRef<HTMLDivElement | null>(null)\r\n\tconst grid = useGridContext()\r\n\t//const [rects, setRects] = useState<Rect[] | null>([])\r\n\tconst rectsRef = useRef<Rect[]>([])\r\n\tconst reveal = gridReveal ? useReveal(grid.grid, revealSpeed) : grid.grid\r\n\tconst [, forceRender] = useReducer((x) => x + 1, 0)\r\n\r\n\tuseLayoutEffect(() => {\r\n\t\tif (!parentRef.current) return\r\n\r\n\t\tlet frame: number\r\n\r\n\t\tconst loop = () => {\r\n\t\t\trectsRef.current = getElements(parentRef)\r\n\t\t\tframe = requestAnimationFrame(loop)\r\n\r\n\t\t\tforceRender()\r\n\t\t}\r\n\r\n\t\tloop()\r\n\r\n\t\treturn () => cancelAnimationFrame(frame)\r\n\t}, [])\r\n\r\n\t// clear canvas\r\n\t// maybe find better way\r\n\tfor (let i = 0; i < grid.grid.length; i++) {\r\n\t\tgrid.grid[i] = String.fromCharCode(160)\r\n\t}\r\n\r\n\trectsRef.current.forEach((rect) => {\r\n\t\tdrawRect({ rect, grid })\r\n\t})\r\n\r\n\treturn (\r\n\t\t<div ref={parentRef} className=\"leading-none\">\r\n\t\t\t<div\r\n\t\t\t\tstyle={{ width: grid.truncWidth, height: grid.truncHeight }}\r\n\t\t\t\tclassName=\"absolute opacity-0 top-0 left-0 bg-none pointer-events-none\"\r\n\t\t\t>\r\n\t\t\t\t{children}\r\n\t\t\t</div>\r\n\t\t\t{parentRef.current && rectsRef.current && (\r\n\t\t\t\t<div style={{ width: grid.truncWidth, height: grid.truncHeight }}>\r\n\t\t\t\t\t{Array.from({ length: grid.rows }, (_, r) => {\r\n\t\t\t\t\t\tlet str = \"\"\r\n\t\t\t\t\t\tconst start = r * grid.cols\r\n\t\t\t\t\t\tconst end = start + grid.cols\r\n\r\n\t\t\t\t\t\tfor (let i = start; i < end; i++) {\r\n\t\t\t\t\t\t\tstr += reveal[i] ?? String.fromCharCode(160)\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn <p key={r}>{str}</p>\r\n\t\t\t\t\t})}\r\n\t\t\t\t</div>\r\n\t\t\t\t// <div style={{ width: grid.truncWidth, height: grid.truncHeight }} className=\"leading-none wrap-break-word\">\r\n\t\t\t\t// \t{String.raw`${reveal.join(\"\")}`}\r\n\t\t\t\t// </div>\r\n\t\t\t)}\r\n\t\t</div>\r\n\t)\r\n}\r\n","import { useEffect, useState } from \"react\"\r\n\r\nexport function useWindowDimensions() {\r\n\tconst [dimensions, setDimensions] = useState({\r\n\t\twidth: 0,\r\n\t\theight: 0,\r\n\t})\r\n\tuseEffect(() => {\r\n\t\tconst update = () => setDimensions({ width: window.innerWidth, height: window.innerHeight })\r\n\r\n\t\tupdate() // Set initial size\r\n\t\twindow.addEventListener(\"resize\", update)\r\n\t\treturn () => window.removeEventListener(\"resize\", update)\r\n\t}, [])\r\n\r\n\treturn dimensions\r\n}\r\n","import { useMemo } from \"react\"\r\nimport { GridContext } from \"../contexts/GridContext\"\r\nimport { useWindowDimensions } from \"../hooks/useWindowDimensions\"\r\nimport type { ASCIIProviderProps } from \"../types/ASCIIProviderProps\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport type { GridOptions } from \"../types/GridOptions\"\r\nimport { defaultOptions } from \"../utils/defaultOptions\"\r\n\r\nfunction initGrid({ width, height, ...options }: { width: number; height: number } & Partial<GridOptions>): GridData {\r\n\tconst mergedOptions: GridOptions = {\r\n\t\t...defaultOptions,\r\n\t\t...options,\r\n\t}\r\n\tconst fontHeight = 16\r\n\tconst courierRatio = 1229 / 2048\r\n\tconst fontWidth = fontHeight * courierRatio\r\n\tconst truncWidth = width - (width % fontWidth)\r\n\tconst truncHeight = height - (height % fontHeight)\r\n\tconst rows = Math.floor(truncHeight / fontHeight)\r\n\tconst cols = Math.floor(truncWidth / fontWidth)\r\n\tconst grid = Array.from({ length: rows * cols }, () => mergedOptions.fill)\r\n\treturn {\r\n\t\tfontHeight,\r\n\t\tcourierRatio,\r\n\t\tfontWidth,\r\n\t\ttruncWidth,\r\n\t\ttruncHeight,\r\n\t\twindowWidth: width,\r\n\t\twindowHeight: height,\r\n\t\trows,\r\n\t\tcols,\r\n\t\tgrid,\r\n\t\toptions: mergedOptions,\r\n\t}\r\n}\r\n\r\nexport function ASCIIProvider({ children, ...options }: ASCIIProviderProps) {\r\n\t// const parentGrid = useContext(GridContext)\r\n\r\n\t// // if a grid already exists, reuse it\r\n\t// if (parentGrid) {\r\n\t// \treturn <GridContext.Provider value={parentGrid}>{children}</GridContext.Provider>\r\n\t// }\r\n\r\n\tconst { width, height } = useWindowDimensions()\r\n\tconst grid = useMemo(() => initGrid({ width, height, ...options }), [width, height, options])\r\n\t//const grid = initGrid({ width, height, ...options })\r\n\treturn <GridContext.Provider value={grid}>{children}</GridContext.Provider>\r\n}\r\n"],"names":["defaultOptions","GridContext","createContext","useGridContext","useContext","useReveal","grid","speed","index","setIndex","useState","useEffect","frame","loop","i","getIndex","x","y","col","getCharOverride","cl","option","fallback","c","drawRect","rect","rectLeft","rectRight","rectTop","rectBottom","hasASCII","hasBorder","hasL","hasR","hasT","hasB","hasTL","hasTR","hasBR","hasBL","hasNoFill","hasText","lChar","rChar","tChar","bChar","tlChar","trChar","brChar","blChar","fillChar","liChar","riChar","tiChar","biChar","iChar","l","t","b","tl","tr","br","bl","cRectLeft","cRectBottom","getElements","ref","el","textWalker","textNode","text","range","ASCII","children","gridReveal","revealSpeed","parentRef","useRef","rectsRef","reveal","forceRender","useReducer","useLayoutEffect","jsxs","jsx","_","r","str","start","end","useWindowDimensions","dimensions","setDimensions","update","initGrid","width","height","options","mergedOptions","fontHeight","courierRatio","fontWidth","truncWidth","truncHeight","rows","cols","ASCIIProvider","useMemo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../lib/utils/defaultOptions.tsx","../lib/contexts/GridContext.tsx","../lib/hooks/useGridContext.tsx","../lib/hooks/useReveal.tsx","../lib/components/ASCII.tsx","../lib/hooks/useWindowDimensions.tsx","../lib/providers/ASCIIProvider.tsx"],"sourcesContent":["import type { GridOptions } from \"../types/GridOptions\"\r\n\r\nexport const defaultOptions: GridOptions = {\r\n\tt: \"─\",\r\n\tti: \"┴\",\r\n\tb: \"─\",\r\n\tbi: \"┬\",\r\n\tl: \"│\",\r\n\tli: \"┤\",\r\n\tr: \"│\",\r\n\tri: \"├\",\r\n\ttl: \"┌\",\r\n\ttr: \"┐\",\r\n\tbr: \"┘\",\r\n\tbl: \"└\",\r\n\ti: \"┼\",\r\n\tfill: String.fromCharCode(160),\r\n}\r\n","import { createContext } from \"react\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport { defaultOptions } from \"../utils/defaultOptions\"\r\n\r\nexport const GridContext = createContext<GridData>({\r\n\tfontHeight: 0,\r\n\tcourierRatio: 0,\r\n\tfontWidth: 0,\r\n\ttruncWidth: 0,\r\n\ttruncHeight: 0,\r\n\twindowWidth: 0,\r\n\twindowHeight: 0,\r\n\trows: 0,\r\n\tcols: 0,\r\n\tgrid: [],\r\n\toptions: defaultOptions,\r\n})\r\n","import { useContext } from \"react\"\r\nimport { GridContext } from \"../contexts/GridContext\"\r\n\r\nexport const useGridContext = () => {\r\n\treturn useContext(GridContext)\r\n}\r\n","import { useEffect, useState } from \"react\"\r\n\r\nexport function useReveal(grid: string[], speed = 1) {\r\n\tconst [index, setIndex] = useState(0)\r\n\tuseEffect(() => {\r\n\t\tlet frame: number\r\n\r\n\t\tconst loop = () => {\r\n\t\t\tsetIndex((i) => {\r\n\t\t\t\tif (i >= grid.length) return i\r\n\t\t\t\treturn i + speed\r\n\t\t\t})\r\n\r\n\t\t\tframe = requestAnimationFrame(loop)\r\n\t\t}\r\n\r\n\t\tloop()\r\n\r\n\t\treturn () => cancelAnimationFrame(frame)\r\n\t}, [grid, speed])\r\n\r\n\treturn grid.slice(0, index)\r\n}\r\n","import { useLayoutEffect, useReducer, useRef } from \"react\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport type { Rect } from \"../types/Rect\"\r\nimport { useGridContext } from \"../hooks/useGridContext\"\r\nimport { useReveal } from \"../hooks/useReveal\"\r\nimport type { GridOptions } from \"../types/GridOptions\"\r\n\r\nconst getIndex = (col: number, row: number, grid: GridData) => {\r\n\treturn row * grid.cols + col\r\n}\r\n\r\nfunction getCharOverride(cl: DOMTokenList, option: keyof GridOptions, fallback: string) {\r\n\tfor (const c of cl) {\r\n\t\tif (c.startsWith(`ascii-${option}-`)) {\r\n\t\t\treturn c.slice(`ascii-${option}-`.length)\r\n\t\t}\r\n\t}\r\n\treturn fallback\r\n}\r\n\r\nconst drawRect = ({ rect, grid }: { rect: Rect; grid: GridData }) => {\r\n\t// const rectLeft = Math.floor(rect.rect.left / grid.fontWidth) * grid.fontWidth\r\n\t// const rectRight = Math.floor(rect.rect.right / grid.fontWidth) * grid.fontWidth\r\n\t// const rectTop = Math.floor(rect.rect.top / grid.fontHeight) * grid.fontHeight\r\n\t// const rectBottom = Math.floor(rect.rect.bottom / grid.fontHeight) * grid.fontHeight\r\n\tconst invFontWidth = 1 / grid.fontWidth\r\n\tconst invFontHeight = 1 / grid.fontHeight\r\n\r\n\tconst leftCol = Math.floor(rect.rect.left * invFontWidth)\r\n\tconst rightCol = Math.floor(rect.rect.right * invFontWidth)\r\n\tconst topRow = Math.floor(rect.rect.top * invFontHeight)\r\n\tconst bottomRow = Math.floor(rect.rect.bottom * invFontHeight)\r\n\r\n\tconst cl = rect.classList\r\n\r\n\tconst hasASCII = cl.contains(\"ascii\")\r\n\tconst hasBorder = cl.contains(\"ascii-border\")\r\n\tconst hasL = cl.contains(\"ascii-border-l\")\r\n\tconst hasR = cl.contains(\"ascii-border-r\")\r\n\tconst hasT = cl.contains(\"ascii-border-t\")\r\n\tconst hasB = cl.contains(\"ascii-border-b\")\r\n\tconst hasTL = cl.contains(\"ascii-border-tl\")\r\n\tconst hasTR = cl.contains(\"ascii-border-tr\")\r\n\tconst hasBR = cl.contains(\"ascii-border-br\")\r\n\tconst hasBL = cl.contains(\"ascii-border-bl\")\r\n\tconst hasNoFill = cl.contains(\"ascii-no-fill\")\r\n\tconst hasText = cl.contains(\"ascii-text\")\r\n\r\n\tconst lChar = getCharOverride(cl, \"l\", grid.options.l)\r\n\tconst rChar = getCharOverride(cl, \"r\", grid.options.r)\r\n\tconst tChar = getCharOverride(cl, \"t\", grid.options.t)\r\n\tconst bChar = getCharOverride(cl, \"b\", grid.options.b)\r\n\tconst tlChar = getCharOverride(cl, \"tl\", grid.options.tl)\r\n\tconst trChar = getCharOverride(cl, \"tr\", grid.options.tr)\r\n\tconst brChar = getCharOverride(cl, \"br\", grid.options.br)\r\n\tconst blChar = getCharOverride(cl, \"bl\", grid.options.bl)\r\n\tconst fillChar = getCharOverride(cl, \"fill\", grid.options.fill)\r\n\tconst liChar = getCharOverride(cl, \"li\", grid.options.li)\r\n\tconst riChar = getCharOverride(cl, \"ri\", grid.options.ri)\r\n\tconst tiChar = getCharOverride(cl, \"ti\", grid.options.ti)\r\n\tconst biChar = getCharOverride(cl, \"bi\", grid.options.bi)\r\n\tconst iChar = getCharOverride(cl, \"i\", grid.options.i)\r\n\r\n\t//TODO: associate grid cells with the local options of the dom element - right now the intersections only look for the default characters\r\n\r\n\t//verticals\r\n\t//left\r\n\tif (hasL || ((hasASCII || hasBorder) && !hasR && !hasT && !hasB && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let row = topRow + 1; row < bottomRow; row++) {\r\n\t\t\tconst l = getIndex(leftCol, row, grid)\r\n\r\n\t\t\tswitch (grid.grid[l]) {\r\n\t\t\t\tcase grid.options.t:\r\n\t\t\t\tcase grid.options.b:\r\n\t\t\t\tcase grid.options.tr:\r\n\t\t\t\tcase grid.options.br:\r\n\t\t\t\t\tgrid.grid[l] = liChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[l] = lChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//right\r\n\tif (hasR || ((hasASCII || hasBorder) && !hasL && !hasT && !hasB && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let row = topRow + 1; row < bottomRow; row++) {\r\n\t\t\tconst r = getIndex(rightCol, row, grid)\r\n\r\n\t\t\tswitch (grid.grid[r]) {\r\n\t\t\t\tcase grid.options.t:\r\n\t\t\t\tcase grid.options.b:\r\n\t\t\t\tcase grid.options.tl:\r\n\t\t\t\tcase grid.options.bl:\r\n\t\t\t\t\tgrid.grid[r] = riChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[r] = rChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//horizontals\r\n\t//top\r\n\tif (hasT || ((hasASCII || hasBorder) && !hasL && !hasR && !hasB && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let col = leftCol + 1; col < rightCol; col++) {\r\n\t\t\tconst t = getIndex(col, topRow, grid)\r\n\r\n\t\t\tswitch (grid.grid[t]) {\r\n\t\t\t\tcase grid.options.l:\r\n\t\t\t\tcase grid.options.r:\r\n\t\t\t\tcase grid.options.bl:\r\n\t\t\t\tcase grid.options.br:\r\n\t\t\t\t\tgrid.grid[t] = tiChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[t] = tChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//bottom\r\n\tif (hasB || ((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let col = leftCol + 1; col < rightCol; col++) {\r\n\t\t\tconst b = getIndex(col, bottomRow, grid)\r\n\t\t\tswitch (grid.grid[b]) {\r\n\t\t\t\tcase grid.options.l:\r\n\t\t\t\tcase grid.options.r:\r\n\t\t\t\tcase grid.options.tl:\r\n\t\t\t\tcase grid.options.tr:\r\n\t\t\t\t\tgrid.grid[b] = biChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[b] = bChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//corners\r\n\t//tl\r\n\tif (\r\n\t\thasTL ||\r\n\t\t(hasT && hasL) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTR && !hasBR && !hasBL)\r\n\t) {\r\n\t\tconst tl = getIndex(leftCol, topRow, grid)\r\n\t\tswitch (grid.grid[tl]) {\r\n\t\t\tcase grid.options.t:\r\n\t\t\tcase grid.options.b:\r\n\t\t\tcase grid.options.tr:\r\n\t\t\t\tgrid.grid[tl] = biChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.l:\r\n\t\t\tcase grid.options.r:\r\n\t\t\tcase grid.options.bl:\r\n\t\t\t\tgrid.grid[tl] = riChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[tl] = iChar\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[tl] = tlChar\r\n\t\t}\r\n\t}\r\n\t//tr\r\n\tif (\r\n\t\thasTR ||\r\n\t\t(hasT && hasR) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTL && !hasBR && !hasBL)\r\n\t) {\r\n\t\tconst tr = getIndex(rightCol, topRow, grid)\r\n\t\tswitch (grid.grid[tr]) {\r\n\t\t\tcase grid.options.t:\r\n\t\t\tcase grid.options.b:\r\n\t\t\tcase grid.options.tl:\r\n\t\t\t\tgrid.grid[tr] = biChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.l:\r\n\t\t\tcase grid.options.r:\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[tr] = liChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.bl:\r\n\t\t\t\tgrid.grid[tr] = iChar\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[tr] = trChar\r\n\t\t}\r\n\t}\r\n\t//br\r\n\tif (\r\n\t\thasBR ||\r\n\t\t(hasB && hasR) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTL && !hasTR && !hasBL)\r\n\t) {\r\n\t\tconst br = getIndex(rightCol, bottomRow, grid)\r\n\t\tif (rect.type === \"textarea\") {\r\n\t\t\tgrid.grid[br] = \"▼\"\r\n\t\t} else {\r\n\t\t\tswitch (grid.grid[br]) {\r\n\t\t\t\tcase grid.options.l:\r\n\t\t\t\tcase grid.options.r:\r\n\t\t\t\tcase grid.options.tr:\r\n\t\t\t\t\tgrid.grid[br] = liChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tcase grid.options.t:\r\n\t\t\t\tcase grid.options.b:\r\n\t\t\t\tcase grid.options.bl:\r\n\t\t\t\t\tgrid.grid[br] = tiChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tcase grid.options.tl:\r\n\t\t\t\t\tgrid.grid[br] = iChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[br] = brChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//bl\r\n\tif (\r\n\t\thasBL ||\r\n\t\t(hasB && hasL) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTL && !hasTR && !hasBR)\r\n\t) {\r\n\t\tconst bl = getIndex(leftCol, bottomRow, grid)\r\n\t\tswitch (grid.grid[bl]) {\r\n\t\t\tcase grid.options.l:\r\n\t\t\tcase grid.options.r:\r\n\t\t\tcase grid.options.tl:\r\n\t\t\t\tgrid.grid[bl] = riChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.t:\r\n\t\t\tcase grid.options.b:\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[bl] = tiChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.tr:\r\n\t\t\t\tgrid.grid[bl] = iChar\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[bl] = blChar\r\n\t\t}\r\n\t}\r\n\r\n\t//fill\r\n\tif (!hasNoFill) {\r\n\t\tfor (let row = topRow + 1; row < bottomRow; row++) {\r\n\t\t\tfor (let col = leftCol + 1; col < rightCol; col++) {\r\n\t\t\t\tgrid.grid[getIndex(col, row, grid)] = fillChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//characters\r\n\tif (hasASCII || hasText) {\r\n\t\trect.characters.forEach((c) => {\r\n\t\t\tconst col = Math.floor(c.rect.left * invFontWidth)\r\n\t\t\tconst row = Math.floor(c.rect.bottom * invFontHeight)\r\n\t\t\tgrid.grid[getIndex(col, row, grid)] = c.char\r\n\t\t})\r\n\t}\r\n}\r\n\r\nfunction getElements(ref: React.RefObject<HTMLDivElement | null>): Rect[] {\r\n\tif (!ref.current) return []\r\n\treturn Array.from(ref.current.querySelectorAll<HTMLElement>('[class*=\"ascii\"]')).map((el) => {\r\n\t\t//console.log(\"element\", el)\r\n\t\tconst c: { char: string; rect: DOMRect }[] = []\r\n\t\tconst textWalker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT)\r\n\r\n\t\twhile (textWalker.nextNode()) {\r\n\t\t\tconst textNode = textWalker.currentNode as Text\r\n\t\t\tconst text = textNode.textContent ?? \"\"\r\n\r\n\t\t\tfor (let i = 0; i < text.length; i++) {\r\n\t\t\t\tif (text[i].trim() === \"\") continue\r\n\t\t\t\t//console.log(text[i])\r\n\t\t\t\tconst range = document.createRange()\r\n\t\t\t\trange.setStart(textNode, i)\r\n\t\t\t\trange.setEnd(textNode, i + 1)\r\n\r\n\t\t\t\tconst rect = range.getBoundingClientRect()\r\n\t\t\t\t//if (rect.width === 0 || rect.height === 0) continue\r\n\r\n\t\t\t\tc.push({ char: text[i], rect })\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn {\r\n\t\t\trect: el.getBoundingClientRect(),\r\n\t\t\tcharacters: c,\r\n\t\t\ttype: el.tagName.toLowerCase(),\r\n\t\t\tclassList: el.classList,\r\n\t\t}\r\n\t})\r\n}\r\n\r\nexport const ASCII = ({\r\n\tchildren,\r\n\tgridReveal = true,\r\n\trevealSpeed = 30,\r\n}: {\r\n\tchildren: React.ReactNode\r\n\tgridReveal?: boolean\r\n\trevealSpeed?: number\r\n}) => {\r\n\tconst parentRef = useRef<HTMLDivElement | null>(null)\r\n\tconst grid = useGridContext()\r\n\t//const [rects, setRects] = useState<Rect[] | null>([])\r\n\tconst rectsRef = useRef<Rect[]>([])\r\n\tconst reveal = gridReveal ? useReveal(grid.grid, revealSpeed) : grid.grid\r\n\tconst [, forceRender] = useReducer((x) => x + 1, 0)\r\n\r\n\tuseLayoutEffect(() => {\r\n\t\tif (!parentRef.current) return\r\n\r\n\t\tlet frame: number\r\n\r\n\t\tconst loop = () => {\r\n\t\t\trectsRef.current = getElements(parentRef)\r\n\t\t\tframe = requestAnimationFrame(loop)\r\n\r\n\t\t\tforceRender()\r\n\t\t}\r\n\r\n\t\tloop()\r\n\r\n\t\treturn () => cancelAnimationFrame(frame)\r\n\t}, [])\r\n\r\n\t// clear canvas\r\n\t// maybe find better way\r\n\tfor (let i = 0; i < grid.grid.length; i++) {\r\n\t\tgrid.grid[i] = String.fromCharCode(160)\r\n\t}\r\n\r\n\trectsRef.current.forEach((rect) => {\r\n\t\tdrawRect({ rect, grid })\r\n\t})\r\n\r\n\treturn (\r\n\t\t<div ref={parentRef} className=\"leading-none\">\r\n\t\t\t<div\r\n\t\t\t\tstyle={{ width: grid.truncWidth, height: grid.truncHeight }}\r\n\t\t\t\t//className=\"absolute top-0 left-0 bg-none pointer-events-none\"\r\n\t\t\t\tclassName=\"absolute bg-transparent text-transparent border-transparent shadow-none ring-0 top-0 left-0 bg-none pointer-events-none\"\r\n\t\t\t>\r\n\t\t\t\t{children}\r\n\t\t\t</div>\r\n\t\t\t{parentRef.current && rectsRef.current && (\r\n\t\t\t\t<div style={{ width: grid.truncWidth, height: grid.truncHeight }}>\r\n\t\t\t\t\t{Array.from({ length: grid.rows }, (_, r) => {\r\n\t\t\t\t\t\tlet str = \"\"\r\n\t\t\t\t\t\tconst start = r * grid.cols\r\n\t\t\t\t\t\tconst end = start + grid.cols\r\n\r\n\t\t\t\t\t\tfor (let i = start; i < end; i++) {\r\n\t\t\t\t\t\t\tstr += reveal[i] ?? String.fromCharCode(160)\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn <p key={r}>{str}</p>\r\n\t\t\t\t\t})}\r\n\t\t\t\t</div>\r\n\t\t\t\t// <div style={{ width: grid.truncWidth, height: grid.truncHeight }} className=\"leading-none wrap-break-word\">\r\n\t\t\t\t// \t{String.raw`${reveal.join(\"\")}`}\r\n\t\t\t\t// </div>\r\n\t\t\t)}\r\n\t\t</div>\r\n\t)\r\n}\r\n","import { useEffect, useState } from \"react\"\r\n\r\nexport function useWindowDimensions() {\r\n\tconst [dimensions, setDimensions] = useState({\r\n\t\twidth: 0,\r\n\t\theight: 0,\r\n\t})\r\n\tuseEffect(() => {\r\n\t\tconst update = () => setDimensions({ width: window.innerWidth, height: window.innerHeight })\r\n\r\n\t\tupdate() // Set initial size\r\n\t\twindow.addEventListener(\"resize\", update)\r\n\t\treturn () => window.removeEventListener(\"resize\", update)\r\n\t}, [])\r\n\r\n\treturn dimensions\r\n}\r\n","import { useMemo } from \"react\"\r\nimport { GridContext } from \"../contexts/GridContext\"\r\nimport { useWindowDimensions } from \"../hooks/useWindowDimensions\"\r\nimport type { ASCIIProviderProps } from \"../types/ASCIIProviderProps\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport type { GridOptions } from \"../types/GridOptions\"\r\nimport { defaultOptions } from \"../utils/defaultOptions\"\r\n\r\nfunction initGrid({ width, height, ...options }: { width: number; height: number } & Partial<GridOptions>): GridData {\r\n\tconst mergedOptions: GridOptions = {\r\n\t\t...defaultOptions,\r\n\t\t...options,\r\n\t}\r\n\tconst fontHeight = 16\r\n\tconst courierRatio = 1229 / 2048\r\n\tconst fontWidth = fontHeight * courierRatio\r\n\tconst truncWidth = width - (width % fontWidth)\r\n\tconst truncHeight = height - (height % fontHeight)\r\n\tconst rows = Math.floor(truncHeight / fontHeight)\r\n\tconst cols = Math.floor(truncWidth / fontWidth)\r\n\tconst grid = Array.from({ length: rows * cols }, () => mergedOptions.fill)\r\n\treturn {\r\n\t\tfontHeight,\r\n\t\tcourierRatio,\r\n\t\tfontWidth,\r\n\t\ttruncWidth,\r\n\t\ttruncHeight,\r\n\t\twindowWidth: width,\r\n\t\twindowHeight: height,\r\n\t\trows,\r\n\t\tcols,\r\n\t\tgrid,\r\n\t\toptions: mergedOptions,\r\n\t}\r\n}\r\n\r\nexport function ASCIIProvider({ children, ...options }: ASCIIProviderProps) {\r\n\t// const parentGrid = useContext(GridContext)\r\n\r\n\t// // if a grid already exists, reuse it\r\n\t// if (parentGrid) {\r\n\t// \treturn <GridContext.Provider value={parentGrid}>{children}</GridContext.Provider>\r\n\t// }\r\n\r\n\tconst { width, height } = useWindowDimensions()\r\n\tconst grid = useMemo(() => initGrid({ width, height, ...options }), [width, height, options])\r\n\t//const grid = initGrid({ width, height, ...options })\r\n\treturn <GridContext.Provider value={grid}>{children}</GridContext.Provider>\r\n}\r\n"],"names":["defaultOptions","GridContext","createContext","useGridContext","useContext","useReveal","grid","speed","index","setIndex","useState","useEffect","frame","loop","i","getIndex","col","row","getCharOverride","cl","option","fallback","c","drawRect","rect","invFontWidth","invFontHeight","leftCol","rightCol","topRow","bottomRow","hasASCII","hasBorder","hasL","hasR","hasT","hasB","hasTL","hasTR","hasBR","hasBL","hasNoFill","hasText","lChar","rChar","tChar","bChar","tlChar","trChar","brChar","blChar","fillChar","liChar","riChar","tiChar","biChar","iChar","l","r","t","b","tl","tr","br","bl","getElements","ref","el","textWalker","textNode","text","range","ASCII","children","gridReveal","revealSpeed","parentRef","useRef","rectsRef","reveal","forceRender","useReducer","x","useLayoutEffect","jsxs","jsx","_","str","start","end","useWindowDimensions","dimensions","setDimensions","update","initGrid","width","height","options","mergedOptions","fontHeight","courierRatio","fontWidth","truncWidth","truncHeight","rows","cols","ASCIIProvider","useMemo"],"mappings":"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"}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode('@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--spacing:.25rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.top-0{top:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.m-2{margin:calc(var(--spacing)*2)}.m-4{margin:calc(var(--spacing)*4)}.
|
|
2
|
-
(function(
|
|
1
|
+
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode('@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--spacing:.25rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.top-0{top:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.m-2{margin:calc(var(--spacing)*2)}.m-4{margin:calc(var(--spacing)*4)}.flex{display:flex}.grid{display:grid}.h-8{height:calc(var(--spacing)*8)}.h-12{height:calc(var(--spacing)*12)}.h-24{height:calc(var(--spacing)*24)}.h-32{height:calc(var(--spacing)*32)}.h-64{height:calc(var(--spacing)*64)}.h-72{height:calc(var(--spacing)*72)}.w-64{width:calc(var(--spacing)*64)}.w-96{width:calc(var(--spacing)*96)}.w-\\[500px\\]{width:500px}.w-\\[1000px\\]{width:1000px}.w-full{width:100%}.cursor-grab{cursor:grab}.resize{resize:both}.justify-center{justify-content:center}.border{border-style:var(--tw-border-style);border-width:1px}.border-transparent{border-color:#0000}.bg-transparent{background-color:#0000}.bg-none{background-image:none}.p-4{padding:calc(var(--spacing)*4)}.text-center{text-align:center}.leading-none{--tw-leading:1;line-height:1}.wrap-break-word{overflow-wrap:break-word}.whitespace-pre{white-space:pre}.text-transparent{color:#0000}.underline{text-decoration-line:underline}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}:root{height:100vh;margin:calc(var(--spacing)*0);font-family:Courier New,Courier,monospace}body,#root{height:100vh}a,button,input,textarea,select,area,label,details,summary{pointer-events:auto}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}')),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}})();
|
|
2
|
+
(function(d,v){typeof exports=="object"&&typeof module<"u"?v(exports,require("react/jsx-runtime"),require("react")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react"],v):(d=typeof globalThis<"u"?globalThis:d||self,v(d["html-to-ascii"]={},d.jsxRuntime,d.React))})(this,(function(d,v,m){"use strict";const M={t:"─",ti:"┴",b:"─",bi:"┬",l:"│",li:"┤",r:"│",ri:"├",tl:"┌",tr:"┐",br:"┘",bl:"└",i:"┼",fill:" "},T=m.createContext({fontHeight:0,courierRatio:0,fontWidth:0,truncWidth:0,truncHeight:0,windowWidth:0,windowHeight:0,rows:0,cols:0,grid:[],options:M}),F=()=>m.useContext(T);function N(s,t=1){const[c,r]=m.useState(0);return m.useEffect(()=>{let n;const l=()=>{r(i=>i>=s.length?i:i+t),n=requestAnimationFrame(l)};return l(),()=>cancelAnimationFrame(n)},[s,t]),s.slice(0,c)}const x=(s,t,c)=>t*c.cols+s;function p(s,t,c){for(const r of s)if(r.startsWith(`ascii-${t}-`))return r.slice(`ascii-${t}-`.length);return c}const j=({rect:s,grid:t})=>{const c=1/t.fontWidth,r=1/t.fontHeight,n=Math.floor(s.rect.left*c),l=Math.floor(s.rect.right*c),i=Math.floor(s.rect.top*r),f=Math.floor(s.rect.bottom*r),e=s.classList,h=e.contains("ascii"),b=e.contains("ascii-border"),u=e.contains("ascii-border-l"),C=e.contains("ascii-border-r"),w=e.contains("ascii-border-t"),k=e.contains("ascii-border-b"),R=e.contains("ascii-border-tl"),W=e.contains("ascii-border-tr"),S=e.contains("ascii-border-br"),y=e.contains("ascii-border-bl"),z=e.contains("ascii-no-fill"),D=e.contains("ascii-text"),_=p(e,"l",t.options.l),$=p(e,"r",t.options.r),X=p(e,"t",t.options.t),J=p(e,"b",t.options.b),K=p(e,"tl",t.options.tl),Q=p(e,"tr",t.options.tr),U=p(e,"br",t.options.br),V=p(e,"bl",t.options.bl),Y=p(e,"fill",t.options.fill),H=p(e,"li",t.options.li),I=p(e,"ri",t.options.ri),E=p(e,"ti",t.options.ti),L=p(e,"bi",t.options.bi),A=p(e,"i",t.options.i);if(u||(h||b)&&!C&&!w&&!k&&!R&&!W&&!S&&!y)for(let o=i+1;o<f;o++){const a=x(n,o,t);switch(t.grid[a]){case t.options.t:case t.options.b:case t.options.tr:case t.options.br:t.grid[a]=H;break;default:t.grid[a]=_}}if(C||(h||b)&&!u&&!w&&!k&&!R&&!W&&!S&&!y)for(let o=i+1;o<f;o++){const a=x(l,o,t);switch(t.grid[a]){case t.options.t:case t.options.b:case t.options.tl:case t.options.bl:t.grid[a]=I;break;default:t.grid[a]=$}}if(w||(h||b)&&!u&&!C&&!k&&!R&&!W&&!S&&!y)for(let o=n+1;o<l;o++){const a=x(o,i,t);switch(t.grid[a]){case t.options.l:case t.options.r:case t.options.bl:case t.options.br:t.grid[a]=E;break;default:t.grid[a]=X}}if(k||(h||b)&&!u&&!C&&!w&&!R&&!W&&!S&&!y)for(let o=n+1;o<l;o++){const a=x(o,f,t);switch(t.grid[a]){case t.options.l:case t.options.r:case t.options.tl:case t.options.tr:t.grid[a]=L;break;default:t.grid[a]=J}}if(R||w&&u||(h||b)&&!u&&!C&&!w&&!k&&!W&&!S&&!y){const o=x(n,i,t);switch(t.grid[o]){case t.options.t:case t.options.b:case t.options.tr:t.grid[o]=L;break;case t.options.l:case t.options.r:case t.options.bl:t.grid[o]=I;break;case t.options.br:t.grid[o]=A;break;default:t.grid[o]=K}}if(W||w&&C||(h||b)&&!u&&!C&&!w&&!k&&!R&&!S&&!y){const o=x(l,i,t);switch(t.grid[o]){case t.options.t:case t.options.b:case t.options.tl:t.grid[o]=L;break;case t.options.l:case t.options.r:case t.options.br:t.grid[o]=H;break;case t.options.bl:t.grid[o]=A;break;default:t.grid[o]=Q}}if(S||k&&C||(h||b)&&!u&&!C&&!w&&!k&&!R&&!W&&!y){const o=x(l,f,t);if(s.type==="textarea")t.grid[o]="▼";else switch(t.grid[o]){case t.options.l:case t.options.r:case t.options.tr:t.grid[o]=H;break;case t.options.t:case t.options.b:case t.options.bl:t.grid[o]=E;break;case t.options.tl:t.grid[o]=A;break;default:t.grid[o]=U}}if(y||k&&u||(h||b)&&!u&&!C&&!w&&!k&&!R&&!W&&!S){const o=x(n,f,t);switch(t.grid[o]){case t.options.l:case t.options.r:case t.options.tl:t.grid[o]=I;break;case t.options.t:case t.options.b:case t.options.br:t.grid[o]=E;break;case t.options.tr:t.grid[o]=A;break;default:t.grid[o]=V}}if(!z)for(let o=i+1;o<f;o++)for(let a=n+1;a<l;a++)t.grid[x(a,o,t)]=Y;(h||D)&&s.characters.forEach(o=>{const a=Math.floor(o.rect.left*c),Z=Math.floor(o.rect.bottom*r);t.grid[x(a,Z,t)]=o.char})};function B(s){return s.current?Array.from(s.current.querySelectorAll('[class*="ascii"]')).map(t=>{const c=[],r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;r.nextNode();){const n=r.currentNode,l=n.textContent??"";for(let i=0;i<l.length;i++){if(l[i].trim()==="")continue;const f=document.createRange();f.setStart(n,i),f.setEnd(n,i+1);const e=f.getBoundingClientRect();c.push({char:l[i],rect:e})}}return{rect:t.getBoundingClientRect(),characters:c,type:t.tagName.toLowerCase(),classList:t.classList}}):[]}const q=({children:s,gridReveal:t=!0,revealSpeed:c=30})=>{const r=m.useRef(null),n=F(),l=m.useRef([]),i=t?N(n.grid,c):n.grid,[,f]=m.useReducer(e=>e+1,0);m.useLayoutEffect(()=>{if(!r.current)return;let e;const h=()=>{l.current=B(r),e=requestAnimationFrame(h),f()};return h(),()=>cancelAnimationFrame(e)},[]);for(let e=0;e<n.grid.length;e++)n.grid[e]=" ";return l.current.forEach(e=>{j({rect:e,grid:n})}),v.jsxs("div",{ref:r,className:"leading-none",children:[v.jsx("div",{style:{width:n.truncWidth,height:n.truncHeight},className:"absolute bg-transparent text-transparent border-transparent shadow-none ring-0 top-0 left-0 bg-none pointer-events-none",children:s}),r.current&&l.current&&v.jsx("div",{style:{width:n.truncWidth,height:n.truncHeight},children:Array.from({length:n.rows},(e,h)=>{let b="";const u=h*n.cols,C=u+n.cols;for(let w=u;w<C;w++)b+=i[w]??" ";return v.jsx("p",{children:b},h)})})]})};function O(){const[s,t]=m.useState({width:0,height:0});return m.useEffect(()=>{const c=()=>t({width:window.innerWidth,height:window.innerHeight});return c(),window.addEventListener("resize",c),()=>window.removeEventListener("resize",c)},[]),s}function G({width:s,height:t,...c}){const r={...M,...c},n=16,l=1229/2048,i=n*l,f=s-s%i,e=t-t%n,h=Math.floor(e/n),b=Math.floor(f/i),u=Array.from({length:h*b},()=>r.fill);return{fontHeight:n,courierRatio:l,fontWidth:i,truncWidth:f,truncHeight:e,windowWidth:s,windowHeight:t,rows:h,cols:b,grid:u,options:r}}function P({children:s,...t}){const{width:c,height:r}=O(),n=m.useMemo(()=>G({width:c,height:r,...t}),[c,r,t]);return v.jsx(T.Provider,{value:n,children:s})}d.ASCII=q,d.ASCIIProvider=P,d.useGridContext=F,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
|
|
3
3
|
//# sourceMappingURL=index.umd.js.map
|
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../lib/utils/defaultOptions.tsx","../lib/contexts/GridContext.tsx","../lib/hooks/useGridContext.tsx","../lib/hooks/useReveal.tsx","../lib/components/ASCII.tsx","../lib/hooks/useWindowDimensions.tsx","../lib/providers/ASCIIProvider.tsx"],"sourcesContent":["import type { GridOptions } from \"../types/GridOptions\"\r\n\r\nexport const defaultOptions: GridOptions = {\r\n\tt: \"─\",\r\n\tti: \"┴\",\r\n\tb: \"─\",\r\n\tbi: \"┬\",\r\n\tl: \"│\",\r\n\tli: \"┤\",\r\n\tr: \"│\",\r\n\tri: \"├\",\r\n\ttl: \"┌\",\r\n\ttr: \"┐\",\r\n\tbr: \"┘\",\r\n\tbl: \"└\",\r\n\ti: \"┼\",\r\n\tfill: String.fromCharCode(160),\r\n}\r\n","import { createContext } from \"react\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport { defaultOptions } from \"../utils/defaultOptions\"\r\n\r\nexport const GridContext = createContext<GridData>({\r\n\tfontHeight: 0,\r\n\tcourierRatio: 0,\r\n\tfontWidth: 0,\r\n\ttruncWidth: 0,\r\n\ttruncHeight: 0,\r\n\twindowWidth: 0,\r\n\twindowHeight: 0,\r\n\trows: 0,\r\n\tcols: 0,\r\n\tgrid: [],\r\n\toptions: defaultOptions,\r\n})\r\n","import { useContext } from \"react\"\r\nimport { GridContext } from \"../contexts/GridContext\"\r\n\r\nexport const useGridContext = () => {\r\n\treturn useContext(GridContext)\r\n}\r\n","import { useEffect, useState } from \"react\"\r\n\r\nexport function useReveal(grid: string[], speed = 1) {\r\n\tconst [index, setIndex] = useState(0)\r\n\tuseEffect(() => {\r\n\t\tlet frame: number\r\n\r\n\t\tconst loop = () => {\r\n\t\t\tsetIndex((i) => {\r\n\t\t\t\tif (i >= grid.length) return i\r\n\t\t\t\treturn i + speed\r\n\t\t\t})\r\n\r\n\t\t\tframe = requestAnimationFrame(loop)\r\n\t\t}\r\n\r\n\t\tloop()\r\n\r\n\t\treturn () => cancelAnimationFrame(frame)\r\n\t}, [grid, speed])\r\n\r\n\treturn grid.slice(0, index)\r\n}\r\n","import { useLayoutEffect, useReducer, useRef } from \"react\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport type { Rect } from \"../types/Rect\"\r\nimport { useGridContext } from \"../hooks/useGridContext\"\r\nimport { useReveal } from \"../hooks/useReveal\"\r\nimport type { GridOptions } from \"../types/GridOptions\"\r\n\r\nconst getIndex = (x: number, y: number, grid: GridData) => {\r\n\tconst col = (x / grid.fontWidth) | 0\r\n\tconst row = (y / grid.fontHeight) | 0\r\n\treturn row * grid.cols + col\r\n}\r\n\r\nfunction getCharOverride(cl: DOMTokenList, option: keyof GridOptions, fallback: string) {\r\n\tfor (const c of cl) {\r\n\t\tif (c.startsWith(`ascii-${option}-`)) {\r\n\t\t\treturn c.slice(`ascii-${option}-`.length)\r\n\t\t}\r\n\t}\r\n\treturn fallback\r\n}\r\n\r\nconst drawRect = ({ rect, grid }: { rect: Rect; grid: GridData }) => {\r\n\tconst rectLeft = Math.floor(rect.rect.left / grid.fontWidth) * grid.fontWidth\r\n\tconst rectRight = Math.floor(rect.rect.right / grid.fontWidth) * grid.fontWidth\r\n\tconst rectTop = Math.floor(rect.rect.top / grid.fontHeight) * grid.fontHeight\r\n\tconst rectBottom = Math.floor(rect.rect.bottom / grid.fontHeight) * grid.fontHeight\r\n\r\n\tconst cl = rect.classList\r\n\r\n\tconst hasASCII = cl.contains(\"ascii\")\r\n\tconst hasBorder = cl.contains(\"ascii-border\")\r\n\tconst hasL = cl.contains(\"ascii-border-l\")\r\n\tconst hasR = cl.contains(\"ascii-border-r\")\r\n\tconst hasT = cl.contains(\"ascii-border-t\")\r\n\tconst hasB = cl.contains(\"ascii-border-b\")\r\n\tconst hasTL = cl.contains(\"ascii-border-tl\")\r\n\tconst hasTR = cl.contains(\"ascii-border-tr\")\r\n\tconst hasBR = cl.contains(\"ascii-border-br\")\r\n\tconst hasBL = cl.contains(\"ascii-border-bl\")\r\n\tconst hasNoFill = cl.contains(\"ascii-no-fill\")\r\n\tconst hasText = cl.contains(\"ascii-text\")\r\n\r\n\tconst lChar = getCharOverride(cl, \"l\", grid.options.l)\r\n\tconst rChar = getCharOverride(cl, \"r\", grid.options.r)\r\n\tconst tChar = getCharOverride(cl, \"t\", grid.options.t)\r\n\tconst bChar = getCharOverride(cl, \"b\", grid.options.b)\r\n\tconst tlChar = getCharOverride(cl, \"tl\", grid.options.tl)\r\n\tconst trChar = getCharOverride(cl, \"tr\", grid.options.tr)\r\n\tconst brChar = getCharOverride(cl, \"br\", grid.options.br)\r\n\tconst blChar = getCharOverride(cl, \"bl\", grid.options.bl)\r\n\tconst fillChar = getCharOverride(cl, \"fill\", grid.options.fill)\r\n\tconst liChar = getCharOverride(cl, \"li\", grid.options.li)\r\n\tconst riChar = getCharOverride(cl, \"ri\", grid.options.ri)\r\n\tconst tiChar = getCharOverride(cl, \"ti\", grid.options.ti)\r\n\tconst biChar = getCharOverride(cl, \"bi\", grid.options.bi)\r\n\tconst iChar = getCharOverride(cl, \"i\", grid.options.i)\r\n\r\n\t//TODO: associate grid cells with the local options of the dom element - right now the intersections only look for the default characters\r\n\r\n\t//verticals\r\n\t//left\r\n\tif (hasL || ((hasASCII || hasBorder) && !hasR && !hasT && !hasB && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let i = rectTop + grid.fontHeight; i < rectBottom; i += grid.fontHeight) {\r\n\t\t\tconst l = getIndex(rectLeft, i, grid)\r\n\r\n\t\t\tswitch (grid.grid[l]) {\r\n\t\t\t\tcase grid.options.t:\r\n\t\t\t\tcase grid.options.b:\r\n\t\t\t\tcase grid.options.tr:\r\n\t\t\t\tcase grid.options.br:\r\n\t\t\t\t\tgrid.grid[l] = liChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[l] = lChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//right\r\n\tif (hasR || ((hasASCII || hasBorder) && !hasL && !hasT && !hasB && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let i = rectTop + grid.fontHeight; i < rectBottom; i += grid.fontHeight) {\r\n\t\t\tconst r = getIndex(rectRight, i, grid)\r\n\r\n\t\t\tswitch (grid.grid[r]) {\r\n\t\t\t\tcase grid.options.t:\r\n\t\t\t\tcase grid.options.b:\r\n\t\t\t\tcase grid.options.tl:\r\n\t\t\t\tcase grid.options.bl:\r\n\t\t\t\t\tgrid.grid[r] = riChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[r] = rChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//horizontals\r\n\t//top\r\n\tif (hasT || ((hasASCII || hasBorder) && !hasL && !hasR && !hasB && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let i = rectLeft + grid.fontWidth; i < rectRight; i += grid.fontWidth) {\r\n\t\t\tconst t = getIndex(i, rectTop, grid)\r\n\r\n\t\t\tswitch (grid.grid[t]) {\r\n\t\t\t\tcase grid.options.l:\r\n\t\t\t\tcase grid.options.r:\r\n\t\t\t\tcase grid.options.bl:\r\n\t\t\t\tcase grid.options.br:\r\n\t\t\t\t\tgrid.grid[t] = tiChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[t] = tChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//bottom\r\n\tif (hasB || ((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let i = rectLeft + grid.fontWidth; i < rectRight; i += grid.fontWidth) {\r\n\t\t\tconst b = getIndex(i, rectBottom, grid)\r\n\t\t\tswitch (grid.grid[b]) {\r\n\t\t\t\tcase grid.options.l:\r\n\t\t\t\tcase grid.options.r:\r\n\t\t\t\tcase grid.options.tl:\r\n\t\t\t\tcase grid.options.tr:\r\n\t\t\t\t\tgrid.grid[b] = biChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[b] = bChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//corners\r\n\t//tl\r\n\tif (\r\n\t\thasTL ||\r\n\t\t(hasT && hasL) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTR && !hasBR && !hasBL)\r\n\t) {\r\n\t\tconst tl = getIndex(rectLeft, rectTop, grid)\r\n\t\tswitch (grid.grid[tl]) {\r\n\t\t\tcase grid.options.t:\r\n\t\t\tcase grid.options.b:\r\n\t\t\tcase grid.options.tr:\r\n\t\t\t\tgrid.grid[tl] = biChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.l:\r\n\t\t\tcase grid.options.r:\r\n\t\t\tcase grid.options.bl:\r\n\t\t\t\tgrid.grid[tl] = riChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[tl] = iChar\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[tl] = tlChar\r\n\t\t}\r\n\t}\r\n\t//tr\r\n\tif (\r\n\t\thasTR ||\r\n\t\t(hasT && hasR) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTL && !hasBR && !hasBL)\r\n\t) {\r\n\t\tconst tr = getIndex(rectRight, rectTop, grid)\r\n\t\tswitch (grid.grid[tr]) {\r\n\t\t\tcase grid.options.t:\r\n\t\t\tcase grid.options.b:\r\n\t\t\tcase grid.options.tl:\r\n\t\t\t\tgrid.grid[tr] = biChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.l:\r\n\t\t\tcase grid.options.r:\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[tr] = liChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.bl:\r\n\t\t\t\tgrid.grid[tr] = iChar\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[tr] = trChar\r\n\t\t}\r\n\t}\r\n\t//br\r\n\tif (\r\n\t\thasBR ||\r\n\t\t(hasB && hasR) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTL && !hasTR && !hasBL)\r\n\t) {\r\n\t\tconst br = getIndex(rectRight, rectBottom, grid)\r\n\t\tif (rect.type === \"textarea\") {\r\n\t\t\tgrid.grid[br] = \"▼\"\r\n\t\t} else {\r\n\t\t\tswitch (grid.grid[br]) {\r\n\t\t\t\tcase grid.options.l:\r\n\t\t\t\tcase grid.options.r:\r\n\t\t\t\tcase grid.options.tr:\r\n\t\t\t\t\tgrid.grid[br] = liChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tcase grid.options.t:\r\n\t\t\t\tcase grid.options.b:\r\n\t\t\t\tcase grid.options.bl:\r\n\t\t\t\t\tgrid.grid[br] = tiChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tcase grid.options.tl:\r\n\t\t\t\t\tgrid.grid[br] = iChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[br] = brChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//bl\r\n\tif (\r\n\t\thasBL ||\r\n\t\t(hasB && hasL) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTL && !hasTR && !hasBR)\r\n\t) {\r\n\t\tconst bl = getIndex(rectLeft, rectBottom, grid)\r\n\t\tswitch (grid.grid[bl]) {\r\n\t\t\tcase grid.options.l:\r\n\t\t\tcase grid.options.r:\r\n\t\t\tcase grid.options.tl:\r\n\t\t\t\tgrid.grid[bl] = riChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.t:\r\n\t\t\tcase grid.options.b:\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[bl] = tiChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.tr:\r\n\t\t\t\tgrid.grid[bl] = iChar\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[bl] = blChar\r\n\t\t}\r\n\t}\r\n\r\n\t//fill\r\n\tif (!hasNoFill) {\r\n\t\tfor (let y = rectTop + grid.fontHeight; y < rectBottom; y += grid.fontHeight) {\r\n\t\t\tfor (let x = rectLeft + grid.fontWidth; x < rectRight; x += grid.fontWidth) {\r\n\t\t\t\tgrid.grid[getIndex(x, y, grid)] = fillChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//characters\r\n\tif (hasASCII || hasText) {\r\n\t\trect.characters.forEach((c) => {\r\n\t\t\tconst cRectLeft = Math.round(c.rect.left / grid.fontWidth) * grid.fontWidth\r\n\t\t\tconst cRectBottom = Math.round(c.rect.bottom / grid.fontHeight) * grid.fontHeight\r\n\t\t\tgrid.grid[getIndex(cRectLeft, cRectBottom, grid)] = c.char\r\n\t\t})\r\n\t}\r\n}\r\n\r\nfunction getElements(ref: React.RefObject<HTMLDivElement | null>): Rect[] {\r\n\tif (!ref.current) return []\r\n\treturn Array.from(ref.current.querySelectorAll<HTMLElement>('[class*=\"ascii\"]')).map((el) => {\r\n\t\t//console.log(\"element\", el)\r\n\t\tconst c: { char: string; rect: DOMRect }[] = []\r\n\t\tconst textWalker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT)\r\n\r\n\t\twhile (textWalker.nextNode()) {\r\n\t\t\tconst textNode = textWalker.currentNode as Text\r\n\t\t\tconst text = textNode.textContent ?? \"\"\r\n\r\n\t\t\tfor (let i = 0; i < text.length; i++) {\r\n\t\t\t\tif (text[i].trim() === \"\") continue\r\n\t\t\t\t//console.log(text[i])\r\n\t\t\t\tconst range = document.createRange()\r\n\t\t\t\trange.setStart(textNode, i)\r\n\t\t\t\trange.setEnd(textNode, i + 1)\r\n\r\n\t\t\t\tconst rect = range.getBoundingClientRect()\r\n\t\t\t\t//if (rect.width === 0 || rect.height === 0) continue\r\n\r\n\t\t\t\tc.push({ char: text[i], rect })\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn {\r\n\t\t\trect: el.getBoundingClientRect(),\r\n\t\t\tcharacters: c,\r\n\t\t\ttype: el.tagName.toLowerCase(),\r\n\t\t\tclassList: el.classList,\r\n\t\t}\r\n\t})\r\n}\r\n\r\nexport const ASCII = ({\r\n\tchildren,\r\n\tgridReveal = true,\r\n\trevealSpeed = 30,\r\n}: {\r\n\tchildren: React.ReactNode\r\n\tgridReveal?: boolean\r\n\trevealSpeed?: number\r\n}) => {\r\n\tconst parentRef = useRef<HTMLDivElement | null>(null)\r\n\tconst grid = useGridContext()\r\n\t//const [rects, setRects] = useState<Rect[] | null>([])\r\n\tconst rectsRef = useRef<Rect[]>([])\r\n\tconst reveal = gridReveal ? useReveal(grid.grid, revealSpeed) : grid.grid\r\n\tconst [, forceRender] = useReducer((x) => x + 1, 0)\r\n\r\n\tuseLayoutEffect(() => {\r\n\t\tif (!parentRef.current) return\r\n\r\n\t\tlet frame: number\r\n\r\n\t\tconst loop = () => {\r\n\t\t\trectsRef.current = getElements(parentRef)\r\n\t\t\tframe = requestAnimationFrame(loop)\r\n\r\n\t\t\tforceRender()\r\n\t\t}\r\n\r\n\t\tloop()\r\n\r\n\t\treturn () => cancelAnimationFrame(frame)\r\n\t}, [])\r\n\r\n\t// clear canvas\r\n\t// maybe find better way\r\n\tfor (let i = 0; i < grid.grid.length; i++) {\r\n\t\tgrid.grid[i] = String.fromCharCode(160)\r\n\t}\r\n\r\n\trectsRef.current.forEach((rect) => {\r\n\t\tdrawRect({ rect, grid })\r\n\t})\r\n\r\n\treturn (\r\n\t\t<div ref={parentRef} className=\"leading-none\">\r\n\t\t\t<div\r\n\t\t\t\tstyle={{ width: grid.truncWidth, height: grid.truncHeight }}\r\n\t\t\t\tclassName=\"absolute opacity-0 top-0 left-0 bg-none pointer-events-none\"\r\n\t\t\t>\r\n\t\t\t\t{children}\r\n\t\t\t</div>\r\n\t\t\t{parentRef.current && rectsRef.current && (\r\n\t\t\t\t<div style={{ width: grid.truncWidth, height: grid.truncHeight }}>\r\n\t\t\t\t\t{Array.from({ length: grid.rows }, (_, r) => {\r\n\t\t\t\t\t\tlet str = \"\"\r\n\t\t\t\t\t\tconst start = r * grid.cols\r\n\t\t\t\t\t\tconst end = start + grid.cols\r\n\r\n\t\t\t\t\t\tfor (let i = start; i < end; i++) {\r\n\t\t\t\t\t\t\tstr += reveal[i] ?? String.fromCharCode(160)\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn <p key={r}>{str}</p>\r\n\t\t\t\t\t})}\r\n\t\t\t\t</div>\r\n\t\t\t\t// <div style={{ width: grid.truncWidth, height: grid.truncHeight }} className=\"leading-none wrap-break-word\">\r\n\t\t\t\t// \t{String.raw`${reveal.join(\"\")}`}\r\n\t\t\t\t// </div>\r\n\t\t\t)}\r\n\t\t</div>\r\n\t)\r\n}\r\n","import { useEffect, useState } from \"react\"\r\n\r\nexport function useWindowDimensions() {\r\n\tconst [dimensions, setDimensions] = useState({\r\n\t\twidth: 0,\r\n\t\theight: 0,\r\n\t})\r\n\tuseEffect(() => {\r\n\t\tconst update = () => setDimensions({ width: window.innerWidth, height: window.innerHeight })\r\n\r\n\t\tupdate() // Set initial size\r\n\t\twindow.addEventListener(\"resize\", update)\r\n\t\treturn () => window.removeEventListener(\"resize\", update)\r\n\t}, [])\r\n\r\n\treturn dimensions\r\n}\r\n","import { useMemo } from \"react\"\r\nimport { GridContext } from \"../contexts/GridContext\"\r\nimport { useWindowDimensions } from \"../hooks/useWindowDimensions\"\r\nimport type { ASCIIProviderProps } from \"../types/ASCIIProviderProps\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport type { GridOptions } from \"../types/GridOptions\"\r\nimport { defaultOptions } from \"../utils/defaultOptions\"\r\n\r\nfunction initGrid({ width, height, ...options }: { width: number; height: number } & Partial<GridOptions>): GridData {\r\n\tconst mergedOptions: GridOptions = {\r\n\t\t...defaultOptions,\r\n\t\t...options,\r\n\t}\r\n\tconst fontHeight = 16\r\n\tconst courierRatio = 1229 / 2048\r\n\tconst fontWidth = fontHeight * courierRatio\r\n\tconst truncWidth = width - (width % fontWidth)\r\n\tconst truncHeight = height - (height % fontHeight)\r\n\tconst rows = Math.floor(truncHeight / fontHeight)\r\n\tconst cols = Math.floor(truncWidth / fontWidth)\r\n\tconst grid = Array.from({ length: rows * cols }, () => mergedOptions.fill)\r\n\treturn {\r\n\t\tfontHeight,\r\n\t\tcourierRatio,\r\n\t\tfontWidth,\r\n\t\ttruncWidth,\r\n\t\ttruncHeight,\r\n\t\twindowWidth: width,\r\n\t\twindowHeight: height,\r\n\t\trows,\r\n\t\tcols,\r\n\t\tgrid,\r\n\t\toptions: mergedOptions,\r\n\t}\r\n}\r\n\r\nexport function ASCIIProvider({ children, ...options }: ASCIIProviderProps) {\r\n\t// const parentGrid = useContext(GridContext)\r\n\r\n\t// // if a grid already exists, reuse it\r\n\t// if (parentGrid) {\r\n\t// \treturn <GridContext.Provider value={parentGrid}>{children}</GridContext.Provider>\r\n\t// }\r\n\r\n\tconst { width, height } = useWindowDimensions()\r\n\tconst grid = useMemo(() => initGrid({ width, height, ...options }), [width, height, options])\r\n\t//const grid = initGrid({ width, height, ...options })\r\n\treturn <GridContext.Provider value={grid}>{children}</GridContext.Provider>\r\n}\r\n"],"names":["defaultOptions","GridContext","createContext","useGridContext","useContext","useReveal","grid","speed","index","setIndex","useState","useEffect","frame","loop","i","getIndex","x","y","col","getCharOverride","cl","option","fallback","c","drawRect","rect","rectLeft","rectRight","rectTop","rectBottom","hasASCII","hasBorder","hasL","hasR","hasT","hasB","hasTL","hasTR","hasBR","hasBL","hasNoFill","hasText","lChar","rChar","tChar","bChar","tlChar","trChar","brChar","blChar","fillChar","liChar","riChar","tiChar","biChar","iChar","l","t","b","tl","tr","br","bl","cRectLeft","cRectBottom","getElements","ref","el","textWalker","textNode","text","range","ASCII","children","gridReveal","revealSpeed","parentRef","useRef","rectsRef","reveal","forceRender","useReducer","useLayoutEffect","jsxs","jsx","_","r","str","start","end","useWindowDimensions","dimensions","setDimensions","update","initGrid","width","height","options","mergedOptions","fontHeight","courierRatio","fontWidth","truncWidth","truncHeight","rows","cols","ASCIIProvider","useMemo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../lib/utils/defaultOptions.tsx","../lib/contexts/GridContext.tsx","../lib/hooks/useGridContext.tsx","../lib/hooks/useReveal.tsx","../lib/components/ASCII.tsx","../lib/hooks/useWindowDimensions.tsx","../lib/providers/ASCIIProvider.tsx"],"sourcesContent":["import type { GridOptions } from \"../types/GridOptions\"\r\n\r\nexport const defaultOptions: GridOptions = {\r\n\tt: \"─\",\r\n\tti: \"┴\",\r\n\tb: \"─\",\r\n\tbi: \"┬\",\r\n\tl: \"│\",\r\n\tli: \"┤\",\r\n\tr: \"│\",\r\n\tri: \"├\",\r\n\ttl: \"┌\",\r\n\ttr: \"┐\",\r\n\tbr: \"┘\",\r\n\tbl: \"└\",\r\n\ti: \"┼\",\r\n\tfill: String.fromCharCode(160),\r\n}\r\n","import { createContext } from \"react\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport { defaultOptions } from \"../utils/defaultOptions\"\r\n\r\nexport const GridContext = createContext<GridData>({\r\n\tfontHeight: 0,\r\n\tcourierRatio: 0,\r\n\tfontWidth: 0,\r\n\ttruncWidth: 0,\r\n\ttruncHeight: 0,\r\n\twindowWidth: 0,\r\n\twindowHeight: 0,\r\n\trows: 0,\r\n\tcols: 0,\r\n\tgrid: [],\r\n\toptions: defaultOptions,\r\n})\r\n","import { useContext } from \"react\"\r\nimport { GridContext } from \"../contexts/GridContext\"\r\n\r\nexport const useGridContext = () => {\r\n\treturn useContext(GridContext)\r\n}\r\n","import { useEffect, useState } from \"react\"\r\n\r\nexport function useReveal(grid: string[], speed = 1) {\r\n\tconst [index, setIndex] = useState(0)\r\n\tuseEffect(() => {\r\n\t\tlet frame: number\r\n\r\n\t\tconst loop = () => {\r\n\t\t\tsetIndex((i) => {\r\n\t\t\t\tif (i >= grid.length) return i\r\n\t\t\t\treturn i + speed\r\n\t\t\t})\r\n\r\n\t\t\tframe = requestAnimationFrame(loop)\r\n\t\t}\r\n\r\n\t\tloop()\r\n\r\n\t\treturn () => cancelAnimationFrame(frame)\r\n\t}, [grid, speed])\r\n\r\n\treturn grid.slice(0, index)\r\n}\r\n","import { useLayoutEffect, useReducer, useRef } from \"react\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport type { Rect } from \"../types/Rect\"\r\nimport { useGridContext } from \"../hooks/useGridContext\"\r\nimport { useReveal } from \"../hooks/useReveal\"\r\nimport type { GridOptions } from \"../types/GridOptions\"\r\n\r\nconst getIndex = (col: number, row: number, grid: GridData) => {\r\n\treturn row * grid.cols + col\r\n}\r\n\r\nfunction getCharOverride(cl: DOMTokenList, option: keyof GridOptions, fallback: string) {\r\n\tfor (const c of cl) {\r\n\t\tif (c.startsWith(`ascii-${option}-`)) {\r\n\t\t\treturn c.slice(`ascii-${option}-`.length)\r\n\t\t}\r\n\t}\r\n\treturn fallback\r\n}\r\n\r\nconst drawRect = ({ rect, grid }: { rect: Rect; grid: GridData }) => {\r\n\t// const rectLeft = Math.floor(rect.rect.left / grid.fontWidth) * grid.fontWidth\r\n\t// const rectRight = Math.floor(rect.rect.right / grid.fontWidth) * grid.fontWidth\r\n\t// const rectTop = Math.floor(rect.rect.top / grid.fontHeight) * grid.fontHeight\r\n\t// const rectBottom = Math.floor(rect.rect.bottom / grid.fontHeight) * grid.fontHeight\r\n\tconst invFontWidth = 1 / grid.fontWidth\r\n\tconst invFontHeight = 1 / grid.fontHeight\r\n\r\n\tconst leftCol = Math.floor(rect.rect.left * invFontWidth)\r\n\tconst rightCol = Math.floor(rect.rect.right * invFontWidth)\r\n\tconst topRow = Math.floor(rect.rect.top * invFontHeight)\r\n\tconst bottomRow = Math.floor(rect.rect.bottom * invFontHeight)\r\n\r\n\tconst cl = rect.classList\r\n\r\n\tconst hasASCII = cl.contains(\"ascii\")\r\n\tconst hasBorder = cl.contains(\"ascii-border\")\r\n\tconst hasL = cl.contains(\"ascii-border-l\")\r\n\tconst hasR = cl.contains(\"ascii-border-r\")\r\n\tconst hasT = cl.contains(\"ascii-border-t\")\r\n\tconst hasB = cl.contains(\"ascii-border-b\")\r\n\tconst hasTL = cl.contains(\"ascii-border-tl\")\r\n\tconst hasTR = cl.contains(\"ascii-border-tr\")\r\n\tconst hasBR = cl.contains(\"ascii-border-br\")\r\n\tconst hasBL = cl.contains(\"ascii-border-bl\")\r\n\tconst hasNoFill = cl.contains(\"ascii-no-fill\")\r\n\tconst hasText = cl.contains(\"ascii-text\")\r\n\r\n\tconst lChar = getCharOverride(cl, \"l\", grid.options.l)\r\n\tconst rChar = getCharOverride(cl, \"r\", grid.options.r)\r\n\tconst tChar = getCharOverride(cl, \"t\", grid.options.t)\r\n\tconst bChar = getCharOverride(cl, \"b\", grid.options.b)\r\n\tconst tlChar = getCharOverride(cl, \"tl\", grid.options.tl)\r\n\tconst trChar = getCharOverride(cl, \"tr\", grid.options.tr)\r\n\tconst brChar = getCharOverride(cl, \"br\", grid.options.br)\r\n\tconst blChar = getCharOverride(cl, \"bl\", grid.options.bl)\r\n\tconst fillChar = getCharOverride(cl, \"fill\", grid.options.fill)\r\n\tconst liChar = getCharOverride(cl, \"li\", grid.options.li)\r\n\tconst riChar = getCharOverride(cl, \"ri\", grid.options.ri)\r\n\tconst tiChar = getCharOverride(cl, \"ti\", grid.options.ti)\r\n\tconst biChar = getCharOverride(cl, \"bi\", grid.options.bi)\r\n\tconst iChar = getCharOverride(cl, \"i\", grid.options.i)\r\n\r\n\t//TODO: associate grid cells with the local options of the dom element - right now the intersections only look for the default characters\r\n\r\n\t//verticals\r\n\t//left\r\n\tif (hasL || ((hasASCII || hasBorder) && !hasR && !hasT && !hasB && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let row = topRow + 1; row < bottomRow; row++) {\r\n\t\t\tconst l = getIndex(leftCol, row, grid)\r\n\r\n\t\t\tswitch (grid.grid[l]) {\r\n\t\t\t\tcase grid.options.t:\r\n\t\t\t\tcase grid.options.b:\r\n\t\t\t\tcase grid.options.tr:\r\n\t\t\t\tcase grid.options.br:\r\n\t\t\t\t\tgrid.grid[l] = liChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[l] = lChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//right\r\n\tif (hasR || ((hasASCII || hasBorder) && !hasL && !hasT && !hasB && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let row = topRow + 1; row < bottomRow; row++) {\r\n\t\t\tconst r = getIndex(rightCol, row, grid)\r\n\r\n\t\t\tswitch (grid.grid[r]) {\r\n\t\t\t\tcase grid.options.t:\r\n\t\t\t\tcase grid.options.b:\r\n\t\t\t\tcase grid.options.tl:\r\n\t\t\t\tcase grid.options.bl:\r\n\t\t\t\t\tgrid.grid[r] = riChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[r] = rChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//horizontals\r\n\t//top\r\n\tif (hasT || ((hasASCII || hasBorder) && !hasL && !hasR && !hasB && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let col = leftCol + 1; col < rightCol; col++) {\r\n\t\t\tconst t = getIndex(col, topRow, grid)\r\n\r\n\t\t\tswitch (grid.grid[t]) {\r\n\t\t\t\tcase grid.options.l:\r\n\t\t\t\tcase grid.options.r:\r\n\t\t\t\tcase grid.options.bl:\r\n\t\t\t\tcase grid.options.br:\r\n\t\t\t\t\tgrid.grid[t] = tiChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[t] = tChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//bottom\r\n\tif (hasB || ((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasTL && !hasTR && !hasBR && !hasBL)) {\r\n\t\tfor (let col = leftCol + 1; col < rightCol; col++) {\r\n\t\t\tconst b = getIndex(col, bottomRow, grid)\r\n\t\t\tswitch (grid.grid[b]) {\r\n\t\t\t\tcase grid.options.l:\r\n\t\t\t\tcase grid.options.r:\r\n\t\t\t\tcase grid.options.tl:\r\n\t\t\t\tcase grid.options.tr:\r\n\t\t\t\t\tgrid.grid[b] = biChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[b] = bChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//corners\r\n\t//tl\r\n\tif (\r\n\t\thasTL ||\r\n\t\t(hasT && hasL) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTR && !hasBR && !hasBL)\r\n\t) {\r\n\t\tconst tl = getIndex(leftCol, topRow, grid)\r\n\t\tswitch (grid.grid[tl]) {\r\n\t\t\tcase grid.options.t:\r\n\t\t\tcase grid.options.b:\r\n\t\t\tcase grid.options.tr:\r\n\t\t\t\tgrid.grid[tl] = biChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.l:\r\n\t\t\tcase grid.options.r:\r\n\t\t\tcase grid.options.bl:\r\n\t\t\t\tgrid.grid[tl] = riChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[tl] = iChar\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[tl] = tlChar\r\n\t\t}\r\n\t}\r\n\t//tr\r\n\tif (\r\n\t\thasTR ||\r\n\t\t(hasT && hasR) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTL && !hasBR && !hasBL)\r\n\t) {\r\n\t\tconst tr = getIndex(rightCol, topRow, grid)\r\n\t\tswitch (grid.grid[tr]) {\r\n\t\t\tcase grid.options.t:\r\n\t\t\tcase grid.options.b:\r\n\t\t\tcase grid.options.tl:\r\n\t\t\t\tgrid.grid[tr] = biChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.l:\r\n\t\t\tcase grid.options.r:\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[tr] = liChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.bl:\r\n\t\t\t\tgrid.grid[tr] = iChar\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[tr] = trChar\r\n\t\t}\r\n\t}\r\n\t//br\r\n\tif (\r\n\t\thasBR ||\r\n\t\t(hasB && hasR) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTL && !hasTR && !hasBL)\r\n\t) {\r\n\t\tconst br = getIndex(rightCol, bottomRow, grid)\r\n\t\tif (rect.type === \"textarea\") {\r\n\t\t\tgrid.grid[br] = \"▼\"\r\n\t\t} else {\r\n\t\t\tswitch (grid.grid[br]) {\r\n\t\t\t\tcase grid.options.l:\r\n\t\t\t\tcase grid.options.r:\r\n\t\t\t\tcase grid.options.tr:\r\n\t\t\t\t\tgrid.grid[br] = liChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tcase grid.options.t:\r\n\t\t\t\tcase grid.options.b:\r\n\t\t\t\tcase grid.options.bl:\r\n\t\t\t\t\tgrid.grid[br] = tiChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tcase grid.options.tl:\r\n\t\t\t\t\tgrid.grid[br] = iChar\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[br] = brChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//bl\r\n\tif (\r\n\t\thasBL ||\r\n\t\t(hasB && hasL) ||\r\n\t\t((hasASCII || hasBorder) && !hasL && !hasR && !hasT && !hasB && !hasTL && !hasTR && !hasBR)\r\n\t) {\r\n\t\tconst bl = getIndex(leftCol, bottomRow, grid)\r\n\t\tswitch (grid.grid[bl]) {\r\n\t\t\tcase grid.options.l:\r\n\t\t\tcase grid.options.r:\r\n\t\t\tcase grid.options.tl:\r\n\t\t\t\tgrid.grid[bl] = riChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.t:\r\n\t\t\tcase grid.options.b:\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[bl] = tiChar\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.tr:\r\n\t\t\t\tgrid.grid[bl] = iChar\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[bl] = blChar\r\n\t\t}\r\n\t}\r\n\r\n\t//fill\r\n\tif (!hasNoFill) {\r\n\t\tfor (let row = topRow + 1; row < bottomRow; row++) {\r\n\t\t\tfor (let col = leftCol + 1; col < rightCol; col++) {\r\n\t\t\t\tgrid.grid[getIndex(col, row, grid)] = fillChar\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//characters\r\n\tif (hasASCII || hasText) {\r\n\t\trect.characters.forEach((c) => {\r\n\t\t\tconst col = Math.floor(c.rect.left * invFontWidth)\r\n\t\t\tconst row = Math.floor(c.rect.bottom * invFontHeight)\r\n\t\t\tgrid.grid[getIndex(col, row, grid)] = c.char\r\n\t\t})\r\n\t}\r\n}\r\n\r\nfunction getElements(ref: React.RefObject<HTMLDivElement | null>): Rect[] {\r\n\tif (!ref.current) return []\r\n\treturn Array.from(ref.current.querySelectorAll<HTMLElement>('[class*=\"ascii\"]')).map((el) => {\r\n\t\t//console.log(\"element\", el)\r\n\t\tconst c: { char: string; rect: DOMRect }[] = []\r\n\t\tconst textWalker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT)\r\n\r\n\t\twhile (textWalker.nextNode()) {\r\n\t\t\tconst textNode = textWalker.currentNode as Text\r\n\t\t\tconst text = textNode.textContent ?? \"\"\r\n\r\n\t\t\tfor (let i = 0; i < text.length; i++) {\r\n\t\t\t\tif (text[i].trim() === \"\") continue\r\n\t\t\t\t//console.log(text[i])\r\n\t\t\t\tconst range = document.createRange()\r\n\t\t\t\trange.setStart(textNode, i)\r\n\t\t\t\trange.setEnd(textNode, i + 1)\r\n\r\n\t\t\t\tconst rect = range.getBoundingClientRect()\r\n\t\t\t\t//if (rect.width === 0 || rect.height === 0) continue\r\n\r\n\t\t\t\tc.push({ char: text[i], rect })\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn {\r\n\t\t\trect: el.getBoundingClientRect(),\r\n\t\t\tcharacters: c,\r\n\t\t\ttype: el.tagName.toLowerCase(),\r\n\t\t\tclassList: el.classList,\r\n\t\t}\r\n\t})\r\n}\r\n\r\nexport const ASCII = ({\r\n\tchildren,\r\n\tgridReveal = true,\r\n\trevealSpeed = 30,\r\n}: {\r\n\tchildren: React.ReactNode\r\n\tgridReveal?: boolean\r\n\trevealSpeed?: number\r\n}) => {\r\n\tconst parentRef = useRef<HTMLDivElement | null>(null)\r\n\tconst grid = useGridContext()\r\n\t//const [rects, setRects] = useState<Rect[] | null>([])\r\n\tconst rectsRef = useRef<Rect[]>([])\r\n\tconst reveal = gridReveal ? useReveal(grid.grid, revealSpeed) : grid.grid\r\n\tconst [, forceRender] = useReducer((x) => x + 1, 0)\r\n\r\n\tuseLayoutEffect(() => {\r\n\t\tif (!parentRef.current) return\r\n\r\n\t\tlet frame: number\r\n\r\n\t\tconst loop = () => {\r\n\t\t\trectsRef.current = getElements(parentRef)\r\n\t\t\tframe = requestAnimationFrame(loop)\r\n\r\n\t\t\tforceRender()\r\n\t\t}\r\n\r\n\t\tloop()\r\n\r\n\t\treturn () => cancelAnimationFrame(frame)\r\n\t}, [])\r\n\r\n\t// clear canvas\r\n\t// maybe find better way\r\n\tfor (let i = 0; i < grid.grid.length; i++) {\r\n\t\tgrid.grid[i] = String.fromCharCode(160)\r\n\t}\r\n\r\n\trectsRef.current.forEach((rect) => {\r\n\t\tdrawRect({ rect, grid })\r\n\t})\r\n\r\n\treturn (\r\n\t\t<div ref={parentRef} className=\"leading-none\">\r\n\t\t\t<div\r\n\t\t\t\tstyle={{ width: grid.truncWidth, height: grid.truncHeight }}\r\n\t\t\t\t//className=\"absolute top-0 left-0 bg-none pointer-events-none\"\r\n\t\t\t\tclassName=\"absolute bg-transparent text-transparent border-transparent shadow-none ring-0 top-0 left-0 bg-none pointer-events-none\"\r\n\t\t\t>\r\n\t\t\t\t{children}\r\n\t\t\t</div>\r\n\t\t\t{parentRef.current && rectsRef.current && (\r\n\t\t\t\t<div style={{ width: grid.truncWidth, height: grid.truncHeight }}>\r\n\t\t\t\t\t{Array.from({ length: grid.rows }, (_, r) => {\r\n\t\t\t\t\t\tlet str = \"\"\r\n\t\t\t\t\t\tconst start = r * grid.cols\r\n\t\t\t\t\t\tconst end = start + grid.cols\r\n\r\n\t\t\t\t\t\tfor (let i = start; i < end; i++) {\r\n\t\t\t\t\t\t\tstr += reveal[i] ?? String.fromCharCode(160)\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn <p key={r}>{str}</p>\r\n\t\t\t\t\t})}\r\n\t\t\t\t</div>\r\n\t\t\t\t// <div style={{ width: grid.truncWidth, height: grid.truncHeight }} className=\"leading-none wrap-break-word\">\r\n\t\t\t\t// \t{String.raw`${reveal.join(\"\")}`}\r\n\t\t\t\t// </div>\r\n\t\t\t)}\r\n\t\t</div>\r\n\t)\r\n}\r\n","import { useEffect, useState } from \"react\"\r\n\r\nexport function useWindowDimensions() {\r\n\tconst [dimensions, setDimensions] = useState({\r\n\t\twidth: 0,\r\n\t\theight: 0,\r\n\t})\r\n\tuseEffect(() => {\r\n\t\tconst update = () => setDimensions({ width: window.innerWidth, height: window.innerHeight })\r\n\r\n\t\tupdate() // Set initial size\r\n\t\twindow.addEventListener(\"resize\", update)\r\n\t\treturn () => window.removeEventListener(\"resize\", update)\r\n\t}, [])\r\n\r\n\treturn dimensions\r\n}\r\n","import { useMemo } from \"react\"\r\nimport { GridContext } from \"../contexts/GridContext\"\r\nimport { useWindowDimensions } from \"../hooks/useWindowDimensions\"\r\nimport type { ASCIIProviderProps } from \"../types/ASCIIProviderProps\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport type { GridOptions } from \"../types/GridOptions\"\r\nimport { defaultOptions } from \"../utils/defaultOptions\"\r\n\r\nfunction initGrid({ width, height, ...options }: { width: number; height: number } & Partial<GridOptions>): GridData {\r\n\tconst mergedOptions: GridOptions = {\r\n\t\t...defaultOptions,\r\n\t\t...options,\r\n\t}\r\n\tconst fontHeight = 16\r\n\tconst courierRatio = 1229 / 2048\r\n\tconst fontWidth = fontHeight * courierRatio\r\n\tconst truncWidth = width - (width % fontWidth)\r\n\tconst truncHeight = height - (height % fontHeight)\r\n\tconst rows = Math.floor(truncHeight / fontHeight)\r\n\tconst cols = Math.floor(truncWidth / fontWidth)\r\n\tconst grid = Array.from({ length: rows * cols }, () => mergedOptions.fill)\r\n\treturn {\r\n\t\tfontHeight,\r\n\t\tcourierRatio,\r\n\t\tfontWidth,\r\n\t\ttruncWidth,\r\n\t\ttruncHeight,\r\n\t\twindowWidth: width,\r\n\t\twindowHeight: height,\r\n\t\trows,\r\n\t\tcols,\r\n\t\tgrid,\r\n\t\toptions: mergedOptions,\r\n\t}\r\n}\r\n\r\nexport function ASCIIProvider({ children, ...options }: ASCIIProviderProps) {\r\n\t// const parentGrid = useContext(GridContext)\r\n\r\n\t// // if a grid already exists, reuse it\r\n\t// if (parentGrid) {\r\n\t// \treturn <GridContext.Provider value={parentGrid}>{children}</GridContext.Provider>\r\n\t// }\r\n\r\n\tconst { width, height } = useWindowDimensions()\r\n\tconst grid = useMemo(() => initGrid({ width, height, ...options }), [width, height, options])\r\n\t//const grid = initGrid({ width, height, ...options })\r\n\treturn <GridContext.Provider value={grid}>{children}</GridContext.Provider>\r\n}\r\n"],"names":["defaultOptions","GridContext","createContext","useGridContext","useContext","useReveal","grid","speed","index","setIndex","useState","useEffect","frame","loop","getIndex","col","row","getCharOverride","cl","option","fallback","c","drawRect","rect","invFontWidth","invFontHeight","leftCol","rightCol","topRow","bottomRow","hasASCII","hasBorder","hasL","hasR","hasT","hasB","hasTL","hasTR","hasBR","hasBL","hasNoFill","hasText","lChar","rChar","tChar","bChar","tlChar","trChar","brChar","blChar","fillChar","liChar","riChar","tiChar","biChar","iChar","l","r","t","b","tl","tr","br","bl","getElements","ref","el","textWalker","textNode","text","range","ASCII","children","gridReveal","revealSpeed","parentRef","useRef","rectsRef","reveal","forceRender","useReducer","x","useLayoutEffect","i","jsxs","jsx","_","str","start","end","useWindowDimensions","dimensions","setDimensions","update","initGrid","width","height","options","mergedOptions","fontHeight","courierRatio","fontWidth","truncWidth","truncHeight","rows","cols","ASCIIProvider","useMemo"],"mappings":"4UAEO,MAAMA,EAA8B,CAC1C,EAAG,IACH,GAAI,IACJ,EAAG,IACH,GAAI,IACJ,EAAG,IACH,GAAI,IACJ,EAAG,IACH,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,GAAI,IACJ,EAAG,IACH,KAAM,GACP,ECbaC,EAAcC,EAAAA,cAAwB,CAClD,WAAY,EACZ,aAAc,EACd,UAAW,EACX,WAAY,EACZ,YAAa,EACb,YAAa,EACb,aAAc,EACd,KAAM,EACN,KAAM,EACN,KAAM,CAAA,EACN,QAASF,CACV,CAAC,ECbYG,EAAiB,IACtBC,EAAAA,WAAWH,CAAW,ECFvB,SAASI,EAAUC,EAAgBC,EAAQ,EAAG,CACpD,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAAA,SAAS,CAAC,EACpCC,OAAAA,EAAAA,UAAU,IAAM,CACf,IAAIC,EAEJ,MAAMC,EAAO,IAAM,CAClBJ,EAAU,GACL,GAAKH,EAAK,OAAe,EACtB,EAAIC,CACX,EAEDK,EAAQ,sBAAsBC,CAAI,CACnC,EAEA,OAAAA,EAAA,EAEO,IAAM,qBAAqBD,CAAK,CACxC,EAAG,CAACN,EAAMC,CAAK,CAAC,EAETD,EAAK,MAAM,EAAGE,CAAK,CAC3B,CCfA,MAAMM,EAAW,CAACC,EAAaC,EAAaV,IACpCU,EAAMV,EAAK,KAAOS,EAG1B,SAASE,EAAgBC,EAAkBC,EAA2BC,EAAkB,CACvF,UAAWC,KAAKH,EACf,GAAIG,EAAE,WAAW,SAASF,CAAM,GAAG,EAClC,OAAOE,EAAE,MAAM,SAASF,CAAM,IAAI,MAAM,EAG1C,OAAOC,CACR,CAEA,MAAME,EAAW,CAAC,CAAE,KAAAC,EAAM,KAAAjB,KAA2C,CAKpE,MAAMkB,EAAe,EAAIlB,EAAK,UACxBmB,EAAgB,EAAInB,EAAK,WAEzBoB,EAAU,KAAK,MAAMH,EAAK,KAAK,KAAOC,CAAY,EAClDG,EAAW,KAAK,MAAMJ,EAAK,KAAK,MAAQC,CAAY,EACpDI,EAAS,KAAK,MAAML,EAAK,KAAK,IAAME,CAAa,EACjDI,EAAY,KAAK,MAAMN,EAAK,KAAK,OAASE,CAAa,EAEvDP,EAAKK,EAAK,UAEVO,EAAWZ,EAAG,SAAS,OAAO,EAC9Ba,EAAYb,EAAG,SAAS,cAAc,EACtCc,EAAOd,EAAG,SAAS,gBAAgB,EACnCe,EAAOf,EAAG,SAAS,gBAAgB,EACnCgB,EAAOhB,EAAG,SAAS,gBAAgB,EACnCiB,EAAOjB,EAAG,SAAS,gBAAgB,EACnCkB,EAAQlB,EAAG,SAAS,iBAAiB,EACrCmB,EAAQnB,EAAG,SAAS,iBAAiB,EACrCoB,EAAQpB,EAAG,SAAS,iBAAiB,EACrCqB,EAAQrB,EAAG,SAAS,iBAAiB,EACrCsB,EAAYtB,EAAG,SAAS,eAAe,EACvCuB,EAAUvB,EAAG,SAAS,YAAY,EAElCwB,EAAQzB,EAAgBC,EAAI,IAAKZ,EAAK,QAAQ,CAAC,EAC/CqC,EAAQ1B,EAAgBC,EAAI,IAAKZ,EAAK,QAAQ,CAAC,EAC/CsC,EAAQ3B,EAAgBC,EAAI,IAAKZ,EAAK,QAAQ,CAAC,EAC/CuC,EAAQ5B,EAAgBC,EAAI,IAAKZ,EAAK,QAAQ,CAAC,EAC/CwC,EAAS7B,EAAgBC,EAAI,KAAMZ,EAAK,QAAQ,EAAE,EAClDyC,EAAS9B,EAAgBC,EAAI,KAAMZ,EAAK,QAAQ,EAAE,EAClD0C,EAAS/B,EAAgBC,EAAI,KAAMZ,EAAK,QAAQ,EAAE,EAClD2C,EAAShC,EAAgBC,EAAI,KAAMZ,EAAK,QAAQ,EAAE,EAClD4C,EAAWjC,EAAgBC,EAAI,OAAQZ,EAAK,QAAQ,IAAI,EACxD6C,EAASlC,EAAgBC,EAAI,KAAMZ,EAAK,QAAQ,EAAE,EAClD8C,EAASnC,EAAgBC,EAAI,KAAMZ,EAAK,QAAQ,EAAE,EAClD+C,EAASpC,EAAgBC,EAAI,KAAMZ,EAAK,QAAQ,EAAE,EAClDgD,EAASrC,EAAgBC,EAAI,KAAMZ,EAAK,QAAQ,EAAE,EAClDiD,EAAQtC,EAAgBC,EAAI,IAAKZ,EAAK,QAAQ,CAAC,EAMrD,GAAI0B,IAAUF,GAAYC,IAAc,CAACE,GAAQ,CAACC,GAAQ,CAACC,GAAQ,CAACC,GAAS,CAACC,GAAS,CAACC,GAAS,CAACC,EACjG,QAASvB,EAAMY,EAAS,EAAGZ,EAAMa,EAAWb,IAAO,CAClD,MAAMwC,EAAI1C,EAASY,EAASV,EAAKV,CAAI,EAErC,OAAQA,EAAK,KAAKkD,CAAC,EAAA,CAClB,KAAKlD,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,GAClB,KAAKA,EAAK,QAAQ,GACjBA,EAAK,KAAKkD,CAAC,EAAIL,EACf,MACD,QACC7C,EAAK,KAAKkD,CAAC,EAAId,CAAA,CAElB,CAGD,GAAIT,IAAUH,GAAYC,IAAc,CAACC,GAAQ,CAACE,GAAQ,CAACC,GAAQ,CAACC,GAAS,CAACC,GAAS,CAACC,GAAS,CAACC,EACjG,QAASvB,EAAMY,EAAS,EAAGZ,EAAMa,EAAWb,IAAO,CAClD,MAAMyC,EAAI3C,EAASa,EAAUX,EAAKV,CAAI,EAEtC,OAAQA,EAAK,KAAKmD,CAAC,EAAA,CAClB,KAAKnD,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,GAClB,KAAKA,EAAK,QAAQ,GACjBA,EAAK,KAAKmD,CAAC,EAAIL,EACf,MACD,QACC9C,EAAK,KAAKmD,CAAC,EAAId,CAAA,CAElB,CAKD,GAAIT,IAAUJ,GAAYC,IAAc,CAACC,GAAQ,CAACC,GAAQ,CAACE,GAAQ,CAACC,GAAS,CAACC,GAAS,CAACC,GAAS,CAACC,EACjG,QAASxB,EAAMW,EAAU,EAAGX,EAAMY,EAAUZ,IAAO,CAClD,MAAM2C,EAAI5C,EAASC,EAAKa,EAAQtB,CAAI,EAEpC,OAAQA,EAAK,KAAKoD,CAAC,EAAA,CAClB,KAAKpD,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,GAClB,KAAKA,EAAK,QAAQ,GACjBA,EAAK,KAAKoD,CAAC,EAAIL,EACf,MACD,QACC/C,EAAK,KAAKoD,CAAC,EAAId,CAAA,CAElB,CAGD,GAAIT,IAAUL,GAAYC,IAAc,CAACC,GAAQ,CAACC,GAAQ,CAACC,GAAQ,CAACE,GAAS,CAACC,GAAS,CAACC,GAAS,CAACC,EACjG,QAASxB,EAAMW,EAAU,EAAGX,EAAMY,EAAUZ,IAAO,CAClD,MAAM4C,EAAI7C,EAASC,EAAKc,EAAWvB,CAAI,EACvC,OAAQA,EAAK,KAAKqD,CAAC,EAAA,CAClB,KAAKrD,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,GAClB,KAAKA,EAAK,QAAQ,GACjBA,EAAK,KAAKqD,CAAC,EAAIL,EACf,MACD,QACChD,EAAK,KAAKqD,CAAC,EAAId,CAAA,CAElB,CAKD,GACCT,GACCF,GAAQF,IACPF,GAAYC,IAAc,CAACC,GAAQ,CAACC,GAAQ,CAACC,GAAQ,CAACC,GAAQ,CAACE,GAAS,CAACC,GAAS,CAACC,EACpF,CACD,MAAMqB,EAAK9C,EAASY,EAASE,EAAQtB,CAAI,EACzC,OAAQA,EAAK,KAAKsD,CAAE,EAAA,CACnB,KAAKtD,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,GACjBA,EAAK,KAAKsD,CAAE,EAAIN,EAChB,MACD,KAAKhD,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,GACjBA,EAAK,KAAKsD,CAAE,EAAIR,EAChB,MACD,KAAK9C,EAAK,QAAQ,GACjBA,EAAK,KAAKsD,CAAE,EAAIL,EAChB,MACD,QACCjD,EAAK,KAAKsD,CAAE,EAAId,CAAA,CAEnB,CAEA,GACCT,GACCH,GAAQD,IACPH,GAAYC,IAAc,CAACC,GAAQ,CAACC,GAAQ,CAACC,GAAQ,CAACC,GAAQ,CAACC,GAAS,CAACE,GAAS,CAACC,EACpF,CACD,MAAMsB,EAAK/C,EAASa,EAAUC,EAAQtB,CAAI,EAC1C,OAAQA,EAAK,KAAKuD,CAAE,EAAA,CACnB,KAAKvD,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,GACjBA,EAAK,KAAKuD,CAAE,EAAIP,EAChB,MACD,KAAKhD,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,GACjBA,EAAK,KAAKuD,CAAE,EAAIV,EAChB,MACD,KAAK7C,EAAK,QAAQ,GACjBA,EAAK,KAAKuD,CAAE,EAAIN,EAChB,MACD,QACCjD,EAAK,KAAKuD,CAAE,EAAId,CAAA,CAEnB,CAEA,GACCT,GACCH,GAAQF,IACPH,GAAYC,IAAc,CAACC,GAAQ,CAACC,GAAQ,CAACC,GAAQ,CAACC,GAAQ,CAACC,GAAS,CAACC,GAAS,CAACE,EACpF,CACD,MAAMuB,EAAKhD,EAASa,EAAUE,EAAWvB,CAAI,EAC7C,GAAIiB,EAAK,OAAS,WACjBjB,EAAK,KAAKwD,CAAE,EAAI,QAEhB,QAAQxD,EAAK,KAAKwD,CAAE,EAAA,CACnB,KAAKxD,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,GACjBA,EAAK,KAAKwD,CAAE,EAAIX,EAChB,MACD,KAAK7C,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,GACjBA,EAAK,KAAKwD,CAAE,EAAIT,EAChB,MACD,KAAK/C,EAAK,QAAQ,GACjBA,EAAK,KAAKwD,CAAE,EAAIP,EAChB,MACD,QACCjD,EAAK,KAAKwD,CAAE,EAAId,CAAA,CAGpB,CAGA,GACCT,GACCJ,GAAQH,IACPF,GAAYC,IAAc,CAACC,GAAQ,CAACC,GAAQ,CAACC,GAAQ,CAACC,GAAQ,CAACC,GAAS,CAACC,GAAS,CAACC,EACpF,CACD,MAAMyB,EAAKjD,EAASY,EAASG,EAAWvB,CAAI,EAC5C,OAAQA,EAAK,KAAKyD,CAAE,EAAA,CACnB,KAAKzD,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,GACjBA,EAAK,KAAKyD,CAAE,EAAIX,EAChB,MACD,KAAK9C,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,EAClB,KAAKA,EAAK,QAAQ,GACjBA,EAAK,KAAKyD,CAAE,EAAIV,EAChB,MACD,KAAK/C,EAAK,QAAQ,GACjBA,EAAK,KAAKyD,CAAE,EAAIR,EAChB,MACD,QACCjD,EAAK,KAAKyD,CAAE,EAAId,CAAA,CAEnB,CAGA,GAAI,CAACT,EACJ,QAASxB,EAAMY,EAAS,EAAGZ,EAAMa,EAAWb,IAC3C,QAASD,EAAMW,EAAU,EAAGX,EAAMY,EAAUZ,IAC3CT,EAAK,KAAKQ,EAASC,EAAKC,EAAKV,CAAI,CAAC,EAAI4C,GAMrCpB,GAAYW,IACflB,EAAK,WAAW,QAASF,GAAM,CAC9B,MAAMN,EAAM,KAAK,MAAMM,EAAE,KAAK,KAAOG,CAAY,EAC3CR,EAAM,KAAK,MAAMK,EAAE,KAAK,OAASI,CAAa,EACpDnB,EAAK,KAAKQ,EAASC,EAAKC,EAAKV,CAAI,CAAC,EAAIe,EAAE,IACzC,CAAC,CAEH,EAEA,SAAS2C,EAAYC,EAAqD,CACzE,OAAKA,EAAI,QACF,MAAM,KAAKA,EAAI,QAAQ,iBAA8B,kBAAkB,CAAC,EAAE,IAAKC,GAAO,CAE5F,MAAM,EAAuC,CAAA,EACvCC,EAAa,SAAS,iBAAiBD,EAAI,WAAW,SAAS,EAErE,KAAOC,EAAW,YAAY,CAC7B,MAAMC,EAAWD,EAAW,YACtBE,EAAOD,EAAS,aAAe,GAErC,QAAS,EAAI,EAAG,EAAIC,EAAK,OAAQ,IAAK,CACrC,GAAIA,EAAK,CAAC,EAAE,KAAA,IAAW,GAAI,SAE3B,MAAMC,EAAQ,SAAS,YAAA,EACvBA,EAAM,SAASF,EAAU,CAAC,EAC1BE,EAAM,OAAOF,EAAU,EAAI,CAAC,EAE5B,MAAM7C,EAAO+C,EAAM,sBAAA,EAGnB,EAAE,KAAK,CAAE,KAAMD,EAAK,CAAC,EAAG,KAAA9C,EAAM,CAC/B,CACD,CACA,MAAO,CACN,KAAM2C,EAAG,sBAAA,EACT,WAAY,EACZ,KAAMA,EAAG,QAAQ,YAAA,EACjB,UAAWA,EAAG,SAAA,CAEhB,CAAC,EA7BwB,CAAA,CA8B1B,CAEO,MAAMK,EAAQ,CAAC,CACrB,SAAAC,EACA,WAAAC,EAAa,GACb,YAAAC,EAAc,EACf,IAIM,CACL,MAAMC,EAAYC,EAAAA,OAA8B,IAAI,EAC9CtE,EAAOH,EAAA,EAEP0E,EAAWD,EAAAA,OAAe,EAAE,EAC5BE,EAASL,EAAapE,EAAUC,EAAK,KAAMoE,CAAW,EAAIpE,EAAK,KAC/D,CAAA,CAAGyE,CAAW,EAAIC,EAAAA,WAAYC,GAAMA,EAAI,EAAG,CAAC,EAElDC,EAAAA,gBAAgB,IAAM,CACrB,GAAI,CAACP,EAAU,QAAS,OAExB,IAAI/D,EAEJ,MAAMC,EAAO,IAAM,CAClBgE,EAAS,QAAUb,EAAYW,CAAS,EACxC/D,EAAQ,sBAAsBC,CAAI,EAElCkE,EAAA,CACD,EAEA,OAAAlE,EAAA,EAEO,IAAM,qBAAqBD,CAAK,CACxC,EAAG,CAAA,CAAE,EAIL,QAASuE,EAAI,EAAGA,EAAI7E,EAAK,KAAK,OAAQ6E,IACrC7E,EAAK,KAAK6E,CAAC,EAAI,IAGhB,OAAAN,EAAS,QAAQ,QAAStD,GAAS,CAClCD,EAAS,CAAE,KAAAC,EAAM,KAAAjB,EAAM,CACxB,CAAC,EAGA8E,EAAAA,KAAC,MAAA,CAAI,IAAKT,EAAW,UAAU,eAC9B,SAAA,CAAAU,EAAAA,IAAC,MAAA,CACA,MAAO,CAAE,MAAO/E,EAAK,WAAY,OAAQA,EAAK,WAAA,EAE9C,UAAU,0HAET,SAAAkE,CAAA,CAAA,EAEDG,EAAU,SAAWE,EAAS,SAC9BQ,EAAAA,IAAC,OAAI,MAAO,CAAE,MAAO/E,EAAK,WAAY,OAAQA,EAAK,WAAA,EACjD,SAAA,MAAM,KAAK,CAAE,OAAQA,EAAK,IAAA,EAAQ,CAACgF,EAAG7B,IAAM,CAC5C,IAAI8B,EAAM,GACV,MAAMC,EAAQ/B,EAAInD,EAAK,KACjBmF,EAAMD,EAAQlF,EAAK,KAEzB,QAAS6E,EAAIK,EAAOL,EAAIM,EAAKN,IAC5BI,GAAOT,EAAOK,CAAC,GAAK,IAGrB,OAAOE,EAAAA,IAAC,IAAA,CAAW,SAAAE,CAAA,EAAJ9B,CAAQ,CACxB,CAAC,CAAA,CACF,CAAA,EAKF,CAEF,EC7WO,SAASiC,GAAsB,CACrC,KAAM,CAACC,EAAYC,CAAa,EAAIlF,WAAS,CAC5C,MAAO,EACP,OAAQ,CAAA,CACR,EACDC,OAAAA,EAAAA,UAAU,IAAM,CACf,MAAMkF,EAAS,IAAMD,EAAc,CAAE,MAAO,OAAO,WAAY,OAAQ,OAAO,YAAa,EAE3F,OAAAC,EAAA,EACA,OAAO,iBAAiB,SAAUA,CAAM,EACjC,IAAM,OAAO,oBAAoB,SAAUA,CAAM,CACzD,EAAG,CAAA,CAAE,EAEEF,CACR,CCRA,SAASG,EAAS,CAAE,MAAAC,EAAO,OAAAC,EAAQ,GAAGC,GAA+E,CACpH,MAAMC,EAA6B,CAClC,GAAGlG,EACH,GAAGiG,CAAA,EAEEE,EAAa,GACbC,EAAe,KAAO,KACtBC,EAAYF,EAAaC,EACzBE,EAAaP,EAASA,EAAQM,EAC9BE,EAAcP,EAAUA,EAASG,EACjCK,EAAO,KAAK,MAAMD,EAAcJ,CAAU,EAC1CM,EAAO,KAAK,MAAMH,EAAaD,CAAS,EACxC/F,EAAO,MAAM,KAAK,CAAE,OAAQkG,EAAOC,CAAA,EAAQ,IAAMP,EAAc,IAAI,EACzE,MAAO,CACN,WAAAC,EACA,aAAAC,EACA,UAAAC,EACA,WAAAC,EACA,YAAAC,EACA,YAAaR,EACb,aAAcC,EACd,KAAAQ,EACA,KAAAC,EACA,KAAAnG,EACA,QAAS4F,CAAA,CAEX,CAEO,SAASQ,EAAc,CAAE,SAAAlC,EAAU,GAAGyB,GAA+B,CAQ3E,KAAM,CAAE,MAAAF,EAAO,OAAAC,CAAA,EAAWN,EAAA,EACpBpF,EAAOqG,EAAAA,QAAQ,IAAMb,EAAS,CAAE,MAAAC,EAAO,OAAAC,EAAQ,GAAGC,CAAA,CAAS,EAAG,CAACF,EAAOC,EAAQC,CAAO,CAAC,EAE5F,aAAQhG,EAAY,SAAZ,CAAqB,MAAOK,EAAO,SAAAkE,EAAS,CACrD"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "html-to-ascii",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.4.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
"eslint-plugin-react-hooks": "^7.0.1",
|
|
56
56
|
"eslint-plugin-react-refresh": "^0.4.24",
|
|
57
57
|
"globals": "^16.5.0",
|
|
58
|
+
"react-draggable": "^4.5.0",
|
|
58
59
|
"typescript": "~5.9.3",
|
|
59
60
|
"typescript-eslint": "^8.46.4",
|
|
60
61
|
"vite": "^7.2.4",
|