From 636b0323075225c584b62719ed51e75521bb7ffb Mon Sep 17 00:00:00 2001
From: aura <nw@moneybot.cc>
Date: Tue, 17 Feb 2026 22:39:42 +0100
Subject: push source

---
 moneyjsx/src/ascii-art.tsx | 165 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 165 insertions(+)
 create mode 100644 moneyjsx/src/ascii-art.tsx

(limited to 'moneyjsx/src/ascii-art.tsx')

diff --git a/moneyjsx/src/ascii-art.tsx b/moneyjsx/src/ascii-art.tsx
new file mode 100644
index 0000000..d2f53b3
--- /dev/null
+++ b/moneyjsx/src/ascii-art.tsx
@@ -0,0 +1,165 @@
+import * as JSX from "./jsx";
+import $ from "jquery";
+
+export default function AsciiArt() {
+  const ret = <div id="ascii-art">
+    { asciiArtStr }
+  </div>;
+
+  setTimeout( doAsciiArt );
+  return ret;
+}
+
+let startTime = 0.0;
+let anim = 0.0;
+
+function animFunc( a: number ) {
+  let ringRadius = anim;
+  let radius = a;
+
+  let dist = ringRadius - radius;
+
+  dist = Math.abs( dist );
+
+  let ret = Math.pow( dist, 0.1 + 0.8 * Math.pow( (anim + 0.5) / 2, 1.6 ) );
+  let remain = ret % 0.12;
+  return ret - remain;
+}
+
+function hexToRgb( hex: string ) {
+  let r = parseInt( hex.slice( 1, 3 ), 16 );
+  let g = parseInt( hex.slice( 3, 5 ), 16 );
+  let b = parseInt( hex.slice( 5, 7 ), 16 );
+  return [ r, g, b ];
+}
+
+function lerpColor( c1: number[], c2: number[], t: number ) {
+  let r1 = c1[0], g1 = c1[1], b1 = c1[2];
+  let r2 = c2[0], g2 = c2[1], b2 = c2[2];
+  let r = r1 + ( r2 - r1 ) * t;
+  let g = g1 + ( g2 - g1 ) * t;
+  let b = b1 + ( b2 - b1 ) * t;
+  return [ Math.round( r ), Math.round( g ), Math.round( b ) ];
+}
+
+function getDist( x: number, y: number ) {
+  const x1 = 0.5 - x / 125;
+  const y1 = 0.5 - y / 63;
+  return Math.sqrt( x1 * x1 + y1 * y1 );
+}
+
+let isDoingAnim = false;
+function doAsciiArt() {
+  let div = $( "#ascii-art" );
+  if( !div.length ) { isDoingAnim = false; return; }
+  isDoingAnim = true;
+
+  let deltaTime = ( Date.now() - startTime ) * 0.001;
+  startTime = Date.now();
+  anim += .5 * deltaTime;
+
+  if( anim > 2 )
+    anim = -0.5;
+
+  let rootColor = hexToRgb( $( ':root' ).css( '--front' ) );
+  let innerStr = "";
+  for( let i = 0; i < asciiArtStr.length; ++i ) {
+    let x = i % 125;
+    let y = Math.floor( i / 125 );
+
+    if( x == 124 ) {
+      continue;
+    }
+    if( asciiArtStr[i] == ',' || asciiArtStr[i] == ' ' || asciiArtStr[i] == '\t' ) {
+      innerStr += asciiArtStr[i];
+      continue;
+    }
+
+    let dist = getDist( x, y );
+    if( dist < 0.133 ) {
+      innerStr += asciiArtStr[i];
+      continue;
+    }
+
+    let color = [];
+    if( asciiArtStr[i] == '#' ) {
+      let a = animFunc( dist * 2 );
+      color = lerpColor( rootColor, [255, 255, 255, 1], a );
+      color[3] = Math.max( Math.min( 1, Math.pow( dist, 2 ) + (1.0 - a) ), 0.8 );
+    }
+    else {
+      color = [255, 255, 255, Math.max( 0.05, 1.0 - animFunc( (dist - 0.1) * 2 ) ) ];
+    }
+    // appending string is faster than jsx
+    innerStr += `<span style='color: rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})'>${asciiArtStr[i]}</span>`;
+  }
+
+  div.html( innerStr );
+  setTimeout( doAsciiArt, 75 );
+}
+
+const asciiArtStr = `
+                                             # #                      # #                                                   
+                                             # #                      # #                                                   
+                                             # #                      # #                                                   
+                                             # #                      # #                                                   
+                                             # #                      # #                                                   
+                                             # #                      # #                                                   
+                                             # #                      # #                                                   
+                                             # #                      # #                                                   
+                                             # #                      # #                                                   
+                                             # #                      # #                                                   
+                                             # #                      # #                                                   
+                                             # #                 ..   # #                                                   
+                                             # #                ..    # #                                                   
+                                             # #                .###  ###                                                   
+                                             # #                 ###  ### ..                                                
+                                             # #                 # #   ....                                                 
+                                             # #                 # #  ....                                                  
+                                             # #                 # #   ..                                                   
+                                             # #                 # #                                                        
+                                             # #                 # #                                                        
+                                 ..    ##############################################                                       
+ ...................................   ###.. ###   ...........   ###     .........###                                       
+ .................................. ####+############################################                                       
+ #######################################+#                                        #.#                                       
+                                   #####-#                                        #.#                                       
+ ####################################  # #                                        #.#                                       
+                                       # #                                        #.#                                       
+ #########################################                                        #.#...................................... 
+                                       ###                                        #.#...............--..................... 
+ #########################################                       |                ##################.###################### 
+                                       # #    ,---..  ,,---.,---.|---.,---..  ,   ###            ### ###...                 
+                          ################    ,---| >< |   ||   ||   ||   | ><    ################ ### #################### 
+ ###########################       ..  ###    \`---^'  \`\`---'\`   '\`---'\`---''  \`   #.#     ...    ### ###                    
+                        ##################                                        #.#        ... #######                    
+ #########################         ... # #                                        #.#              .     ################## 
+ ############################.         #.#                                        #.#                    # # .............. 
+                          ###-         #.#                                        #-########################............... 
+ ############################-         # #                                        #+#                 ...###......   ...... 
+ .........................##############-#                                        #-########################.... ..         
+ .........................###.         #-#                                        #.#   .......................             
+            ..............+##########################################################  ......................               
+                      .................###...................    ###      ###  ...###        ..........                     
+                        .............. ##############################################                                       
+                                                             ....# #..... # #                                               
+                                                      ...    ... # #      # #                                               
+                                                ................ # #      # #                                               
+                                             ..................  # #      # #                                               
+                                           .......##################      # #   .                                           
+                                         .....######             ###      # #                                               
+                                            ####+###################.     # #                                               
+                                            ######+    ..............     # #                                               
+                                            # #    .................      # #                                               
+                                            # #            ......         # #                                               
+                                            # #                           # #                                               
+                                            # #                           # #                                               
+                                            # #                           # #                                               
+                                            # #                           # #                                               
+                                            # #                           # #                                               
+                                            # #                           # #                                               
+                                            # #                           # #                                               
+                                            # #                           # #                                               
+                                            # #                           # #                                               
+                                            # #                           # #                                               
+`;
-- 
cgit v1.2.3

