html-to-ascii 0.2.3 → 0.3.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/README.md CHANGED
@@ -1,73 +1,250 @@
1
- # React + TypeScript + Vite
2
-
3
- This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4
-
5
- Currently, two official plugins are available:
6
-
7
- - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
8
- - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9
-
10
- ## React Compiler
11
-
12
- The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
13
-
14
- ## Expanding the ESLint configuration
15
-
16
- If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
17
-
18
- ```js
19
- export default defineConfig([
20
- globalIgnores(['dist']),
21
- {
22
- files: ['**/*.{ts,tsx}'],
23
- extends: [
24
- // Other configs...
25
-
26
- // Remove tseslint.configs.recommended and replace with this
27
- tseslint.configs.recommendedTypeChecked,
28
- // Alternatively, use this for stricter rules
29
- tseslint.configs.strictTypeChecked,
30
- // Optionally, add this for stylistic rules
31
- tseslint.configs.stylisticTypeChecked,
32
-
33
- // Other configs...
34
- ],
35
- languageOptions: {
36
- parserOptions: {
37
- project: ['./tsconfig.node.json', './tsconfig.app.json'],
38
- tsconfigRootDir: import.meta.dirname,
39
- },
40
- // other options...
41
- },
42
- },
43
- ])
44
- ```
45
-
46
- You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
47
-
48
- ```js
49
- // eslint.config.js
50
- import reactX from 'eslint-plugin-react-x'
51
- import reactDom from 'eslint-plugin-react-dom'
52
-
53
- export default defineConfig([
54
- globalIgnores(['dist']),
55
- {
56
- files: ['**/*.{ts,tsx}'],
57
- extends: [
58
- // Other configs...
59
- // Enable lint rules for React
60
- reactX.configs['recommended-typescript'],
61
- // Enable lint rules for React DOM
62
- reactDom.configs.recommended,
63
- ],
64
- languageOptions: {
65
- parserOptions: {
66
- project: ['./tsconfig.node.json', './tsconfig.app.json'],
67
- tsconfigRootDir: import.meta.dirname,
68
- },
69
- // other options...
70
- },
71
- },
72
- ])
73
- ```
1
+ ```
2
+ __ __ __ __ _ _
3
+ / /_ / /_____ ___ / / / /_____ ____ ___________(_|_)
4
+ / __ \/ __/ __ `__ \/ /_____/ __/ __ \______/ __ `/ ___/ ___/ / /
5
+ / / / / /_/ / / / / / /_____/ /_/ /_/ /_____/ /_/ (__ ) /__/ / /
6
+ /_/ /_/\__/_/ /_/ /_/_/ \__/\____/ \__,_/____/\___/_/_/
7
+
8
+ ```
9
+
10
+ [![NPM Version][npm-image]][npm-url]
11
+ [![Downloads Stats][npm-downloads]][npm-url]
12
+
13
+ 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
+
15
+ [[Changelog](https://github.com/zachariahwatson/html-to-ascii/blob/main/CHANGELOG.md)]
16
+
17
+ ## Installation
18
+
19
+ ```sh
20
+ npm install html-to-ascii
21
+ ```
22
+
23
+ Add `<ASCIIProvider>` to the root of your project:
24
+
25
+ ```jsx
26
+ import { StrictMode } from "react"
27
+ import { createRoot } from "react-dom/client"
28
+ import App from "./App.tsx"
29
+ import { ASCIIProvider } from "html-to-ascii"
30
+
31
+ createRoot(document.getElementById("root")!).render(
32
+ <StrictMode>
33
+ <ASCIIProvider>
34
+ <App />
35
+ </ASCIIProvider>
36
+ </StrictMode>,
37
+ )
38
+ ```
39
+
40
+ ## Usage
41
+
42
+ ### Quick Start
43
+
44
+ Wrap your page with `<ASCII>` and add the `ascii` class to any element you want to render:
45
+
46
+ ```jsx
47
+ import { ASCII } from "html-to-ascii"
48
+
49
+ function App() {
50
+ return (
51
+ <ASCII>
52
+ <div className="flex justify-center"> <!---I'm not ASCII :(-->
53
+ <div className="text-center w-64 h-24 ascii">Look at me! I'm ASCII!</div>
54
+ </div>
55
+ </ASCII>
56
+ )
57
+ }
58
+
59
+ export default App
60
+ ```
61
+
62
+ Output
63
+
64
+ ```
65
+ ┌─────────────────────────┐
66
+ │ Look at me! I'm ASCII! │
67
+ │ │
68
+ │ │
69
+ │ │
70
+ │ │
71
+ └─────────────────────────┘
72
+ ```
73
+
74
+ ### Customization
75
+
76
+ html-to-ascii supports three interchangeable methods for customizing the look of your boxes:
77
+
78
+ #### 1. Adding props to `<ASCIIProvider>`:
79
+
80
+ This method changes the global style for every element unless locally overridden.
81
+ _(A full list of options can be seen [here](#api))_
82
+
83
+ ```html
84
+ <!--set the left and right borders to ":"-->
85
+ <ASCIIProvider l=":" r=":"></ASCIIProvider>
86
+ ```
87
+
88
+ Output
89
+
90
+ ```
91
+ ┌─────────────────────────┐
92
+ : Look at me! I'm ASCII! :
93
+ : :
94
+ : :
95
+ : :
96
+ : :
97
+ └─────────────────────────┘
98
+ ```
99
+
100
+ #### 2. Using class names on elements inside of `<ASCII>` to enable certain ASCII features:
101
+
102
+ _(A full list of class names can be seen [here](#api))_
103
+
104
+ ```jsx
105
+ <ASCII>
106
+ <div className="flex justify-center">
107
+ <!--enable only the border-->
108
+ <div className="text-center w-64 h-24 ascii-border">
109
+ Hey! Where'd the text go?
110
+ <!--enable only text and the top right and bottom left corners-->
111
+ <div className="ascii-text ascii-border-tr ascii-border-bl w-full h-12">Right here!</div>
112
+ </div>
113
+ </div>
114
+ </ASCII>
115
+ ```
116
+
117
+ Output
118
+
119
+ ```
120
+ ┌─────────────────────────┐
121
+ │ ┐│
122
+ │ │
123
+ │ Right here! │
124
+ │└ │
125
+ │ │
126
+ └─────────────────────────┘
127
+ ```
128
+
129
+ #### 3. Using class names on elements inside of `<ASCII>` to override global styles:
130
+
131
+ This method allows you to add local styling to a single element without changing the styles of other elements. _(A full list of override class names can be seen [here](#api))_
132
+
133
+ ```jsx
134
+ <ASCII>
135
+ <div className="flex justify-center">
136
+ <div className="text-center w-96 h-32 p-4 ascii">
137
+ I look so cool! B)
138
+ <br />
139
+ <br />
140
+ <!--override border styles-->
141
+ <div className="ascii ascii-l-║ ascii-r-║ ascii-t-═ ascii-b-═ ascii-tl-╔ ascii-tr-╗ ascii-br-╝ ascii-bl-╚ w-full h-12">
142
+ {"I look even *cooler* >B)"}
143
+ </div>
144
+ </div>
145
+ </div>
146
+ </ASCII>
147
+ ```
148
+
149
+ Output
150
+
151
+ ```
152
+ ┌───────────────────────────────────────┐
153
+ │ │
154
+ │ I look so cool! B) │
155
+ │ ╔═══════════════════════════════════╗ │
156
+ │ ║ I look even *cooler* >B) ║ │
157
+ │ ║ ║ │
158
+ │ ╚═══════════════════════════════════╝ │
159
+ │ │
160
+ └───────────────────────────────────────┘
161
+ ```
162
+
163
+ ### Preserving Strings and ASCII Art
164
+
165
+ ASCII art can contain some weird character combinations, and sometimes that messes with the renderer (especially "\\" and "(" ). We don't want to escape any characters upon render because it would mess with the grid array length and such, so we can "sterilize" certain texts by using `String.raw` and `white-space: pre`:
166
+
167
+ ```jsx
168
+ <ASCII>
169
+ <div className="flex justify-center">
170
+ <div className="w-[1000px] h-72 border text-center ascii whitespace-pre">
171
+ {String.raw`
172
+ _____ _ ______ _ ______ ______ _____ _____
173
+ |_ _| / // ____ `. / \ .' ____ \ .' ___ ||_ _||_ _|
174
+ | | / / `' __) | / _ \ | (___ \_|/ .' \_| | | | |
175
+ | | < < _ |__ '. / ___ \ _.____`. | | | | | |
176
+ _| |_ \ \| \____) | _/ / \ \_| \____) |\ `.___.'\ _| |_ _| |_
177
+ |_____| \_\\______.' |____| |____|\______.' `.____ .'|_____||_____|
178
+
179
+ `}
180
+ </div>
181
+ </ASCII>
182
+ ```
183
+
184
+ ### API
185
+
186
+ #### `<ASCIIProvider>` Props:
187
+
188
+ | Prop | Type | Default | Description |
189
+ | ------ | --------- | ------- | --------------------- |
190
+ | `t` | `string?` | `'─'` | Top border |
191
+ | `ti` | `string?` | `'┴'` | Top intersection |
192
+ | `b` | `string?` | `'─'` | Bottom border |
193
+ | `bi` | `string?` | `'┬'` | Bottom intersection |
194
+ | `l` | `string?` | `'│'` | Left border |
195
+ | `li` | `string?` | `'┤'` | Left intersection |
196
+ | `r` | `string?` | `'│'` | Right border |
197
+ | `ri` | `string?` | `'├'` | Right intersection |
198
+ | `tl` | `string?` | `'┌'` | Top-left corner |
199
+ | `tr` | `string?` | `'┐'` | Top-right corner |
200
+ | `br` | `string?` | `'┘'` | Bottom-right corner |
201
+ | `bl` | `string?` | `'└'` | Bottom-left corner |
202
+ | `i` | `string?` | `'┼'` | Four-way intersection |
203
+ | `fill` | `string?` | `' '` | Element fill |
204
+
205
+ #### `<ASCII>` Class names:
206
+
207
+ | Class name | Description |
208
+ | ----------------- | ------------------------------------------- |
209
+ | `ascii` | Enable all |
210
+ | `ascii-border` | Enable all borders |
211
+ | `ascii-border-l` | Enable left border |
212
+ | `ascii-border-r` | Enable right border |
213
+ | `ascii-border-t` | Enable top border |
214
+ | `ascii-border-b` | Enable bottom border |
215
+ | `ascii-border-tl` | Enable top-left corner |
216
+ | `ascii-border-tr` | Enable top-right corner |
217
+ | `ascii-border-br` | Enable bottom-right corner |
218
+ | `ascii-border-bl` | Enable bottom-left corner |
219
+ | `ascii-text` | Enable text |
220
+ | `ascii-no-fill` | Disable element's fill (will be "see-thru") |
221
+
222
+ #### `<ASCII>` Override class names:
223
+
224
+ Replace '#' with your desired character
225
+
226
+ | Class name | Description |
227
+ | -------------- | --------------------- |
228
+ | `ascii-t-#` | Top border |
229
+ | `ascii-ti-#` | Top intersection |
230
+ | `ascii-b-#` | Bottom border |
231
+ | `ascii-bi-#` | Bottom intersection |
232
+ | `ascii-l-#` | Left border |
233
+ | `ascii-li-#` | Left intersection |
234
+ | `ascii-r-#` | Right border |
235
+ | `ascii-ri-#` | Right intersection |
236
+ | `ascii-tl-#` | Top-left corner |
237
+ | `ascii-tr-#` | Top-right corner |
238
+ | `ascii-br-#` | Bottom-right corner |
239
+ | `ascii-bl-#` | Bottom-left corner |
240
+ | `ascii-i-#` | Four-way intersection |
241
+ | `ascii-fill-#` | Element fill |
242
+
243
+ <!-- Markdown link & img dfn's -->
244
+
245
+ [npm-image]: https://img.shields.io/npm/v/datadog-metrics.svg?style=flat-square
246
+ [npm-url]: https://www.npmjs.com/package/html-to-ascii
247
+ [npm-downloads]: https://img.shields.io/npm/dm/datadog-metrics.svg?style=flat-square
248
+ [travis-image]: https://img.shields.io/travis/dbader/node-datadog-metrics/master.svg?style=flat-square
249
+ [travis-url]: https://travis-ci.org/dbader/node-datadog-metrics
250
+ [wiki]: https://github.com/yourname/yourproject/wiki
@@ -1,4 +1,6 @@
1
- export declare const ASCII: ({ children }: {
1
+ export declare const ASCII: ({ children, gridReveal, revealSpeed, }: {
2
2
  children: React.ReactNode;
3
+ gridReveal?: boolean;
4
+ revealSpeed?: number;
3
5
  }) => import("react/jsx-runtime").JSX.Element;
4
6
  //# sourceMappingURL=ASCII.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ASCII.d.ts","sourceRoot":"","sources":["../../lib/components/ASCII.tsx"],"names":[],"mappings":"AA4QA,eAAO,MAAM,KAAK,GAAI,cAAc;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,4CA8ChE,CAAA"}
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 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAA;AAEpB,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA"}
package/dist/index.es.js CHANGED
@@ -1,6 +1,7 @@
1
- import { jsxs as H, jsx as f } from "react/jsx-runtime";
2
- import { createContext as W, useContext as k, useState as b, useEffect as u, useRef as x, useLayoutEffect as v } from "react";
3
- const m = {
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 = {
4
5
  t: "─",
5
6
  ti: "┴",
6
7
  b: "─",
@@ -15,7 +16,7 @@ const m = {
15
16
  bl: "└",
16
17
  i: "┼",
17
18
  fill: " "
18
- }, w = W({
19
+ }, I = X({
19
20
  fontHeight: 0,
20
21
  courierRatio: 0,
21
22
  fontWidth: 0,
@@ -26,129 +27,128 @@ const m = {
26
27
  rows: 0,
27
28
  cols: 0,
28
29
  grid: [],
29
- options: m
30
- }), C = () => k(w);
31
- function d(s, t = 1) {
32
- const [n, i] = b(0);
33
- return u(() => {
34
- let c;
35
- const a = () => {
36
- i((o) => o >= s.length ? o : o + t), c = requestAnimationFrame(a);
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;
36
+ const l = () => {
37
+ i((n) => n >= s.length ? n : n + t), e = requestAnimationFrame(l);
37
38
  };
38
- return a(), () => cancelAnimationFrame(c);
39
- }, [s, t]), s.slice(0, n);
39
+ return l(), () => cancelAnimationFrame(e);
40
+ }, [s, t]), s.slice(0, c);
40
41
  }
41
- const r = (s, t, n) => {
42
- const i = s / n.fontWidth | 0;
43
- return (t / n.fontHeight | 0) * n.cols + i;
44
- }, y = ({ rect: s, grid: t }) => {
45
- const n = Math.floor(s.rect.left / t.fontWidth) * t.fontWidth, i = Math.floor(s.rect.right / t.fontWidth) * t.fontWidth, c = Math.floor(s.rect.top / t.fontHeight) * t.fontHeight, a = Math.floor(s.rect.bottom / t.fontHeight) * t.fontHeight;
46
- if (s.classList.contains("ascii-border") && !["ascii-border-l", "ascii-border-r", "ascii-border-t", "ascii-border-b"].some(
47
- (o) => s.classList.contains(o)
48
- ) || s.classList.contains("ascii-border-l"))
49
- for (let o = c + t.fontHeight; o < a; o += t.fontHeight) {
50
- const e = r(n, o, t);
51
- switch (t.grid[e]) {
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);
50
+ return c;
51
+ }
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]) {
52
58
  case t.options.t:
53
59
  case t.options.b:
54
60
  case t.options.tr:
55
61
  case t.options.br:
56
- t.grid[e] = t.options.li;
62
+ t.grid[r] = v;
57
63
  break;
58
64
  default:
59
- t.grid[e] = t.options.l;
65
+ t.grid[r] = F;
60
66
  }
61
67
  }
62
- if (s.classList.contains("ascii-border") && !["ascii-border-l", "ascii-border-r", "ascii-border-t", "ascii-border-b"].some(
63
- (o) => s.classList.contains(o)
64
- ) || s.classList.contains("ascii-border-r"))
65
- for (let o = c + t.fontHeight; o < a; o += t.fontHeight) {
66
- const e = r(i, o, t);
67
- switch (t.grid[e]) {
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]) {
68
72
  case t.options.t:
69
73
  case t.options.b:
70
74
  case t.options.tl:
71
75
  case t.options.bl:
72
- t.grid[e] = t.options.ri;
76
+ t.grid[r] = L;
73
77
  break;
74
78
  default:
75
- t.grid[e] = t.options.r;
79
+ t.grid[r] = d;
76
80
  }
77
81
  }
78
- if (s.classList.contains("ascii-border") && !["ascii-border-l", "ascii-border-r", "ascii-border-t", "ascii-border-b"].some(
79
- (o) => s.classList.contains(o)
80
- ) || s.classList.contains("ascii-border-t"))
81
- for (let o = n + t.fontWidth; o < i; o += t.fontWidth) {
82
- const e = r(o, c, t);
83
- switch (t.grid[e]) {
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]) {
84
86
  case t.options.l:
85
87
  case t.options.r:
86
88
  case t.options.bl:
87
89
  case t.options.br:
88
- t.grid[e] = t.options.ti;
90
+ t.grid[r] = y;
89
91
  break;
90
92
  default:
91
- t.grid[e] = t.options.t;
93
+ t.grid[r] = O;
92
94
  }
93
95
  }
94
- if (s.classList.contains("ascii-border") && !["ascii-border-l", "ascii-border-r", "ascii-border-t", "ascii-border-b"].some(
95
- (o) => s.classList.contains(o)
96
- ) || s.classList.contains("ascii-border-b"))
97
- for (let o = n + t.fontWidth; o < i; o += t.fontWidth) {
98
- const e = r(o, a, t);
99
- switch (t.grid[e]) {
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]) {
100
100
  case t.options.l:
101
101
  case t.options.r:
102
102
  case t.options.tl:
103
103
  case t.options.tr:
104
- t.grid[e] = t.options.bi;
104
+ t.grid[r] = A;
105
105
  break;
106
106
  default:
107
- t.grid[e] = t.options.b;
107
+ t.grid[r] = q;
108
108
  }
109
109
  }
110
- if (["ascii-border", "ascii-border-tl"].some((o) => s.classList.contains(o)) || ["ascii-border-l", "ascii-border-t"].every((o) => s.classList.contains(o))) {
111
- const o = r(n, c, t);
110
+ if (w || p && h || (f || a) && !h && !u && !p && !m && !W && !H && !x) {
111
+ const o = C(c, e, t);
112
112
  switch (t.grid[o]) {
113
113
  case t.options.t:
114
114
  case t.options.b:
115
115
  case t.options.tr:
116
- t.grid[o] = t.options.bi;
116
+ t.grid[o] = A;
117
117
  break;
118
118
  case t.options.l:
119
119
  case t.options.r:
120
120
  case t.options.bl:
121
- t.grid[o] = t.options.ri;
121
+ t.grid[o] = L;
122
122
  break;
123
123
  case t.options.br:
124
- t.grid[o] = t.options.i;
124
+ t.grid[o] = k;
125
125
  break;
126
126
  default:
127
- t.grid[o] = t.options.tl;
127
+ t.grid[o] = G;
128
128
  }
129
129
  }
130
- if (["ascii-border", "ascii-border-tr"].some((o) => s.classList.contains(o)) || ["ascii-border-r", "ascii-border-t"].every((o) => s.classList.contains(o))) {
131
- const o = r(i, c, t);
130
+ if (W || p && u || (f || a) && !h && !u && !p && !m && !w && !H && !x) {
131
+ const o = C(i, e, t);
132
132
  switch (t.grid[o]) {
133
133
  case t.options.t:
134
134
  case t.options.b:
135
135
  case t.options.tl:
136
- t.grid[o] = t.options.bi;
136
+ t.grid[o] = A;
137
137
  break;
138
138
  case t.options.l:
139
139
  case t.options.r:
140
140
  case t.options.br:
141
- t.grid[o] = t.options.li;
141
+ t.grid[o] = v;
142
142
  break;
143
143
  case t.options.bl:
144
- t.grid[o] = t.options.i;
144
+ t.grid[o] = k;
145
145
  break;
146
146
  default:
147
- t.grid[o] = t.options.tr;
147
+ t.grid[o] = j;
148
148
  }
149
149
  }
150
- if (["ascii-border", "ascii-border-br"].some((o) => s.classList.contains(o)) || ["ascii-border-r", "ascii-border-b"].every((o) => s.classList.contains(o))) {
151
- const o = r(i, a, t);
150
+ if (H || m && u || (f || a) && !h && !u && !p && !m && !w && !W && !x) {
151
+ const o = C(i, l, t);
152
152
  if (s.type === "textarea")
153
153
  t.grid[o] = "▼";
154
154
  else
@@ -156,129 +156,142 @@ const r = (s, t, n) => {
156
156
  case t.options.l:
157
157
  case t.options.r:
158
158
  case t.options.tr:
159
- t.grid[o] = t.options.li;
159
+ t.grid[o] = v;
160
160
  break;
161
161
  case t.options.t:
162
162
  case t.options.b:
163
163
  case t.options.bl:
164
- t.grid[o] = t.options.ti;
164
+ t.grid[o] = y;
165
165
  break;
166
166
  case t.options.tl:
167
- t.grid[o] = t.options.i;
167
+ t.grid[o] = k;
168
168
  break;
169
169
  default:
170
- t.grid[o] = t.options.br;
170
+ t.grid[o] = z;
171
171
  }
172
172
  }
173
- if (["ascii-border", "ascii-border-bl"].some((o) => s.classList.contains(o)) || ["ascii-border-l", "ascii-border-b"].every((o) => s.classList.contains(o))) {
174
- const o = r(n, a, t);
173
+ if (x || m && h || (f || a) && !h && !u && !p && !m && !w && !W && !H) {
174
+ const o = C(c, l, t);
175
175
  switch (t.grid[o]) {
176
176
  case t.options.l:
177
177
  case t.options.r:
178
178
  case t.options.tl:
179
- t.grid[o] = t.options.ri;
179
+ t.grid[o] = L;
180
180
  break;
181
181
  case t.options.t:
182
182
  case t.options.b:
183
183
  case t.options.br:
184
- t.grid[o] = t.options.ti;
184
+ t.grid[o] = y;
185
185
  break;
186
186
  case t.options.tr:
187
- t.grid[o] = t.options.i;
187
+ t.grid[o] = k;
188
188
  break;
189
189
  default:
190
- t.grid[o] = t.options.bl;
190
+ t.grid[o] = D;
191
191
  }
192
192
  }
193
- if (s.classList.contains("ascii-fill"))
194
- for (let o = c + t.fontHeight; o < a; o += t.fontHeight)
195
- for (let e = n + t.fontWidth; e < i; e += t.fontWidth)
196
- t.grid[r(e, o, t)] = t.options.fill;
197
- s.classList.contains("ascii-text") && s.characters.forEach((o) => {
198
- const e = Math.floor(o.rect.left / t.fontWidth) * t.fontWidth, l = Math.floor(o.rect.bottom / t.fontHeight) * t.fontHeight;
199
- t.grid[r(e, l, t)] = o.char;
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;
200
200
  });
201
201
  };
202
- function R(s) {
202
+ function g(s) {
203
203
  return s.current ? Array.from(s.current.querySelectorAll('[class*="ascii"]')).map((t) => {
204
- const n = [], i = document.createTreeWalker(t, NodeFilter.SHOW_TEXT);
204
+ const c = [], i = document.createTreeWalker(t, NodeFilter.SHOW_TEXT);
205
205
  for (; i.nextNode(); ) {
206
- const c = i.currentNode, a = c.textContent ?? "";
207
- for (let o = 0; o < a.length; o++) {
208
- if (a[o].trim() === "") continue;
209
- const e = document.createRange();
210
- e.setStart(c, o), e.setEnd(c, o + 1);
211
- const l = e.getBoundingClientRect();
212
- n.push({ char: a[o], rect: l });
206
+ const e = i.currentNode, l = e.textContent ?? "";
207
+ for (let n = 0; n < l.length; n++) {
208
+ if (l[n].trim() === "") continue;
209
+ 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 });
213
213
  }
214
214
  }
215
215
  return {
216
216
  rect: t.getBoundingClientRect(),
217
- characters: n,
217
+ characters: c,
218
218
  type: t.tagName.toLowerCase(),
219
219
  classList: t.classList
220
220
  };
221
221
  }) : [];
222
222
  }
223
- const I = ({ children: s }) => {
224
- const t = x(null), n = C(), [i, c] = b([]), a = d(n.grid, 30);
225
- v(() => {
226
- if (!t.current) return;
227
- let o;
228
- const e = () => {
229
- c(R(t)), o = requestAnimationFrame(e);
223
+ const st = ({
224
+ children: s,
225
+ gridReveal: t = !0,
226
+ revealSpeed: c = 30
227
+ }) => {
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;
232
+ const h = () => {
233
+ l.current = g(i), a = requestAnimationFrame(h), f();
230
234
  };
231
- return e(), () => cancelAnimationFrame(o);
235
+ return h(), () => cancelAnimationFrame(a);
232
236
  }, []);
233
- for (let o = 0; o < n.grid.length; o++)
234
- n.grid[o] = " ";
235
- return i?.forEach((o) => {
236
- y({ rect: o, grid: n });
237
- }), /* @__PURE__ */ H("div", { ref: t, children: [
238
- /* @__PURE__ */ f(
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(
239
243
  "div",
240
244
  {
241
- style: { width: n.truncWidth, height: n.truncHeight },
245
+ style: { width: e.truncWidth, height: e.truncHeight },
242
246
  className: "absolute opacity-0 top-0 left-0 bg-none pointer-events-none",
243
247
  children: s
244
248
  }
245
249
  ),
246
- t.current && /* @__PURE__ */ f("div", { style: { width: n.truncWidth, height: n.truncHeight }, className: "leading-none wrap-break-word", children: a.join("") })
250
+ i.current && l.current && /* @__PURE__ */ R("div", { style: { width: e.truncWidth, height: e.truncHeight }, children: Array.from({ length: e.rows }, (a, h) => {
251
+ 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);
256
+ }) })
247
257
  ] });
248
258
  };
249
- function A() {
250
- const [s, t] = b({
259
+ function tt() {
260
+ const [s, t] = E({
251
261
  width: 0,
252
262
  height: 0
253
263
  });
254
- return u(() => {
255
- const n = () => t({ width: window.innerWidth, height: window.innerHeight });
256
- return n(), window.addEventListener("resize", n), () => window.removeEventListener("resize", n);
264
+ return M(() => {
265
+ const c = () => t({ width: window.innerWidth, height: window.innerHeight });
266
+ return c(), window.addEventListener("resize", c), () => window.removeEventListener("resize", c);
257
267
  }, []), s;
258
268
  }
259
- function E({ width: s, height: t }) {
260
- const i = 0.60009765625, c = 16 * i, a = s - s % c, o = t - t % 16, e = s, l = t, h = Math.floor(o / 16), p = Math.floor(a / c), L = Array.from({ length: h * p }, () => " ");
269
+ function ot({ width: s, height: t, ...c }) {
270
+ const i = {
271
+ ...B,
272
+ ...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);
261
274
  return {
262
- fontHeight: 16,
263
- courierRatio: i,
264
- fontWidth: c,
265
- truncWidth: a,
266
- truncHeight: o,
267
- windowWidth: e,
268
- windowHeight: l,
275
+ fontHeight: e,
276
+ courierRatio: l,
277
+ fontWidth: n,
278
+ truncWidth: f,
279
+ truncHeight: a,
280
+ windowWidth: s,
281
+ windowHeight: t,
269
282
  rows: h,
270
- cols: p,
271
- grid: L,
272
- options: m
283
+ cols: u,
284
+ grid: p,
285
+ options: i
273
286
  };
274
287
  }
275
- function F({ children: s }) {
276
- const { width: t, height: n } = A(), i = E({ width: t, height: n });
277
- return /* @__PURE__ */ f(w.Provider, { value: i, children: s });
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 });
278
291
  }
279
292
  export {
280
- I as ASCII,
281
- F as ASCIIProvider,
282
- C as useGridContext
293
+ st as ASCII,
294
+ ct as ASCIIProvider,
295
+ V as useGridContext
283
296
  };
284
297
  //# 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, useRef, useState } 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\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\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\t//verticals\r\n\t//left\r\n\tif (\r\n\t\t(rect.classList.contains(\"ascii-border\") &&\r\n\t\t\t![\"ascii-border-l\", \"ascii-border-r\", \"ascii-border-t\", \"ascii-border-b\"].some((c) =>\r\n\t\t\t\trect.classList.contains(c),\r\n\t\t\t)) ||\r\n\t\trect.classList.contains(\"ascii-border-l\")\r\n\t) {\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] = grid.options.li\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[l] = grid.options.l\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//right\r\n\tif (\r\n\t\t(rect.classList.contains(\"ascii-border\") &&\r\n\t\t\t![\"ascii-border-l\", \"ascii-border-r\", \"ascii-border-t\", \"ascii-border-b\"].some((c) =>\r\n\t\t\t\trect.classList.contains(c),\r\n\t\t\t)) ||\r\n\t\trect.classList.contains(\"ascii-border-r\")\r\n\t) {\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] = grid.options.ri\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[r] = grid.options.r\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 (\r\n\t\t(rect.classList.contains(\"ascii-border\") &&\r\n\t\t\t![\"ascii-border-l\", \"ascii-border-r\", \"ascii-border-t\", \"ascii-border-b\"].some((c) =>\r\n\t\t\t\trect.classList.contains(c),\r\n\t\t\t)) ||\r\n\t\trect.classList.contains(\"ascii-border-t\")\r\n\t) {\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] = grid.options.ti\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[t] = grid.options.t\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//bottom\r\n\tif (\r\n\t\t(rect.classList.contains(\"ascii-border\") &&\r\n\t\t\t![\"ascii-border-l\", \"ascii-border-r\", \"ascii-border-t\", \"ascii-border-b\"].some((c) =>\r\n\t\t\t\trect.classList.contains(c),\r\n\t\t\t)) ||\r\n\t\trect.classList.contains(\"ascii-border-b\")\r\n\t) {\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] = grid.options.bi\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[b] = grid.options.b\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\t[\"ascii-border\", \"ascii-border-tl\"].some((c) => rect.classList.contains(c)) ||\r\n\t\t[\"ascii-border-l\", \"ascii-border-t\"].every((c) => rect.classList.contains(c))\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] = grid.options.bi\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] = grid.options.ri\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[tl] = grid.options.i\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[tl] = grid.options.tl\r\n\t\t}\r\n\t}\r\n\t//tr\r\n\tif (\r\n\t\t[\"ascii-border\", \"ascii-border-tr\"].some((c) => rect.classList.contains(c)) ||\r\n\t\t[\"ascii-border-r\", \"ascii-border-t\"].every((c) => rect.classList.contains(c))\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] = grid.options.bi\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] = grid.options.li\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.bl:\r\n\t\t\t\tgrid.grid[tr] = grid.options.i\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[tr] = grid.options.tr\r\n\t\t}\r\n\t}\r\n\t//br\r\n\tif (\r\n\t\t[\"ascii-border\", \"ascii-border-br\"].some((c) => rect.classList.contains(c)) ||\r\n\t\t[\"ascii-border-r\", \"ascii-border-b\"].every((c) => rect.classList.contains(c))\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] = grid.options.li\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] = grid.options.ti\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] = grid.options.i\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[br] = grid.options.br\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//bl\r\n\tif (\r\n\t\t[\"ascii-border\", \"ascii-border-bl\"].some((c) => rect.classList.contains(c)) ||\r\n\t\t[\"ascii-border-l\", \"ascii-border-b\"].every((c) => rect.classList.contains(c))\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] = grid.options.ri\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] = grid.options.ti\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.tr:\r\n\t\t\t\tgrid.grid[bl] = grid.options.i\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[bl] = grid.options.bl\r\n\t\t}\r\n\t}\r\n\r\n\t//fill\r\n\tif (rect.classList.contains(\"ascii-fill\")) {\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)] = grid.options.fill\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//characters\r\n\tif (rect.classList.contains(\"ascii-text\")) {\r\n\t\trect.characters.forEach((c) => {\r\n\t\t\tconst cRectLeft = Math.floor(c.rect.left / grid.fontWidth) * grid.fontWidth\r\n\t\t\tconst cRectBottom = Math.floor(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 = ({ children }: { children: React.ReactNode }) => {\r\n\tconst parentRef = useRef<HTMLDivElement | null>(null)\r\n\tconst grid = useGridContext()\r\n\tconst [rects, setRects] = useState<Rect[] | null>([])\r\n\tconst reveal = useReveal(grid.grid, 30)\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\tsetRects(getElements(parentRef))\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}, [])\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\trects?.forEach((rect) => {\r\n\t\tdrawRect({ rect, grid })\r\n\t})\r\n\r\n\treturn (\r\n\t\t<div ref={parentRef}>\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 && (\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{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 { GridContext } from \"../contexts/GridContext\"\r\nimport { useWindowDimensions } from \"../hooks/useWindowDimensions\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport { defaultOptions } from \"../utils/defaultOptions\"\r\n\r\nfunction initGrid({ width, height }: { width: number; height: number }): GridData {\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 windowWidth = width\r\n\tconst windowHeight = height\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 }, () => String.fromCharCode(160))\r\n\tconst options = defaultOptions\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,\r\n\t\twindowHeight,\r\n\t\trows,\r\n\t\tcols,\r\n\t\tgrid,\r\n\t\toptions,\r\n\t}\r\n}\r\n\r\nexport function ASCIIProvider({ children }: { children: React.ReactNode }) {\r\n\tconst { width, height } = useWindowDimensions()\r\n\tconst grid = initGrid({ width, height })\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","drawRect","rect","rectLeft","rectRight","rectTop","rectBottom","c","l","r","t","b","tl","tr","br","bl","cRectLeft","cRectBottom","getElements","ref","el","textWalker","textNode","text","range","ASCII","children","parentRef","useRef","rects","setRects","reveal","useLayoutEffect","jsxs","jsx","useWindowDimensions","dimensions","setDimensions","update","initGrid","width","height","courierRatio","fontWidth","truncWidth","truncHeight","windowWidth","windowHeight","rows","cols","ASCIIProvider"],"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 = (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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"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,3 @@
1
- (function(r,b){typeof exports=="object"&&typeof module<"u"?b(exports,require("react/jsx-runtime"),require("react")):typeof define=="function"&&define.amd?define(["exports","react/jsx-runtime","react"],b):(r=typeof globalThis<"u"?globalThis:r||self,b(r["html-to-ascii"]={},r.jsxRuntime,r.React))})(this,(function(r,b,f){"use strict";const p={t:"─",ti:"┴",b:"─",bi:"┬",l:"",li:"",r:"",ri:"",tl:"┌",tr:"┐",br:"┘",bl:"",i:"",fill:" "},u=f.createContext({fontHeight:0,courierRatio:0,fontWidth:0,truncWidth:0,truncHeight:0,windowWidth:0,windowHeight:0,rows:0,cols:0,grid:[],options:p}),m=()=>f.useContext(u);function d(s,t=1){const[e,i]=f.useState(0);return f.useEffect(()=>{let c;const a=()=>{i(o=>o>=s.length?o:o+t),c=requestAnimationFrame(a)};return a(),()=>cancelAnimationFrame(c)},[s,t]),s.slice(0,e)}const l=(s,t,e)=>{const i=s/e.fontWidth|0;return(t/e.fontHeight|0)*e.cols+i},H=({rect:s,grid:t})=>{const e=Math.floor(s.rect.left/t.fontWidth)*t.fontWidth,i=Math.floor(s.rect.right/t.fontWidth)*t.fontWidth,c=Math.floor(s.rect.top/t.fontHeight)*t.fontHeight,a=Math.floor(s.rect.bottom/t.fontHeight)*t.fontHeight;if(s.classList.contains("ascii-border")&&!["ascii-border-l","ascii-border-r","ascii-border-t","ascii-border-b"].some(o=>s.classList.contains(o))||s.classList.contains("ascii-border-l"))for(let o=c+t.fontHeight;o<a;o+=t.fontHeight){const n=l(e,o,t);switch(t.grid[n]){case t.options.t:case t.options.b:case t.options.tr:case t.options.br:t.grid[n]=t.options.li;break;default:t.grid[n]=t.options.l}}if(s.classList.contains("ascii-border")&&!["ascii-border-l","ascii-border-r","ascii-border-t","ascii-border-b"].some(o=>s.classList.contains(o))||s.classList.contains("ascii-border-r"))for(let o=c+t.fontHeight;o<a;o+=t.fontHeight){const n=l(i,o,t);switch(t.grid[n]){case t.options.t:case t.options.b:case t.options.tl:case t.options.bl:t.grid[n]=t.options.ri;break;default:t.grid[n]=t.options.r}}if(s.classList.contains("ascii-border")&&!["ascii-border-l","ascii-border-r","ascii-border-t","ascii-border-b"].some(o=>s.classList.contains(o))||s.classList.contains("ascii-border-t"))for(let o=e+t.fontWidth;o<i;o+=t.fontWidth){const n=l(o,c,t);switch(t.grid[n]){case t.options.l:case t.options.r:case t.options.bl:case t.options.br:t.grid[n]=t.options.ti;break;default:t.grid[n]=t.options.t}}if(s.classList.contains("ascii-border")&&!["ascii-border-l","ascii-border-r","ascii-border-t","ascii-border-b"].some(o=>s.classList.contains(o))||s.classList.contains("ascii-border-b"))for(let o=e+t.fontWidth;o<i;o+=t.fontWidth){const n=l(o,a,t);switch(t.grid[n]){case t.options.l:case t.options.r:case t.options.tl:case t.options.tr:t.grid[n]=t.options.bi;break;default:t.grid[n]=t.options.b}}if(["ascii-border","ascii-border-tl"].some(o=>s.classList.contains(o))||["ascii-border-l","ascii-border-t"].every(o=>s.classList.contains(o))){const o=l(e,c,t);switch(t.grid[o]){case t.options.t:case t.options.b:case t.options.tr:t.grid[o]=t.options.bi;break;case t.options.l:case t.options.r:case t.options.bl:t.grid[o]=t.options.ri;break;case t.options.br:t.grid[o]=t.options.i;break;default:t.grid[o]=t.options.tl}}if(["ascii-border","ascii-border-tr"].some(o=>s.classList.contains(o))||["ascii-border-r","ascii-border-t"].every(o=>s.classList.contains(o))){const o=l(i,c,t);switch(t.grid[o]){case t.options.t:case t.options.b:case t.options.tl:t.grid[o]=t.options.bi;break;case t.options.l:case t.options.r:case t.options.br:t.grid[o]=t.options.li;break;case t.options.bl:t.grid[o]=t.options.i;break;default:t.grid[o]=t.options.tr}}if(["ascii-border","ascii-border-br"].some(o=>s.classList.contains(o))||["ascii-border-r","ascii-border-b"].every(o=>s.classList.contains(o))){const o=l(i,a,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]=t.options.li;break;case t.options.t:case t.options.b:case t.options.bl:t.grid[o]=t.options.ti;break;case t.options.tl:t.grid[o]=t.options.i;break;default:t.grid[o]=t.options.br}}if(["ascii-border","ascii-border-bl"].some(o=>s.classList.contains(o))||["ascii-border-l","ascii-border-b"].every(o=>s.classList.contains(o))){const o=l(e,a,t);switch(t.grid[o]){case t.options.l:case t.options.r:case t.options.tl:t.grid[o]=t.options.ri;break;case t.options.t:case t.options.b:case t.options.br:t.grid[o]=t.options.ti;break;case t.options.tr:t.grid[o]=t.options.i;break;default:t.grid[o]=t.options.bl}}if(s.classList.contains("ascii-fill"))for(let o=c+t.fontHeight;o<a;o+=t.fontHeight)for(let n=e+t.fontWidth;n<i;n+=t.fontWidth)t.grid[l(n,o,t)]=t.options.fill;s.classList.contains("ascii-text")&&s.characters.forEach(o=>{const n=Math.floor(o.rect.left/t.fontWidth)*t.fontWidth,h=Math.floor(o.rect.bottom/t.fontHeight)*t.fontHeight;t.grid[l(n,h,t)]=o.char})};function W(s){return s.current?Array.from(s.current.querySelectorAll('[class*="ascii"]')).map(t=>{const e=[],i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;i.nextNode();){const c=i.currentNode,a=c.textContent??"";for(let o=0;o<a.length;o++){if(a[o].trim()==="")continue;const n=document.createRange();n.setStart(c,o),n.setEnd(c,o+1);const h=n.getBoundingClientRect();e.push({char:a[o],rect:h})}}return{rect:t.getBoundingClientRect(),characters:e,type:t.tagName.toLowerCase(),classList:t.classList}}):[]}const x=({children:s})=>{const t=f.useRef(null),e=m(),[i,c]=f.useState([]),a=d(e.grid,30);f.useLayoutEffect(()=>{if(!t.current)return;let o;const n=()=>{c(W(t)),o=requestAnimationFrame(n)};return n(),()=>cancelAnimationFrame(o)},[]);for(let o=0;o<e.grid.length;o++)e.grid[o]=" ";return i?.forEach(o=>{H({rect:o,grid:e})}),b.jsxs("div",{ref:t,children:[b.jsx("div",{style:{width:e.truncWidth,height:e.truncHeight},className:"absolute opacity-0 top-0 left-0 bg-none pointer-events-none",children:s}),t.current&&b.jsx("div",{style:{width:e.truncWidth,height:e.truncHeight},className:"leading-none wrap-break-word",children:a.join("")})]})};function k(){const[s,t]=f.useState({width:0,height:0});return f.useEffect(()=>{const e=()=>t({width:window.innerWidth,height:window.innerHeight});return e(),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[]),s}function C({width:s,height:t}){const i=.60009765625,c=16*i,a=s-s%c,o=t-t%16,n=s,h=t,w=Math.floor(o/16),L=Math.floor(a/c),y=Array.from({length:w*L},()=>" ");return{fontHeight:16,courierRatio:i,fontWidth:c,truncWidth:a,truncHeight:o,windowWidth:n,windowHeight:h,rows:w,cols:L,grid:y,options:p}}function v({children:s}){const{width:t,height:e}=k(),i=C({width:t,height:e});return b.jsx(u.Provider,{value:i,children:s})}r.ASCII=x,r.ASCIIProvider=v,r.useGridContext=m,Object.defineProperty(r,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}}}@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"})}));
2
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, useRef, useState } 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\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\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\t//verticals\r\n\t//left\r\n\tif (\r\n\t\t(rect.classList.contains(\"ascii-border\") &&\r\n\t\t\t![\"ascii-border-l\", \"ascii-border-r\", \"ascii-border-t\", \"ascii-border-b\"].some((c) =>\r\n\t\t\t\trect.classList.contains(c),\r\n\t\t\t)) ||\r\n\t\trect.classList.contains(\"ascii-border-l\")\r\n\t) {\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] = grid.options.li\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[l] = grid.options.l\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//right\r\n\tif (\r\n\t\t(rect.classList.contains(\"ascii-border\") &&\r\n\t\t\t![\"ascii-border-l\", \"ascii-border-r\", \"ascii-border-t\", \"ascii-border-b\"].some((c) =>\r\n\t\t\t\trect.classList.contains(c),\r\n\t\t\t)) ||\r\n\t\trect.classList.contains(\"ascii-border-r\")\r\n\t) {\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] = grid.options.ri\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[r] = grid.options.r\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 (\r\n\t\t(rect.classList.contains(\"ascii-border\") &&\r\n\t\t\t![\"ascii-border-l\", \"ascii-border-r\", \"ascii-border-t\", \"ascii-border-b\"].some((c) =>\r\n\t\t\t\trect.classList.contains(c),\r\n\t\t\t)) ||\r\n\t\trect.classList.contains(\"ascii-border-t\")\r\n\t) {\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] = grid.options.ti\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[t] = grid.options.t\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t//bottom\r\n\tif (\r\n\t\t(rect.classList.contains(\"ascii-border\") &&\r\n\t\t\t![\"ascii-border-l\", \"ascii-border-r\", \"ascii-border-t\", \"ascii-border-b\"].some((c) =>\r\n\t\t\t\trect.classList.contains(c),\r\n\t\t\t)) ||\r\n\t\trect.classList.contains(\"ascii-border-b\")\r\n\t) {\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] = grid.options.bi\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[b] = grid.options.b\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\t[\"ascii-border\", \"ascii-border-tl\"].some((c) => rect.classList.contains(c)) ||\r\n\t\t[\"ascii-border-l\", \"ascii-border-t\"].every((c) => rect.classList.contains(c))\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] = grid.options.bi\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] = grid.options.ri\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.br:\r\n\t\t\t\tgrid.grid[tl] = grid.options.i\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[tl] = grid.options.tl\r\n\t\t}\r\n\t}\r\n\t//tr\r\n\tif (\r\n\t\t[\"ascii-border\", \"ascii-border-tr\"].some((c) => rect.classList.contains(c)) ||\r\n\t\t[\"ascii-border-r\", \"ascii-border-t\"].every((c) => rect.classList.contains(c))\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] = grid.options.bi\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] = grid.options.li\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.bl:\r\n\t\t\t\tgrid.grid[tr] = grid.options.i\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[tr] = grid.options.tr\r\n\t\t}\r\n\t}\r\n\t//br\r\n\tif (\r\n\t\t[\"ascii-border\", \"ascii-border-br\"].some((c) => rect.classList.contains(c)) ||\r\n\t\t[\"ascii-border-r\", \"ascii-border-b\"].every((c) => rect.classList.contains(c))\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] = grid.options.li\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] = grid.options.ti\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] = grid.options.i\r\n\t\t\t\t\tbreak\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tgrid.grid[br] = grid.options.br\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//bl\r\n\tif (\r\n\t\t[\"ascii-border\", \"ascii-border-bl\"].some((c) => rect.classList.contains(c)) ||\r\n\t\t[\"ascii-border-l\", \"ascii-border-b\"].every((c) => rect.classList.contains(c))\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] = grid.options.ri\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] = grid.options.ti\r\n\t\t\t\tbreak\r\n\t\t\tcase grid.options.tr:\r\n\t\t\t\tgrid.grid[bl] = grid.options.i\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tgrid.grid[bl] = grid.options.bl\r\n\t\t}\r\n\t}\r\n\r\n\t//fill\r\n\tif (rect.classList.contains(\"ascii-fill\")) {\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)] = grid.options.fill\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//characters\r\n\tif (rect.classList.contains(\"ascii-text\")) {\r\n\t\trect.characters.forEach((c) => {\r\n\t\t\tconst cRectLeft = Math.floor(c.rect.left / grid.fontWidth) * grid.fontWidth\r\n\t\t\tconst cRectBottom = Math.floor(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 = ({ children }: { children: React.ReactNode }) => {\r\n\tconst parentRef = useRef<HTMLDivElement | null>(null)\r\n\tconst grid = useGridContext()\r\n\tconst [rects, setRects] = useState<Rect[] | null>([])\r\n\tconst reveal = useReveal(grid.grid, 30)\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\tsetRects(getElements(parentRef))\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}, [])\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\trects?.forEach((rect) => {\r\n\t\tdrawRect({ rect, grid })\r\n\t})\r\n\r\n\treturn (\r\n\t\t<div ref={parentRef}>\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 && (\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{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 { GridContext } from \"../contexts/GridContext\"\r\nimport { useWindowDimensions } from \"../hooks/useWindowDimensions\"\r\nimport type { GridData } from \"../types/GridData\"\r\nimport { defaultOptions } from \"../utils/defaultOptions\"\r\n\r\nfunction initGrid({ width, height }: { width: number; height: number }): GridData {\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 windowWidth = width\r\n\tconst windowHeight = height\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 }, () => String.fromCharCode(160))\r\n\tconst options = defaultOptions\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,\r\n\t\twindowHeight,\r\n\t\trows,\r\n\t\tcols,\r\n\t\tgrid,\r\n\t\toptions,\r\n\t}\r\n}\r\n\r\nexport function ASCIIProvider({ children }: { children: React.ReactNode }) {\r\n\tconst { width, height } = useWindowDimensions()\r\n\tconst grid = initGrid({ width, height })\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","drawRect","rect","rectLeft","rectRight","rectTop","rectBottom","c","l","r","t","b","tl","tr","br","bl","cRectLeft","cRectBottom","getElements","ref","el","textWalker","textNode","text","range","ASCII","children","parentRef","useRef","rects","setRects","reveal","useLayoutEffect","jsxs","jsx","useWindowDimensions","dimensions","setDimensions","update","initGrid","width","height","courierRatio","fontWidth","truncWidth","truncHeight","windowWidth","windowHeight","rows","cols","ASCIIProvider"],"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 = (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,4 +1,3 @@
1
- export declare function ASCIIProvider({ children }: {
2
- children: React.ReactNode;
3
- }): import("react/jsx-runtime").JSX.Element;
1
+ import { ASCIIProviderProps } from '../types/ASCIIProviderProps';
2
+ export declare function ASCIIProvider({ children, ...options }: ASCIIProviderProps): import("react/jsx-runtime").JSX.Element;
4
3
  //# sourceMappingURL=ASCIIProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ASCIIProvider.d.ts","sourceRoot":"","sources":["../../lib/providers/ASCIIProvider.tsx"],"names":[],"mappings":"AAgCA,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAIxE"}
1
+ {"version":3,"file":"ASCIIProvider.d.ts","sourceRoot":"","sources":["../../lib/providers/ASCIIProvider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAiCrE,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,EAAE,kBAAkB,2CAYzE"}
@@ -0,0 +1,3 @@
1
+ import { GridOptions } from './GridOptions';
2
+ export type ASCIIProviderProps = React.PropsWithChildren<Partial<GridOptions>>;
3
+ //# sourceMappingURL=ASCIIProviderProps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ASCIIProviderProps.d.ts","sourceRoot":"","sources":["../../lib/types/ASCIIProviderProps.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD,MAAM,MAAM,kBAAkB,GAAG,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { GridOptions } from './GridOptions';
2
+ export interface GridData {
3
+ fontHeight: number | 0;
4
+ courierRatio: number;
5
+ fontWidth: number;
6
+ truncWidth: number;
7
+ truncHeight: number;
8
+ windowWidth: number;
9
+ windowHeight: number;
10
+ rows: number;
11
+ cols: number;
12
+ grid: string[];
13
+ options: Required<GridOptions>;
14
+ }
15
+ //# sourceMappingURL=GridData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridData.d.ts","sourceRoot":"","sources":["../../lib/types/GridData.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD,MAAM,WAAW,QAAQ;IACxB,UAAU,EAAE,MAAM,GAAG,CAAC,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAA;CAC9B"}
@@ -0,0 +1,17 @@
1
+ export interface GridOptions {
2
+ t: string;
3
+ ti: string;
4
+ b: string;
5
+ bi: string;
6
+ l: string;
7
+ li: string;
8
+ r: string;
9
+ ri: string;
10
+ tl: string;
11
+ tr: string;
12
+ br: string;
13
+ bl: string;
14
+ i: string;
15
+ fill: string;
16
+ }
17
+ //# sourceMappingURL=GridOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridOptions.d.ts","sourceRoot":"","sources":["../../lib/types/GridOptions.tsx"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,CAAC,EAAE,MAAM,CAAA;IACT,EAAE,EAAE,MAAM,CAAA;IACV,CAAC,EAAE,MAAM,CAAA;IACT,EAAE,EAAE,MAAM,CAAA;IACV,CAAC,EAAE,MAAM,CAAA;IACT,EAAE,EAAE,MAAM,CAAA;IACV,CAAC,EAAE,MAAM,CAAA;IACT,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,CAAC,EAAE,MAAM,CAAA;IACT,IAAI,EAAE,MAAM,CAAA;CACZ"}
@@ -0,0 +1,10 @@
1
+ export interface Rect {
2
+ rect: DOMRect;
3
+ characters: {
4
+ char: string;
5
+ rect: DOMRect;
6
+ }[];
7
+ type: string;
8
+ classList: DOMTokenList;
9
+ }
10
+ //# sourceMappingURL=Rect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rect.d.ts","sourceRoot":"","sources":["../../lib/types/Rect.tsx"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACpB,IAAI,EAAE,OAAO,CAAA;IACb,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,YAAY,CAAA;CACvB"}
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "html-to-ascii",
3
3
  "private": false,
4
- "version": "0.2.3",
4
+ "version": "0.3.1",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "exports": {
9
9
  ".": {
10
+ "types": "./dist/index.d.ts",
10
11
  "import": "./dist/index.es.js",
11
- "require": "./dist/index.umd.js",
12
- "types": "./dist/index.d.ts"
12
+ "require": "./dist/index.umd.js"
13
13
  }
14
14
  },
15
15
  "files": [
@@ -25,7 +25,8 @@
25
25
  "@tailwindcss/vite": "^4.1.18",
26
26
  "react": "^19.2.0",
27
27
  "react-dom": "^19.2.0",
28
- "tailwindcss": "^4.1.18"
28
+ "tailwindcss": "^4.1.18",
29
+ "vite-plugin-css-injected-by-js": "^3.5.2"
29
30
  },
30
31
  "devDependencies": {
31
32
  "@eslint/js": "^9.39.1",