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 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 install html-to-ascii
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":"AAkSA,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,4CA+DA,CAAA"}
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)}.mt-4{margin-top: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%}.resize{resize:both}.justify-center{justify-content:center}.border{border-style:var(--tw-border-style);border-width:1px}.bg-none{background-image:none}.p-4{padding:calc(var(--spacing)*4)}.p-10{padding:calc(var(--spacing)*10)}.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}.opacity-0{opacity:0}.opacity-100{opacity:1}}: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}')),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}})();
2
- import { jsxs as $, jsx as R } from "react/jsx-runtime";
3
- import { createContext as X, useContext as J, useState as E, useEffect as M, useRef as S, useReducer as K, useLayoutEffect as Q, useMemo as U } from "react";
4
- const B = {
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
- }, I = X({
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: B
31
- }), V = () => J(I);
32
- function Y(s, t = 1) {
33
- const [c, i] = E(0);
34
- return M(() => {
35
- let e;
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
- i((n) => n >= s.length ? n : n + t), e = requestAnimationFrame(l);
37
+ a((r) => r >= e.length ? r : r + t), s = requestAnimationFrame(l);
38
38
  };
39
- return l(), () => cancelAnimationFrame(e);
40
- }, [s, t]), s.slice(0, c);
39
+ return l(), () => cancelAnimationFrame(s);
40
+ }, [e, t]), e.slice(0, c);
41
41
  }
42
- const C = (s, t, c) => {
43
- const i = s / c.fontWidth | 0;
44
- return (t / c.fontHeight | 0) * c.cols + i;
45
- };
46
- function b(s, t, c) {
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 Z = ({ rect: s, grid: t }) => {
53
- const c = Math.floor(s.rect.left / t.fontWidth) * t.fontWidth, i = Math.floor(s.rect.right / t.fontWidth) * t.fontWidth, e = Math.floor(s.rect.top / t.fontHeight) * t.fontHeight, l = Math.floor(s.rect.bottom / t.fontHeight) * t.fontHeight, n = s.classList, f = n.contains("ascii"), a = n.contains("ascii-border"), h = n.contains("ascii-border-l"), u = n.contains("ascii-border-r"), p = n.contains("ascii-border-t"), m = n.contains("ascii-border-b"), w = n.contains("ascii-border-tl"), W = n.contains("ascii-border-tr"), H = n.contains("ascii-border-br"), x = n.contains("ascii-border-bl"), N = n.contains("ascii-no-fill"), T = n.contains("ascii-text"), F = b(n, "l", t.options.l), d = b(n, "r", t.options.r), O = b(n, "t", t.options.t), q = b(n, "b", t.options.b), G = b(n, "tl", t.options.tl), j = b(n, "tr", t.options.tr), z = b(n, "br", t.options.br), D = b(n, "bl", t.options.bl), P = b(n, "fill", t.options.fill), v = b(n, "li", t.options.li), L = b(n, "ri", t.options.ri), y = b(n, "ti", t.options.ti), A = b(n, "bi", t.options.bi), k = b(n, "i", t.options.i);
54
- if (h || (f || a) && !u && !p && !m && !w && !W && !H && !x)
55
- for (let o = e + t.fontHeight; o < l; o += t.fontHeight) {
56
- const r = C(c, o, t);
57
- switch (t.grid[r]) {
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[r] = v;
59
+ t.grid[i] = A;
63
60
  break;
64
61
  default:
65
- t.grid[r] = F;
62
+ t.grid[i] = O;
66
63
  }
67
64
  }
68
- if (u || (f || a) && !h && !p && !m && !w && !W && !H && !x)
69
- for (let o = e + t.fontHeight; o < l; o += t.fontHeight) {
70
- const r = C(i, o, t);
71
- switch (t.grid[r]) {
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[r] = L;
73
+ t.grid[i] = L;
77
74
  break;
78
75
  default:
79
- t.grid[r] = d;
76
+ t.grid[i] = q;
80
77
  }
81
78
  }
82
- if (p || (f || a) && !h && !u && !m && !w && !W && !H && !x)
83
- for (let o = c + t.fontWidth; o < i; o += t.fontWidth) {
84
- const r = C(o, e, t);
85
- switch (t.grid[r]) {
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[r] = y;
87
+ t.grid[i] = S;
91
88
  break;
92
89
  default:
93
- t.grid[r] = O;
90
+ t.grid[i] = G;
94
91
  }
95
92
  }
96
- if (m || (f || a) && !h && !u && !p && !w && !W && !H && !x)
97
- for (let o = c + t.fontWidth; o < i; o += t.fontWidth) {
98
- const r = C(o, l, t);
99
- switch (t.grid[r]) {
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[r] = A;
101
+ t.grid[i] = y;
105
102
  break;
106
103
  default:
107
- t.grid[r] = q;
104
+ t.grid[i] = j;
108
105
  }
109
106
  }
110
- if (w || p && h || (f || a) && !h && !u && !p && !m && !W && !H && !x) {
111
- const o = C(c, e, t);
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] = A;
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] = k;
121
+ t.grid[o] = v;
125
122
  break;
126
123
  default:
127
- t.grid[o] = G;
124
+ t.grid[o] = z;
128
125
  }
