1<!doctype html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <meta 6 name="viewport" 7 content="width=device-width, initial-scale=1.0, viewport-fit=cover, user-scalable=no" 8 /> 9 <title>Nottana - Zero-knowledge password manager on decentralized storage</title> 10 <meta name="application-version" content="1.38.0" /> 11 <!-- Smart App Banner: when an iOS Safari user lands on any 12 app.nottana.com page (e.g. via a share-invite or 13 finalize email link), Apple renders a native banner at 14 the top offering "Open" if the iOS app is installed or 15 "Get" to install from the App Store. This pairs with 16 the Universal Links setup in 17 public/.well-known/apple-app-site-association so users 18 with the app already have it open directly via 19 deep-link, while those without it see this banner. --> 20 <meta name="apple-itunes-app" content="app-id=6758984474" /> 21 <!-- Pre-paint the page in the stored theme before the JS bundle loads, 22 so cold starts don't flash white for dark-mode users. Mirrors 23 ThemeModeContext (localStorage key + system resolution). --> 24
24<script> 25 (function () { 26 try { 27 var mode = localStorage.getItem('nottana_theme_mode'); 28 var dark = 29 mode === 'dark' || 30 (mode === 'system' && 31 window.matchMedia && 32 window.matchMedia('(prefers-color-scheme: dark)').matches); 33 if (dark) { 34 document.documentElement.style.backgroundColor = '#0f172a'; 35 } 36 } catch (e) {} 37 })(); 38 </script>
38 39 40 <!-- Keep application-version in sync with src/config/app-version.js --> 41
41<script> 42 (function () { 43 var meta = document.querySelector('meta[name="application-version"]'); 44 window.__NOTTANA_APP_VERSION__ = meta && meta.getAttribute('content'); 45 })(); 46 </script>
46 47 48 <!-- Android-specific CSS fixes --> 49 <style> 50 /* Fix for Android viewport height issues */ 51 html, 52 body { 53 height: 100%; 54 overflow-x: hidden; 55 /* Prevent double-tap zoom on Android */ 56 touch-action: manipulation; 57 /* Fix for Android scrolling issues */ 58 -webkit-overflow-scrolling: touch; 59 overscroll-behavior: contain; 60 } 61 62 /* Fix for Android Chrome address bar issues */ 63 @media screen and (max-width: 768px) { 64 html { 65 height: -webkit-fill-available; 66 height: 100vh; /* Fallback for older browsers */ 67 } 68 body { 69 min-height: -webkit-fill-available; 70 min-height: 100vh; /* Fallback for older browsers */ 71 /* Prevent page-level scrolling on mobile */ 72 overflow-x: hidden; 73 overflow-y: hidden; 74 /* Fix for keyboard issues */ 75 position: relative; 76 } 77 78 /* Ensure proper height calculation for mobile containers */ 79 .mobile-container { 80 height: calc(100vh - 64px - env(safe-area-inset-bottom)); 81 min-height: calc(100vh - 64px - env(safe-area-inset-bottom)); 82 max-height: calc(100vh - 64px - env(safe-area-inset-bottom)); 83 } 84 85 /* Fix for mobile keyboard issues */ 86 .keyboard-open { 87 position: fixed; 88 top: 0; 89 left: 0; 90 right: 0; 91 bottom: 0; 92 overflow-y: auto; 93 -webkit-overflow-scrolling: touch; 94 } 95 96 /* Prevent zoom on input focus for iOS */ 97 input[type="text"], 98 input[type="email"], 99 input[type="password"], 100 textarea, 101 select { 102 font-size: 16px; 103 } 104 105 /* Smooth transitions for keyboard state changes */ 106 .login-form-container { 107 transition: all 0.3s ease-in-out; 108 } 109 } 110 111 /* Prevent multiple scrollbars on Android */ 112 * { 113 box-sizing: border-box; 114 } 115 116 /* Fix for Android drawer positioning */ 117 .MuiDrawer-paper { 118 position: fixed !important; 119 } 120 121 /* iOS-specific scroll containment for settings page */ 122 @media screen and (max-width: 768px) { 123 /* Prevent whole app scrolling on iOS when touching settings header/tabs */ 124 .settings-container { 125 touch-action: none !important;
126 overscroll-behavior: none !important; 127 -webkit-overflow-scrolling: auto !important; 128 isolation: isolate !important; 129 } 130 131 .settings-header { 132 touch-action: none !important; 133 overscroll-behavior: none !important; 134 -webkit-overflow-scrolling: auto !important; 135 } 136 137 .settings-tabs { 138 touch-action: pan-x !important; /* Allow horizontal scrolling only */ 139 overscroll-behavior: none !important; 140 -webkit-overflow-scrolling: touch !important; 141 } 142 143 .settings-content { 144 touch-action: pan-y !important; 145 overscroll-behavior: contain !important; 146 -webkit-overflow-scrolling: touch !important; 147 isolation: isolate !important; 148 overflow: auto !important; /* Allow scrolling for tab content */ 149 } 150 } 151 152 /* PWA-specific drawer: scroll containment only; position/safe area from layout.jsx */ 153 @media (display-mode: standalone) { 154 .MuiDrawer-paper { 155 touch-action: pan-y !important; 156 overscroll-behavior: contain !important; 157 -webkit-overflow-scrolling: touch !important; 158 isolation: isolate !important; 159 } 160 161 .MuiDrawer-paper[data-pwa="true"] { 162 touch-action: pan-y !important; 163 overscroll-behavior: contain !important; 164 -webkit-overflow-scrolling: touch !important; 165 isolation: isolate !important; 166 } 167 168 /* Prevent page scrolling when drawer is open in PWA */ 169 .MuiDrawer-paper[data-pwa="true"] ~ * { 170 touch-action: none !important;
171 overscroll-behavior: none !important; 172 } 173 174 /* Aggressive scroll prevention for PWA when drawer is open */ 175 body[data-drawer-open="true"] { 176 overflow: hidden !important; 177 position: fixed !important; 178 width: 100% !important; 179 height: 100% !important; 180 touch-action: none !important; 181 overscroll-behavior: none !important; 182 } 183 184 /* Prevent scroll gestures on page content when drawer is open in PWA */ 185 body[data-drawer-open="true"] * { 186 overscroll-behavior: none !important; 187 } 188 189 /* Allow clicks but prevent scroll on page content */ 190 body[data-drawer-open="true"] 191 *:not(.MuiDrawer-paper):not(.MuiBackdrop-root) { 192 touch-action: manipulation !important; 193 } 194 195 /* Allow backdrop clicks while preventing scroll */ 196 body[data-drawer-open="true"] .MuiBackdrop-root { 197 touch-action: manipulation !important; 198 overscroll-behavior: none !important; 199 pointer-events: auto !important; 200 } 201 202 /* Allow touch events only within the drawer */ 203 body[data-drawer-open="true"] .MuiDrawer-paper { 204 touch-action: pan-y !important; 205 overscroll-behavior: contain !important; 206 } 207 } 208 </style> 209 210 <!-- Primary Meta Tags --> 211 <meta 212 name="title" 213 content="Nottana - Zero-knowledge password manager on decentralized storage" 214 /> 215 <meta 216 name="description" 217 content="Encrypted vault for your personal, family and team data â passwords, notes, files, payment methods, IDs. Stored on a decentralized network. Always private, always yours." 218 /> 219 <meta 220 name="keywords" 221 content="password manager, end-to-end encryption, zero-knowledge, decentralized storage, IPFS, privacy, family, team" 222 /> 223 <meta name="author" content="Nottana" /> 224 225 <!-- Open Graph / Facebook --> 226 <meta property="og:type" content="website" /> 227 <meta property="og:url" content="https://app.nottana.com/" /> 228 <!-- <meta property="fb:app_id" content="123456789" /> --> 229 <meta 230 property="og:title" 231 content="Nottana - Zero-knowledge password manager on decentralized storage" 232 /> 233 <meta 234 property="og:description" 235 content="Encrypted vault for your personal, family and team data, stored on a decentralized network. Always private, always yours." 236 /> 237 <meta 238 property="og:image" 239 content="https://app.nottana.com/nottana-logo-og.png" 240 /> 241 <meta property="og:image:width" content="1200" /> 242 <meta property="og:image:height" content="630" /> 243 <meta property="og:site_name" content="Nottana" /> 244 <meta property="og:locale" content="en_US" /> 245 246 <!-- Twitter --> 247 <meta property="twitter:card" content="summary_large_image" /> 248 <meta property="twitter:url" content="https://app.nottana.com/" /> 249 <meta 250 property="twitter:title" 251 content="Nottana - Zero-knowledge password manager on decentralized storage" 252 /> 253 <meta 254 property="twitter:description" 255 content="Encrypted vault for your personal, family and team data, stored on a decentralized network. Always private, always yours." 256 /> 257 <meta 258 property="twitter:image" 259 content="https://app.nottana.com/nottana-logo-og.png" 260 /> 261 262 <!-- Additional Meta Tags --> 263 <meta name="theme-color" content="#1976d2" /> 264 <meta name="msapplication-TileColor" content="#1976d2" /> 265 <meta name="apple-mobile-web-app-capable" content="yes" /> 266 <meta 267 name="apple-mobile-web-app-status-bar-style" 268 content="black-translucent" 269 /> 270 <meta name="apple-mobile-web-app-title" content="Nottana" /> 271 <meta name="mobile-web-app-capable" content="yes" /> 272 <meta name="apple-touch-fullscreen" content="yes" /> 273 <meta name="format-detection" content="telephone=no" /> 274 275 <!-- iOS Safe Area CSS - Global Solution --> 276 <style> 277 /* iOS Safe Area Support - Only for PWA mode, top safe area only */ 278 @media (display-mode: standalone) { 279 html, 280 body { 281 padding-top: env(safe-area-inset-top); 282 /* Don't add bottom padding here - handled by individual components */ 283 /* Make entire background transparent in non-safe areas */ 284 background: transparent; 285 min-height: 100vh; 286 } 287 288 /* Ensure the root container takes full height in PWA mode */ 289 #root { 290 min-height: 100vh; 291 min-height: calc(100vh + env(safe-area-inset-bottom)); 292 /* --app-body-bg is published by the MUI theme (see 293 src/assets/styles/theme.js). This file runs before React, so the 294 literal below is only the pre-hydration paint; once the theme 295 mounts, the variable wins and dark mode stops showing a white 296 band where app content does not reach the viewport edge. */ 297 background: var(--app-body-bg, white); 298 /* Make bottom non-safe area transparent */ 299 background: linear-gradient( 300 to bottom, 301 var(--app-body-bg, white) 0%, 302 var(--app-body-bg, white) calc(100% - env(safe-area-inset-bottom)), 303 transparent calc(100% - env(safe-area-inset-bottom)) 304 ); 305 } 306 } 307 308 /* Fallback for devices without safe area support */ 309 @supports not (padding: env(safe-area-inset-top)) { 310 html, 311 body { 312 padding-top: 0; 313 } 314 } 315 </style> 316 317 <!-- Poppins (5 weights) â src/app.css sets font-family: Poppins 318 globally, but without this <link> the browser would fall 319 back to the system font and intermediate weights (500/600) 320 would round to 400/700. Keep in sync with the weights this 321 app actually uses in Typography sx={{ fontWeight }}. -->
322 <link rel="preconnect" href="https://fonts.googleapis.com" /> 323 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 324 <link 325 rel="stylesheet" 326 href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap" 327 /> 328 329 <!-- App Icons for Mobile Shortcuts - HIGH PRIORITY --> 330 <!-- Default apple-touch-icon for browsers that look for the default path --> 331 <link 332 rel="apple-touch-icon" 333 href="https://app.nottana.com/assets/manifest-icon-192.png" 334 data-nottana="true" 335 /> 336 <link 337 rel="apple-touch-icon" 338 sizes="180x180" 339 href="https://app.nottana.com/assets/manifest-icon-192.png" 340 data-nottana="true" 341 /> 342 <link 343 rel="apple-touch-icon" 344 sizes="152x152" 345 href="https://app.nottana.com/assets/manifest-icon-192.png" 346 data-nottana="true" 347 /> 348 <link 349 rel="apple-touch-icon" 350 sizes="144x144" 351 href="https://app.nottana.com/assets/manifest-icon-192.png" 352 data-nottana="true" 353 /> 354 <link 355 rel="apple-touch-icon" 356 sizes="120x120" 357 href="https://app.nottana.com/assets/manifest-icon-192.png" 358 data-nottana="true" 359 /> 360 <link 361 rel="apple-touch-icon" 362 sizes="114x114" 363 href="https://app.nottana.com/assets/manifest-icon-192.png" 364 data-nottana="true" 365 /> 366 <link 367 rel="apple-touch-icon" 368 sizes="76x76" 369 href="https://app.nottana.com/assets/manifest-icon-192.png" 370 data-nottana="true" 371 /> 372 <link 373 rel="apple-touch-icon" 374 sizes="72x72" 375 href="https://app.nottana.com/assets/manifest-icon-192.png" 376 data-nottana="true" 377 /> 378 <link 379 rel="apple-touch-icon" 380 sizes="60x60" 381 href="https://app.nottana.com/assets/manifest-icon-192.png" 382 data-nottana="true" 383 /> 384 <link 385 rel="apple-touch-icon" 386 sizes="57x57" 387 href="https://app.nottana.com/assets/manifest-icon-192.png" 388 data-nottana="true" 389 /> 390 391 <!-- Android App Icons - HIGH PRIORITY --> 392 <link 393 rel="icon" 394 type="image/png" 395 sizes="192x192" 396 href="https://app.nottana.com/assets/manifest-icon-192.png" 397 data-nottana="true" 398 /> 399 <link 400 rel="icon" 401 type="image/png" 402 sizes="96x96" 403 href="https://app.nottana.com/assets/manifest-icon-192.png" 404 data-nottana="true" 405 /> 406 <link 407 rel="icon" 408 type="image/png" 409 sizes="32x32" 410 href="https://app.nottana.com/assets/manifest-icon-192.png" 411 data-nottana="true" 412 /> 413 <link 414 rel="icon" 415 type="image/png" 416 sizes="16x16" 417 href="https://app.nottana.com/assets/manifest-icon-192.png" 418 data-nottana="true" 419 /> 420 421 <!-- Windows Tiles - HIGH PRIORITY --> 422 <meta 423 name="msapplication-TileImage" 424 content="https://app.nottana.com/assets/manifest-icon-192.png" 425 data-nottana="true" 426 /> 427 <meta 428 name="msapplication-TileColor" 429 content="#1976d2" 430 data-nottana="true" 431 /> 432 433 <!-- PWA Manifest --> 434 <link 435 rel="manifest" 436 href="https://app.nottana.com/manifest.json" 437 data-nottana="true" 438 /> 439 440 <!-- Standard Favicon - HIGH PRIORITY (Browser Tabs Only) --> 441 <link 442 rel="icon" 443 type="image/x-icon" 444 href="https://app.nottana.com/assets/favicon1.ico" 445 data-nottana="true" 446 /> 447 <link 448 rel="shortcut icon" 449 href="https://app.nottana.com/assets/favicon1.ico" 450 data-nottana="true" 451 /> 452 453 <!-- Force Override WordPress Icons with JavaScript --> 454
454<script> 455 // Immediately override any WordPress icon overrides 456 (function () { 457 "use strict"; 458 459 // Function to force our icons 460 function forceNottanaIcons() { 461 // Remove any WordPress-added icon links 462 const allIconLinks = document.querySelectorAll( 463 'link[rel*="icon"], link[rel*="apple-touch-icon"]', 464 ); 465 allIconLinks.forEach((link) => { 466 if (!link.hasAttribute("data-nottana")) { 467 link.remove(); 468 } 469 }); 470 471 // Force our favicon (browser tabs only) 472 let favicon = document.querySelector( 473 'link[rel="icon"][data-nottana="true"]', 474 ); 475 if (!favicon) { 476 favicon = document.createElement("link"); 477 favicon.rel = "icon"; 478 favicon.type = "image/x-icon"; 479 favicon.href = "https://app.nottana.com/assets/favicon1.ico"; 480 favicon.setAttribute("data-nottana", "true"); 481 document.head.appendChild(favicon); 482 } 483 484 // Force our apple touch icons 485 const appleIconSizes = [57, 60, 72, 76, 114, 120, 144, 152, 180]; 486 appleIconSizes.forEach((size) => { 487 let appleIcon = document.querySelector( 488 `link[rel="apple-touch-icon"][sizes="${size}x${size}"][data-nottana="true"]`, 489 ); 490 if (!appleIcon) { 491 appleIcon = document.createElement("link"); 492 appleIcon.rel = "apple-touch-icon"; 493 appleIcon.sizes = `${size}x${size}`; 494 appleIcon.href = 495 "https://app.nottana.com/assets/manifest-icon-192.png"; 496 appleIcon.setAttribute("data-nottana", "true"); 497 document.head.appendChild(appleIcon); 498 } 499 }); 500 } 501 502 // Run immediately 503 forceNottanaIcons(); 504 505 // Also run when DOM is ready 506 if (document.readyState === "loading") { 507 document.addEventListener("DOMContentLoaded", forceNottanaIcons); 508 } 509 510 // Run periodically to catch any late WordPress overrides 511 setInterval(forceNottanaIcons, 1000); 512 })(); 513 </script>
513 514
514<script type="module" crossorigin src="/assets/DNA11vdE.js"></script>
514 515 <link rel="modulepreload" crossorigin href="/assets/UqzzAnT4.js"> 516 <link rel="modulepreload" crossorigin href="/assets/DYw7LMfG.js"> 517 <link rel="modulepreload" crossorigin href="/assets/DXvvCRrN.js"> 518 <link rel="modulepreload" crossorigin href="/assets/BFMbySPq.js"> 519 <link rel="stylesheet" crossorigin href="/assets/Cgshjk_g.css"> 520 </head> 521 <body> 522
522<script> 523 globalThis.__process_shim__ = { 524 env: { NODE_ENV: "development" }, 525 browser: true, 526 nextTick: function (fn) { 527 setTimeout(fn, 0); 528 }, 529 }; 530 </script>
530 531 <div id="root"></div> 532 <!-- The script tag points to your main entry file in the src directory --> 533 </body> 534</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.