1<!doctype html> 2<html lang="en"> 3 4<head> 5 <!-- Required meta tags --> 6 <meta charset="utf-8"> 7 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 8 9 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 10 11 <meta name="csrf-token" content="Oigci8MUB9tVQpZMpb8IhqwqlCrL8dDmrzptluXG"> 12 13 14 <link rel="canonical" href="https://www.citypng.com/contact" /> 15 16 <meta name="description" content="CityPNG provides millions of free high quality transparent images. Including transparent png clip art, cartoon, icon, logo, silhouette, watercolors, outlines, etc."> 17 <meta name="keywords" content="png,free png,download premium png free,hd png,transparent png,png image,png pictures,download png,png arrow,png heart,png flower,png smoke,png star,pngtree,png circle,png background,png effects" /> 18 19 20 21 22 23 24 25 26 27 28 29 <meta name="robots" content="noindex, nofollow">
vendor: 105 bytes, lines 29-35
29 30 31 32 <script src="https://www.google.com/recaptcha/enterprise.js" async defer></script> 33 34 35
35<!-- Bootstrap CSS v5.2.1 --> 36 <link rel="stylesheet" href="https://city-png.b-cdn.net/new-design/bootstrap/css/bootstrap.min.css"> 37 38 <!-- ArialMT Fonts --> 39 <link rel="stylesheet" href="https://city-png.b-cdn.net/new-design/fonts/style.css"> 40 41 <!-- Custom Css --> 42 <link rel="stylesheet" href="https://city-png.b-cdn.net/new-design/custom_css/main.css"> 43 44 <!-- Bootstrap Icons --> 45 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css" rel="preload" as="style" onload="this.onload=null;this.rel='stylesheet'"> 46 <noscript><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css"></noscript> 47 48 <!-- Font-awesome Icons --> 49 50 51 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.8.1/css/all.min.css" 52 integrity="sha512-gMjQeDaELJ0ryCI+FtItusU9MkAifCZcGq789FrzkiM49D8lbDhoaUaIX4ASU187wofMNlgBJ4ckbrXM9sE6Pg==" 53 crossorigin="anonymous" referrerpolicy="no-referrer" /> 54 55<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css" 56 integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ==" 57 crossorigin="anonymous" referrerpolicy="no-referrer" /> 58 59 60 <!-- Jquery CDN --> 61
61<script src="https://code.jquery.com/jquery-3.6.3.min.js" integrity="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU=" crossorigin="anonymous"></script>
61 62 63 <!-- Favicon --> 64 <link rel="shortcut icon" href="https://city-png.b-cdn.net/new-design/images/favicon/favicon.png"> 65 66 <!-- Title Default --> 67 <title> CityPNG | Download FREE HD PNG Images </title> 68 69 70 71 <!-- Sweet Alert --> 72 <link href="https://city-png.b-cdn.net/sweetalert.css" rel="stylesheet" type="text/css" media="none" 73 onload="if(media!='all')media='all'" /> 74 75 <link href="https://city-png.b-cdn.net/vivify.min.css" rel="stylesheet" type="text/css" media="none" 76 onload="if(media!='all')media='all'" /> 77 78 79 <!-- Google tag (gtag.js) -->
vendor: 65 bytes, lines 79-80
79 80<script async src="https://www.googletagmanager.com/gtag/js?id=
80G-3V4FXQ8QYZ
vendor: 13 bytes, line 80
80"></script>
81<script> 82
vendor: 138 bytes, lines 82-86
82window.dataLayer = window.dataLayer || []; 83 function gtag(){dataLayer.push(arguments);} 84 gtag('js', new Date()); 85 86 gtag('config', '
86G-3V4FXQ8QYZ
vendor: 5 bytes, line 86
86');
87</script>
87 88<!-- Google tag (gtag.js) -->
vendor: 65 bytes, lines 88-89
88 89<script async src="https://www.googletagmanager.com/gtag/js?id=
89G-V6C2J5TSJQ
vendor: 13 bytes, line 89
89"></script>
90<script> 91
vendor: 138 bytes, lines 91-95
91window.dataLayer = window.dataLayer || []; 92 function gtag(){dataLayer.push(arguments);} 93 gtag('js', new Date()); 94 95 gtag('config', '
95G-V6C2J5TSJQ
vendor: 5 bytes, line 95
95');
96</script>
96 97</head> 98 99<body class="google-anno-skip"> 100<div id="cookie-law-info-bar" data-nosnippet="true" style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0); font-family: inherit; bottom: 0px; position: fixed;"> 101 <span>This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. 102 <a role="button" data-bs-toggle="modal" data-bs-target="#cookie" tabindex="0" style="margin: 5px 20px; color: rgb(20, 182, 148);">Cookie settings</a> 103 <a role="button" class="accept_cookies" tabindex="0" style="display: inline-block; margin: 5px; color: rgb(255, 255, 255); background-color: rgb(0, 0, 0);padding:4px 10px">ACCEPT</a> 104 </span> 105</div> 106 107<style> 108/* Toast (gentle success) */ 109.pwDlToast { 110 pointer-events: auto; 111 display:flex; 112 align-items:flex-start; 113 gap:10px; 114 min-width: 280px; 115 max-width: 420px; 116 117 background: #F1FBF5; 118 border: 1px solid #D7F2E1; 119 color: #113B25; 120 121 border-radius: 14px; 122 box-shadow: 0 10px 26px rgba(0,0,0,.10); 123 padding: 12px 12px; 124 125 opacity: 0; 126 transform: translateY(-8px); 127 transition: opacity 180ms ease, transform 180ms ease; 128} 129.pwDlToast.show { 130 opacity: 1; 131 transform: translateY(0); 132} 133 134.pwDlToastIcon { 135 width: 18px; 136 height: 18px; 137 border-radius: 999px; 138 display:flex; 139 align-items:center; 140 justify-content:center; 141 142 background: #E2F6EA; 143 border: 1px solid #C9EED8; 144 color:#1f7a3a; 145 146 font-size: 12px; 147 font-weight: 900; 148 flex: 0 0 auto; 149 margin-top: 2px; 150} 151 152.pwDlToastTitle { 153 font-size: 13px; 154 font-weight: 700; 155 line-height: 1.25; 156 margin: 0; 157 color:#113B25; 158} 159 160.pwDlToastText { 161 font-size: 12px; 162 line-height: 1.25; 163 margin: 2px 0 0; 164 color: rgba(17,59,37,.70); 165} 166 167.pwDlToastClose { 168 margin-left:auto; 169 border:0; 170 background: transparent; 171 cursor: pointer; 172 opacity: .45; 173 padding: 6px; 174 border-radius: 10px; 175 transition: opacity 140ms ease, background 140ms ease; 176 line-height:1; 177} 178.pwDlToastClose:hover { 179 opacity: .85; 180 background: rgba(17,59,37,.08); 181} 182 183@media (max-width: 640px) { 184 #pwDlToastRoot { right: 12px !important; top: 76px !important; } 185 .pwDlToast { max-width: calc(100vw - 24px); min-width: 0; } 186} 187</style> 188 189 190<div id="pwDlToastRoot" 191 aria-live="polite" 192 aria-atomic="true" 193 style="position:fixed;top:140px;right:24px;left:auto;transform:none; 194 z-index:100000;pointer-events:none;"> 195</div> 196 197 198 199 200 201<style> 202 203 204 205 @media (min-width: 768px) { 206 207} 208 209/* Style for smaller screens */ 210/*@media (max-width: 767px) { 211 header{position:relative;top:50px;} 212 .homePage{margin-top:50px;} 213 .imagePage-single{position:relative;top:30px;} 214 .latestPage{margin-top:50px;} 215 .searchResultPage{margin-top:50px;} 216 .searchResultPageImages {margin-top:50px;} 217 .downloadPage{margin-top:70px;} 218 .loginPage{margin-top:20px;} 219 .signUpPage{margin-top:80px;} 220 .categoriesPage{margin-top:50px;} 221 .categoriePage{margin-top:50px;} 222 footer{position:relative;top:50px;} 223}*/ 224 225</style> 226 227<!-- Account issue notice --> 228<!--<div class="up-message" style="background:#ffe5e5; color:#b30000; text-align:center; padding:10px; font-weight:bold; position:sticky; top:0; z-index:9999; border-bottom:2px solid #b30000;"> 229 â ï¸ We are currently experiencing an issue with account registration. 230 Our team is working on a fix. Downloads are working normally.
231 Thank you for your patience. â ï¸ 232</div>--> 233 234 235 236<!-- Issue case --> 237<!--<div style="background:#ffcc00; color:#000; text-align:center; padding:10px; font-weight:bold; position:sticky; top:0; z-index:9999;"> 238 🚧 We are currently experiencing technical issues. Our team is working on a fix. Thank you for your patience. 🚧 239</div>--> 240 241<!-- Not 100% stable --> 242<!--<div style="background:#00c4ff; color:#000; text-align:center; padding:10px; font-weight:bold; position:sticky; top:0; z-index:9999;"> 243 ð¡ The website is currently mostly stable, but users may occasionally experience brief service interruptions that recover quickly. 244</div>--> 245 246<!-- Stable --> 247<!--<div style="background:#4CAF50; color:#fff; text-align:center; padding:10px; font-weight:bold; position:sticky; top:0; z-index:9999;"> 248 â The website is operating normally. If you notice any issue, please contact us. 249</div>--> 250 251 252 253<div class="modal fade" style="display:none" id="cookie"> 254 <div class="modal-dialog"> 255 <div class="modal-content"> 256 <div class="modal-header"> 257 <h4 class="modal-title">Privacy overview</h4> 258 <button type="button" class="close btn" data-dismiss="modal"> 259 <span aria-hidden="true">×</span> 260 <span class="sr-only">Close</span> 261 </button> 262 263 </div> 264 <div class="modal-body"> 265 <p>This website uses cookies to improve your experience while you navigate through the website. Out of these cookies, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent.</p> 266 <div> 267 <button data-toggle="collapse" data-target="#necessary" style="width: 100%;border:none;text-align: left;padding: 10px 26px;display:flex;justify-content:space-between;align-items-center;margin-bottom:8px">Necessary <span style="font-size:12px">Always Enabled</span></button> 268 <div id="necessary" class="collapse" style="padding: 10px 24px"> 269 <p>Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.</p> 270 </div> 271 <button data-toggle="collapse" data-target="#non-necessary" style="width: 100%;border:none;text-align: left;padding: 10px 26px;display:flex;justify-content:space-between;"> 272 Non-Necessary 273 <div class="cli-switch"> 274 <input type="checkbox" id="wt-cli-checkbox-non-necessary" class="cli-user-preference-checkbox" data-id="checkbox-non-necessary" checked="checked"> 275 <label for="wt-cli-checkbox-non-necessary" class="cli-slider" data-cli-enable="Enabled" data-cli-disable="Disabled"></label> 276 </div> 277 </button> 278 <div id="non-necessary" class="collapse" style="padding: 10px 24px"> 279 <p>Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.</p> 280 </div> 281 </div> 282 </div> 283 <div class="modal-footer"> 284 <button data-bs-dismiss="modal" class="accept_cookies btn btn-success">Accept</button> 285 </div> 286 </div> 287 </div> 288</div> 289 290 <header> 291 292
293<script> 294 document.addEventListener("DOMContentLoaded", function() { 295 const elementsToStyle = document.querySelector(".for-message"); 296 297 // Listen for close event 298 document.getElementById("imageAlert").addEventListener('close.bs.alert', function () { 299 elementsToStyle.classList.remove("active"); 300 }); 301 302 // Initialize (assuming the alert starts as shown) 303 elementsToStyle.classList.add("active"); 304 }); 305 306 307</script>
307 308 309 <!-- Navbar start --> 310 311 312 313 <div class="container "> 314 315 <style> 316/* ===== NV2 Modern Admin Dev Navbar (Clean, No Duplicates) ===== */ 317:root{ 318 --nv2-secondary:#df5858; 319 --nv2-bg: rgba(255,255,255,0.78); 320 --nv2-border: rgba(0,0,0,0.08); 321 --nv2-text:#121212; 322 --nv2-muted:#6b6b6b; 323 --nv2-radius:12px; 324 --nv2-barRadius:14px; 325 --nv2-t:120ms; 326 --nv2-shadow:0 6px 20px rgba(0,0,0,0.04); 327 --nv2-shadowScroll:0 10px 28px rgba(0,0,0,0.06); 328} 329 330/* Reset Bootstrap/theme navbar visuals (we render our own bar) */ 331nav.nv2.navbar{ 332 background: transparent !important; 333 border: 0 !important; 334 box-shadow: none !important; 335 padding: 0 !important; 336 margin: 0 !important; 337} 338 339/* Global box sizing inside NV2 navbar */ 340nav.nv2.navbar, 341nav.nv2.navbar *{ 342 box-sizing: border-box; 343} 344 345/* Top spacing must be on nav to survive theme/Bootstrap resets */ 346nav.nv2.navbar{ margin-top: 16px !important; } 347@media (min-width: 1200px){ nav.nv2.navbar{ margin-top: 18px !important; } } 348@media (max-width: 767.98px){ nav.nv2.navbar{ margin-top: 12px !important; } } 349 350/* Sticky wrapper */ 351.nv2{ 352 position: sticky; 353 top: 0; 354 z-index: 1030; 355 padding: 0 24px; 356} 357@media (max-width: 767.98px){ 358 .nv2{ padding: 0 16px; } 359} 360 361/* Inner container */ 362.nv2__shell{ 363 max-width: 1280px; 364 width: 100%; 365 margin: 0 auto; 366} 367 368/* Hard fix: prevent RTL/theme from flipping NV2 layout */ 369nav#nv2, 370nav#nv2 .nv2__bar{ 371 direction: ltr !important; 372} 373 374 375/* Main bar */ 376.nv2__bar{ 377 position: relative; 378 display:flex; 379 align-items:center; 380 gap: 14px; 381 padding: 12px 24px; 382 min-height: 64px; 383 384 border: 1px solid var(--nv2-border); 385 border-bottom: 1px solid #eee; 386 border-radius: var(--nv2-barRadius); 387 388 background: var(--nv2-bg); 389 backdrop-filter: blur(10px); 390 -webkit-backdrop-filter: blur(10px); 391 392 box-shadow: var(--nv2-shadow); 393 transition: box-shadow var(--nv2-t) ease, background var(--nv2-t) ease, transform var(--nv2-t) ease; 394} 395.nv2.is-scrolled .nv2__bar{ box-shadow: var(--nv2-shadowScroll); } 396 397.nv2.is-scrolled .nv2__bar{ 398 background: rgba(255,255,255,0.92); /* previously 0.78 */ 399 border-color: rgba(0,0,0,0.10); 400} 401 402/* On tablets/mobile: keep bar row, brand left, icons right (RTL-safe) */ 403@media (max-width: 991.98px){ 404 nav#nv2 .nv2__bar{ flex-direction: row !important; } 405 406 nav#nv2 .nv2__brand{ 407 order: 1 !important; 408 margin-right: auto !important; 409 margin-left: 0 !important; 410 } 411 412 nav#nv2 .nv2__mActions{ 413 order: 2 !important; 414 margin-left: auto !important; 415 margin-right: 0 !important; 416 } 417} 418 419/* Responsive bar sizing */ 420@media (max-width: 991.98px){ 421 .nv2__bar{ 422 gap: 12px; 423 padding: 12px 16px; /* 14â16 premium */ 424 min-height: 68px; /* 56â68 */ 425 border-radius: 18px; /* SaaS feel */ 426 } 427} 428 429/* Brand */ 430.nv2__brand{ 431 display:flex; 432 align-items:center; 433 gap: 10px; 434 text-decoration:none; 435 flex: 0 0 auto; 436} 437.nv2__logo{ 438 height: 28px; 439 width:auto; 440 display:block; 441} 442 443/* Mobile actions (toggler/search icon area) */ 444.nv2__mActions{ 445 margin-left:auto; 446 display:flex; 447 gap: 8px; 448 align-items:center; 449 flex: 0 0 auto; 450} 451 452/* Icon buttons (shared) */ 453.nv2__iconBtn{ 454 height: 40px; 455 width: 40px; 456 display:inline-flex; 457 align-items:center; 458 justify-content:center; 459 border-radius: var(--nv2-radius); 460 border: 1px solid rgba(0,0,0,0.08); 461 background: rgba(255,255,255,0.75); 462 463 color: #111 !important; /* iOS Safari: avoid blue tint */ 464 -webkit-appearance: none; 465 appearance: none; 466 -webkit-tap-highlight-color: transparent; /* optional: remove tap highlight */ 467 468 transition: transform var(--nv2-t) ease, background var(--nv2-t) ease, border-color var(--nv2-t) ease; 469} 470.nv2__iconBtn i{ color: inherit !important; } 471 472.nv2__iconBtn:hover{ 473 transform: translateY(-1px); 474 background: rgba(255,255,255,0.95); 475 border-color: rgba(0,0,0,0.12); 476} 477 478.nv2__iconBtn:focus, 479.nv2__iconBtn:active{ 480 color:#111 !important; 481 outline: none !important; 482 box-shadow: none !important; 483} 484 485/* ===== Mobile burger should be 44x44 (tap target + importance) ===== */ 486@media (max-width: 991.98px){ 487 .nv2__mActions .nv2__iconBtn{ 488 width: 44px !important; 489 height: 44px !important; 490 border-radius: 14px !important; 491 } 492 493 .nv2 .navbar-toggler{ 494 background: rgba(255,255,255,0.70) !important; 495 border: 1px solid rgba(0,0,0,0.14) !important; 496 } 497 498 .nv2 .navbar-toggler:active{ 499 transform: scale(0.98); 500 background: rgba(0,0,0,0.04) !important; 501 } 502} 503 504/* ===== Burger toggler (fix: border returns after close) ===== */ 505.nv2 .navbar-toggler{ 506 border: 1px solid rgba(0,0,0,0.14) !important; 507 box-shadow: none !important; 508 outline: none !important; 509} 510.nv2 .navbar-toggler:focus, 511.nv2 .navbar-toggler:focus-visible{ 512 border: 1px solid rgba(0,0,0,0.14) !important; 513 box-shadow: none !important; 514 outline: none !important; 515} 516 517/* When expanded: show active background and hide border */ 518.nv2 .navbar-toggler[aria-expanded="true"]{ 519 border-color: transparent !important; 520 background: rgba(0,0,0,0.03) !important; 521} 522.nv2 .navbar-toggler[aria-expanded="true"]:focus, 523.nv2 .navbar-toggler[aria-expanded="true"]:focus-visible{ 524 border-color: transparent !important; 525 box-shadow: none !important; 526} 527.nv2 .navbar-toggler-icon{ filter: none; opacity: .85; } 528 529/* ===== Burger -> X state (clear open/close) ===== */ 530.nv2 .navbar-toggler{ 531 position: relative; 532} 533.nv2 .navbar-toggler .navbar-toggler-icon{ 534 opacity: 0 !important; /* hide default */ 535} 536 537.nv2 .navbar-toggler::before, 538.nv2 .navbar-toggler::after{ 539 content:""; 540 position:absolute; 541 left:50%; 542 top:50%;
543 width: 20px; 544 height: 2px; 545 background: rgba(0,0,0,0.75); 546 border-radius: 999px; 547 transform: translate(-50%, -50%) rotate(0deg); 548 transition: transform 160ms ease, width 160ms ease, opacity 160ms ease; 549} 550 551/* 3rd middle line (burger) */ 552.nv2 .navbar-toggler span.nv2__mid{ 553 position:absolute; 554 left:50%; 555 top:50%; 556 width: 20px; 557 height: 2px; 558 background: rgba(0,0,0,0.75); 559 border-radius: 999px; 560 transform: translate(-50%, -50%); 561 transition: opacity 160ms ease; 562} 563 564/* burger layout (3 lines) */ 565.nv2 .navbar-toggler::before{ transform: translate(-50%, -50%) translateY(-6px); } 566.nv2 .navbar-toggler::after { transform: translate(-50%, -50%) translateY( 6px); } 567 568/* expanded => X */ 569.nv2 .navbar-toggler[aria-expanded="true"]::before{ 570 transform: translate(-50%, -50%) rotate(45deg); 571} 572.nv2 .navbar-toggler[aria-expanded="true"]::after{ 573 transform: translate(-50%, -50%) rotate(-45deg); 574} 575.nv2 .navbar-toggler[aria-expanded="true"] span.nv2__mid{ 576 opacity: 0; 577} 578 579/* Mobile Search toggle button: keep border, add active bg */ 580#nv2SearchToggler{ 581 border: 1px solid rgba(0,0,0,0.08) !important; 582 background: rgba(255,255,255,0.75) !important; 583 color:#111 !important; 584 box-shadow:none !important; 585 outline:none !important; 586 -webkit-appearance:none; 587 appearance:none; 588} 589#nv2SearchToggler:focus, 590#nv2SearchToggler:focus-visible, 591#nv2SearchToggler:active{ 592 border: 1px solid rgba(0,0,0,0.08) !important; 593 box-shadow:none !important; 594 outline:none !important; 595} 596#nv2SearchToggler i{ color: inherit !important; } 597 598/* Active state when mobile search is open */ 599.nv2.is-msearch-open #nv2SearchToggler{ 600 background: rgba(0,0,0,0.06) !important; 601 border-color: rgba(0,0,0,0.12) !important; 602} 603 604/* Collapse area layout */ 605#nv2Collapse{ 606 flex: 1 1 auto; 607 min-width: 0; 608} 609@media (min-width: 992px){ 610 #nv2Collapse{ 611 display:flex !important; 612 align-items:center; 613 min-width: 0; 614 } 615} 616@media (max-width: 991.98px){ 617 618 /* Navbar dropdown containers */ 619 .nv2__bar{ 620 overflow: visible; 621 } 622 623 /* Collapse dropdown panel below the navbar */ 624 #nv2Collapse{ 625 position: absolute; 626 left: 14px; 627 right: 14px; 628 top: 100%; 629 z-index: 1040 !important; 630 631 margin-top: 10px; 632 633 background: rgba(255,255,255,0.96); 634 border: 1px solid rgba(0,0,0,0.08); 635 border-radius: 14px; 636 box-shadow: 0 14px 40px rgba(0,0,0,0.10); 637 638 padding: 10px 12px; 639 640 /* Important: keep auto width to avoid layout issues */ 641 width: auto !important; 642 } 643 644 /* Bootstrap collapse visibility overrides */ 645 .navbar-collapse.collapse{ display:none !important; } 646 .navbar-collapse.collapse.show{ display:block !important; } 647 648 /* Dropdown content spacing */ 649 .nv2__nav{ 650 margin-top: 0 !important; 651 padding-top: 0 !important; 652 } 653 654 .nv2__right{ 655 margin-top: 10px !important; 656 padding-top: 10px !important; 657 } 658} 659 660/* Center nav */ 661.nv2__nav{ 662 list-style:none; 663 display:flex; 664 gap: 28px; 665 align-items:center; 666 margin: 0; 667 padding: 0; 668} 669.nv2__item{ display:flex; } 670 671@media (min-width: 992px){ 672 .nv2__nav{ 673 position:absolute; 674 left:50%; 675 top:50%; 676 transform: translate(-50%, -50%); 677 z-index: 2; 678 679 /* More room on the right side (actions/tools) */ 680 max-width: calc(100% - 560px); 681 overflow:hidden; 682 white-space:nowrap; 683 } 684} 685@media (max-width: 991.98px){ 686 .nv2__nav{ 687 position: static; 688 transform: none; 689 flex-direction: column; 690 align-items: stretch; 691 gap: 6px; 692 width: 100%; 693 margin-top: 10px; 694 padding: 8px 0 0; 695 } 696 .nv2__item{ width: 100%; } 697} 698 699/* Nav links */ 700.nv2__link{ 701 position:relative; 702 display:inline-flex; 703 align-items:center; 704 height: 40px; 705 padding: 0 8px; 706 border-radius: var(--nv2-radius); 707 color: #222; 708 text-decoration:none; 709 font-weight: 500; 710 background: transparent !important; 711 transition: color var(--nv2-t) ease; 712} 713.nv2__link:hover{ color:#111; background: transparent !important; } 714 715.nv2__link::after{ 716 content:""; 717 position:absolute; 718 left:50%; 719 bottom: 4px; 720 height: 2px; 721 width: 0%; 722 transform: translateX(-50%); 723 background: rgba(223,88,88,0.85); 724 border-radius: 999px; 725 transition: width 180ms ease; 726} 727.nv2__link:hover::after{ width: 50%; opacity:.7; }
728.nv2__link.is-active{ color: var(--nv2-secondary); } 729.nv2__link.is-active::after{ width: 70%; } 730 731@media (max-width: 991.98px){ 732 .nv2__link{ 733 width: 100%; 734 justify-content: space-between; 735 padding: 0 12px; 736 } 737 .nv2__link::after{ 738 left: 12px; 739 transform: none; 740 } 741 .nv2__link:hover::after, 742 .nv2__link.is-active::after{ 743 width: 56px; 744 } 745} 746 747/* Right side area */ 748.nv2__right{ 749 margin-left:auto; 750 display:flex; 751 align-items:center; 752 gap: 16px; 753 padding: 0; 754 flex: 0 0 auto; 755} 756@media (min-width: 992px){ 757 .nv2__right{ position: relative; z-index: 3; } 758} 759@media (max-width: 991.98px){ 760 .nv2__right{ 761 width: 100%; 762 justify-content: flex-end; 763 gap: 12px; 764 margin-top: 10px; 765 padding-top: 10px; 766 border-top: 1px solid rgba(0,0,0,0.06); 767 } 768} 769@media (max-width: 767.98px){ 770 .nv2__right{ justify-content: space-between; } 771} 772 773/* Tools (hidden on mobile) */ 774.nv2__tools{ 775 display:flex; 776 align-items:center; 777 gap: 16px; 778} 779@media (max-width: 991.98px){ 780 .nv2__tools{ display:none !important; } 781} 782 783/* Notification badge */ 784.nv2__badge{ 785 position:absolute; 786 top: 6px; 787 right: 6px; 788 min-width: 18px; 789 height: 18px; 790 padding: 0 5px; 791 border-radius: 999px; 792 background: var(--nv2-secondary); 793 color:#fff; 794 font-size: 11px; 795 display:flex; 796 align-items:center; 797 justify-content:center; 798} 799 800/* Desktop search wrapper */ 801.nv2SearchWrap{ 802 width:auto; 803 display:flex; 804 align-items:center; 805} 806.nv2SearchWrap.is-hidden{ visibility:hidden; } 807 808/* Search pill (closed => icon only; open => input) */ 809.nv2Search{ 810 display:flex; 811 align-items:center; 812 height:40px; 813 gap:8px; 814 padding:0 6px; 815 border-radius: var(--nv2-radius); 816 border:1px solid rgba(0,0,0,0.08); 817 background: rgba(255,255,255,0.70); 818 transition: background var(--nv2-t) ease, border-color var(--nv2-t) ease; 819 width: 44px; /* closed width */ 820 overflow:hidden; /* keep everything inside */ 821} 822.nv2Search:hover{ 823 background: rgba(255,255,255,0.92); 824 border-color: rgba(0,0,0,0.12); 825} 826 827/* Open widths by breakpoint */ 828.nv2Search.is-open{ width: 180px; } 829@media (min-width: 1400px){ .nv2Search.is-open{ width: 200px; } } 830@media (max-width: 1199.98px){ .nv2Search.is-open{ width: 165px; } } 831 832/* Search icon button */ 833.nv2Search__btn{ 834 height:40px; 835 width:40px; 836 border-radius: calc(var(--nv2-radius) - 2px); 837 border:0; 838 background:transparent; 839 display:flex; 840 align-items:center; 841 justify-content:center; 842 transition: transform var(--nv2-t) ease, opacity var(--nv2-t) ease, width 160ms ease; 843} 844.nv2Search__btn:hover{ transform: translateY(-1px); } 845 846/* When open, hide icon to save space */ 847.nv2Search.is-open .nv2Search__btn{ 848 width:0 !important; 849 opacity:0 !important; 850 padding:0 !important; 851 margin:0 !important; 852 pointer-events:none !important; 853} 854 855/* Input holder (use opacity/transform; avoid width animations that break layout) */ 856.nv2Search__box{ 857 flex: 1 1 auto; 858 min-width: 0; 859 opacity: 0; 860 transform: translateX(-4px); 861 transition: opacity var(--nv2-t) ease, transform 160ms ease; 862} 863.nv2Search.is-open .nv2Search__box{ 864 opacity: 1; 865 transform: translateX(0); 866} 867 868/* Search input */ 869.nv2Search__input{ 870 width:100%; 871 height:38px; 872 border-radius: calc(var(--nv2-radius) - 4px); 873 border:1px solid rgba(0,0,0,0.10); 874 background: rgba(255,255,255,0.92); 875 padding:0 12px; 876 outline:none; 877 font-weight:650; 878 color:#222; 879} 880.nv2Search__input:focus{ 881 border-color: rgba(223,88,88,0.45); 882 box-shadow: 0 0 0 4px rgba(223,88,88,0.10); 883} 884 885/* CTA button: always reserves its space (prevents input resizing) */ 886.nv2Search__go{ 887 height:34px; 888 width:34px; 889 flex: 0 0 34px; 890 border-radius: calc(var(--nv2-radius) - 2px); 891 border:0; 892 background: rgba(223,88,88,0.12); 893 color: var(--nv2-secondary); 894 895 display:flex; /* always in layout */ 896 align-items:center; 897 justify-content:center; 898 899 transition: transform var(--nv2-t) ease, background var(--nv2-t) ease, opacity var(--nv2-t) ease; 900 opacity: 0; /* hidden by default */ 901 pointer-events: none; /* not clickable when empty */ 902} 903.nv2Search__go:hover{ 904 transform: translateY(-1px); 905 background: rgba(223,88,88,0.18); 906} 907 908/* Show CTA only when there is text (without changing widths) */ 909.nv2Search.is-open.has-text .nv2Search__go{ 910 opacity: 1; 911 pointer-events: auto; 912} 913 914/* ===== Mobile Search (inside navbar bar) ===== */ 915.nv2SearchMobile{ display:none; } 916 917@media (max-width: 991.98px){ 918 .nv2SearchMobile{ 919 display:flex; 920 align-items:center; 921 gap: 10px; 922 height: 44px; 923 padding: 0 10px; 924 925 border-radius: calc(var(--nv2-radius) + 2px); 926 border: 1px solid rgba(0,0,0,0.08); 927 background: rgba(255,255,255,0.78); 928 929 /* Key fix: position the mobile search panel below the navbar bar */ 930 position: absolute; 931 left: 14px; 932 right: 14px; 933 top: 100%; 934 z-index: 1040 !important; 935 936 /* hidden state */ 937 opacity: 0; 938 pointer-events:none; 939 transform: translateY(0); 940 max-height: 0; 941 overflow: hidden; 942 943 transition: opacity 160ms ease, transform 160ms ease, max-height 160ms ease; 944 } 945 946 /* open state */ 947 .nv2.is-msearch-open .nv2SearchMobile{ 948 max-height: 44px; 949 opacity: 1; 950 pointer-events:auto; 951 transform: translateY(10px); 952 } 953 954 .nv2SearchMobile__input{ 955 flex: 1 1 auto; 956 min-width: 0; 957 height: 38px; 958 border-radius: calc(var(--nv2-radius) - 2px); 959 border: 1px solid rgba(0,0,0,0.10); 960 background: rgba(255,255,255,0.92); 961 padding: 0 12px; 962 outline: none; 963 font-weight: 650; 964 color:#222; 965 } 966 967 .nv2SearchMobile__input:focus{ 968 border-color: rgba(223,88,88,0.45); 969 box-shadow: 0 0 0 4px rgba(223,88,88,0.10); 970 } 971 972 /* CTA is hidden by default */ 973 .nv2SearchMobile__go{ 974 flex: 0 0 38px; 975 width: 38px; 976 height: 38px; 977 border-radius: 10px; 978 border: 0; 979 980 background: rgba(223,88,88,0.14); 981 color: var(--nv2-secondary); 982 983 display:flex; 984 align-items:center; 985 justify-content:center; 986 987 opacity: 0; 988 transform: translateX(6px); 989 pointer-events: none; 990 991 transition: opacity 140ms ease, transform 140ms ease, background var(--nv2-t) ease; 992 } 993 994 /* Show only when the input contains text */ 995 .nv2.is-msearch-open .nv2SearchMobile.is-ready .nv2SearchMobile__go{ 996 opacity: 1; 997 transform: translateX(0); 998 pointer-events: auto; 999 } 1000 1001 .nv2SearchMobile__go:active{ 1002 transform: translateX(0) scale(0.98); 1003 } 1004} 1005 1006/* Upload button */ 1007.nv2__upload{ 1008 position:relative; 1009 height: 40px; 1010 display:inline-flex; 1011 align-items:center; 1012 gap: 8px; 1013 padding: 0 12px; 1014 border-radius: var(--nv2-radius); 1015 background: var(--nv2-secondary); 1016 color:#fff !important; 1017 text-decoration:none !important; 1018 font-weight: 700; 1019 box-shadow: 0 6px 14px rgba(223,88,88,0.18); 1020 transition: transform var(--nv2-t) ease, background var(--nv2-t) ease, box-shadow var(--nv2-t) ease, opacity var(--nv2-t) ease; 1021} 1022#nv2UploadBtn, 1023#nv2UploadBtn:link, 1024#nv2UploadBtn:visited, 1025#nv2UploadBtn:hover, 1026#nv2UploadBtn:focus, 1027#nv2UploadBtn:active{ 1028 color:#fff !important; 1029 text-decoration:none !important; 1030} 1031#nv2UploadBtn *{ color:#fff !important; } 1032#nv2UploadBtn .nv2__uploadIcon i, 1033#nv2UploadBtn .nv2__uploadIcon svg{ 1034 color:#fff !important; 1035 fill:#fff !important; 1036} 1037.nv2__upload:hover{ 1038 background: #cf4f4f !important; 1039 transform: translateY(-1px); 1040 box-shadow: 0 10px 20px rgba(223,88,88,0.22); 1041} 1042.nv2__upload:active{ 1043 transform: translateY(0); 1044 box-shadow: 0 4px 10px rgba(223,88,88,0.15); 1045} 1046.nv2__upload:focus{
1047 outline:none !important; 1048 box-shadow: 0 0 0 4px rgba(223,88,88,0.18), 0 6px 14px rgba(223,88,88,0.18) !important; 1049} 1050.nv2__uploadIcon{ display:inline-flex; transition: transform var(--nv2-t) ease; } 1051.nv2__upload:hover .nv2__uploadIcon{ transform: translateY(-1px); } 1052 1053/* Upload loading spinner */ 1054.nv2__spinner{ 1055 display:none; 1056 width: 14px; 1057 height: 14px; 1058 border-radius: 999px; 1059 border: 2px solid rgba(255,255,255,0.35); 1060 border-top-color: #fff; 1061 animation: nv2spin .7s linear infinite; 1062} 1063.nv2__upload.is-loading{ pointer-events:none; opacity:.7; } 1064.nv2__upload.is-loading .nv2__spinner{ display:inline-block; } 1065@keyframes nv2spin{ to{ transform: rotate(360deg); } } 1066 1067@media (max-width: 767.98px){ 1068 .nv2__upload{ 1069 width: 40px; 1070 padding: 0; 1071 justify-content:center; 1072 } 1073 .nv2__uploadText{ display:none !important; } 1074} 1075 1076/* Avatar + dropdown */ 1077.nv2__userBtn{ 1078 height: 40px; 1079 display:inline-flex; 1080 align-items:center; 1081 gap: 8px; 1082 padding: 0 10px 0 6px; 1083 border-radius: var(--nv2-radius); 1084 border: 1px solid rgba(0,0,0,0.08); 1085 background: rgba(255,255,255,0.75); 1086 text-decoration:none; 1087 transition: background var(--nv2-t) ease, transform var(--nv2-t) ease, border-color var(--nv2-t) ease; 1088} 1089.nv2__userBtn:hover{ 1090 transform: translateY(-1px); 1091 background: rgba(0,0,0,0.03); 1092 border-color: rgba(0,0,0,0.12); 1093} 1094.nv2__avatar{ 1095 width: 36px; 1096 height: 36px; 1097 border-radius: 999px; 1098 border: 1px solid #eee; 1099 object-fit: cover; 1100 display:block; 1101} 1102.nv2__chev{ 1103 color: var(--nv2-muted); 1104 font-size: 12px; 1105 transition: transform var(--nv2-t) ease; 1106} 1107.nv2__user.show .nv2__chev{ transform: rotate(180deg); } 1108 1109/* Dropdown menu */ 1110.nv2__menu{ 1111 min-width: 210px; 1112 padding: 10px; 1113 border-radius: 14px; 1114 border: 1px solid #eee; 1115 background: #fff; 1116 box-shadow: 0 10px 30px rgba(0,0,0,0.08); 1117 margin-top: 10px !important; 1118 transform-origin: top right; 1119 animation: nv2dropIn 120ms ease forwards; 1120} 1121@keyframes nv2dropIn{ 1122 from{ opacity: 0; transform: translateY(6px) scale(0.97); } 1123 to{ opacity: 1; transform: translateY(0) scale(1); } 1124} 1125 1126.nv2__groupTitle{ 1127 font-size: 10.5px; 1128 font-weight: 800; 1129 letter-spacing: .35px; 1130 color: var(--nv2-muted); 1131 padding: 6px 10px 4px; 1132 text-transform: uppercase; 1133 opacity: .85; 1134} 1135.nv2__divider{ 1136 height: 1px; 1137 background: rgba(0,0,0,0.06); 1138 margin: 6px 6px; 1139 border-radius: 999px; 1140} 1141 1142.nv2__row{ 1143 display:flex; 1144 align-items:center; 1145 gap: 10px; 1146 padding: 9px 10px; 1147 border-radius: 12px; 1148 color: var(--nv2-text); 1149 text-decoration:none; 1150 transition: background var(--nv2-t) ease, color var(--nv2-t) ease; 1151} 1152.nv2__rowIcon, 1153.nv2__rowIcon i, 1154.nv2__rowIcon svg{ 1155 color: rgba(0,0,0,0.55); 1156 fill: rgba(0,0,0,0.55); 1157 opacity: 1; 1158 transition: transform var(--nv2-t) ease, opacity var(--nv2-t) ease, color var(--nv2-t) ease; 1159} 1160.nv2__row:hover{ 1161 background: rgba(0,0,0,0.03); 1162 color: #111; 1163} 1164.nv2__row:hover .nv2__rowIcon, 1165.nv2__row:hover .nv2__rowIcon i, 1166.nv2__row:hover .nv2__rowIcon svg{ 1167 color: rgba(0,0,0,0.70); 1168 fill: rgba(0,0,0,0.70); 1169 opacity: .95; 1170 transform: translateX(1px); 1171} 1172.nv2__rowMeta{ margin-left:auto; font-size: 12px; color: var(--nv2-muted); } 1173 1174.nv2__row.active, 1175.nv2__row.is-active{ 1176 background: rgba(223,88,88,0.10); 1177 color: var(--nv2-secondary); 1178} 1179.nv2__row.active .nv2__rowIcon, 1180.nv2__row.active .nv2__rowIcon i, 1181.nv2__row.active .nv2__rowIcon svg, 1182.nv2__row.is-active .nv2__rowIcon, 1183.nv2__row.is-active .nv2__rowIcon i, 1184.nv2__row.is-active .nv2__rowIcon svg{ 1185 color: var(--nv2-secondary); 1186 fill: var(--nv2-secondary); 1187} 1188 1189.nv2__row--danger{ 1190 color: rgba(223,88,88,0.85); 1191 font-weight: 600; 1192} 1193.nv2__row--danger .nv2__rowIcon, 1194.nv2__row--danger .nv2__rowIcon i, 1195.nv2__row--danger .nv2__rowIcon svg{ 1196 color: rgba(223,88,88,0.60); 1197 fill: rgba(223,88,88,0.60); 1198} 1199.nv2__row--danger:hover{ 1200 background: rgba(223,88,88,0.08); 1201 color: var(--nv2-secondary); 1202} 1203.nv2__row--danger:hover .nv2__rowIcon, 1204.nv2__row--danger:hover .nv2__rowIcon i, 1205.nv2__row--danger:hover .nv2__rowIcon svg{ 1206 color: var(--nv2-secondary); 1207 fill: var(--nv2-secondary); 1208} 1209 1210/* Optional: breathing space for anchors after sticky nav */ 1211.nv2 + *{ scroll-margin-top: 96px; } 1212 1213/* ===== Guest actions (responsive conversion) ===== */ 1214.nv2__gActions{ 1215 display:flex; 1216 align-items:center; 1217 gap: 12px; 1218} 1219 1220/* Base guest button */ 1221.nv2__gBtn{ 1222 height: 44px; 1223 display:inline-flex; 1224 align-items:center; 1225 justify-content:center; 1226 gap: 10px; 1227 padding: 0 16px; 1228 border-radius: var(--nv2-radius); 1229 border: 1px solid rgba(0,0,0,0.16); 1230 background: #fff; 1231 color:#121212; 1232 text-decoration:none !important; 1233 font-weight: 800; 1234 line-height: 1; 1235 white-space: nowrap; 1236 transition: transform var(--nv2-t) ease, 1237 background var(--nv2-t) ease, 1238 border-color var(--nv2-t) ease, 1239 color var(--nv2-t) ease, 1240 box-shadow var(--nv2-t) ease; 1241} 1242.nv2__gBtn i{ font-size: 16px; opacity: .92; } 1243 1244.nv2__gBtn:hover{ 1245 border-color: rgba(223,88,88,0.55); 1246 color: var(--nv2-secondary); 1247 background:#fff; 1248 transform: translateY(-1px); 1249 box-shadow: 0 8px 18px rgba(0,0,0,0.06); 1250} 1251 1252/* Sign up button (primary) */
1253.nv2__gBtn--primary{ 1254 border-color: transparent; 1255 background: var(--nv2-secondary); 1256 color:#fff !important; 1257 box-shadow: 0 10px 20px rgba(223,88,88,0.18); 1258} 1259.nv2__gBtn--primary:hover{ 1260 background:#cf4f4f; 1261 transform: translateY(-1px); 1262 box-shadow: 0 14px 26px rgba(223,88,88,0.22); 1263} 1264 1265/* ===== Desktop Guest: if Desktop search exists => compact Sign up (icon-only) ===== */ 1266@media (min-width: 992px){ 1267 /* only when desktop search is visible (nv2--ds-show) */ 1268 nav#nv2.nv2--ds-show .nv2__gBtn--signup{ 1269 width: 48px; /* hit-area */ 1270 padding: 0 !important; /* icon-only */ 1271 gap: 0 !important; 1272 } 1273 1274 nav#nv2.nv2--ds-show .nv2__gBtn--signup .nv2__gText{ 1275 display: none !important; 1276 } 1277 1278 nav#nv2.nv2--ds-show .nv2__gBtn--signup i{ 1279 margin: 0 !important; 1280 } 1281} 1282 1283/* Mobile: stack full width */ 1284/* ===== Guest actions: 360 â 767.98 side-by-side ===== */ 1285@media (min-width: 360px) and (max-width: 767.98px){ 1286 .nv2__gActions{ 1287 width: 100%; 1288 flex-direction: row; 1289 align-items: center; 1290 gap: 10px; 1291 margin-top: 6px; 1292 padding-top: 6px; 1293 } 1294 1295 .nv2__gBtn{ 1296 width: 50%; 1297 flex: 1 1 0; 1298 justify-content: center; 1299 padding: 0 12px; /* prevents crowding */ 1300 } 1301 1302 .nv2__gBtn span{ 1303 font-size: 14px; /* slightly tighter */ 1304 } 1305} 1306 1307/* Optional: <360 keep stacked (tiny phones) */ 1308@media (max-width: 359.98px){ 1309 .nv2__gActions{ 1310 width: 100%; 1311 flex-direction: column; 1312 align-items: stretch; 1313 gap: 10px; 1314 margin-top: 6px; 1315 padding-top: 6px; 1316 } 1317 .nv2__gBtn{ width: 100%; } 1318} 1319 1320/* Tap / press feedback */ 1321.nv2__gBtn:active{ 1322 transform: translateY(0); 1323 box-shadow: none; 1324 background: rgba(0,0,0,0.02); 1325} 1326.nv2__gBtn--primary:active{ 1327 background:#c54848; 1328 box-shadow: 0 6px 14px rgba(223,88,88,0.18); 1329} 1330 1331 1332 1333/* ===== User Drawer (Offcanvas) ===== */ 1334.nv2UserDrawer{ 1335 width: 360px; 1336 max-width: 360px; 1337 border-left: 1px solid rgba(0,0,0,0.08); 1338 background: #fff; 1339} 1340@media (max-width: 767.98px){ 1341 .nv2UserDrawer{ 1342 width: 85vw; 1343 max-width: 360px; 1344 } 1345} 1346 1347/* <480px: bottom sheet behavior */ 1348@media (max-width: 479.98px){ 1349 .nv2UserDrawer.offcanvas-end{ 1350 top: auto; 1351 bottom: 0; 1352 right: 0; 1353 left: 0; 1354 width: 100% !important; 1355 max-width: 100% !important; 1356 height: 70vh; 1357 border-left: 0; 1358 border-top: 1px solid rgba(0,0,0,0.08); 1359 border-radius: 16px 16px 0 0; 1360 transform: translateY(100%); /* override Bootstrap end drawer */ 1361 } 1362 .nv2UserDrawer.offcanvas-end.show{ 1363 transform: translateY(0); 1364 } 1365} 1366 1367.nv2UserDrawer__header{ 1368 display:flex; 1369 align-items:center; 1370 justify-content:space-between; 1371 padding: 14px 16px; 1372 border-bottom: 1px solid rgba(0,0,0,0.06); 1373} 1374.nv2UserDrawer__title{ 1375 font-weight: 800; 1376 color: #111; 1377 letter-spacing: .2px; 1378} 1379.nv2UserDrawer__close{ 1380 height: 38px; 1381 width: 38px; 1382 border: 1px solid rgba(0,0,0,0.10); 1383 border-radius: 12px; 1384 background:#fff; 1385 color:#111; 1386} 1387 1388.nv2UserDrawer__profile{ 1389 display:flex; 1390 align-items:center; 1391 gap: 12px; 1392 padding: 14px 16px; 1393 border-bottom: 1px solid rgba(0,0,0,0.06); 1394} 1395.nv2UserDrawer__avatar{ 1396 width: 44px; 1397 height: 44px; 1398 border-radius: 999px; 1399 object-fit: cover; 1400 border: 1px solid rgba(0,0,0,0.08); 1401} 1402.nv2UserDrawer__name{ font-weight: 800; color:#111; } 1403.nv2UserDrawer__email{ font-size: 13px; color: #6b6b6b; } 1404 1405.nv2UserDrawer__body{ padding: 10px 10px 14px; } 1406.nv2UserDrawer__sectionTitle{ 1407 padding: 10px 10px 6px; 1408 font-size: 11px; 1409 font-weight: 900; 1410 letter-spacing: .35px; 1411 color: #6b6b6b; 1412 text-transform: uppercase; 1413} 1414 1415/* Drawer links */ 1416.nv2UserDrawer__link{ 1417 display:flex; 1418 align-items:center; 1419 gap: 10px; 1420 padding: 12px 14px; 1421 border-radius: 12px; 1422 text-decoration:none; 1423 color:#121212; 1424 font-weight: 600; 1425 transition: background var(--nv2-t) ease, 1426 color var(--nv2-t) ease, 1427 transform var(--nv2-t) ease; 1428} 1429.nv2UserDrawer__link i{ 1430 color: rgba(0,0,0,0.55); 1431 transition: color var(--nv2-t) ease, opacity var(--nv2-t) ease; 1432} 1433.nv2UserDrawer__link:hover{ 1434 background: rgba(223,88,88,0.06); 1435 color:#111; 1436} 1437.nv2UserDrawer__link:hover i{ color: rgba(0,0,0,0.75); } 1438 1439.nv2UserDrawer__link.is-active{ 1440 background: rgba(223,88,88,0.10); 1441 color: var(--nv2-secondary); 1442 font-weight: 700; 1443} 1444.nv2UserDrawer__link.is-active i{ color: var(--nv2-secondary); } 1445 1446/* Drawer footer */ 1447.nv2UserDrawer__footer{ 1448 padding: 12px 10px 16px; 1449 border-top: 1px solid rgba(0,0,0,0.06); 1450} 1451 1452/* Drawer logout (fixed hover) */ 1453.nv2UserDrawer__logout{ 1454 display:flex; 1455 align-items:center; 1456 justify-content:center; 1457 gap: 10px; 1458 padding: 14px 12px; 1459 border-radius: 14px; 1460 text-decoration:none !important; 1461 font-weight: 800; 1462 color: var(--nv2-secondary) !important; 1463 background: rgba(223,88,88,0.10); 1464 transition: background var(--nv2-t) ease, 1465 transform var(--nv2-t) ease, 1466 box-shadow var(--nv2-t) ease; 1467} 1468.nv2UserDrawer__logout i{ color: var(--nv2-secondary) !important; } 1469 1470.nv2UserDrawer__logout:hover{ 1471 background: rgba(223,88,88,0.18); 1472 color: var(--nv2-secondary) !important; 1473 box-shadow: 0 6px 16px rgba(223,88,88,0.15); 1474 transform: translateY(-1px); 1475} 1476.nv2UserDrawer__logout:active{ 1477 transform: translateY(0); 1478 box-shadow: 0 3px 8px rgba(223,88,88,0.12); 1479} 1480</style> 1481 1482<nav class="navbar navbar-expand-lg navbar-light nv2 nv2--admin nv2--sticky nv2--ds-show" id="nv2"> 1483 1484 <div class="nv2__shell"> 1485 <div class="nv2__bar"> 1486 1487 1488 <a class="nv2__brand" href="https://www.citypng.com" aria-label="CityPNG Home"> 1489 <img class="nv2__logo nvLogo" 1490 src="https://imagedelivery.net/5MYSbk45M80qAwecrlKzdQ/1df3913a-3012-43f5-e509-c60d81362700/thumbnail" 1491 alt="Brand Logo"> 1492 1493 </a> 1494 1495 1496 <div class="nv2__mActions d-lg-none"> 1497 <button id="nv2SearchToggler" class="nv2__iconBtn nv2__iconBtn--search" type="button" aria-label="Search"> 1498 <i class="fa fa-search"></i> 1499 </button> 1500 1501 <button class="nv2__iconBtn navbar-toggler" type="button" 1502 data-bs-toggle="collapse" data-bs-target="#nv2Collapse" 1503 aria-controls="nv2Collapse" aria-expanded="false" aria-label="Open menu"> 1504 <span class="navbar-toggler-icon"></span> 1505 <span class="nv2__mid" aria-hidden="true"></span> 1506</button> 1507 </div> 1508 1509 1510 <form class="nv2SearchMobile js-nv2SearchMobile d-lg-none" action="https://www.citypng.com/search" method="GET" role="search"> 1511 <input 1512 type="text" 1513 class="nv2SearchMobile__input js-nv2SearchMobileInput" 1514 name="q" 1515 placeholder="Search..." 1516 autocomplete="off" 1517 /> 1518 <button class="nv2SearchMobile__go" type="submit" aria-label="Search"> 1519 <i class="fa fa-arrow-right"></i> 1520 </button> 1521 </form> 1522 1523 1524 <div class="collapse navbar-collapse" id="nv2Collapse"> 1525 1526 1527 <ul class="nv2__nav"> 1528 <li class="nv2__item"> 1529 <a class="nv2__link " href="https://www.citypng.com/latest">Latest</a> 1530 </li> 1531 <li class="nv2__item"> 1532 <a class="nv2__link " href="https://www.citypng.com/categories">Categories</a> 1533 </li> 1534 <li class="nv2__item"> 1535 <a class="nv2__link " href="https://www.citypng.com/page/about-us">About</a> 1536 </li> 1537 <li class="nv2__item"> 1538 <a class="nv2__link is-active" href="https://www.citypng.com/contact">Contact</a> 1539 </li> 1540 </ul> 1541 1542 1543 <div class="nv2__right"> 1544 1545 1546<div class="nv2__tools d-none d-lg-flex"> 1547
1548 <div class="nv2SearchWrap "> 1549 <form class="nv2Search js-nv2Search" action="https://www.citypng.com/search" method="GET" role="search"> 1550 <button class="nv2Search__btn js-nv2SearchBtn" type="button" aria-label="Open search"> 1551 <i class="fa fa-search"></i> 1552 </button> 1553 1554 <div class="nv2Search__box"> 1555 <input 1556 type="text" 1557 class="nv2Search__input js-nv2SearchInput" 1558 name="q" 1559 placeholder="Search..." 1560 autocomplete="off" 1561> 1562 </div> 1563 1564 1565 <button class="nv2Search__go" type="submit" aria-label="Search" title="Search"> 1566 <i class="fa fa-arrow-right"></i> 1567 </button> 1568 </form> 1569 </div> 1570 1571</div> 1572 1573 1574 1575 1576<div class="nv2__gActions"> 1577 1578 1579 <a class="nv2__gBtn" href="https://www.citypng.com/login"> 1580 <i class="fa fa-sign-in" aria-hidden="true"></i> 1581 <span>Log in</span> 1582 </a> 1583 1584 1585 <a class="nv2__gBtn nv2__gBtn--primary nv2__gBtn--signup" href="https://www.citypng.com/signup" aria-label="Sign up"> 1586 <i class="fa fa-user-plus" aria-hidden="true"></i> 1587 <span class="nv2__gText">Sign up</span> 1588</a> 1589 1590</div> 1591 1592 1593 </div> 1594 </div> 1595 1596 </div> 1597 </div> 1598</nav> 1599 1600
1601<script> 1602(function(){ 1603 document.querySelectorAll('.js-nv2Search').forEach(function(form){ 1604 // Prevent duplicate binding if the partial is included more than once 1605 if(form.dataset.bound === '1') return; 1606 form.dataset.bound = '1'; 1607 1608 var btn = form.querySelector('.js-nv2SearchBtn'); 1609 var input = form.querySelector('.js-nv2SearchInput'); 1610 if(!btn || !input) return; 1611 1612 function syncText(){ 1613 var q = (input.value || '').trim(); 1614 if(q.length) form.classList.add('has-text'); 1615 else form.classList.remove('has-text'); 1616 } 1617 1618 function openSearch(){ 1619 form.classList.add('is-open'); 1620 syncText(); 1621 setTimeout(function(){ try{ input.focus(); }catch(e){} }, 10); 1622 } 1623 1624 function closeSearch(){ 1625 form.classList.remove('is-open'); 1626 form.classList.remove('has-text'); 1627 try{ input.blur(); }catch(e){} 1628 } 1629 1630 btn.addEventListener('click', function(e){ 1631 e.preventDefault(); 1632 e.stopPropagation(); 1633 if(form.classList.contains('is-open')) closeSearch(); 1634 else openSearch(); 1635 }); 1636 1637 form.addEventListener('click', function(e){ e.stopPropagation(); }); 1638 1639 document.addEventListener('click', function(){ 1640 if(form.classList.contains('is-open')) closeSearch(); 1641 }); 1642 1643 document.addEventListener('keydown', function(e){ 1644 if(e.key === 'Escape' && form.classList.contains('is-open')) closeSearch(); 1645 }); 1646 1647 input.addEventListener('input', syncText); 1648 1649// Prevent empty form submission 1650form.addEventListener('submit', function(e){ 1651 var q = (input.value || '').trim(); 1652 if(!q){ 1653 e.preventDefault(); 1654 openSearch(); 1655 input.focus(); 1656 } 1657}); 1658 1659 }); 1660 1661 // ===== Fix burger button border by removing focus after collapse closes ===== 1662 try{ 1663 var collapseEl = document.getElementById('nv2Collapse'); 1664 if(collapseEl){ 1665 collapseEl.addEventListener('hidden.bs.collapse', function(){ 1666 var btn = document.querySelector('[data-bs-target="#nv2Collapse"]'); 1667 if(btn) btn.blur(); 1668 }); 1669 } 1670 }catch(e){} 1671 1672 // ===== Mobile search toggle (prevent interference from old theme scripts) ===== 1673try{ 1674 var nav = document.getElementById('nv2'); 1675 var mBtn = document.getElementById('nv2SearchToggler'); 1676 var mForm = document.querySelector('.js-nv2SearchMobile'); 1677 var mInput= document.querySelector('.js-nv2SearchMobileInput'); 1678 1679 function safeFocus(el){ 1680 if(!el) return; 1681 try{ 1682 if(el.focus) el.focus({ preventScroll:true }); 1683 else el.focus(); 1684 }catch(e){ 1685 try{ el.focus(); }catch(e2){} 1686 } 1687 } 1688 1689function openMobileSearch(){ 1690 if(!nav || !mForm) return; 1691 1692 // Close any other search inputs outside the navbar search form 1693 try{ 1694 document.querySelectorAll('input[name="q"]').forEach(function(x){ 1695 if(!mForm.contains(x)) x.blur(); 1696 }); 1697 }catch(e){} 1698 1699 // Close the mobile menu first if it is currently open 1700 try{ 1701 var collapse = document.getElementById('nv2Collapse'); 1702 if(collapse && collapse.classList.contains('show')){
1703 try{ 1704 if(window.bootstrap && bootstrap.Collapse){ 1705 bootstrap.Collapse.getOrCreateInstance(collapse, { toggle:false }).hide(); 1706 }else{ 1707 // Fallback: force close without Bootstrap instance 1708 collapse.classList.remove('show'); 1709 collapse.style.height = ''; 1710 } 1711 }catch(err){ 1712 collapse.classList.remove('show'); 1713 collapse.style.height = ''; 1714 } 1715 } 1716 }catch(e){} 1717 1718 // Open the mobile search panel 1719 nav.classList.add('is-msearch-open'); 1720 1721 // Remove focus from the button to avoid iOS/Bootstrap focus border issues 1722 try{ mBtn && mBtn.blur(); }catch(e){} 1723 1724 // Focus the mobile search input 1725 setTimeout(function(){ safeFocus(mInput); }, 10); 1726} 1727 1728 function closeMobileSearch(){ 1729 if(!nav) return; 1730 nav.classList.remove('is-msearch-open'); 1731 try{ mInput && mInput.blur(); }catch(e){} 1732 } 1733 1734 if(mBtn && nav && mForm){ 1735 // Use a capture-phase listener to intercept the click before legacy scripts 1736 mBtn.addEventListener('click', function(e){ 1737 e.preventDefault(); 1738 e.stopPropagation(); 1739 if(e.stopImmediatePropagation) e.stopImmediatePropagation(); 1740 1741 if(nav.classList.contains('is-msearch-open')) closeMobileSearch(); 1742 else openMobileSearch(); 1743 }, true); 1744 1745 // Prevent closing when clicking inside the mobile search form 1746 mForm.addEventListener('click', function(e){ 1747 e.stopPropagation(); 1748 if(e.stopImmediatePropagation) e.stopImmediatePropagation(); 1749 }, true); 1750 1751 // Close on outside click 1752 document.addEventListener('click', function(){ 1753 if(nav.classList.contains('is-msearch-open')) closeMobileSearch(); 1754 }); 1755 1756 // Close on Escape key 1757 document.addEventListener('keydown', function(e){ 1758 if(e.key === 'Escape' && nav.classList.contains('is-msearch-open')) closeMobileSearch(); 1759 }); 1760 1761 } 1762}catch(e){} 1763 1764// ===== Mobile menu close logic (independent from Account Offcanvas state) ===== 1765try{ 1766 var nav = document.getElementById('nv2'); 1767 var collapse = document.getElementById('nv2Collapse'); 1768 var drawer = document.getElementById('nv2UserDrawer'); // Account panel 1769 1770 if(!nav || !collapse) return; 1771 1772 // Prevent duplicate binding 1773 if(nav.dataset.menuBound === '1') return; 1774 nav.dataset.menuBound = '1'; 1775 1776 function isMobile(){ 1777 return window.matchMedia && window.matchMedia('(max-width: 991.98px)').matches; 1778 } 1779 1780 function isDrawerOpen(){ 1781 return !!(drawer && drawer.classList.contains('show')); 1782 } 1783 1784 function closeMenu(){ 1785 if(!isMobile()) return; 1786 if(!collapse.classList.contains('show')) return; 1787 1788 try{ 1789 if(window.bootstrap && bootstrap.Collapse){ 1790 bootstrap.Collapse.getOrCreateInstance(collapse, { toggle:false }).hide(); 1791 return; 1792 } 1793 }catch(e){} 1794 1795 // Fallback: force close without Bootstrap instance 1796 collapse.classList.remove('show'); 1797 collapse.style.height = ''; 1798 } 1799 1800 // 1) Close when clicking a link inside the menu (mobile only) 1801 collapse.addEventListener('click', function(e){ 1802 if(!isMobile()) return; 1803 1804 if(isDrawerOpen()) return; 1805 1806 var a = e.target.closest('a'); 1807 if(!a) return; 1808 if(a.getAttribute('data-bs-toggle') || a.getAttribute('data-toggle')) return; 1809 1810 closeMenu(); 1811 }, true); 1812 1813 // 2) Close when clicking outside the navbar (mobile only) 1814 document.addEventListener('pointerdown', function(e){ 1815 if(!isMobile()) return; 1816 if(!collapse.classList.contains('show')) return; 1817 1818 if(isDrawerOpen()) return; 1819 1820 if(nav.contains(e.target)) return; 1821 1822 closeMenu(); 1823 }, true); 1824 1825}catch(e){} 1826 1827// ===== Mobile search CTA: show only when the input has text ===== 1828try{ 1829 var mForm = document.querySelector('.js-nv2SearchMobile'); 1830 var mInput = document.querySelector('.js-nv2SearchMobileInput'); 1831 1832 function syncMobileCTA(){ 1833 if(!mForm || !mInput) return; 1834 var q = (mInput.value || '').trim(); 1835 if(q.length) mForm.classList.add('is-ready'); 1836 else mForm.classList.remove('is-ready'); 1837 } 1838 1839 if(mForm && mInput){ 1840 mInput.addEventListener('input', syncMobileCTA); 1841 mInput.addEventListener('change', syncMobileCTA); 1842 syncMobileCTA(); 1843 1844 // prevent empty submit 1845 mForm.addEventListener('submit', function(e){ 1846 var q = (mInput.value || '').trim(); 1847 if(!q){ 1848 e.preventDefault(); 1849 try{ mInput.focus({ preventScroll:true }); }catch(err){ try{ mInput.focus(); }catch(e2){} } 1850 } 1851 }); 1852 } 1853}catch(e){} 1854 1855 1856 1857 1858 1859})(); 1860</script>
1860 1861 1862 1863 1864 <div class="mt-3 header-search-main" style="display: none;"> 1865 <body class=" google-anno-skip"> 1866 1867<style> 1868 /* =========================== 1869 CityPNG search hero 1870 Applied to legacy include 1871 =========================== */ 1872 1873.cpSearchHero{ 1874 width: 100%; 1875 max-width: 780px; 1876 margin: 0 auto; 1877 padding: 0 12px; /* Small horizontal spacing on the sides */ 1878 text-align: center; 1879} 1880 1881.cpSearchForm{ width: 100%; margin: 0; } 1882 1883.cpSearchBar{ 1884 display: flex; 1885 align-items: stretch; 1886 width: 100%; 1887 height: 56px; 1888 border-radius: 14px; 1889 overflow: hidden; 1890 background: rgba(255,255,255,0.94); 1891 border: 1px solid rgba(0,0,0,0.08); 1892 box-shadow: none; 1893 transition: box-shadow 120ms ease, border-color 120ms ease, transform 120ms ease; 1894} 1895 1896.cpSearchInput{ 1897 flex: 1 1 auto; 1898 width: 100%; 1899 height: 100%; 1900 border: 0; 1901 outline: 0; 1902 padding: 0 16px; 1903 font-size: 16px; 1904 color: #121212; 1905 background: transparent; 1906} 1907 1908.cpSearchInput::placeholder{ 1909 color: rgba(0,0,0,0.45); 1910} 1911 1912.cpSearchBtn{ 1913 width: 72px; 1914 height: 100%; 1915 border: 0; 1916 cursor: pointer; 1917 background: #df5858; 1918 color: #fff; 1919 display: inline-flex; 1920 align-items: center; 1921 justify-content: center; 1922 transition: background 120ms ease, transform 120ms ease, opacity 120ms ease; 1923} 1924 1925.cpSearchBtn:hover{ background: #d94a4a; } 1926.cpSearchBtn:active{ transform: scale(0.98); } 1927 1928.cpSearchBtn__icon i{ 1929 font-size: 20px; 1930 line-height: 1; 1931} 1932 1933.cpSearchBtn:disabled{ 1934 opacity: 0.55; 1935 cursor: not-allowed; 1936 transform: none; 1937} 1938 1939/* Hide the hero search below 992px only on photo and png-download pages */ 1940@media (max-width: 991.98px){ 1941 .hide-hero-search-mobile .cpSearchHero{ 1942 display: none !important; 1943 } 1944} 1945</style> 1946 1947<div class="cpSearchHero"> 1948 <form role="search" autocomplete="off" action="https://www.citypng.com/search" method="get" class="cpSearchForm"> 1949 <div class="cpSearchBar" aria-label="Search"> 1950 <input 1951 type="text" 1952 name="q" 1953 class="cpSearchInput" 1954 aria-label="Search PNG" 1955 placeholder="Search PNG" 1956 /> 1957 1958 <button class="cpSearchBtn" type="submit" aria-label="Search" disabled> 1959 <span class="cpSearchBtn__icon" aria-hidden="true"> 1960 <i class="bi-search"></i> 1961 </span> 1962 </button> 1963 </div> 1964 </form> 1965</div> 1966
1967<script> 1968document.querySelectorAll('.cpSearchForm').forEach(function(form){ 1969 1970 const input = form.querySelector('.cpSearchInput'); 1971 const btn = form.querySelector('.cpSearchBtn'); 1972 1973 if(!input || !btn) return; 1974 1975 function toggleButton(){ 1976 const hasText = input.value.trim().length > 0; 1977 btn.disabled = !hasText; 1978 } 1979 1980 toggleButton(); 1981 input.addEventListener('input', toggleButton); 1982 1983}); 1984</script>
1984 </div> 1985 </div> 1986 1987 <!-- Navbar end --> 1988 1989 </header> 1990 1991 1992 <main> 1993 1994 1995 <!-- Main Content Starts --> 1996 1997 <div class="container"> 1998 <div class="row justify-content-center align-items-center"> 1999 <div class="col-lg-9 col-md-10 "> 2000 <div class="row"> 2001 <div class="col-12 mt-5"> 2002 </div> 2003 2004 <div class="col-12 mt-5 d-flex justify-content-center"> 2005 <h4 class="FPIheading">CONTACT US</h4> 2006 </div> 2007 2008 <div class="col-12 mt-5 text-center"> 2009 <p class="whh mb-0">We're here to help!</p> 2010 </div> 2011 </div> 2012 2013 <form class="mt-4 mb-3" action="https://www.citypng.com/contact" method="post"> 2014 <input type="hidden" name="_token" value="Oigci8MUB9tVQpZMpb8IhqwqlCrL8dDmrzptluXG"> 2015 <input type="hidden" name="captchaToken" id="hidden-token" /> 2016 <input type="hidden" name="captchaAction" id="hidden-action" /> 2017 2018 <div class="row align-items-center justify-content-between"> 2019 <div class="col-lg-6 col-md-6 col-12"> 2020 <input class="form-control cuInpFields" type="text" name="full_name" value="" required placeholder="*Name"> 2021 </div> 2022 2023 <div class="col-lg-6 col-md-6 col-12 mt-lg-0 mt-md-0 mt-4"> 2024 <input class="form-control cuInpFields" type="email" name="email" value="" required placeholder="*Email"> 2025 </div> 2026 2027 <div class="col-12 mt-4"> 2028 <input class="form-control cuInpFields" type="text" value="" name="subject" required placeholder="*Subject"> 2029 </div> 2030 2031 <div class="col-12 mt-4"> 2032 <textarea class="form-control cuInpFields cuTxtArea" maxlength="100" name="message" rows="5" type="text" required placeholder="* Please enter your problem in detail. We will get back to you via email in 24-48 business hours."></textarea> 2033 </div> 2034 2035 <div class="form-group mt-4" style="display:flex;justify-content:center;"> 2036 <div class="g-recaptcha" data-sitekey="6LfJ684iAAAAAOg8tC-59ugFEbNmpBIzjU6-VJCL" data-action="register"></div> 2037 </div> 2038 2039 <div class="col-12 mt-3 text-center"> 2040 <button type="submit" class="regisBtn sndBtn p-2">Send</button> 2041 </div> 2042 </div> 2043 </form> 2044 </div> 2045 </div> 2046 </div> 2047 2048 <!-- Main Content Ends --> 2049 2050
2050<script> 2051 function alertHide(){ 2052 document.getElementsByClassName("myAlert-danger")[0].style.display = "none"; 2053 } 2054 2055 $(document).ready(function(){ 2056 $('.cuInpFields[name="full_name"], .cuInpFields[name="subject"]').on('keypress', function(e){ 2057 var regex = new RegExp("^[a-zA-Z0-9]+$"); 2058 var str = String.fromCharCode(!e.charCode ? e.which : e.charCode); 2059 if (regex.test(str)) { 2060 return true; 2061 } 2062 2063 e.preventDefault(); 2064 return false; 2065 }); 2066 }); 2067 </script>
2067 2068 2069 2070 2071 2072 </main> 2073 2074 <style> 2075/* ===== FTD Footer (FINAL STRUCTURE) ===== */ 2076:root{ 2077 --ftd-secondary:#df5858; 2078 --ftd-bg: rgba(255,255,255,0.78); 2079 --ftd-border: rgba(0,0,0,0.08); 2080 --ftd-text:#121212; 2081 --ftd-muted:#6b6b6b; 2082 --ftd-radius:14px; 2083 --ftd-t:120ms; 2084 --ftd-shadow: 0 10px 28px rgba(0,0,0,0.06); 2085} 2086 2087.ftd{ 2088 margin-top: 20px; 2089 padding: 0 24px 18px; 2090} 2091@media (max-width: 767.98px){ 2092 .ftd{ padding: 0 16px 16px; } 2093} 2094 2095/* ===== Match navbar spacing (container + NV2 padding) on 576px â 767.98px ===== */ 2096@media (min-width: 576px) and (max-width: 767.98px){ 2097 /* Navbar padding = container gutter/2 + NV2 horizontal padding (16px) */ 2098 .ftd{ 2099 padding-left: calc(16px + (var(--bs-gutter-x, 24px) / 2)); 2100 padding-right: calc(16px + (var(--bs-gutter-x, 24px) / 2)); 2101 } 2102 2103 /* Optional but recommended: use the same container max width */ 2104 .ftd__shell{ 2105 max-width: 540px; 2106 } 2107} 2108 2109/* Keep footer alignment after 768px (md container range) */ 2110@media (min-width: 768px) and (max-width: 991.98px){ 2111 .ftd__shell{ max-width: 720px; } 2112} 2113 2114.ftd__shell{ 2115 max-width: 1280px; 2116 width: 100%; 2117 margin: 0 auto; 2118} 2119 2120/* ===== Align footer width with Bootstrap container (same as navbar look) ===== */ 2121/* sm: 576 â 767.98 => container max-width: 540px */ 2122@media (min-width: 576px) and (max-width: 767.98px){ 2123 .ftd__shell{ max-width: 513px; } 2124} 2125 2126/* md: 768 â 991.98 => keep footer aligned after crossing the 768px breakpoint */ 2127@media (min-width: 768px) and (max-width: 991.98px){ 2128 .ftd__shell{ max-width: 100%; } 2129 .ftd {padding:0px 12px;} 2130} 2131 2132@media (min-width: 1091px) and (max-width: 1399.98px){ 2133 .ftd__shell{ 2134 max-width: 81vw; 2135 } 2136} 2137 2138/* ===== 900 â 1090 keep same width ===== */ 2139@media (min-width: 900px) and (max-width: 1090.98px){ 2140 .ftd__shell{ 2141 max-width: 92%; 2142 } 2143} 2144 2145/* Footer card */ 2146.ftd__card{ 2147 border: 1px solid var(--ftd-border); 2148 border-radius: var(--ftd-radius); 2149 background: var(--ftd-bg); 2150 backdrop-filter: blur(10px); 2151 -webkit-backdrop-filter: blur(10px); 2152 box-shadow: var(--ftd-shadow); 2153 padding: 18px 20px; 2154} 2155@media (max-width: 767.98px){ 2156 .ftd__card{ padding: 16px 16px; } 2157} 2158 2159/* Top layout: 2160 Desktop: left brand area + right link columns 2161 Mobile: stacked layout with accordion sections */ 2162.ftd__top{ 2163 display:grid; 2164 grid-template-columns: 0.9fr 1.1fr; /* â left slightly narrower */ 2165 gap: 18px; 2166 align-items:start; 2167} 2168@media (max-width: 991.98px){ 2169 .ftd__top{ grid-template-columns: 1fr; } 2170} 2171 2172/* LEFT (Brand Area) */ 2173.ftd__brand{ 2174 display:flex; 2175 flex-direction:column; 2176 gap: 10px; 2177 min-width: 0; 2178} 2179.ftd__logoLink{ 2180 display:inline-flex; 2181 align-items:center; 2182 text-decoration:none; 2183} 2184.ftd__logo{ 2185 height: 28px; 2186 width:auto; 2187 display:block; 2188} 2189 2190/* Brand tagline */ 2191.ftd__tagline{ 2192 margin: 0; 2193 color: rgba(18,18,18,0.70); 2194 font-size: 14px; 2195 line-height: 1.45; 2196 max-width: 420px; 2197 font-weight: 620; 2198} 2199 2200/* Care line */ 2201.ftd__care{ 2202 margin: 0; 2203 font-size: 13px; 2204 line-height: 1.35; 2205 color: rgba(18,18,18,0.55); 2206 font-weight: 600; 2207} 2208 2209/* Heart icon: clearer and independent from text opacity */ 2210.ftd__heart{ 2211 display:inline-flex; 2212 align-items:center; 2213 justify-content:center; 2214 2215 width: 16px; 2216 height: 16px; 2217 margin: 0 6px; 2218 2219 color: #df5858; /* Accent color */ 2220 line-height: 1; 2221 transform: translateY(2px); /* baseline align */ 2222 2223 opacity: 1; 2224} 2225.ftd__heart svg{ 2226 width: 16px; 2227 height: 16px; 2228 display:block; 2229 fill: currentColor; 2230 2231 /* Slight sharpening */ 2232 filter: drop-shadow(0 1px 0 rgba(0,0,0,0.06)); 2233} 2234 2235/* ===== Right section (desktop columns only) ===== */ 2236.ftd__colsDesktop{ display:block; } 2237@media (max-width: 767.98px){ 2238 .ftd__colsDesktop{ display:none !important; } /* Hide desktop columns on mobile */ 2239} 2240 2241.ftd__cols{ 2242 display:grid; 2243 grid-template-columns: repeat(3, minmax(0, 1fr)); /* Equal-width columns */ 2244 gap: 16px; 2245} 2246 2247/* Section headings: uppercase with subtle underline */ 2248.ftd__colTitle{ 2249 display:inline-flex; 2250 align-items:center; 2251 2252 font-size: 11px; 2253 font-weight: 650; /* Medium weight */ 2254 letter-spacing: .55px; 2255 text-transform: uppercase; 2256 2257 color: rgba(18,18,18,0.84); 2258 margin-bottom: 8px; 2259 2260 position: relative; 2261 padding-bottom: 7px; 2262} 2263.ftd__colTitle::after{ 2264 content:""; 2265 position:absolute; 2266 left: 0; 2267 bottom: 1px;
2268 width: 20px; 2269 height: 1px; /* Very thin underline */ 2270 border-radius: 999px; 2271 background: rgba(223,88,88,0.52); 2272 opacity: .75; 2273} 2274 2275/* Link lists: compact spacing */ 2276.ftd__list{ 2277 list-style:none; 2278 margin: 0; 2279 padding: 0; 2280 display:flex; 2281 flex-direction:column; 2282 gap: 7px; /* Compact spacing */ 2283} 2284 2285/* Links: subtle motion with soft underline on hover */ 2286.ftd__link{ 2287 display:inline-flex; 2288 align-items:center; 2289 color: rgba(18,18,18,0.62) !important; 2290 text-decoration:none !important; 2291 font-size: 14px; 2292 line-height: 1.30; 2293 font-weight: 640; 2294 transition: color var(--ftd-t) ease, 2295 transform var(--ftd-t) ease, 2296 text-decoration-color var(--ftd-t) ease; 2297} 2298.ftd__link:hover{ 2299 color: var(--ftd-secondary) !important; 2300 transform: translateX(1px); 2301 text-decoration: underline !important; 2302 text-decoration-color: rgba(223,88,88,0.22) !important; 2303 text-underline-offset: 3px; 2304} 2305.ftd__link:focus{ 2306 outline: none !important; 2307 box-shadow: 0 0 0 4px rgba(223,88,88,0.10) !important; 2308 border-radius: 10px; 2309} 2310.ftd__link:visited{ color: rgba(18,18,18,0.62) !important; } 2311 2312/* ===== Mobile accordion only ===== */ 2313.ftd__acc{ display:none; } 2314@media (max-width: 767.98px){ 2315 .ftd__acc{ display:block; margin-top: 12px; } /* Mobile only */ 2316} 2317 2318.ftdAcc{ 2319 border: 1px solid rgba(0,0,0,0.06); 2320 border-radius: 14px; 2321 background: rgba(255,255,255,0.70); 2322 padding: 10px 12px; 2323} 2324.ftdAcc + .ftdAcc{ margin-top: 10px; } 2325 2326.ftdAcc summary{ 2327 cursor:pointer; 2328 list-style:none; 2329 display:flex; 2330 align-items:center; 2331 justify-content:space-between; 2332 gap: 10px; 2333 2334 font-weight: 650; 2335 letter-spacing: .55px; 2336 text-transform: uppercase; 2337 font-size: 11px; 2338 color: rgba(18,18,18,0.84); 2339 2340 padding: 4px 2px; 2341} 2342.ftdAcc summary::-webkit-details-marker{ display:none; } 2343 2344/* ===== Modern SVG chevron ===== */ 2345.ftdAcc__chev{ 2346 display:inline-flex; 2347 align-items:center; 2348 justify-content:center; 2349 2350 width: 38px; 2351 height: 38px; 2352 2353 border-radius: 10px; 2354 2355 transition: transform var(--ftd-t) ease, 2356 background var(--ftd-t) ease; 2357} 2358 2359.ftdAcc__chev svg{ 2360 width: 18px; /* Larger icon size */ 2361 height: 18px; 2362 stroke: rgba(0,0,0,0.65); 2363 stroke-width: 2.5; 2364 fill: none; 2365 stroke-linecap: round; 2366 stroke-linejoin: round; 2367} 2368 2369.ftdAcc[open] .ftdAcc__chev{ 2370 transform: rotate(180deg); 2371} 2372 2373.ftdAcc summary:hover .ftdAcc__chev{ 2374 background: rgba(0,0,0,0.05); 2375} 2376 2377.ftdAcc__body{ 2378 padding-top: 10px; 2379 border-top: 1px solid rgba(0,0,0,0.06); 2380 margin-top: 10px; 2381} 2382 2383/* ===== Bottom section ===== */ 2384.ftd__bottom{ 2385 margin-top: 14px; 2386 padding-top: 12px; 2387 border-top: 1px solid rgba(0,0,0,0.06); 2388} 2389 2390/* Follow section row */ 2391.ftd__social{ 2392 display:flex; 2393 align-items:center; 2394 justify-content:space-between; 2395 gap: 14px; 2396} 2397@media (max-width: 767.98px){ 2398 .ftd__social{ 2399 flex-direction:column; 2400 align-items:flex-start; 2401 } 2402} 2403 2404.ftd__follow{ 2405 font-weight: 800; 2406 letter-spacing: .15px; 2407 color: rgba(18,18,18,0.86); 2408} 2409 2410/* Social link chips with subtle borders */ 2411.ftd__socialRow{ 2412 display:flex; 2413 gap: 10px; 2414 flex-wrap: wrap; 2415} 2416 2417.ftd__iconLink{ 2418 height: 44px; 2419 min-width: 44px; 2420 padding: 0 12px; 2421 border-radius: 12px; 2422 2423 border: 1px solid rgba(0,0,0,0.045); /* Lower contrast border */ 2424 background: rgba(255,255,255,0.80); 2425 2426 color: #111 !important; 2427 text-decoration:none !important; 2428 2429 display:inline-flex; 2430 align-items:center; 2431 justify-content:center; 2432 gap: 10px; 2433 2434 transition: transform var(--ftd-t) ease, 2435 background var(--ftd-t) ease, 2436 border-color var(--ftd-t) ease, 2437 box-shadow var(--ftd-t) ease; 2438} 2439.ftd__iconLink i{ font-size: 16px; opacity: .92; } 2440.ftd__iconLabel{ 2441 font-size: 13px; 2442 font-weight: 780; 2443 color: rgba(18,18,18,0.70); 2444 text-decoration: underline; 2445 text-decoration-color: rgba(223,88,88,0.0); 2446 text-underline-offset: 3px; 2447 transition: color var(--ftd-t) ease, text-decoration-color var(--ftd-t) ease; 2448} 2449.ftd__iconLink:hover{ 2450 transform: translateY(-1px); 2451 background: rgba(255,255,255,0.95); 2452 border-color: rgba(0,0,0,0.07); 2453 box-shadow: 0 10px 20px rgba(0,0,0,0.05); 2454} 2455.ftd__iconLink:hover .ftd__iconLabel{ 2456 color: var(--ftd-secondary); 2457 text-decoration-color: rgba(223,88,88,0.26); 2458} 2459.ftd__iconLink:focus{
2460 outline:none !important; 2461 box-shadow: 0 0 0 4px rgba(223,88,88,0.10) !important; 2462} 2463 2464/* Copyright text */ 2465.ftd__copy{ 2466 margin: 10px 0 0; 2467 font-size: 13px; 2468 color: rgba(18,18,18,0.70); 2469 font-weight: 650; 2470} 2471</style> 2472 2473 2474<footer class="ftd" id="ftdFooter" aria-label="Site footer"> 2475 <div class="ftd__shell"> 2476 <div class="ftd__card"> 2477 2478 <div class="ftd__top"> 2479 2480 2481 <div class="ftd__brand"> 2482 <a class="ftd__logoLink" href="https://www.citypng.com" aria-label="CityPNG Home"> 2483 <img 2484 class="ftd__logo" 2485 src="https://imagedelivery.net/5MYSbk45M80qAwecrlKzdQ/1df3913a-3012-43f5-e509-c60d81362700/thumbnail" 2486 alt="CityPNG"> 2487 </a> 2488 2489 <p class="ftd__tagline"> 2490 High-quality transparent PNGs â fast, clean, and free. 2491 </p> 2492 2493 <p class="ftd__care"> 2494 Made with care 2495 <span class="ftd__heart" aria-hidden="true"> 2496 <svg viewBox="0 0 24 24" focusable="false" aria-hidden="true"> 2497 <path d="M12.1 21.35l-1.1-1.02C5.14 14.99 2 12.14 2 8.5 2 6 4 4 6.5 4c1.74 0 3.41.81 4.5 2.09C12.09 4.81 13.76 4 15.5 4 18 4 20 6 20 8.5c0 3.64-3.14 6.49-8.9 11.83l-1 1.02z"/> 2498 </svg> 2499 </span> 2500 for designers worldwide. 2501</p> 2502 </div> 2503 2504 2505 <div class="ftd__colsDesktop" aria-label="Footer links"> 2506 <div class="ftd__cols"> 2507 2508 <div class="ftd__col" id="ftdColProduct"> 2509 <div class="ftd__colTitle">Product</div> 2510 <ul class="ftd__list"> 2511 <li><a class="ftd__link" href="https://www.citypng.com/latest">Latest</a></li> 2512 <li><a class="ftd__link" href="https://www.citypng.com/categories">Categories</a></li> 2513 <li><a class="ftd__link" href="https://www.citypng.com/png-to-jpg">PNG to JPG</a></li> 2514 </ul> 2515 </div> 2516 2517 <div class="ftd__col" id="ftdColCompany"> 2518 <div class="ftd__colTitle">Company</div> 2519 <ul class="ftd__list"> 2520 <li><a class="ftd__link" href="https://www.citypng.com/page/about-us">About</a></li> 2521 <li><a class="ftd__link" href="https://www.citypng.com/contact">Contact</a></li> 2522 </ul> 2523 </div> 2524 2525 <div class="ftd__col" id="ftdColLegal"> 2526 <div class="ftd__colTitle">Legal</div> 2527 <ul class="ftd__list"> 2528 <li><a class="ftd__link" href="https://www.citypng.com/page/terms-of-service">Terms</a></li> 2529 <li><a class="ftd__link" href="https://www.citypng.com/page/privacy-policy">Privacy</a></li> 2530 <li><a class="ftd__link" href="https://www.citypng.com/page/dmca">DMCA</a></li> 2531 </ul> 2532 </div> 2533 2534 </div> 2535 </div> 2536 2537 </div> 2538 2539 2540 <div class="ftd__acc" id="ftdAccordions"> 2541 <details class="ftdAcc" open> 2542 <summary><span>Product</span><span class="ftdAcc__chev" aria-hidden="true"> 2543 <svg viewBox="0 0 24 24"> 2544 <path d="M6 9l6 6 6-6"/> 2545 </svg> 2546</span></summary> 2547 <div class="ftdAcc__body"> 2548 <ul class="ftd__list"> 2549 <li><a class="ftd__link" href="https://www.citypng.com/latest">Latest</a></li> 2550 <li><a class="ftd__link" href="https://www.citypng.com/categories">Categories</a></li> 2551 <li><a class="ftd__link" href="https://www.citypng.com/latest">Trending</a></li> 2552 <li><a class="ftd__link" href="https://www.citypng.com/png-to-jpg">PNG to JPG</a></li> 2553 </ul> 2554 </div> 2555 </details> 2556 2557 <details class="ftdAcc"> 2558 <summary><span>Company</span><span class="ftdAcc__chev" aria-hidden="true"> 2559 <svg viewBox="0 0 24 24"> 2560 <path d="M6 9l6 6 6-6"/> 2561 </svg> 2562</span></summary> 2563 <div class="ftdAcc__body"> 2564 <ul class="ftd__list"> 2565 <li><a class="ftd__link" href="https://www.citypng.com/page/about-us">About</a></li> 2566 <li><a class="ftd__link" href="https://www.citypng.com/contact">Contact</a></li> 2567 <li><a class="ftd__link" href="https://www.citypng.com/support">Support</a></li> 2568 </ul> 2569 </div> 2570 </details> 2571 2572 <details class="ftdAcc"> 2573 <summary><span>Legal</span><span class="ftdAcc__chev" aria-hidden="true"> 2574 <svg viewBox="0 0 24 24"> 2575 <path d="M6 9l6 6 6-6"/> 2576 </svg> 2577</span></summary> 2578 <div class="ftdAcc__body"> 2579 <ul class="ftd__list"> 2580 <li><a class="ftd__link" href="https://www.citypng.com/page/terms-of-service">Terms</a></li> 2581 <li><a class="ftd__link" href="https://www.citypng.com/page/privacy-policy">Privacy</a></li> 2582 <li><a class="ftd__link" href="https://www.citypng.com/page/dmca">DMCA</a></li> 2583 </ul> 2584 </div> 2585 </details> 2586 </div> 2587 2588 2589 <div class="ftd__bottom" id="ftdBottom"> 2590 <div class="ftd__social" id="ftdSocial"> 2591 <div class="ftd__follow"><span>Follow Us</span></div> 2592 2593 <div class="ftd__socialRow" role="list"> 2594 <a class="ftd__iconLink" role="listitem" target="_blank" rel="noopener" 2595 href="https://www.facebook.com/City-PNG-100368688224730/" aria-label="CityPNG on Facebook"> 2596 <i class="fa-brands fa-facebook-f" aria-hidden="true"></i>
2597 <span class="ftd__iconLabel">Facebook</span> 2598 </a> 2599 2600 <a class="ftd__iconLink" role="listitem" target="_blank" rel="noopener" 2601 href="https://www.pinterest.com/citypng/" aria-label="CityPNG on Pinterest"> 2602 <i class="fa-brands fa-pinterest" aria-hidden="true"></i> 2603 <span class="ftd__iconLabel">Pinterest</span> 2604 </a> 2605 2606 <a class="ftd__iconLink" role="listitem" target="_blank" rel="noopener" 2607 href="https://www.instagram.com/citypng.web/" aria-label="CityPNG on Instagram"> 2608 <i class="fa-brands fa-instagram" aria-hidden="true"></i> 2609 <span class="ftd__iconLabel">Instagram</span> 2610 </a> 2611 </div> 2612 </div> 2613 2614 <p class="ftd__copy">© 2026 CityPNG. All rights reserved.</p> 2615 </div> 2616 2617 </div> 2618 </div> 2619</footer> 2620 <!-- Bootstrap JavaScript Library --> 2621
2621<script src="https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js"></script>
2621 2622 2623
2623<script src="https://city-png.b-cdn.net/new-design/bootstrap/Javascript/bootstrap.bundle.min.js"></script>
2623 2624 2625
2625<script src="https://city-png.b-cdn.net/cookies.min.js"></script>
2625 2626
2626<script> 2627 2628 $(function() { 2629 const accepted = window.localStorage.getItem('cookie_accepted') 2630 if(!accepted) { 2631 $('#cookie-law-info-bar').show() 2632 } 2633 $('.accept_cookies').on('click', function () { 2634 window.localStorage.setItem('cookie_accepted', 1) 2635 $('#cookie-law-info-bar').hide(); 2636 $('#float_box').animate({ 2637 bottom: "10px" 2638 }, 1500); 2639 }) 2640 }) 2641 2642 document.querySelector('.schBarInp').addEventListener('keypress', function(e) { 2643 var regex = new RegExp("^[a-zA-Z0-9 ]+$"); 2644 var str = String.fromCharCode(!e.charCode ? e.which : e.charCode); 2645 if (regex.test(str)) { 2646 return true; 2647 } 2648 2649 e.preventDefault(); 2650 return false; 2651 }); 2652 2653 document.querySelector('input[name="q"]').addEventListener('keyup', (e) => { 2654 if (e.keyCode === 13) { 2655 document.querySelector('form[role="search"]').submit(); 2656 } 2657 }); 2658 2659 function toggleLike(id) { 2660 try { 2661 event.preventDefault(); 2662 var token = $('meta[name="csrf-token"]').attr('content') 2663 $.post('/ajax/like', { 2664 id: id, 2665 '_token': token 2666 }).then(() => { 2667 $(`#heart_icon_${id}`).toggleClass("heart-icon-red"); 2668 }) 2669 } catch (error) { 2670 console.log(error); 2671 } 2672 } 2673 2674 $(".search-toggler").click(function(){ 2675 $(".header-search-main").slideToggle(300); 2676 }); 2677 2678 </script>
2678 2679 2680 2681
2681<script> 2682 Cookies.set('cookieBanner'); 2683 2684 $(document).ready(function() { 2685 if (Cookies('cookiePolicySite')); 2686 else { 2687 $('.showBanner').fadeIn(); 2688 $("#close-banner").click(function() { 2689 $(".showBanner").slideUp(50); 2690 Cookies('cookiePolicySite', true); 2691 }); 2692 } 2693 }); 2694 </script>
2694 2695
2696<script type="text/javascript" async src="//c.pubguru.net/pg.citypng.js"></script>
2696 2697 2698 2699<style> 2700/* Start V2 */ 2701/* Close X button (top-right) */ 2702.cpx-floatbox__x{ 2703 position: absolute; 2704 top: 10px; 2705 right: 10px; 2706 width: 34px; 2707 height: 34px; 2708 border-radius: 10px; 2709 border: 0; 2710 background: rgba(0,0,0,.04); 2711 cursor: pointer; 2712 display: inline-flex; 2713 align-items: center; 2714 justify-content: center; 2715 transition: background .15s ease, transform .15s ease, opacity .15s ease; 2716} 2717 2718.cpx-floatbox__x:hover{ 2719 background: rgba(0,0,0,.08); 2720 transform: translateY(-1px); 2721} 2722 2723.cpx-floatbox__x:active{ transform: translateY(0px); } 2724 2725.cpx-floatbox__x svg{ 2726 width: 16px; 2727 height: 16px; 2728 opacity: .7; 2729} 2730 2731/* Smooth hide animation */ 2732.cpx-floatbox.is-hiding{ 2733 opacity: 0; 2734 transform: translateY(12px); 2735 transition: opacity .22s ease, transform .22s ease; 2736} 2737 2738.cpx-floatbox{ 2739 transition: opacity .22s ease, transform .22s ease; 2740} 2741 2742/* End V2 */ 2743 .cpx-floatbox{ 2744 position: fixed; 2745 right: 20px; 2746 bottom: 20px; 2747 width: 240px; 2748 z-index: 9999; 2749 display: none; 2750 font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; 2751 } 2752 2753 .cpx-floatbox__inner{ 2754 position: relative; 2755 background: #fff; 2756 border-radius: 18px; 2757 box-shadow: 0 12px 30px rgba(0,0,0,.18); 2758 border: 1px solid rgba(0,0,0,.06); 2759 2760 /* Leave space for the icon that extends above the card */ 2761 padding: 52px 16px 16px; 2762 } 2763 2764 /* Icon positioned above the card with no background */ 2765 .cpx-floatbox__icon{ 2766 position: absolute; 2767 top: -55px; 2768 left: 50%; 2769 transform: translateX(-50%); 2770 background: transparent; 2771 padding: 0; 2772 border: 0; 2773 box-shadow: none; 2774 pointer-events: none; /* Decorative icon only */ 2775 } 2776 2777 .cpx-floatbox__icon img{ 2778 display: block; 2779 width: 100px; 2780 height: auto; 2781 } 2782 2783 .cpx-floatbox__title{ 2784 font-weight: 800; 2785 font-size: 18px; 2786 margin-bottom: 6px; 2787 text-align: center; 2788 color: #111; 2789 } 2790 2791 .cpx-floatbox__desc{ 2792 font-size: 14px; 2793 opacity: .75; 2794 line-height: 1.4; 2795 text-align: center; 2796 margin-bottom: 6px; 2797 } 2798 2799 .cpx-floatbox__actions{ 2800 margin-top: 16px; 2801 display: flex; 2802 flex-direction: column; 2803 gap: 12px; 2804 } 2805 2806 .cpx-floatbox__btn{ 2807 display: inline-flex; 2808 justify-content: center; 2809 align-items: center; 2810 height: 48px; 2811 border-radius: 14px; 2812 text-decoration: none; 2813 font-weight: 800; 2814 font-size: 16px; 2815 background: #df5858; 2816 color: #fff; 2817 transition: transform .15s ease, box-shadow .15s ease, opacity .15s ease; 2818 } 2819 2820 .cpx-floatbox__btn:hover{ 2821 opacity: .95; 2822 transform: translateY(-1px); 2823 box-shadow: 0 6px 16px rgba(223,88,88,.35); 2824 color:#FFF; 2825 } 2826 2827 .cpx-floatbox__link{ 2828 background: transparent; 2829 border: 0; 2830 padding: 6px 0; 2831 cursor: pointer; 2832 font-size: 16px; 2833 opacity: .45; 2834 text-decoration:underline; 2835 } 2836 2837 .cpx-floatbox__link:hover{ opacity: .9; } 2838 2839 @media (max-width: 1023px){ 2840 .cpx-floatbox{ display: none !important; } 2841 } 2842</style> 2843 2844<!-- CPX Float Box (DEV only: privacy-policy) --> 2845<div id="cpx-floatbox" class="cpx-floatbox" aria-hidden="true"> 2846 <div class="cpx-floatbox__inner"> 2847 2848 <button id="cpx-floatbox-x" class="cpx-floatbox__x" type="button" aria-label="Close"> 2849 <svg viewBox="0 0 24 24" fill="none" aria-hidden="true"> 2850 <path d="M6 6l12 12M18 6L6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/> 2851 </svg> 2852</button> 2853 2854 2855 <div class="cpx-floatbox__icon"> 2856 <img 2857 src="https://www.citypng.com/public/png-jpg-converter-icon.png" 2858 alt="PNG to JPG Converter" 2859 loading="lazy" 2860 > 2861 </div> 2862 2863 <div class="cpx-floatbox__text"> 2864 <div class="cpx-floatbox__title">Need JPG version?</div> 2865 <div class="cpx-floatbox__desc">Convert PNG â JPG in seconds</div> 2866 </div> 2867 2868 <div class="cpx-floatbox__actions"> 2869 <a 2870 id="cpx-floatbox-cta" 2871 class="cpx-floatbox__btn" 2872 href="https://www.citypng.com/png-to-jpg" 2873 rel="nofollow" 2874 > 2875 Convert PNG â JPG 2876 </a> 2877 2878 <button id="cpx-floatbox-close" class="cpx-floatbox__link" type="button"> 2879 Maybe later 2880 </button> 2881 </div> 2882 2883 </div> 2884</div> 2885 2886 2887
2888<script> 2889(function () { 2890 // ---------------------------- 2891 // Safe GA4 helper 2892 // ---------------------------- 2893 function trackGA(eventName, params) { 2894 try { 2895 if (typeof gtag === 'function') { 2896 params = params || {}; 2897 params.debug_mode = false; 2898 gtag('event', eventName, params); 2899 } 2900 } catch (e) {} 2901 } 2902 2903 // DEV: show only on privacy-policy page 2904 var DEV_ONLY_PRIVACY_PAGE = false; // Keep false in production 2905 var TARGET_PATH = "/page/privacy-policy"; 2906 2907 var DESKTOP_MIN_WIDTH = 1024; 2908 var SHOW_AFTER_SECONDS = 6; 2909 var SHOW_AFTER_SCROLL_RATIO = 0.40; 2910 2911 // Storage keys and durations 2912 var STORAGE_KEY = "cpx_floatbox_hide_until"; // 7 days (Maybe later) 2913 var CONVERTED_KEY = "cpx_floatbox_converted"; // forever (Convert click) 2914 var SESSION_CLOSE_KEY = "cpx_floatbox_closed_session"; // X close = per session 2915 var HIDE_DAYS = 7; 2916 2917 function cookieBarVisible() { 2918 var bar = document.getElementById("cookie-law-info-bar"); 2919 if (!bar) return false; 2920 return bar.offsetParent !== null && getComputedStyle(bar).display !== "none"; 2921 } 2922 2923 function isDesktop() { return window.innerWidth >= DESKTOP_MIN_WIDTH; } 2924 2925 function isAllowedPage() { 2926 if (!DEV_ONLY_PRIVACY_PAGE) return true; 2927 return window.location.pathname === TARGET_PATH; 2928 } 2929 2930 function nowMs() { return Date.now(); } 2931 2932 function getHideUntil() { 2933 try { 2934 var v = localStorage.getItem(STORAGE_KEY); 2935 if (!v) return 0; 2936 var n = parseInt(v, 10); 2937 return Number.isFinite(n) ? n : 0; 2938 } catch(e) { return 0; } 2939 } 2940 2941 function setHideForDays(days) { 2942 try { 2943 localStorage.setItem(STORAGE_KEY, String(nowMs() + days*24*60*60*1000)); 2944 } catch(e) {} 2945 } 2946 2947 function hasConverted() { 2948 try { 2949 return localStorage.getItem(CONVERTED_KEY) === "1"; 2950 } catch(e) { return false; } 2951 } 2952 2953 function setConvertedForever() { 2954 try { 2955 localStorage.setItem(CONVERTED_KEY, "1"); 2956 } catch(e) {} 2957 } 2958 2959 function hasClosedThisSession() { 2960 try { return sessionStorage.getItem(SESSION_CLOSE_KEY) === "1"; } 2961 catch(e) { return false; } 2962 } 2963 2964 function setClosedThisSession() { 2965 try { sessionStorage.setItem(SESSION_CLOSE_KEY, "1"); } 2966 catch(e) {} 2967 } 2968 2969 function scrollRatio() { 2970 var doc = document.documentElement; 2971 var scrollTop = window.pageYOffset || doc.scrollTop || 0; 2972 var scrollHeight = doc.scrollHeight || 0; 2973 var clientHeight = doc.clientHeight || 0; 2974 var maxScroll = Math.max(scrollHeight - clientHeight, 1); 2975 return scrollTop / maxScroll; 2976 } 2977 2978 var box = document.getElementById("cpx-floatbox"); 2979 if (!box) return; 2980 2981 // Guard conditions 2982 if (!isAllowedPage()) return; 2983 if (!isDesktop()) return; 2984 if (hasConverted()) return; // Convert action => never show again 2985 if (getHideUntil() > nowMs()) return; // Maybe later => hide for 7 days 2986 if (hasClosedThisSession()) return; // X close => current session only 2987 2988 var shown = false; 2989 2990 function applyBottomOffset() { 2991 box.style.bottom = cookieBarVisible() ? "90px" : "20px"; 2992 } 2993 2994 function hideBoxNice() { 2995 box.classList.add("is-hiding"); 2996 setTimeout(function(){ 2997 box.style.display = "none"; 2998 box.setAttribute("aria-hidden", "true"); 2999 box.classList.remove("is-hiding"); 3000 }, 230); 3001 } 3002 3003 function showBox() { 3004 if (shown) return; 3005 if (!isDesktop()) return; 3006 if (hasConverted()) return; 3007 if (getHideUntil() > nowMs()) return; 3008 if (hasClosedThisSession()) return; 3009 3010 shown = true; 3011 applyBottomOffset(); 3012 box.style.display = "block"; 3013 box.setAttribute("aria-hidden", "false"); 3014 3015 trackGA('floatbox_impression', { 3016 placement: 'bottom_right', 3017 page: window.location.pathname, 3018 tool: 'png_to_jpg' 3019 }); 3020 3021 window.removeEventListener("scroll", onScroll, { passive: true }); 3022 window.removeEventListener("resize", onResize); 3023 } 3024 3025 function onScroll() { 3026 if (scrollRatio() >= SHOW_AFTER_SCROLL_RATIO) showBox(); 3027 } 3028 3029 function onResize() { 3030 if (!isDesktop()) { 3031 box.style.display = "none"; 3032 box.setAttribute("aria-hidden", "true"); 3033 } else if (shown) { 3034 applyBottomOffset(); 3035 } 3036 } 3037 3038 // Maybe later: hide for 7 days 3039 var closeBtn = document.getElementById("cpx-floatbox-close"); 3040 if (closeBtn) { 3041 closeBtn.addEventListener("click", function () { 3042 trackGA('floatbox_dismiss', { 3043 placement: 'bottom_right', 3044 page: window.location.pathname, 3045 hide_days: HIDE_DAYS 3046 }); 3047 3048 setHideForDays(HIDE_DAYS); 3049 hideBoxNice(); 3050 }); 3051 } 3052 3053 // X close: hide for the current session only 3054 var xBtn = document.getElementById("cpx-floatbox-x"); 3055 if (xBtn) { 3056 xBtn.addEventListener("click", function () { 3057 trackGA('floatbox_close_click', { 3058 placement: 'bottom_right', 3059 page: window.location.pathname, 3060 scope: 'session' 3061 }); 3062 3063 setClosedThisSession(); 3064 hideBoxNice(); 3065 }); 3066 } 3067 3068 // CTA click: mark as converted and hide permanently 3069 var ctaBtn = document.getElementById("cpx-floatbox-cta"); 3070 if (ctaBtn) { 3071 ctaBtn.addEventListener("click", function () { 3072 trackGA('floatbox_cta_click', { 3073 placement: 'bottom_right', 3074 page: window.location.pathname, 3075 destination: 'png_to_jpg' 3076 }); 3077 3078 setConvertedForever(); 3079 hideBoxNice(); 3080 }); 3081 } 3082 3083 window.addEventListener("scroll", onScroll, { passive: true }); 3084 window.addEventListener("resize", onResize); 3085 3086 setTimeout(showBox, SHOW_AFTER_SECONDS * 1000); 3087 3088 document.addEventListener("click", function(e){ 3089 if (e.target && e.target.classList && e.target.classList.contains("accept_cookies")) { 3090 setTimeout(function(){ 3091 if (shown) applyBottomOffset(); 3092 }, 200); 3093 } 3094 }); 3095 3096})(); 3097</script>
3097 3098
3099<script> 3100(function(){ 3101 function showToast(opts){ 3102 opts = opts || {}; 3103 var title = opts.title || 'Done'; 3104 var text = opts.text || ''; 3105 var ms = Number(opts.ms || 8000); 3106 3107 var root = document.getElementById('pwDlToastRoot'); 3108 if(!root) return; 3109 3110 root.innerHTML = ''; 3111 3112 var toast = document.createElement('div'); 3113 toast.className = 'pwDlToast'; 3114 toast.setAttribute('role', 'status'); 3115 3116 toast.innerHTML = 3117 '<div class="pwDlToastIcon" aria-hidden="true">â</div>' + 3118 '<div style="flex:1;min-width:0;">' + 3119 ' <p class="pwDlToastTitle"></p>' + 3120 (text ? ' <p class="pwDlToastText"></p>' : '') + 3121 '</div>' + 3122 '<button type="button" class="pwDlToastClose" aria-label="Close">â</button>'; 3123 3124 root.appendChild(toast); 3125 3126 toast.querySelector('.pwDlToastTitle').textContent = title; 3127 if(text){ 3128 toast.querySelector('.pwDlToastText').textContent = text; 3129 } 3130 3131 requestAnimationFrame(function(){ toast.classList.add('show'); }); 3132 3133 var closeBtn = toast.querySelector('.pwDlToastClose'); 3134 var t1, t2; 3135 3136 function dismiss(){ 3137 toast.classList.remove('show'); 3138 clearTimeout(t1); clearTimeout(t2); 3139 t2 = setTimeout(function(){ 3140 if (toast && toast.parentNode) toast.parentNode.removeChild(toast); 3141 }, 220); 3142 } 3143 3144 if(closeBtn) closeBtn.addEventListener('click', dismiss); 3145 t1 = setTimeout(dismiss, ms); 3146 3147 return { dismiss: dismiss }; 3148 } 3149 3150 window.CityPNGToast = { show: showToast }; 3151 3152 // Server-driven toast (reset password success) 3153 })(); 3154</script>
3154 3155 3156 3157 3158 3159 3160</body> 3161 3162</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.