129
126
  }
130
- if (W || p && u || (f || a) && !h && !u && !p && !m && !w && !H && !x) {
131
- const o = C(i, e, t);
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] = A;
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] = v;
138
+ t.grid[o] = A;
142
139
  break;
143
140
  case t.options.bl:
144
- t.grid[o] = k;
141
+ t.grid[o] = v;
145
142
  break;
146
143
  default:
147
- t.grid[o] = j;
144
+ t.grid[o] = D;
148
145
  }
149
146
  }
150
- if (H || m && u || (f || a) && !h && !u && !p && !m && !w && !W && !x) {
151
- const o = C(i, l, t);
152
- if (s.type === "textarea")
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] = v;
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] = y;
161
+ t.grid[o] = S;
165
162
  break;
166
163
  case t.options.tl:
167
- t.grid[o] = k;
164
+ t.grid[o] = v;
168
165
  break;
169
166
  default:
170
- t.grid[o] = z;
167
+ t.grid[o] = P;
171
168
  }
172
169
  }
173
- if (x || m && h || (f || a) && !h && !u && !p && !m && !w && !W && !H) {
174
- const o = C(c, l, t);
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] = y;
181
+ t.grid[o] = S;
185
182
  break;
186
183
  case t.options.tr:
187
- t.grid[o] = k;
184
+ t.grid[o] = v;
188
185
  break;
189
186
  default:
190
- t.grid[o] = D;
187
+ t.grid[o] = _;
191
188
  }
192
189
  }
