1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <link rel="icon" type="image/svg+xml" href="/icon.svg" /> 6 <link rel="apple-touch-icon" href="/icon.svg" /> 7 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 8 9 <!-- PWA Configuration --> 10 <link rel="manifest" href="/manifest.json" /> 11 <meta name="theme-color" content="#fef3c7" /> 12 <meta name="apple-mobile-web-app-capable" content="yes" /> 13 <meta name="apple-mobile-web-app-status-bar-style" content="default" /> 14 <meta name="apple-mobile-web-app-title" content="GoTorah" /> 15 16 <!-- SEO & Description --> 17 <title>GoTorah</title> 18 <meta name="description" content="AI-powered Torah study companion - Connect with Torah like never before" /> 19
19<script src="https://cdn.tailwindcss.com"></script>
19 20 <link rel="preconnect" href="https://fonts.googleapis.com"> 21 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 22 <link href="https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600&family=Frank+Ruhl+Libre:wght@300;400;500;700&family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet"> 23 <style> 24 /* --- GoTorah Loading Animations --- */ 25 @keyframes logo-scale-in { 26 from { 27 transform: scale(0.8); 28 opacity: 0; 29 } 30 to { 31 transform: scale(1); 32 opacity: 1; 33 } 34 } 35 36 .animate-logo-scale-in { 37 animation: logo-scale-in 0.7s cubic-bezier(0.25, 1, 0.5, 1) forwards; 38 } 39 40 @keyframes line-1-draw { 41 from { width: 0; } 42 to { width: 2.5rem; } /* w-10 */ 43 } 44 .animate-line-1-draw { 45 width: 0; 46 animation: line-1-draw 0.5s ease-out forwards; 47 animation-delay: 0.5s; 48 } 49 50 @keyframes line-2-draw { 51 from { width: 0; } 52 to { width: 2.25rem; } /* w-9 */ 53 } 54 .animate-line-2-draw { 55 width: 0; 56 animation: line-2-draw 0.5s ease-out forwards; 57 animation-delay: 0.7s; 58 } 59 60 @keyframes line-3-draw { 61 from { width: 0; } 62 to { width: 2rem; } /* w-8 */ 63 } 64 .animate-line-3-draw { 65 width: 0; 66 animation: line-3-draw 0.5s ease-out forwards; 67 animation-delay: 0.9s; 68 } 69 70 @keyframes fade-in-up { 71 from { 72 opacity: 0; 73 transform: translateY(20px); 74 } 75 to { 76 opacity: 1; 77 transform: translateY(0); 78 } 79 } 80 .animate-fade-in-up { 81 opacity: 0; 82 animation: fade-in-up 0.6s cubic-bezier(0.25, 1, 0.5, 1) forwards; 83 } 84 85 /* --- Bring to My Table shimmer --- */ 86 @keyframes btn-shimmer { 87 0% { background-position: -200% center; } 88 100% { background-position: 200% center; } 89 } 90 .animate-btn-shimmer { 91 background-image: linear-gradient( 92 105deg, 93 transparent 40%, 94 rgba(255,255,255,0.18) 50%, 95 transparent 60% 96 ); 97 background-size: 200% 100%; 98 animation: btn-shimmer 2.8s ease-in-out infinite; 99 } 100 101 /* --- Base Styles --- */ 102 body { 103 font-family: 'Inter', sans-serif; 104 } 105 h1, h2, h3, h4, .font-serif { 106 font-family: 'Frank Ruhl Libre', serif; 107 } 108 </style> 109 110
110<script type="importmap"> 111{ 112 "imports": { 113 "react": "https://aistudiocdn.com/react@^19.1.1", 114 "react-dom/": "https://aistudiocdn.com/react-dom@^19.1.1/", 115 "react/": "https://aistudiocdn.com/react@^19.1.1/", 116 "@google/genai": "https://aistudiocdn.com/@google/genai@^1.20.0", 117 "firebase/app": "https://www.gstatic.com/firebasejs/10.12.2/firebase-app.js", 118 "firebase/auth": "https://www.gstatic.com/firebasejs/10.12.2/firebase-auth.js", 119 "firebase/": "https://aistudiocdn.com/firebase@^12.3.0/", 120 "vite": "https://aistudiocdn.com/vite@^7.1.7", 121 "path": "https://aistudiocdn.com/path@^0.12.7", 122 "@vitejs/plugin-react": "https://aistudiocdn.com/@vitejs/plugin-react@^5.0.3" 123 } 124} 125</script>
125 126
126<script type="module" crossorigin src="/assets/index-BlBr0r9U.js"></script>
126 127</head> 128 <body class="bg-slate-50"> 129 <!-- Capture donate intent before React mounts or Firebase redirects strip the URL param --> 130
130<script> 131 try { 132 if (new URLSearchParams(window.location.search).get('donate') === 'true') { 133 sessionStorage.setItem('pendingDonate', 'true'); 134 } 135 } catch(e) {} 136 </script>
136 137 <div id="root"></div> 138 </body> 139</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.