*{margin:0;padding:0;box-sizing:border-box}:root{--color-white:#ffffff;--color-gray-50:#f9fafb;--color-gray-100:#f3f4f6;--color-gray-200:#e5e7eb;--color-gray-300:#d1d5db;--color-gray-400:#9ca3af;--color-gray-500:#6b7280;--color-gray-600:#4b5563;--color-gray-700:#374151;--color-gray-800:#1f2937;--color-gray-900:#111827;--color-indigo-400:#818cf8;--color-indigo-500:#6366f1;--color-indigo-600:#4f46e5;--color-indigo-700:#4338ca;--color-purple-600:#9333ea;--color-purple-700:#7e22ce;--color-purple-800:#6b21a8;--color-red-400:#f87171;--color-red-500:#ef4444;--color-yellow-400:#facc15;--color-yellow-500:#eab308;--color-blue-400:#60a5fa;--color-blue-500:#3b82f6;--color-green-400:#4ade80;--color-green-500:#22c55e;--color-green-600:#16a34a;--text:var(--color-gray-900);--text-secondary:var(--color-gray-500);--input-bg:var(--color-white);--border:var(--color-gray-200);--card-bg:var(--color-gray-50);--primary:var(--color-indigo-600);--info-bg:rgba(99, 102, 241, 0.08);--focus-ring:#7aa7ff;--bp-sm:640px;--bp-md:768px;--bp-lg:1024px;--bp-xl:1280px;--bp-2xl:1536px}body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Roboto','Oxygen','Ubuntu','Cantarell','Fira Sans','Droid Sans','Helvetica Neue',sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:var(--color-white);color:var(--color-gray-800);transition:background-color 0.3s,color 0.3s;min-height:100vh;display:flex;flex-direction:column}body.dark{background-color:var(--color-gray-900);color:var(--color-gray-100);--text:var(--color-white);--text-secondary:var(--color-gray-400);--input-bg:var(--color-gray-900);--border:var(--color-gray-700);--card-bg:var(--color-gray-800);--primary:var(--color-indigo-400);--info-bg:rgba(99, 102, 241, 0.15)}.container{width:min(100% - 2rem, 72rem);margin:0 auto;padding:0 0}@media (min-width:1280px){.container{width:min(100% - 2rem, 80rem)}}@media (min-width:1536px){.container{width:min(100% - 2rem, 88rem)}}header{background-color:rgb(255 255 255 / .8);backdrop-filter:blur(12px);position:sticky;top:0;z-index:50;box-shadow:0 1px 3px 0 rgb(0 0 0 / .05)}body.dark header{background-color:rgb(31 41 55 / .5);box-shadow:0 1px 3px 0 rgb(0 0 0 / .2)}.header-content{display:flex;align-items:center;justify-content:space-between;height:4rem}.logo{display:flex;align-items:center;gap:.5rem;text-decoration:none;color:inherit}.logo-text{font-size:1.25rem;font-weight:700;color:var(--color-gray-900)}body.dark .logo-text{color:var(--color-white)}.logo svg{color:var(--color-indigo-500)}.nav-desktop{display:none;align-items:center}.nav-links{display:flex;align-items:baseline;gap:1rem;margin-left:2.5rem}.nav-link{padding:.5rem .75rem;border-radius:.375rem;font-size:.875rem;font-weight:500;text-decoration:none;transition:all 0.3s;color:var(--color-gray-600)}body.dark .nav-link{color:var(--color-gray-300)}.nav-link:hover{background-color:var(--color-gray-100);color:var(--color-gray-900)}@media (min-width:1024px){.nav-desktop{display:flex;align-items:center;justify-content:space-between;gap:1rem;position:relative}.nav-desktop .nav-links{display:flex;align-items:center;gap:1rem}.dropdown-parent{position:relative}.nav-link-parent{display:inline-flex;align-items:center;gap:.25rem}.nav-link-parent:hover{cursor:pointer}.dropdown-menu{position:absolute;top:100%;left:0;min-width:240px;padding:.5rem 0;border-radius:.5rem;background:var(--card-bg,#ffffff);border:1px solid var(--border-color,rgb(0 0 0 / .08));box-shadow:0 10px 25px rgb(0 0 0 / .08);opacity:0;visibility:hidden;transform:translateY(6px);pointer-events:none;transition:opacity .16s ease,transform .16s ease,visibility .16s step-end;z-index:50}.dropdown-parent:hover .dropdown-menu,.dropdown-parent:focus-within .dropdown-menu,.dropdown-parent[aria-expanded="true"] .dropdown-menu{opacity:1;visibility:visible;transform:translateY(0);pointer-events:auto;transition:opacity .16s ease,transform .16s ease,visibility 0s step-start}.dropdown-link{display:block;padding:.6rem 1rem;line-height:1.2;text-decoration:none;color:var(--text-color,inherit);white-space:nowrap}.dropdown-link:hover,.dropdown-link:focus{background:var(--hover-bg,rgb(0 0 0 / .04))}.chevron{flex:0 0 auto;opacity:.8;transition:transform .16s ease}.dropdown-parent:hover .chevron,.dropdown-parent:focus-within .chevron,.dropdown-parent[aria-expanded="true"] .chevron{transform:rotate(180deg)}body.dark .dropdown-menu{background:var(--card-bg-dark,#121212);border-color:var(--border-color-dark,rgb(255 255 255 / .12));box-shadow:0 10px 25px rgb(0 0 0 / .6)}body.dark .dropdown-link:hover,body.dark .dropdown-link:focus{background:var(--hover-bg-dark,rgb(255 255 255 / .06))}}body.dark .nav-link:hover{background-color:var(--color-gray-700);color:var(--color-white)}.nav-link.active{background-color:var(--color-indigo-600);color:var(--color-white)}.theme-toggle-wrapper{margin-left:1.5rem}.mobile-controls{display:flex;align-items:center;gap:.5rem}.theme-toggle,.menu-toggle{padding:.5rem;border-radius:9999px;border:none;background:#fff0;color:var(--color-gray-500);cursor:pointer;transition:all 0.2s}body.dark .theme-toggle,body.dark .menu-toggle{color:var(--color-gray-400)}.theme-toggle:hover,.menu-toggle:hover{background-color:var(--color-gray-100)}body.dark .theme-toggle:hover,body.dark .menu-toggle:hover{background-color:var(--color-gray-700)}.menu-toggle{background-color:var(--color-gray-100)}body.dark .menu-toggle{background-color:var(--color-gray-800)}.mobile-controls .menu-toggle{width:44px;height:44px;aspect-ratio:1 / 1;padding:0;display:grid;place-items:center;border-radius:50%;line-height:1;background-color:var(--color-gray-100);box-shadow:0 1px 2px rgb(0 0 0 / .06) inset}body.dark .mobile-controls .menu-toggle{background-color:var(--color-gray-800)}.mobile-controls .menu-toggle svg{width:22px;height:22px}.mobile-controls .menu-toggle:hover{background-color:var(--color-gray-200)}body.dark .mobile-controls .menu-toggle:hover{background-color:var(--color-gray-700)}.mobile-controls .menu-toggle:focus-visible{outline:2px solid var(--focus-ring,#7aa7ff);outline-offset:2px}.theme-toggle-mobile{width:44px;height:44px;aspect-ratio:1 / 1;padding:0;display:grid;place-items:center;border-radius:50%;border:none;background-color:var(--color-gray-100);color:var(--color-gray-500);cursor:pointer;box-shadow:0 1px 2px rgb(0 0 0 / .06) inset;transition:background-color .2s ease}body.dark .theme-toggle-mobile{background-color:var(--color-gray-800);color:var(--color-gray-400)}.theme-toggle-mobile:hover{background-color:var(--color-gray-200)}body.dark .theme-toggle-mobile:hover{background-color:var(--color-gray-700)}.theme-toggle-mobile svg{width:22px;height:22px}@media (min-width:1024px){.theme-toggle-mobile{display:none}}.mobile-menu{display:none;padding:.5rem}.mobile-menu.active{display:block}.mobile-menu .nav-link{display:block;margin-bottom:.25rem}@media (min-width:1024px){.nav-desktop{display:flex}.mobile-controls .menu-toggle{display:none}.mobile-menu{display:none!important}}main{flex:1;padding:2rem 0}footer{background-color:rgb(249 250 251 / .5);border-top:1px solid rgb(229 231 235 / .5);margin-top:3rem;padding:1.5rem 0;text-align:center;color:var(--color-gray-500)}body.dark footer{background-color:rgb(31 41 55 / .3);border-top-color:rgb(55 65 81 / .5);color:var(--color-gray-400)}.footer-links{display:flex;justify-content:center;gap:1.5rem;margin-bottom:1rem}.footer-links a{color:inherit;text-decoration:none;transition:color 0.3s}.footer-links a:hover{color:var(--color-indigo-500)}body.dark .footer-links a:hover{color:var(--color-indigo-400)}footer p{margin-bottom:.5rem}footer .text-xs{font-size:.75rem;margin-top:.5rem}.page-header{text-align:center;max-width:48rem;margin:0 auto 2rem}.page-title{font-size:2.5rem;font-weight:700;color:var(--color-gray-900);margin-bottom:.5rem}body.dark .page-title{color:var(--color-white)}.page-subtitle{font-size:1.125rem;color:var(--color-gray-500);margin-bottom:2rem}body.dark .page-subtitle{color:var(--color-gray-400)}@media (min-width:768px){.page-title{font-size:3rem}}.card{background-color:rgb(249 250 251 / .5);backdrop-filter:blur(12px);border-radius:.75rem;box-shadow:0 25px 50px -12px rgb(0 0 0 / .05);padding:2rem;border:1px solid rgb(229 231 235 / .5);max-width:48rem;margin:0 auto}body.dark .card{background-color:rgb(31 41 55 / .5);box-shadow:0 25px 50px -12px rgb(0 0 0 / .3);border-color:rgb(55 65 81 / .5)}.input-group{position:relative;display:flex;align-items:center;margin-bottom:1.5rem}.input-field{width:100%;padding:1rem 4rem 1rem 1rem;font-size:1.125rem;background-color:var(--color-white);border:1px solid var(--color-gray-300);border-radius:.5rem;color:var(--color-gray-900);font-family:'Courier New',monospace}body.dark .input-field{background-color:var(--color-gray-900);border-color:var(--color-gray-600);color:var(--color-gray-100)}.input-field:focus{outline:none;border-color:var(--color-indigo-500);box-shadow:0 0 0 3px rgb(99 102 241 / .1)}.input-button{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);padding:.5rem;border-radius:.375rem;border:none;background-color:var(--color-gray-200);color:var(--color-gray-600);cursor:pointer;transition:all 0.2s}body.dark .input-button{background-color:var(--color-gray-700);color:var(--color-gray-300)}.input-button:hover{background-color:var(--color-indigo-600);color:var(--color-white)}.form-group{margin-bottom:1.5rem}.form-label{display:block;color:var(--color-gray-600);margin-bottom:.5rem}body.dark .form-label{color:var(--color-gray-300)}.range-group{display:flex;align-items:center;gap:1rem}.range-input{flex:1;height:.5rem;background:var(--color-gray-200);border-radius:.5rem;outline:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer}body.dark .range-input{background:var(--color-gray-700)}.range-input::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:1rem;height:1rem;background:var(--color-indigo-600);border-radius:50%;cursor:pointer}.range-input::-moz-range-thumb{width:1rem;height:1rem;background:var(--color-indigo-600);border-radius:50%;cursor:pointer;border:none}.range-value{background-color:var(--color-gray-200);color:var(--color-gray-800);font-size:.875rem;font-weight:500;padding:.25rem .75rem;border-radius:.375rem;min-width:4rem;text-align:center}body.dark .range-value{background-color:var(--color-gray-700);color:var(--color-white)}.checkbox-group{display:grid;grid-template-columns:1fr;gap:1rem;margin-bottom:1.5rem}@media (min-width:768px){.checkbox-group{grid-template-columns:1fr 1fr}}.checkbox-label{display:flex;align-items:center;gap:.75rem;cursor:pointer;user-select:none}.checkbox-toggle{position:relative}.checkbox-input{position:absolute;opacity:0;width:0;height:0}.checkbox-slider{display:block;width:2.5rem;height:1.5rem;background-color:var(--color-gray-300);border-radius:9999px;transition:background-color 0.3s}body.dark .checkbox-slider{background-color:var(--color-gray-600)}.checkbox-input:checked+.checkbox-slider{background-color:var(--color-indigo-600)}.checkbox-dot{position:absolute;left:.25rem;top:.25rem;width:1rem;height:1rem;background-color:var(--color-white);border-radius:9999px;transition:transform 0.3s}.checkbox-input:checked~.checkbox-dot{transform:translateX(1rem)}.checkbox-text{color:var(--color-gray-700)}body.dark .checkbox-text{color:var(--color-gray-300)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;font-weight:700;padding:.75rem 1.5rem;border-radius:.5rem;border:none;cursor:pointer;transition:all 0.3s;font-size:1rem;text-decoration:none}.btn-primary{background-color:var(--color-indigo-600);color:var(--color-white)}.btn-primary:hover{background-color:var(--color-indigo-700)}.btn-primary:disabled{background-color:var(--color-indigo-800);cursor:not-allowed;opacity:.6}.btn-purple{background-color:var(--color-purple-600);color:var(--color-white)}.btn-purple:hover{background-color:var(--color-purple-700)}.btn-purple:disabled{background-color:var(--color-purple-800);cursor:not-allowed;opacity:.6}.btn-secondary{background-color:var(--color-gray-200);color:var(--color-gray-600);font-size:.875rem}body.dark .btn-secondary{background-color:var(--color-gray-700);color:var(--color-gray-300)}.btn-secondary:hover{background-color:var(--color-indigo-600);color:var(--color-white)}.btn-group{display:flex;flex-direction:column;gap:1rem;padding-top:1rem}@media (min-width:768px){.btn-group{flex-direction:row}}.btn-full{width:100%}.strength-meter{width:100%;margin-bottom:1.5rem}.strength-bar-bg{background-color:var(--color-gray-200);border-radius:9999px;height:.625rem;width:100%;overflow:hidden}body.dark .strength-bar-bg{background-color:var(--color-gray-700)}.strength-bar{height:100%;border-radius:9999px;transition:all 0.3s ease-in-out}.strength-bar.strength-0{width:0%;background-color:var(--color-red-500)}.strength-bar.strength-1{width:25%;background-color:var(--color-red-500)}.strength-bar.strength-2{width:50%;background-color:var(--color-yellow-500)}.strength-bar.strength-3{width:75%;background-color:var(--color-blue-500)}.strength-bar.strength-4{width:100%;background-color:var(--color-green-500)}.strength-text{text-align:right;font-size:.875rem;margin-top:.25rem;font-weight:500}.strength-text.strength-0{color:var(--color-gray-500)}.strength-text.strength-1{color:var(--color-red-500)}.strength-text.strength-2{color:var(--color-yellow-500)}.strength-text.strength-3{color:var(--color-blue-500)}.strength-text.strength-4{color:var(--color-green-500)}body.dark .strength-text.strength-0{color:var(--color-gray-400)}body.dark .strength-text.strength-1{color:var(--color-red-400)}body.dark .strength-text.strength-2{color:var(--color-yellow-400)}body.dark .strength-text.strength-3{color:var(--color-blue-400)}body.dark .strength-text.strength-4{color:var(--color-green-400)}.bulk-layout{display:grid;grid-template-columns:1fr;gap:2rem;max-width:80rem;margin:0 auto}@media (min-width:768px){.bulk-layout{grid-template-columns:1fr 2fr}}.bulk-options{align-self:start}.section-title{font-size:1.5rem;font-weight:700;margin-bottom:1.5rem;color:var(--color-gray-900)}body.dark .section-title{color:var(--color-white)}.select-field,.number-field,.text-field{width:100%;padding:.5rem;background-color:var(--color-white);border:1px solid var(--color-gray-300);border-radius:.5rem;color:var(--color-gray-800)}body.dark .select-field,body.dark .number-field,body.dark .text-field{background-color:var(--color-gray-900);border-color:var(--color-gray-600);color:var(--color-gray-100)}.select-field:focus,.number-field:focus,.text-field:focus{outline:none;border-color:var(--color-indigo-500);box-shadow:0 0 0 3px rgb(99 102 241 / .1)}.advanced-options{padding-top:1rem;border-top:1px solid var(--color-gray-200);margin-top:1rem;margin-bottom:1.25rem}body.dark .advanced-options{border-top-color:var(--color-gray-700)}.advanced-title{font-size:1.125rem;font-weight:600;color:var(--color-gray-900);margin-bottom:1rem}body.dark .advanced-title{color:var(--color-white)}.advanced-label{display:block;font-size:.75rem;color:var(--color-gray-500);margin-bottom:.25rem}body.dark .advanced-label{color:var(--color-gray-400)}.text-field{font-size:.875rem;font-family:'Courier New',monospace}.password-list-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.button-group{display:flex;align-items:center;gap:.5rem}.password-list-container{background-color:var(--color-white);padding:1rem;border-radius:.5rem;height:24rem;overflow-y:auto;font-family:'Courier New',monospace;color:var(--color-gray-700);border:1px solid var(--color-gray-200)}body.dark .password-list-container{background-color:var(--color-gray-900);color:var(--color-gray-300);border-color:var(--color-gray-700)}.password-item{display:flex;align-items:center;justify-content:space-between;padding:.25rem .5rem;border-radius:.375rem;transition:background-color 0.2s}.password-item:hover{background-color:var(--color-gray-100)}body.dark .password-item:hover{background-color:rgb(55 65 81 / .5)}.password-item button{opacity:0;padding:.375rem;border-radius:.375rem;border:none;background:#fff0;color:var(--color-gray-500);cursor:pointer;transition:all 0.2s}body.dark .password-item button{color:var(--color-gray-400)}.password-item:hover button{opacity:1}.password-item button:hover{background-color:var(--color-indigo-600);color:var(--color-white)}.empty-state{display:flex;align-items:center;justify-content:center;height:24rem;background-color:var(--color-gray-50);border-radius:.5rem;border:2px dashed var(--color-gray-300);color:var(--color-gray-400);padding:1rem 1.25rem;text-align:left}.empty-state p{margin:0;line-height:1.5}body.dark .empty-state{background-color:var(--color-gray-900);border-color:var(--color-gray-700);color:var(--color-gray-500)}.export-menu{position:relative}.export-dropdown{position:absolute;right:0;margin-top:.5rem;width:12rem;background-color:var(--color-white);border:1px solid var(--color-gray-200);border-radius:.375rem;box-shadow:0 10px 15px -3px rgb(0 0 0 / .1);z-index:20;display:none}body.dark .export-dropdown{background-color:var(--color-gray-900);border-color:var(--color-gray-700)}.export-dropdown.active{display:block}.export-dropdown button{display:flex;align-items:center;gap:.5rem;width:100%;text-align:left;padding:.5rem 1rem;font-size:.875rem;color:var(--color-gray-700);background:#fff0;border:none;cursor:pointer;transition:all 0.2s}body.dark .export-dropdown button{color:var(--color-gray-300)}.export-dropdown button:hover{background-color:var(--color-gray-100);color:var(--color-gray-900)}body.dark .export-dropdown button:hover{background-color:var(--color-gray-800);color:var(--color-white)}.time-to-crack{text-align:center;margin-top:1.5rem;border-top:1px solid rgb(229 231 235 / .5);border-bottom:1px solid rgb(229 231 235 / .5);padding:1rem 0}body.dark .time-to-crack{border-top-color:rgb(55 65 81 / .5);border-bottom-color:rgb(55 65 81 / .5)}.time-to-crack h3{font-size:.875rem;color:var(--color-gray-500);text-transform:uppercase;letter-spacing:.05em;font-weight:600}body.dark .time-to-crack h3{color:var(--color-gray-400)}.time-to-crack .time-value{font-size:2rem;font-weight:700;color:var(--color-indigo-500);margin-top:.25rem}body.dark .time-to-crack .time-value{color:var(--color-indigo-400)}@media (min-width:768px){.time-to-crack .time-value{font-size:2.5rem}}.time-to-crack .time-note{font-size:.75rem;color:var(--color-gray-400);margin-top:.25rem}body.dark .time-to-crack .time-note{color:var(--color-gray-500)}.feedback-section{margin-top:1.5rem}.feedback-title{font-size:1.125rem;font-weight:600;color:var(--color-gray-900);margin-bottom:.75rem}body.dark .feedback-title{color:var(--color-white)}.feedback-list{list-style:none}.feedback-item{display:flex;align-items:flex-start;gap:.75rem;margin-bottom:.75rem}.feedback-item.good{color:var(--color-green-600)}body.dark .feedback-item.good{color:var(--color-green-400)}.feedback-item.bad{color:var(--color-gray-700)}body.dark .feedback-item.bad{color:var(--color-gray-300)}.feedback-icon{flex-shrink:0}.legal-container{max-width:64rem;margin:0 auto}.legal-card{background-color:rgb(249 250 251 / .5);backdrop-filter:blur(12px);border-radius:.75rem;box-shadow:0 25px 50px -12px rgb(0 0 0 / .05);padding:3rem;border:1px solid rgb(229 231 235 / .5)}body.dark .legal-card{background-color:rgb(31 41 55 / .5);box-shadow:0 25px 50px -12px rgb(0 0 0 / .3);border-color:rgb(55 65 81 / .5)}.legal-title{font-size:2.25rem;font-weight:700;color:var(--color-gray-900);margin-bottom:2rem;text-align:center}body.dark .legal-title{color:var(--color-white)}@media (min-width:768px){.legal-title{font-size:2.5rem}}.legal-content{color:var(--color-gray-600);line-height:1.75}body.dark .legal-content{color:var(--color-gray-300)}.legal-content h2{font-size:1.5rem;font-weight:600;color:var(--color-gray-800);margin-top:1.5rem;margin-bottom:.75rem}body.dark .legal-content h2{color:var(--color-gray-100)}.legal-content p{margin-bottom:1rem}.legal-content ul{list-style:disc;padding-left:2.5rem;margin-bottom:1rem}.legal-content ul li{margin-bottom:.5rem}.legal-content strong{color:var(--color-gray-800);font-weight:600}body.dark .legal-content strong{color:var(--color-gray-100)}.legal-content a{color:var(--color-indigo-500);text-decoration:none}body.dark .legal-content a{color:var(--color-indigo-400)}.legal-content a:hover{text-decoration:underline}.legal-content .text-sm{font-size:.875rem}@keyframes spin{to{transform:rotate(360deg)}}.spinner{animation:spin 1s linear infinite;margin-right:.75rem;height:1.25rem;width:1.25rem}.hidden{display:none}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.password-list-container{display:grid;gap:.5rem}.password-item{display:grid;grid-template-columns:1fr 40px;align-items:center;column-gap:.75rem;min-width:0}.password-item>span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.password-item button{width:40px;height:40px;padding:0;display:grid;place-items:center;border-width:1px}.password-item button svg{width:20px;height:20px}.password-item button:focus{outline:2px solid var(--focus-ring,#7aa7ff);outline-offset:2px}@media (max-width:480px){.range-group{display:grid;grid-template-columns:1fr auto;row-gap:.5rem;align-items:center}.range-group .form-label{grid-column:1 / -1;margin-bottom:0;white-space:normal!important}.range-input{grid-column:1 / 2;width:100%;min-width:0}.range-value{grid-column:2 / 3;justify-self:end;flex:none}.empty-state{height:auto;min-height:12rem}}.disclosure-btn{width:100%;display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:.6rem;padding:.8rem 1rem;border:1px solid var(--color-gray-200,#e5e7eb);background:var(--color-gray-50,#f9fafb);border-radius:.75rem;cursor:pointer;transition:background .2s ease,border-color .2s ease,box-shadow .2s ease}.disclosure-btn:hover{background:var(--color-gray-100,#f3f4f6);border-color:var(--color-gray-300,#d1d5db)}.disclosure-btn:focus-visible{outline:2px solid var(--focus-ring,#7aa7ff);outline-offset:2px}.disclosure-btn .chevron{display:inline-grid;place-items:center;transition:transform .2s ease}.disclosure-btn[aria-expanded="true"] .chevron{transform:rotate(90deg)}.disclosure-title{font-weight:600;text-align:start}.disclosure-hint{font-size:.85rem;color:var(--color-gray-500,#6b7280)}.disclosure-panel{overflow:hidden;will-change:height;border-left:2px solid var(--color-gray-200,#e5e7eb);margin-left:.5rem;padding-left:.9rem;margin-top:.75rem}body.dark .disclosure-btn{background:var(--color-gray-800);border-color:var(--color-gray-700);color:var(--color-gray-100)}body.dark .disclosure-btn:hover{background:var(--color-gray-700);border-color:var(--color-gray-600)}body.dark .disclosure-hint{color:var(--color-gray-400)}body.dark .disclosure-panel{border-left-color:var(--color-gray-700)}.toast{position:fixed;bottom:1.5rem;right:1.5rem;max-width:min(320px, calc(100% - 2rem));padding:.75rem 1rem;border-radius:.75rem;background:var(--card-bg);color:var(--text);border:1px solid var(--border);box-shadow:0 20px 35px -18px rgb(15 23 42 / .35);font-size:.9rem;line-height:1.4;display:flex;align-items:flex-start;gap:.5rem;opacity:0;pointer-events:none;transform:translateY(10px);transition:opacity 0.2s ease,transform 0.2s ease;z-index:9999}.toast.toast--visible,.toast.show{opacity:1;transform:translateY(0);pointer-events:auto}.toast--info{border-left:3px solid var(--color-blue-500)}.toast--success{border-left:3px solid var(--color-green-500)}.toast--warning{border-left:3px solid var(--color-yellow-500)}.toast--error{border-left:3px solid var(--color-red-500)}.toast button{margin-left:auto}.note-box{margin-top:1.25rem;padding:.75rem 1rem;background:var(--card-bg);border-left:3px solid var(--border);border-radius:.375rem;font-size:.8rem;color:var(--text-secondary);line-height:1.4}.note-box strong{color:var(--text-secondary);font-weight:600}@media (max-width:480px){.disclosure-btn{padding:.7rem .9rem}.disclosure-panel{margin-left:.25rem;padding-left:.7rem}}@media (max-width:540px){.password-list-header{display:grid;grid-template-columns:1fr;row-gap:.75rem;align-items:start}.password-list-header .section-title{margin:0}.password-list-header .button-group{display:grid;grid-template-columns:1fr 1fr;gap:.5rem;width:100%}.password-list-header .btn{width:100%;padding:.625rem .75rem;border-radius:.6rem;display:inline-flex;align-items:center;justify-content:center;gap:.5rem;min-height:44px}.password-list-header .btn svg{width:16px;height:16px;flex:0 0 auto}.export-menu{position:relative}.export-menu .export-dropdown{position:absolute;top:calc(100% + 8px);right:0;min-width:220px;z-index:10}}@media (max-width:360px){.password-list-header .button-group{grid-template-columns:1fr}.export-menu .export-dropdown{left:0;right:0;min-width:0;width:100%}}@media (min-width:1024px){.nav-desktop{display:flex;flex:1;justify-content:flex-end}.nav-links{margin-left:0}.theme-toggle-wrapper{margin-left:0}.header-content{gap:1rem}}body.dark .dropdown-menu{background:var(--color-gray-800);border-color:var(--color-gray-700);box-shadow:0 10px 25px rgb(0 0 0 / .7)}body.dark .dropdown-link{color:var(--color-gray-100)}body.dark .dropdown-link:hover,body.dark .dropdown-link:focus{background:var(--color-gray-700);color:var(--color-white)}.language-switcher{display:inline-block;margin-left:0}.language-select{padding:.5rem 1rem;border:1px solid var(--border-color);border-radius:8px;background:var(--card-bg);color:var(--text-primary);cursor:pointer}[dir="rtl"]{direction:rtl;text-align:right}[dir="rtl"] *{font-family:'Tajawal','Segoe UI',Tahoma,Arial,sans-serif!important}.lang-switch{position:relative;display:inline-flex;align-items:center;gap:.5rem}.lang-menu{position:absolute;top:calc(100% + 8px);right:0;min-width:180px;max-height:60vh;overflow:auto;background:var(--color-white,#fff);color:var(--color-gray-900,#111827);border:1px solid var(--color-gray-200,#e5e7eb);border-radius:10px;box-shadow:0 10px 25px rgb(0 0 0 / .12);padding:6px;z-index:1100}.lang-menu[aria-hidden="true"]{display:none}[dir="rtl"] .lang-menu{right:auto;left:0;transform-origin:top left;text-align:right}.lang-menu{max-width:min(280px, calc(100vw - 16px));overflow-x:hidden}.lang-item{width:100%;display:flex;align-items:center;gap:8px;padding:10px 12px;border:0;background:#fff0;font:inherit;text-align:left;border-radius:8px;cursor:pointer;transition:background-color .15s ease,color .15s ease;margin-bottom:2px}.lang-item:hover,.lang-item:focus,.lang-item.is-active{background:var(--color-gray-100,#f3f4f6)}body.dark .lang-menu{background:var(--color-gray-800,#1f2937);color:var(--color-gray-50,#f9fafb);border-color:var(--color-gray-700,#374151);box-shadow:0 10px 25px rgb(0 0 0 / .35)}body.dark .lang-item:hover,body.dark .lang-item:focus,body.dark .lang-item.is-active{background:var(--color-gray-700,#374151)}body.dark .lang-item{color:var(--color-gray-100)}body.dark .lang-item:hover,body.dark .lang-item:focus,body.dark .lang-item.is-active{color:var(--color-white);background:var(--color-gray-700,#374151)}[dir="rtl"] .password-list-header{direction:rtl;text-align:right}[dir="rtl"] .password-list-header .button-group{flex-direction:row-reverse}[dir="rtl"] .empty-state{direction:rtl;text-align:right;unicode-bidi:plaintext}.password-list-container,.password-item,.password-item>span{direction:ltr!important;text-align:left!important;unicode-bidi:isolate}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}[dir="rtl"] .input-group{position:relative}[dir="rtl"] .input-field{padding:1rem 1rem 1rem 4rem!important}[dir="rtl"] .input-button{left:0.5rem!important;right:auto!important;top:50%;transform:translateY(-50%)}input::placeholder,textarea::placeholder{text-align:start}[dir="rtl"] input::placeholder,[dir="rtl"] textarea::placeholder{text-align:right}select{text-align:start}[dir="rtl"] select{text-align:right}#password.input-field{direction:ltr!important;text-align:left!important;padding:1rem 4rem 1rem 1rem!important}[dir="rtl"] #password.input-field{direction:ltr!important;text-align:left!important;padding:1rem 4rem 1rem 1rem!important}[dir="rtl"] #password+.input-button,#password+.input-button{right:0.5rem!important;left:auto!important;transform:translateY(-50%)}#passwordInput.input-field,#passwordToCheck.input-field{direction:ltr!important;text-align:left!important;padding:1rem 4rem 1rem 1rem!important}#passwordInput+.input-button,[dir="rtl"] #passwordInput+.input-button{right:0.5rem!important;left:auto!important;top:50%;transform:translateY(-50%)}#passwordToCheck+.input-button,[dir="rtl"] #passwordToCheck+.input-button{right:0.5rem!important;left:auto!important;top:50%;transform:translateY(-50%)}[dir="rtl"] .disclosure-btn .chevron{transform:rotate(180deg)}[dir="rtl"] .disclosure-btn[aria-expanded="true"] .chevron{transform:rotate(90deg)}
/* Shared tool-page primitives: FAQ accordion, "Explore Tools" grid, "Related Tools" tiles, and Password Ideas landing pages. */
.faq-list{display:flex;flex-direction:column;gap:.75rem}
.faq-item{border:1px solid var(--border);border-radius:.5rem;overflow:hidden;background:var(--card-bg)}
body.dark .faq-item{background:rgb(31 41 55 / .35)}
.faq-question{padding:1rem 1.25rem;font-weight:600;cursor:pointer;color:var(--text);list-style:none;display:flex;align-items:center;justify-content:space-between;gap:.75rem}
.faq-question::-webkit-details-marker{display:none}
.faq-question::after{content:'+';font-size:1.25rem;font-weight:400;color:var(--text-secondary);transition:transform .2s}
details[open] .faq-question::after{content:'\2212'}
.faq-answer{padding:0 1.25rem 1rem;color:var(--text-secondary);line-height:1.6}
.tool-link{text-decoration:none;color:inherit;transition:transform .2s}
.tool-link:hover{transform:translateY(-2px)}
.tool-link h3{margin:0;font-size:.95rem;color:var(--text)}
.info-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:1.25rem;margin-top:1rem}
.info-item{display:flex;gap:1rem;align-items:flex-start;padding:.25rem 0}
.info-icon{width:48px;height:48px;border-radius:.75rem;display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#fff}
.info-item h3{font-size:1.0625rem;font-weight:600;margin-bottom:.25rem;color:var(--text)}
.info-item p{font-size:.9375rem;color:var(--text-secondary);line-height:1.6}
@media (max-width:768px){.info-grid{grid-template-columns:1fr}}
/* Password-ideas page widgets reuse the same primitives, plus a couple of helpers. */
.pi-intro{line-height:1.75;color:var(--text)}
.pi-intro p{margin-bottom:.85rem}
.pi-intro p:last-child{margin-bottom:0}
.pi-pattern-num{font-size:.95rem;font-weight:700;color:#fff}
.pi-note{margin-top:.75rem;color:var(--text-secondary);font-size:.8rem}
.pi-note a{color:var(--color-indigo-500)}
body.dark .pi-note a{color:var(--color-indigo-400)}
.pi-mini-output{direction:ltr;text-align:left}

.lang-item{text-decoration:none;color:inherit}
.lang-item:hover,.lang-item:focus,.lang-item.is-active{text-decoration:none}
/* Trust banner: privacy-first promise shown above each tool's main card. */
.trust-banner{display:flex;align-items:center;gap:.6rem;max-width:48rem;margin:0 auto 1.25rem;padding:.6rem .9rem;background:rgba(16,185,129,.08);border-left:3px solid #10b981;border-radius:.5rem;font-size:.875rem;line-height:1.4;color:var(--text);flex-wrap:wrap}
body.dark .trust-banner{background:rgba(16,185,129,.12);color:var(--text)}
.trust-banner-icon{display:inline-flex;align-items:center;color:#10b981;flex-shrink:0}
.trust-banner-text{flex:1;min-width:0}
.trust-banner-link{color:#059669;text-decoration:underline;font-weight:500;white-space:nowrap}
body.dark .trust-banner-link{color:#34d399}
[dir="rtl"] .trust-banner{border-left:none;border-right:3px solid #10b981}
@media (max-width:480px){.trust-banner{font-size:.8rem;padding:.5rem .75rem}}
/* Shared passphrase/pronounceable/memorable output panel + stats block (also used by /pronounceable_password_generator). */
.passphrase-display{margin-bottom:1.5rem}
.passphrase-output{background:var(--input-bg);border:2px solid var(--border);border-radius:.5rem;padding:1.5rem;min-height:80px;display:flex;align-items:center;justify-content:center;margin-bottom:1rem;transition:all 0.2s}
.passphrase-text{font-size:1.25rem;font-weight:600;color:var(--text);word-break:break-word;text-align:center;font-family:'Courier New',monospace;direction:ltr}
.button-group{display:flex;gap:.75rem;flex-wrap:wrap}
.button-group .btn{flex:1;min-width:150px}
.options-section{margin-top:2rem;padding-top:2rem;border-top:1px solid var(--border)}
.options-title{font-size:1.125rem;font-weight:600;margin-bottom:1.5rem;color:var(--text)}
.passphrase-stats{margin-top:2rem;padding-top:2rem;border-top:1px solid var(--border)}
.stats-title{font-size:1.125rem;font-weight:600;margin-bottom:1rem;color:var(--text)}
.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:1rem}
.stat-item{background:var(--card-bg);padding:1rem;border-radius:.5rem;border:1px solid var(--border)}
.stat-label{display:block;font-size:.875rem;color:var(--text-secondary);margin-bottom:.25rem}
.stat-value{display:block;font-size:1.125rem;font-weight:600;color:var(--primary)}
@media (max-width:768px){.button-group{flex-direction:column}.button-group .btn{width:100%}.stats-grid{grid-template-columns:1fr}}
/* Strength meter spacing — keep the meter visually separated from the output buttons on every tool that uses it. */
.passphrase-display + .strength-meter,.passphrase-output ~ .strength-meter{margin-top:.75rem;margin-bottom:1.5rem}
/* Full-width range slider helper — pages like /pronounceable_password_generator put a range inside a plain .form-group and need it to span the row. */
.range-input.range-full{width:100%}
/* PIN tile list */
.pin-results{margin-top:1.25rem;display:flex;flex-direction:column;gap:.5rem}
.pin-tile{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;background:var(--input-bg);border:1px solid var(--border);border-radius:.5rem;direction:ltr}
.pin-value{font-family:'Courier New',monospace;font-size:1.5rem;font-weight:700;letter-spacing:.15em;color:var(--text)}
.pin-copy{padding:.4rem .8rem;font-size:.8rem}
/* Homepage #password has TWO stacked .input-button siblings (eye + copy). Stagger them so both
   stay visible side-by-side in LTR and stay anchored on the right (over the LTR-forced password
   text) in RTL — otherwise the second one falls back to [dir="rtl"] .input-button{left:.5rem}
   and covers the password (regression spotted on /ar/). */
#password~.input-button,[dir="rtl"] #password~.input-button{right:.5rem!important;left:auto!important;transform:translateY(-50%)}
#toggleVisibilityBtn,[dir="rtl"] #toggleVisibilityBtn{right:3rem!important;left:auto!important}
#copyBtn,[dir="rtl"] #copyBtn{right:.5rem!important;left:auto!important}
/* Add padding for two buttons (~5.5rem) on the right side, regardless of doc direction. */
#password.input-field,[dir="rtl"] #password.input-field{padding:1rem 5.5rem 1rem 1rem!important}

/* No-FOUC: paint dark before app.js runs by mirroring body.dark variables onto html.dark-pre body. */
html.dark-pre body{background-color:var(--color-gray-900);color:var(--color-gray-100);--text:var(--color-white);--text-secondary:var(--color-gray-400);--input-bg:var(--color-gray-900);--border:var(--color-gray-700);--card-bg:var(--color-gray-800);--primary:var(--color-indigo-400);--info-bg:rgba(99,102,241,0.15)}

/* High-contrast preference — bump border + text contrast in both themes. */
@media (prefers-contrast:more){
  :root{--border:#000;--text-secondary:#000}
  body.dark{--border:#fff;--text-secondary:#fff}
  .btn-primary{outline:2px solid currentColor}
  .input-field{border-width:2px}
}

/* Visible focus rings — keyboard navigation should never lose the ring. */
.btn:focus-visible,
.input-button:focus-visible,
.theme-toggle:focus-visible,
.theme-toggle-mobile:focus-visible,
.menu-toggle:focus-visible,
.disclosure-btn:focus-visible,
.faq-question:focus-visible,
.lang-item:focus-visible,
.dropdown-link:focus-visible,
.nav-link:focus-visible,
.tool-link:focus-visible,
[data-shortcuts-open]:focus-visible,
.shortcuts-close:focus-visible{outline:2px solid var(--focus-ring,#7aa7ff);outline-offset:2px;border-radius:.375rem}

/* Keyboard-shortcuts help overlay. */
.shortcuts-overlay{position:fixed;inset:0;z-index:10000;display:flex;align-items:center;justify-content:center;padding:1rem}
.shortcuts-overlay[hidden]{display:none}
.shortcuts-backdrop{position:absolute;inset:0;background:rgba(0,0,0,0.5)}
.shortcuts-panel{position:relative;background:var(--card-bg,#fff);color:var(--text,#111);border:1px solid var(--border,#e5e7eb);border-radius:.75rem;box-shadow:0 25px 50px -12px rgba(0,0,0,0.4);max-width:28rem;width:100%;padding:1.25rem 1.5rem}
body.dark .shortcuts-panel{background:var(--color-gray-800);color:var(--color-gray-100)}
.shortcuts-header{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:.75rem}
.shortcuts-header h2{font-size:1.125rem;margin:0;font-weight:700}
.shortcuts-close{background:#fff0;border:none;font-size:1.75rem;line-height:1;cursor:pointer;color:inherit;padding:.25rem .5rem;border-radius:.375rem}
.shortcuts-close:hover{background:rgba(0,0,0,0.08)}
body.dark .shortcuts-close:hover{background:rgba(255,255,255,0.08)}
.shortcuts-list{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:.5rem}
.shortcuts-list li{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;border-radius:.5rem;background:rgba(99,102,241,0.06)}
.shortcuts-list kbd{font-family:'Courier New',monospace;font-weight:700;background:var(--color-gray-100,#f3f4f6);border:1px solid var(--color-gray-300,#d1d5db);border-radius:.25rem;padding:.15rem .4rem;font-size:.85rem;min-width:1.75rem;text-align:center}
body.dark .shortcuts-list kbd{background:var(--color-gray-700);border-color:var(--color-gray-600);color:var(--color-white)}

/* Passphrase variations grid — used by /passphrase_generator when the "show variations" toggle is on. */
.passphrase-variations{display:grid;grid-template-columns:1fr;gap:.75rem;margin-bottom:1rem}
@media (min-width:768px){.passphrase-variations{grid-template-columns:repeat(3,1fr)}}
.passphrase-variation{background:var(--input-bg);border:2px solid var(--border);border-radius:.5rem;padding:1rem;display:flex;flex-direction:column;gap:.6rem;min-height:120px}
.passphrase-variation .passphrase-text{font-size:1rem;text-align:left;direction:ltr;word-break:break-word}
.passphrase-variation .variation-actions{display:flex;justify-content:space-between;align-items:center;gap:.5rem}
.passphrase-variation .variation-actions .btn{flex:0 0 auto;padding:.4rem .75rem;font-size:.85rem}
.passphrase-variation .variation-label{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--text-secondary);font-weight:600}

/* Print stylesheet — used primarily by the WiFi QR generator's "Print" button.
   Strips nav, footer, ads, related tools, FAQs; centers the QR card; uses high-contrast B&W. */
@media print{
  header,footer,.nav-desktop,.mobile-menu,.mobile-controls,.theme-toggle-wrapper,
  .related-tools,.trust-banner,.affiliate-card,.menu-toggle,.theme-toggle,
  .theme-toggle-mobile,.lang-switch,.toast,.shortcuts-overlay,
  .btn-group,.note-box,.section-title + .faq-list,
  .qr-info ~ .btn-group,details.faq-item,.use-cases-grid,.steps-grid{display:none!important}
  body{background:#fff!important;color:#000!important}
  body.dark{background:#fff!important;color:#000!important}
  .card{border:1px solid #ccc!important;box-shadow:none!important;break-inside:avoid;background:#fff!important;color:#000!important;page-break-inside:avoid;max-width:100%!important;padding:1rem!important}
  main,.container{padding:0!important;margin:0!important;width:100%!important;max-width:100%!important}
  a{color:#000!important;text-decoration:underline}
  .qr-preview-container,.qr-preview-box{display:block!important;text-align:center!important}
  #qrCanvas{display:block!important;margin:0 auto!important;max-width:3.5in!important;height:auto!important;width:auto!important}
  .qr-info{margin-top:1rem!important;font-size:11pt!important;text-align:center!important}
  .qr-info-item{display:block!important;margin:.25rem 0!important}
  .page-title{font-size:18pt!important;text-align:center!important}
  .page-subtitle{display:none!important}
  /* Hide non-essential cards while printing the WiFi page. */
  .card:not(#qrPreview){display:none!important}
  /* Print warning is inserted by the WiFi page; show it. */
  .print-only{display:block!important}
}
.print-only{display:none}
/* Self-hosted Tajawal (issue #38). WOFF2 binaries live in /fonts/tajawal/ and
   are NOT in git (see fonts/tajawal/README.md for the download + subset
   recipe). Until they are uploaded, the fallback chain
   `'Tajawal','Segoe UI',Tahoma,Arial,sans-serif` renders Arabic glyphs with
   the OS font — degraded but functional. font-display:swap eliminates FOIT. */
@font-face{font-family:'Tajawal';font-style:normal;font-weight:400;font-display:swap;src:url('/fonts/tajawal/tajawal-400.woff2') format('woff2')}
@font-face{font-family:'Tajawal';font-style:normal;font-weight:500;font-display:swap;src:url('/fonts/tajawal/tajawal-500.woff2') format('woff2')}
@font-face{font-family:'Tajawal';font-style:normal;font-weight:700;font-display:swap;src:url('/fonts/tajawal/tajawal-700.woff2') format('woff2')}

/* Local-dev captcha placeholder (contact.php). Production renders the real
   Cloudflare Turnstile widget here instead. */
.captcha-placeholder{display:flex;align-items:center;gap:.6rem;padding:.85rem 1rem;border-radius:.5rem;border:1px dashed var(--color-gray-300);background:var(--color-gray-50);color:var(--color-gray-600);font-size:.9rem;line-height:1.4}
body.dark .captcha-placeholder{border-color:var(--color-gray-700);background:var(--color-gray-800);color:var(--color-gray-400)}
.captcha-placeholder svg{color:var(--color-indigo-500);flex:0 0 auto}

/* ========================================================================
   Affiliate hero card — issue #28.
   Hand-built (no iframes, no third-party banner scripts). Theme-aware via
   CSS custom properties; per-vendor accent color via --pi-aff-accent /
   --pi-aff-accent-2 set inline on the .pi-affiliate root.
   ======================================================================== */
.pi-affiliate{position:relative;margin:1.5rem auto 0;max-width:48rem;border-radius:1rem;overflow:hidden;background:var(--card-bg);border:1px solid var(--border);box-shadow:0 12px 30px -16px rgb(15 23 42 / .25);isolation:isolate}
body.dark .pi-affiliate{box-shadow:0 12px 30px -10px rgb(0 0 0 / .55)}

.pi-affiliate__hero{position:relative;display:flex;gap:1rem;padding:1.5rem 1.25rem 1.25rem;color:#fff;background:linear-gradient(135deg,var(--pi-aff-accent,#4f46e5) 0%,var(--pi-aff-accent-2,#1e3a8a) 100%)}
.pi-affiliate__hero::after{content:"";position:absolute;inset:0;background:radial-gradient(circle at 100% 0%,rgba(255,255,255,.18) 0%,rgba(255,255,255,0) 55%);pointer-events:none}

.pi-affiliate__icon{flex:0 0 56px;width:56px;height:56px;border-radius:14px;background:rgba(255,255,255,.18);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);display:grid;place-items:center;color:#fff;box-shadow:inset 0 0 0 1px rgba(255,255,255,.25)}
.pi-affiliate__icon svg{width:30px;height:30px}

.pi-affiliate__intro{flex:1 1 auto;min-width:0}
.pi-affiliate__eyebrow{font-size:.72rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;margin:0 0 .35rem;color:rgba(255,255,255,.88)}
.pi-affiliate__headline{font-size:1.35rem;font-weight:800;line-height:1.2;margin:0 0 .4rem;color:#fff;letter-spacing:-.01em}
.pi-affiliate__subhead{font-size:.95rem;line-height:1.5;margin:0;color:rgba(255,255,255,.94)}

.pi-affiliate__features{list-style:none;padding:1.1rem 1.25rem 0;margin:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.65rem 1rem}
.pi-affiliate__features li{display:flex;align-items:flex-start;gap:.5rem;font-size:.92rem;line-height:1.4;color:var(--text)}
.pi-affiliate__tick{flex:0 0 18px;margin-top:.1rem;color:var(--pi-aff-accent,var(--primary))}

.pi-affiliate__footer{display:flex;align-items:center;justify-content:space-between;gap:1.25rem;padding:1.25rem;flex-wrap:wrap}

.pi-affiliate__cta{display:inline-flex;align-items:center;gap:.55rem;padding:.85rem 1.5rem;background:linear-gradient(135deg,var(--pi-aff-accent,#4f46e5) 0%,var(--pi-aff-accent-2,#1e3a8a) 100%);color:#fff;border-radius:.65rem;font-weight:700;font-size:.95rem;text-decoration:none;box-shadow:0 8px 20px -8px var(--pi-aff-accent,#4f46e5);transition:transform .15s ease,box-shadow .15s ease,filter .15s ease;white-space:nowrap}
.pi-affiliate__cta:hover{transform:translateY(-1px);box-shadow:0 12px 28px -8px var(--pi-aff-accent,#4f46e5);filter:brightness(1.05)}
.pi-affiliate__cta:focus-visible{outline:2px solid var(--pi-aff-accent,var(--primary));outline-offset:3px}
.pi-affiliate__cta svg{transition:transform .15s ease}
.pi-affiliate__cta:hover svg{transform:translateX(2px)}
[dir="rtl"] .pi-affiliate__cta:hover svg{transform:translateX(-2px)}
[dir="rtl"] .pi-affiliate__cta svg{transform:scaleX(-1)}

.pi-affiliate__disclosure{flex:1 1 200px;margin:0;font-size:.72rem;line-height:1.45;color:var(--text-secondary);text-align:end}

/* Mobile — stack header, single-column features, full-width CTA. */
@media (max-width:560px){
  .pi-affiliate__hero{padding:1.25rem 1rem 1rem;gap:.85rem}
  .pi-affiliate__icon{flex:0 0 48px;width:48px;height:48px;border-radius:12px}
  .pi-affiliate__icon svg{width:26px;height:26px}
  .pi-affiliate__headline{font-size:1.15rem}
  .pi-affiliate__subhead{font-size:.9rem}
  .pi-affiliate__features{grid-template-columns:1fr;padding:1rem 1rem 0;gap:.55rem}
  .pi-affiliate__footer{padding:1rem;gap:.85rem;flex-direction:column;align-items:stretch}
  .pi-affiliate__cta{justify-content:center;width:100%}
  .pi-affiliate__disclosure{flex:1 1 auto;text-align:start}
}
@media (max-width:380px){
  .pi-affiliate__hero{padding:1rem .9rem .9rem}
  .pi-affiliate__headline{font-size:1.05rem}
}

/* ============================================================
   Unified hyperlink color (dark-mode contrast audit, 2026-05-23).

   Before: there was no global `a` rule, so plain inline links
   (e.g. the CC BY 4.0 link on /downloads/password-safety-checklist,
   the "Related Tools" links on the same page, etc.) inherited the
   browser default link color. On dark mode that default purple-blue
   (~#0000EE) sits at ~2:1 contrast against the #111827 background —
   essentially unreadable. Existing rules (.legal-content a, .pi-note a)
   used a slightly different indigo (-500 vs -600) so the same site had
   subtly different blues depending on where the link appeared.

   Fix: define one --link / --link-hover token pair, give plain <a> the
   token, and force the existing namespaced rules to use the same token.
   Nav/UI links (.nav-link, .dropdown-link, .lang-item, .tool-link,
   .btn, .logo, .footer-links a, .trust-banner-link, .pi-affiliate__cta)
   keep their existing overrides — those are intentional UI colors, not
   "body text links".

   Contrast (WCAG AA needs ≥ 4.5:1 for normal text):
     light  #4f46e5 on #ffffff ≈ 5.6:1 ✓
     dark   #818cf8 on #111827 ≈ 5.9:1 ✓  (and ≈ 5.4:1 on #1f2937 cards ✓)
   ============================================================ */
:root{
  --link:var(--color-indigo-600);
  --link-hover:var(--color-indigo-700);
}
body.dark,
html.dark-pre body{
  --link:var(--color-indigo-400);
  --link-hover:#a5b4fc;
}
/* The base `a` color is safe to apply to every anchor: a class selector
   like `.btn-primary` (specificity 0,1,0) outranks the element selector
   `a` (specificity 0,0,1), so UI links keep their own colors.
   `a:hover` (0,1,1) however *outranks* `.btn-primary` (0,1,0), so a
   global hover rule would steal the white text on solid-indigo buttons
   and turn it indigo — text vanishes against the same-color background.
   Restrict hover + focus styling to anchors that have no class, which
   is exactly the set of "body text links" we want to colorize. UI
   anchors (.btn, .nav-link, .tool-link, .lang-item, .dropdown-link,
   .logo, .trust-banner-link, .pi-affiliate__cta, etc.) keep their
   own hover behavior untouched. Container-scoped overrides for
   .legal-content a and .pi-note a (below) handle classed contexts. */
a{color:var(--link);text-decoration:none;transition:color .15s ease}
a:not([class]):hover{color:var(--link-hover);text-decoration:underline}
a:not([class]):focus-visible{outline:2px solid var(--focus-ring,#7aa7ff);outline-offset:2px;border-radius:2px}

/* Override the legacy .legal-content / .pi-note color rules so every
   body link resolves to the same token in both themes. Equal-or-higher
   specificity than the rules on line 1, declared later in the cascade. */
.legal-content a,
body.dark .legal-content a,
.pi-note a,
body.dark .pi-note a{color:var(--link)}
.legal-content a:hover,
.pi-note a:hover{color:var(--link-hover);text-decoration:underline}