193
- if (!N)
194
- for (let o = e + t.fontHeight; o < l; o += t.fontHeight)
195
- for (let r = c + t.fontWidth; r < i; r += t.fontWidth)
196
- t.grid[C(r, o, t)] = P;
197
- (f || T) && s.characters.forEach((o) => {
198
- const r = Math.round(o.rect.left / t.fontWidth) * t.fontWidth, _ = Math.round(o.rect.bottom / t.fontHeight) * t.fontHeight;
199
- t.grid[C(r, _, t)] = o.char;
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 g(s) {
203
- return s.current ? Array.from(s.current.querySelectorAll('[class*="ascii"]')).map((t) => {
204
- const c = [], i = document.createTreeWalker(t, NodeFilter.SHOW_TEXT);
205
- for (; i.nextNode(); ) {
206
- const e = i.currentNode, l = e.textContent ?? "";
207
- for (let n = 0; n < l.length; n++) {
208
- if (l[n].trim() === "") continue;
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(e, n), f.setEnd(e, n + 1);
211
- const a = f.getBoundingClientRect();
212
- c.push({ char: l[n], rect: a });
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 st = ({
224
- children: s,
220
+ const rt = ({
221
+ children: e,
225
222
  gridReveal: t = !0,
226
223
  revealSpeed: c = 30
227
224
  }) => {
228
- const i = S(null), e = V(), l = S([]), n = t ? Y(e.grid, c) : e.grid, [, f] = K((a) => a + 1, 0);
229
- Q(() => {
230
- if (!i.current) return;
231
- let a;
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 = g(i), a = requestAnimationFrame(h), f();
230
+ l.current = ot(a), n = requestAnimationFrame(h), f();
234
231
  };
235
- return h(), () => cancelAnimationFrame(a);
232
+ return h(), () => cancelAnimationFrame(n);
236
233
  }, []);
237
- for (let a = 0; a < e.grid.length; a++)
238
- e.grid[a] = " ";
239
- return l.current.forEach((a) => {
240
- Z({ rect: a, grid: e });
241
- }), /* @__PURE__ */ $("div", { ref: i, className: "leading-none", children: [
242
- /* @__PURE__ */ R(
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: e.truncWidth, height: e.truncHeight },
246
- className: "absolute opacity-0 top-0 left-0 bg-none pointer-events-none",
247
- children: s
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
- i.current && l.current && /* @__PURE__ */ R("div", { style: { width: e.truncWidth, height: e.truncHeight }, children: Array.from({ length: e.rows }, (a, h) => {
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 * e.cols, m = p + e.cols;
253
- for (let w = p; w < m; w++)
254
- u += n[w] ?? " ";
255
- return /* @__PURE__ */ R("p", { children: u }, h);
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 tt() {
260
- const [s, t] = E({
256
+ function nt() {
257
+ const [e, t] = M({
261
258
  width: 0,
262
259
  height: 0
263
260
  });
264
- return M(() => {
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
- }, []), s;
264
+ }, []), e;
268
265
  }
269
- function ot({ width: s, height: t, ...c }) {
270
- const i = {
271
- ...B,
266
+ function st({ width: e, height: t, ...c }) {
267
+ const a = {
268
+ ...I,
272
269
  ...c
273
- }, e = 16, l = 1229 / 2048, n = e * l, f = s - s % n, a = t - t % e, h = Math.floor(a / e), u = Math.floor(f / n), p = Array.from({ length: h * u }, () => i.fill);
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: e,
272
+ fontHeight: s,
276
273
  courierRatio: l,
277
- fontWidth: n,
274
+ fontWidth: r,
278
275
  truncWidth: f,
279
- truncHeight: a,
280
- windowWidth: s,
276
+ truncHeight: n,
277
+ windowWidth: e,
281
278
  windowHeight: t,
282
279
  rows: h,
283
280
  cols: u,
284
281
  grid: p,
285
- options: i
282
+ options: a
286
283
  };
287
284
  }
288
- function ct({ children: s, ...t }) {
289
- const { width: c, height: i } = tt(), e = U(() => ot({ width: c, height: i, ...t }), [c, i, t]);
290
- return /* @__PURE__ */ R(I.Provider, { value: e, children: s });
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
- st as ASCII,
294
- ct as ASCIIProvider,
295
- V as useGridContext
290
+ rt as ASCII,
291
+ at as ASCIIProvider,
292
+ Z as useGridContext
296
293
  };
297
294
  //# sourceMappingURL=index.es.js.map
@@ -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)}.mt-4{margin-top: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%}.resize{resize:both}.justify-center{justify-content:center}.border{border-style:var(--tw-border-style);border-width:1px}.bg-none{background-image:none}.p-4{padding:calc(var(--spacing)*4)}.p-10{padding:calc(var(--spacing)*10)}.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}.opacity-0{opacity:0}.opacity-100{opacity:1}}: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}')),document.head.appendChild(e)}}catch(t){console.error("vite-plugin-css-injected-by-js",t)}})();
2
- (function(W,x){typeof exports=="object"&&typeof module<"u"?x(exports,require("react/jsx-runtime"),require("react")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react"],x):(W=typeof globalThis<"u"?globalThis:W||self,x(W["html-to-ascii"]={},W.jsxRuntime,W.React))})(this,(function(W,x,C){"use strict";const L={t:"─",ti:"┴",b:"─",bi:"┬",l:"│",li:"┤",r:"│",ri:"├",tl:"┌",tr:"┐",br:"┘",bl:"└",i:"┼",fill:" "},T=C.createContext({fontHeight:0,courierRatio:0,fontWidth:0,truncWidth:0,truncHeight:0,windowWidth:0,windowHeight:0,rows:0,cols:0,grid:[],options:L}),E=()=>C.useContext(T);function M(s,t=1){const[c,i]=C.useState(0);return C.useEffect(()=>{let n;const l=()=>{i(e=>e>=s.length?e:e+t),n=requestAnimationFrame(l)};return l(),()=>cancelAnimationFrame(n)},[s,t]),s.slice(0,c)}const H=(s,t,c)=>{const i=s/c.fontWidth|0;return(t/c.fontHeight|0)*c.cols+i};function b(s,t,c){for(const i of s)if(i.startsWith(`ascii-${t}-`))return i.slice(`ascii-${t}-`.length);return c}const B=({rect:s,grid:t})=>{const c=Math.floor(s.rect.left/t.fontWidth)*t.fontWidth,i=Math.floor(s.rect.right/t.fontWidth)*t.fontWidth,n=Math.floor(s.rect.top/t.fontHeight)*t.fontHeight,l=Math.floor(s.rect.bottom/t.fontHeight)*t.fontHeight,e=s.classList,f=e.contains("ascii"),a=e.contains("ascii-border"),h=e.contains("ascii-border-l"),u=e.contains("ascii-border-r"),p=e.contains("ascii-border-t"),m=e.contains("ascii-border-b"),w=e.contains("ascii-border-tl"),k=e.contains("ascii-border-tr"),d=e.contains("ascii-border-br"),R=e.contains("ascii-border-bl"),G=e.contains("ascii-no-fill"),P=e.contains("ascii-text"),z=b(e,"l",t.options.l),D=b(e,"r",t.options.r),_=b(e,"t",t.options.t),$=b(e,"b",t.options.b),X=b(e,"tl",t.options.tl),J=b(e,"tr",t.options.tr),K=b(e,"br",t.options.br),Q=b(e,"bl",t.options.bl),U=b(e,"fill",t.options.fill),y=b(e,"li",t.options.li),S=b(e,"ri",t.options.ri),A=b(e,"ti",t.options.ti),I=b(e,"bi",t.options.bi),v=b(e,"i",t.options.i);if(h||(f||a)&&!u&&!p&&!m&&!w&&!k&&!d&&!R)for(let o=n+t.fontHeight;o<l;o+=t.fontHeight){const r=H(c,o,t);switch(t.grid[r]){case t.options.t:case t.options.b:case t.options.tr:case t.options.br:t.grid[r]=y;break;default:t.grid[r]=z}}if(u||(f||a)&&!h&&!p&&!m&&!w&&!k&&!d&&!R)for(let o=n+t.fontHeight;o<l;o+=t.fontHeight){const r=H(i,o,t);switch(t.grid[r]){case t.options.t:case t.options.b:case t.options.tl:case t.options.bl:t.grid[r]=S;break;default:t.grid[r]=D}}if(p||(f||a)&&!h&&!u&&!m&&!w&&!k&&!d&&!R)for(let o=c+t.fontWidth;o<i;o+=t.fontWidth){const r=H(o,n,t);switch(t.grid[r]){case t.options.l:case t.options.r:case t.options.bl:case t.options.br:t.grid[r]=A;break;default:t.grid[r]=_}}if(m||(f||a)&&!h&&!u&&!p&&!w&&!k&&!d&&!R)for(let o=c+t.fontWidth;o<i;o+=t.fontWidth){const r=H(o,l,t);switch(t.grid[r]){case t.options.l:case t.options.r:case t.options.tl:case t.options.tr:t.grid[r]=I;break;default:t.grid[r]=$}}if(w||p&&h||(f||a)&&!h&&!u&&!p&&!m&&!k&&!d&&!R){const o=H(c,n,t);switch(t.grid[o]){case t.options.t:case t.options.b:case t.options.tr:t.grid[o]=I;break;case t.options.l:case t.options.r:case t.options.bl:t.grid[o]=S;break;case t.options.br:t.grid[o]=v;break;default:t.grid[o]=X}}if(k||p&&u||(f||a)&&!h&&!u&&!p&&!m&&!w&&!d&&!R){const o=H(i,n,t);switch(t.grid[o]){case t.options.t:case t.options.b:case t.options.tl:t.grid[o]=I;break;case t.options.l:case t.options.r:case t.options.br:t.grid[o]=y;break;case t.options.bl:t.grid[o]=v;break;default:t.grid[o]=J}}if(d||m&&u||(f||a)&&!h&&!u&&!p&&!m&&!w&&!k&&!R){const o=H(i,l,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]=y;break;case t.options.t:case t.options.b:case t.options.bl:t.grid[o]=A;break;case t.options.tl:t.grid[o]=v;break;default:t.grid[o]=K}}if(R||m&&h||(f||a)&&!h&&!u&&!p&&!m&&!w&&!k&&!d){const o=H(c,l,t);switch(t.grid[o]){case t.options.l:case t.options.r:case t.options.tl:t.grid[o]=S;break;case t.options.t:case t.options.b:case t.options.br:t.grid[o]=A;break;case t.options.tr:t.grid[o]=v;break;default:t.grid[o]=Q}}if(!G)for(let o=n+t.fontHeight;o<l;o+=t.fontHeight)for(let r=c+t.fontWidth;r<i;r+=t.fontWidth)t.grid[H(r,o,t)]=U;(f||P)&&s.characters.forEach(o=>{const r=Math.round(o.rect.left/t.fontWidth)*t.fontWidth,V=Math.round(o.rect.bottom/t.fontHeight)*t.fontHeight;t.grid[H(r,V,t)]=o.char})};function N(s){return s.current?Array.from(s.current.querySelectorAll('[class*="ascii"]')).map(t=>{const c=[],i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;i.nextNode();){const n=i.currentNode,l=n.textContent??"";for(let e=0;e<l.length;e++){if(l[e].trim()==="")continue;const f=document.createRange();f.setStart(n,e),f.setEnd(n,e+1);const a=f.getBoundingClientRect();c.push({char:l[e],rect:a})}}return{rect:t.getBoundingClientRect(),characters:c,type:t.tagName.toLowerCase(),classList:t.classList}}):[]}const j=({children:s,gridReveal:t=!0,revealSpeed:c=30})=>{const i=C.useRef(null),n=E(),l=C.useRef([]),e=t?M(n.grid,c):n.grid,[,f]=C.useReducer(a=>a+1,0);C.useLayoutEffect(()=>{if(!i.current)return;let a;const h=()=>{l.current=N(i),a=requestAnimationFrame(h),f()};return h(),()=>cancelAnimationFrame(a)},[]);for(let a=0;a<n.grid.length;a++)n.grid[a]=" ";return l.current.forEach(a=>{B({rect:a,grid:n})}),x.jsxs("div",{ref:i,className:"leading-none",children:[x.jsx("div",{style:{width:n.truncWidth,height:n.truncHeight},className:"absolute opacity-0 top-0 left-0 bg-none pointer-events-none",children:s}),i.current&&l.current&&x.jsx("div",{style:{width:n.truncWidth,height:n.truncHeight},children:Array.from({length:n.rows},(a,h)=>{let u="";const p=h*n.cols,m=p+n.cols;for(let w=p;w<m;w++)u+=e[w]??" ";return x.jsx("p",{children:u},h)})})]})};function F(){const[s,t]=C.useState({width:0,height:0});return C.useEffect(()=>{const c=()=>t({width:window.innerWidth,height:window.innerHeight});return c(),window.addEventListener("resize",c),()=>window.removeEventListener("resize",c)},[]),s}function q({width:s,height:t,...c}){const i={...L,...c},n=16,l=1229/2048,e=n*l,f=s-s%e,a=t-t%n,h=Math.floor(a/n),u=Math.floor(f/e),p=Array.from({length:h*u},()=>i.fill);return{fontHeight:n,courierRatio:l,fontWidth:e,truncWidth:f,truncHeight:a,windowWidth:s,windowHeight:t,rows:h,cols:u,grid:p,options:i}}function O({children:s,...t}){const{width:c,height:i}=F(),n=C.useMemo(()=>q({width:c,height:i,...t}),[c,i,t]);return x.jsx(T.Provider,{value:n,children:s})}W.ASCII=j,W.ASCIIProvider=O,W.useGridContext=E,Object.defineProperty(W,Symbol.toStringTag,{value:"Module"})}));
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
@@ -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":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "html-to-ascii",
3
3
  "private": false,
4
- "version": "0.3.2",
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",