@@ -1808,6 +1808,11 @@ if (quoteBtn && quoteOutput) {
18081808
18091809if ( launchBtn && quoteOutput && signalCount ) {
18101810 launchBtn . addEventListener ( "click" , ( event ) => {
1811+ if ( document . body . classList . contains ( "matrix-mode" ) ) {
1812+ stopMatrixRain ( ) ;
1813+ showToast ( "Pulse override: Matrix rain off." ) ;
1814+ }
1815+
18111816 launches += 1 ;
18121817 signalCount . textContent = String ( launches ) ;
18131818 quoteOutput . textContent = `> Aura pulse ${ launches } launched from Mars.` ;
@@ -1899,6 +1904,7 @@ let matrixContext = null;
18991904let matrixAnimation = null ;
19001905let matrixDrops = [ ] ;
19011906let matrixResizeHandler = null ;
1907+ let matrixViewportResizeHandler = null ;
19021908
19031909function startMatrixRain ( ) {
19041910 if ( matrixCanvas ) {
@@ -1913,29 +1919,52 @@ function startMatrixRain() {
19131919
19141920 matrixResizeHandler = ( ) => {
19151921 if ( ! matrixCanvas || ! matrixContext ) return ;
1916- matrixCanvas . width = window . innerWidth ;
1917- matrixCanvas . height = window . innerHeight ;
1918- const columns = Math . floor ( matrixCanvas . width / 14 ) ;
1919- matrixDrops = Array . from ( { length : columns } , ( ) => Math . random ( ) * matrixCanvas . height ) ;
1922+ const viewportWidth = Math . max (
1923+ 1 ,
1924+ Math . floor ( window . visualViewport ?. width || window . innerWidth || document . documentElement . clientWidth || 1 )
1925+ ) ;
1926+ const viewportHeight = Math . max (
1927+ 1 ,
1928+ Math . floor ( window . visualViewport ?. height || window . innerHeight || document . documentElement . clientHeight || 1 )
1929+ ) ;
1930+ const pixelRatio = Math . max ( 1 , window . devicePixelRatio || 1 ) ;
1931+
1932+ matrixCanvas . style . width = `${ viewportWidth } px` ;
1933+ matrixCanvas . style . height = `${ viewportHeight } px` ;
1934+ matrixCanvas . width = Math . floor ( viewportWidth * pixelRatio ) ;
1935+ matrixCanvas . height = Math . floor ( viewportHeight * pixelRatio ) ;
1936+ matrixContext . setTransform ( pixelRatio , 0 , 0 , pixelRatio , 0 , 0 ) ;
1937+
1938+ const columns = Math . floor ( viewportWidth / 14 ) ;
1939+ matrixDrops = Array . from ( { length : columns } , ( ) => Math . random ( ) * viewportHeight ) ;
19201940 } ;
19211941
19221942 matrixResizeHandler ( ) ;
19231943 window . addEventListener ( "resize" , matrixResizeHandler ) ;
1944+ if ( window . visualViewport ) {
1945+ matrixViewportResizeHandler = ( ) => matrixResizeHandler ?. ( ) ;
1946+ window . visualViewport . addEventListener ( "resize" , matrixViewportResizeHandler ) ;
1947+ }
19241948
19251949 const chars = "01{}[]<>/\\|$#@" ;
19261950 const draw = ( ) => {
19271951 if ( ! matrixCanvas || ! matrixContext ) return ;
1952+ const pixelRatio = Math . max ( 1 , window . devicePixelRatio || 1 ) ;
1953+ const renderWidth = matrixCanvas . width / pixelRatio ;
1954+ const renderHeight = matrixCanvas . height / pixelRatio ;
19281955
19291956 matrixContext . fillStyle = "rgba(0, 0, 0, 0.08)" ;
1930- matrixContext . fillRect ( 0 , 0 , matrixCanvas . width , matrixCanvas . height ) ;
1957+ matrixContext . fillRect ( 0 , 0 , renderWidth , renderHeight ) ;
19311958 matrixContext . fillStyle = "#73ff86" ;
19321959 matrixContext . font = "13px monospace" ;
19331960
19341961 matrixDrops . forEach ( ( drop , index ) => {
19351962 const char = chars [ Math . floor ( Math . random ( ) * chars . length ) ] ;
19361963 const x = index * 14 ;
19371964 matrixContext . fillText ( char , x , drop ) ;
1938- matrixDrops [ index ] = drop > matrixCanvas . height && Math . random ( ) > 0.98 ? 0 : drop + 10 ;
1965+ matrixDrops [ index ] = drop > renderHeight && Math . random ( ) > 0.98
1966+ ? 0
1967+ : drop + 10 ;
19391968 } ) ;
19401969
19411970 matrixAnimation = requestAnimationFrame ( draw ) ;
@@ -1954,6 +1983,10 @@ function stopMatrixRain() {
19541983 window . removeEventListener ( "resize" , matrixResizeHandler ) ;
19551984 matrixResizeHandler = null ;
19561985 }
1986+ if ( window . visualViewport && matrixViewportResizeHandler ) {
1987+ window . visualViewport . removeEventListener ( "resize" , matrixViewportResizeHandler ) ;
1988+ matrixViewportResizeHandler = null ;
1989+ }
19571990
19581991 if ( matrixCanvas ) matrixCanvas . remove ( ) ;
19591992 matrixCanvas = null ;
0 commit comments