diff --git a/README.md b/README.md index 7d5b97e84..f7f572780 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,8 @@ Using WebP (for smaller images) or AVIF (for >80 kiB due to larger overhead) may * `brew install libavif` (see [GitHub Project Page](https://github.com/AOMediaCodec/libavif?tab=readme-ov-file#installation) for other installation methods) * Example (lossless): `avifenc -l input.png output.avif` * Example (lossy): `avifenc --qcolor 70 --qalpha 100 --depth 8 input.png output.avif` + * Example (lossy, mostly transparent image): `avifenc --qcolor 60 --qalpha 50 --depth 10 -s 0 input.png output.avif` + * Alpha is coded separately. For an image with large transparent areas, `--qalpha 100` can be most of the file, and a lower `--qalpha` (around 50) shrinks it several times over with no visible difference. Speed `-s 0` is slow but gives the smallest file. * `brew install libwebm` * Example (lossless): `cwebp -preset drawing -lossless -z 6 -metadata all input.png -o output.webp` * Example (lossy): `cwebp -preset drawing -q 90 -alpha_q 100 -metadata all input.png -o output.webp` diff --git a/assets/css/custom.css b/assets/css/custom.css index 7a75b3730..423793222 100644 --- a/assets/css/custom.css +++ b/assets/css/custom.css @@ -1,9 +1,96 @@ /* custom classes: */ .header-bg { - background-image: url(/img/home/header-background.avif), linear-gradient(to bottom, rgb(4.31% 5.88% 9.02%) 0%, rgb(7.84% 20.39% 32.94%) 38%, rgb(24.71% 54.51% 85.1%) 72%, rgb(60.39% 78.04% 96.08%) 90%); + background-image: url(/img/home/header-background.avif), linear-gradient(to bottom, var(--color-dark) 0%, rgb(7.84% 20.39% 32.94%) 38%, rgb(24.71% 54.51% 85.1%) 72%, rgb(60.39% 78.04% 96.08%) 90%); background-size: auto 100%; } +/* Two stacked icons per slot; `.is-locked` on the .finder-hero root, set by + script, picks the visible face. */ +.finder-swap-icon { + @apply relative inline-flex flex-none size-5; +} + +.finder-swap-icon i, +.finder-swap-icon img { + @apply absolute inset-0 flex items-center justify-center object-contain; + transition: opacity 0.4s ease; +} + +.finder-hero.is-locked .finder-when-unlocked, +.finder-hero:not(.is-locked) .finder-when-locked { + opacity: 0; +} + +.finder-hero.is-locked .finder-flap-name { + @apply font-mono text-[13px] text-gray-600; +} + +/* The title-bar path flips as one whole panel between its locked and unlocked + label instead of per-letter flapping. */ +.finder-path { + @apply inline-flex min-w-0 perspective-[400px]; +} + +.finder-path-inner { + @apply transform-3d transition-transform duration-600 ease-in-out; +} + +.finder-path-front, +.finder-path-back { + @apply backface-hidden; +} + +.finder-path-back, +.finder-hero:not(.is-locked) .finder-path-inner { + @apply rotate-x-180; +} + +/* Crossfade rotator for exactly three children: the :nth-child delays carve the + 12s cycle into three 4s slots, so a fourth child fades in on top of the first. */ +.idp-swap { + display: inline-grid; + place-items: center; +} + +/* Every delay is shifted by -0.48s, the length of the 4% fade-in, so the first + child is already opaque on load instead of fading in. */ +.idp-swap > * { + grid-area: 1 / 1; + opacity: 0; + animation: idp-cycle 12s infinite backwards; + animation-delay: -0.48s; +} + +.idp-swap > :nth-child(2) { + animation-delay: 3.52s; +} + +.idp-swap > :nth-child(3) { + animation-delay: 7.52s; +} + +@keyframes idp-cycle { + 0% { opacity: 0; } + 4% { opacity: 1; } + 33% { opacity: 1; } + 37% { opacity: 0; } + 100% { opacity: 0; } +} + +@media (prefers-reduced-motion: reduce) { + .ad-pulse { + display: none; + } + + .idp-swap > * { + animation: none; + } + + .idp-swap > :first-child { + opacity: 1; + } +} + .container-prose { @apply w-full mx-auto; max-width: 768px; @@ -34,22 +121,22 @@ @apply bg-secondary border-secondary text-white; } -.btn-tertiary2 { - @apply bg-tertiary2 border-tertiary2 text-white; +.btn-hub { + @apply bg-hub border-hub text-white; } .btn-primary:hover, .btn-primary:focus, .btn-secondary:hover, .btn-secondary:focus, -.btn-tertiary2:hover, -.btn-tertiary2:focus { +.btn-hub:hover, +.btn-hub:focus { @apply text-white transition transform duration-200 ease-in-out shadow-md -translate-y-px; } .btn-primary:disabled, .btn-secondary:disabled, -.btn-tertiary2:disabled { +.btn-hub:disabled { @apply shadow-none translate-y-0; } @@ -62,6 +149,15 @@ @apply bg-primary text-white transition transform duration-200 ease-in-out; } +.btn-outline-hub { + @apply border border-hub text-hub; +} + +.btn-outline-hub:hover, +.btn-outline-hub:focus { + @apply bg-hub text-white transition transform duration-200 ease-in-out; +} + .btn-outline-secondary { @apply border border-secondary text-secondary; } @@ -99,6 +195,10 @@ @apply text-primary no-underline hover:underline; } +.text-link-hub { + @apply text-hub no-underline hover:underline; +} + .font-h1 { @apply font-headline font-medium text-3xl md:text-4xl leading-tight text-balance; } diff --git a/assets/css/hero.css b/assets/css/hero.css index 5831b4e1f..e0a75ab4a 100644 --- a/assets/css/hero.css +++ b/assets/css/hero.css @@ -52,7 +52,7 @@ .hero-aura-secondary { right: -12%; - background: radial-gradient(circle, color-mix(in srgb, var(--color-tertiary2) 14%, transparent) 0%, transparent 70%); + background: radial-gradient(circle, color-mix(in srgb, var(--color-hub) 14%, transparent) 0%, transparent 70%); } /* Uses the same `container` constraint as the content sections below, so the @@ -70,7 +70,7 @@ } .hero-panel-primary { --accent: var(--color-primary); } - .hero-panel-secondary { --accent: var(--color-tertiary2); } + .hero-panel-secondary { --accent: var(--color-hub); } .hero-panel-content { @apply flex-1 flex flex-col items-center; @@ -142,7 +142,7 @@ - encrypted vault / key → secondary (teal) — the right segment */ .hero-cryp-link { stroke: var(--color-primary); } - .hero-hub-link { stroke: var(--color-tertiary2); } + .hero-hub-link { stroke: var(--color-hub); } /* Anchor: the icon/logo is centered on its declared point so the connecting dashed lines (drawn to that point) pass through the disc's centre. The label @@ -167,9 +167,9 @@ } .hero-hub-scene { - --scene-accent: var(--color-tertiary2); + --scene-accent: var(--color-hub); --scene-disc: #f1f6fb; - --scene-token: var(--color-tertiary2); + --scene-token: var(--color-hub); --scene-glow: color-mix(in srgb, var(--color-gray-600) 40%, transparent); --scene-cycle: 10s; } diff --git a/assets/css/theme.css b/assets/css/theme.css index 405d23a2e..e16b0104d 100644 --- a/assets/css/theme.css +++ b/assets/css/theme.css @@ -113,7 +113,7 @@ --color-primary-l2: #ebf5eb; --color-secondary: #008a7b; --color-tertiary: #005e71; - --color-tertiary2: #354960; + --color-hub: #354960; --color-dark: #1e2b33; --font-*: initial; diff --git a/assets/js/finder-hero.js b/assets/js/finder-hero.js new file mode 100644 index 000000000..5061bd68e --- /dev/null +++ b/assets/js/finder-hero.js @@ -0,0 +1,94 @@ +"use strict"; + +/* One interval drives both halves of the effect: the per-element split-flap + text here, and the `.is-locked` icon and panel swap done in CSS. */ + +class FinderFlap { + constructor(el) { + this.el = el; + this.lockedText = el.dataset.locked; + this.unlockedText = el.dataset.unlocked; + this.chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + this.raf = null; + } + + show(locked) { + const newText = locked ? this.lockedText : this.unlockedText; + const oldText = this.el.textContent; + const length = Math.max(oldText.length, newText.length); + this.queue = []; + for (let i = 0; i < length; i++) { + const from = oldText[i] || ''; + const to = newText[i] || ''; + const start = Math.floor(i * 0.8); + const end = start + 8 + Math.floor(Math.random() * 8); + this.queue.push({ from, to, start, end, char: null }); + } + cancelAnimationFrame(this.raf); + this.frame = 0; + this.update(); + } + + update() { + let output = ''; + let complete = 0; + for (const item of this.queue) { + if (this.frame >= item.end) { + complete++; + output += item.to; + } else if (this.frame >= item.start) { + if (!item.char || Math.random() < 0.35) { + item.char = this.chars[Math.floor(Math.random() * this.chars.length)]; + } + output += item.char; + } else { + output += item.from; + } + } + this.el.textContent = output; + if (complete < this.queue.length) { + this.frame++; + this.raf = requestAnimationFrame(() => this.update()); + } + } +} + +function initFinderHero() { + const root = document.querySelector('.finder-hero'); + if (!root) { + return; + } + const flapElements = root.querySelectorAll('.finder-flap'); + if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) { + root.classList.remove('is-locked'); + flapElements.forEach((el) => { + el.textContent = el.dataset.unlocked; + }); + return; + } + const flaps = Array.from(flapElements, (el) => new FinderFlap(el)); + const providers = [ + { name: 'Google Drive', src: '/img/clouds/google-drive.svg' }, + { name: 'iCloud Drive', src: '/img/clouds/icloud.svg' }, + { name: 'OneDrive', src: '/img/clouds/onedrive.svg' }, + { name: 'Dropbox', src: '/img/clouds/dropbox.svg' }, + ]; + const providerName = root.querySelector('[data-finder-provider-name]'); + const providerIcon = root.querySelector('[data-finder-provider-icon]'); + let providerIndex = 0; + let locked = true; + setInterval(() => { + locked = !locked; + if (locked) { + providerIndex = (providerIndex + 1) % providers.length; + providerName.textContent = providers[providerIndex].name; + providerIcon.src = providers[providerIndex].src; + } + root.classList.toggle('is-locked', locked); + flaps.forEach((flap, index) => { + setTimeout(() => flap.show(locked), index * 140); + }); + }, 5000); +} + +initFinderHero(); diff --git a/content/for-individuals.de.html b/content/for-individuals.de.html index 82885156c..81e49ae00 100644 --- a/content/for-individuals.de.html +++ b/content/for-individuals.de.html @@ -1,4 +1,6 @@ --- title: "Cryptomator" type: for-individuals +darkNav: true +flushHero: true --- diff --git a/content/for-individuals.en.html b/content/for-individuals.en.html index 82885156c..81e49ae00 100644 --- a/content/for-individuals.en.html +++ b/content/for-individuals.en.html @@ -1,4 +1,6 @@ --- title: "Cryptomator" type: for-individuals +darkNav: true +flushHero: true --- diff --git a/content/for-teams.de.html b/content/for-teams.de.html index ec6251bd3..003d60f51 100644 --- a/content/for-teams.de.html +++ b/content/for-teams.de.html @@ -1,5 +1,8 @@ --- title: "Cryptomator Hub" type: for-teams +hubNav: true +darkNav: true +flushHero: true aliases: ["/hub"] --- diff --git a/content/for-teams.en.html b/content/for-teams.en.html index ec6251bd3..003d60f51 100644 --- a/content/for-teams.en.html +++ b/content/for-teams.en.html @@ -1,5 +1,8 @@ --- title: "Cryptomator Hub" type: for-teams +hubNav: true +darkNav: true +flushHero: true aliases: ["/hub"] --- diff --git a/i18n/de.yaml b/i18n/de.yaml index f6f722a8e..433a45c32 100644 --- a/i18n/de.yaml +++ b/i18n/de.yaml @@ -223,13 +223,64 @@ - id: for_individuals_header_title translation: "Deine Daten in der Cloud gehören dir allein" - id: for_individuals_header_description - translation: "Daten in der Cloud sind oft nicht ausreichend geschützt. Cryptomator verschlüsselt deine Dokumente, Fotos und persönlichen Dateien mit wenigen Klicks – so hast nur du Zugriff. Niemand sonst." + translation: "Cryptomator verschlüsselt deine Dokumente, Fotos und persönlichen Dateien mit wenigen Klicks – so hast nur du Zugriff. Niemand sonst." - id: for_individuals_header_cta translation: "Jetzt herunterladen" - id: for_individuals_header_cta_description translation: "Verfügbar für Windows, macOS, Linux, Android und iOS." -- id: for_individuals_header_woman_laptop_alt - translation: "Person, die vor einem Laptop sitzt, während Cryptobot neben der Person auf den Laptop zeigt" +- id: for_individuals_header_link + translation: "So funktioniert's" + +- id: for_individuals_finder_locked_path_suffix + translation: " › Tresor" +- id: for_individuals_finder_unlocked_path + translation: "Dein Laufwerk › Tresor" +- id: for_individuals_finder_col_name + translation: "Name" +- id: for_individuals_finder_col_size + translation: "Größe" +- id: for_individuals_finder_col_modified + translation: "Geändert" +- id: for_individuals_finder_file_1_name + translation: "Urlaubsfotos" +- id: for_individuals_finder_file_1_modified + translation: "Heute, 09:41" +- id: for_individuals_finder_file_2_name + translation: "Steuererklärung-2025.pdf" +- id: for_individuals_finder_file_2_size + translation: "2,4 MB" +- id: for_individuals_finder_file_2_modified + translation: "Gestern, 18:07" +- id: for_individuals_finder_file_3_name + translation: "Reisepass-Scan.jpg" +- id: for_individuals_finder_file_3_size + translation: "1,8 MB" +- id: for_individuals_finder_file_3_modified + translation: "12.07.2026" +- id: for_individuals_finder_file_4_name + translation: "Finanzen.xlsx" +- id: for_individuals_finder_file_4_size + translation: "96 KB" +- id: for_individuals_finder_file_4_modified + translation: "08.07.2026" +- id: for_individuals_finder_file_5_name + translation: "Mietvertrag.pdf" +- id: for_individuals_finder_file_5_size + translation: "640 KB" +- id: for_individuals_finder_file_5_modified + translation: "27.06.2026" +- id: for_individuals_finder_file_6_name + translation: "Bewerbung.docx" +- id: for_individuals_finder_file_6_size + translation: "88 KB" +- id: for_individuals_finder_file_6_modified + translation: "05.06.2026" +- id: for_individuals_hero_pill + translation: "Ende-zu-Ende verschlüsselt – nur du hast den Schlüssel" +- id: for_individuals_finder_items + translation: "6 Objekte" +- id: for_individuals_stats_title + translation: "Vertraut von Millionen weltweit" - id: for_individuals_downloads_title translation: "4M+" @@ -401,11 +452,45 @@ - id: hub_header_title translation: "Souveräne Zusammenarbeit in der Cloud" - id: hub_header_description - translation: "Cryptomator Hub verschlüsselt deine vertraulichen Unternehmensdaten wie personenbezogene Kundendaten oder interne Geschäftsdokumente – DSGVO-konform, einfach und unter deiner Kontrolle." + translation: "Cryptomator Hub verschlüsselt die vertraulichen Daten deines Unternehmens – DSGVO-konform, einfach und unter deiner Kontrolle." - id: hub_header_managed_cta - translation: "Jetzt anmelden" + translation: "Kostenlos testen" - id: hub_header_managed_cta_description translation: "Startet eure kostenlose 30-Tage-Testversion noch heute, keine Kreditkarte erforderlich." +- id: hub_header_link + translation: "So funktioniert's" +- id: hub_hero_scene_vault + translation: "Gemeinsamer Tresor" +- id: hub_hero_card_vault_name + translation: "Finanzen" +- id: hub_hero_group_name + translation: "Team Buchhaltung" +- id: hub_hero_group_subtitle + translation: "Gruppe · 8 Mitglieder" +- id: hub_hero_tile_audit + translation: "Audit-Log" +- id: hub_hero_tile_devices + translation: "Geräte" +- id: hub_hero_ad_row_users + translation: "128 Benutzer" +- id: hub_hero_ad_row_groups + translation: "12 Gruppen" +- id: hub_hero_node_revoked + translation: "Zugriff entzogen" +- id: hub_hero_audit_row_1 + translation: "Zugriff erteilt · Lena" +- id: hub_hero_audit_row_2 + translation: "Gerät registriert · Jonas" +- id: hub_hero_audit_row_3 + translation: "Zugriff entzogen · Michael" +- id: hub_hero_row_owner_desc + translation: "CFO" +- id: hub_hero_tag_external + translation: "Extern" +- id: hub_hero_tag_owner + translation: "Owner" +- id: hub_hero_row_external_desc + translation: "Steuerberaterin" - id: hub_header_group_magic_alt translation: "Cryptobot verbindet eine Gruppe von Menschen mit seinen magischen Fähigkeiten durch Zero-Knowledge-Verschlüsselung" @@ -432,6 +517,12 @@ translation: "Ladet euren Tresor über Cryptomator Hub herunter und öffnet ihn direkt in der Cryptomator App als bestehenden Tresor. Statt ein Passwort einzugeben, erfolgt die Authentifizierung sicher über Hub – so bleibt alles geschützt und trotzdem komfortabel zugänglich." - id: hub_workflow_step_3_alt translation: "Cryptomator-App-Oberfläche mit mehreren Tresoren" +- id: hub_workflow_step_4_title + translation: "4. Lückenlos nachvollziehbar" +- id: hub_workflow_step_4_description + translation: "Wer hat wann welchen Tresor entsperrt, ein Gerät registriert oder Zugriff erhalten? Das Audit-Log protokolliert alle sicherheitsrelevanten Ereignisse. Compliance-Nachweise gibt es damit auf Knopfdruck." +- id: hub_workflow_step_4_alt + translation: "Audit-Log in Cryptomator Hub mit protokollierten Ereignissen" - id: hub_features_title translation: "Warum Cryptomator Hub?" @@ -781,6 +872,38 @@ - id: hub_demo_contact_us_button translation: "Kontaktiere uns" +# Hub CE Registration +- id: hub_ce_registration_description + translation: "Registriere deine Cryptomator-Hub-Instanz für eine kostenlose Community-Edition-Lizenz." + +- id: hub_ce_registration_steps_title + translation: "Schritt von " +- id: hub_ce_registration_steps_next + translation: "Weiter" + +- id: hub_ce_registration_step_1_nav_title + translation: "E-Mail-Adresse" +- id: hub_ce_registration_step_1_title + translation: "Wie lautet deine E-Mail-Adresse?" +- id: hub_ce_registration_step_1_email_placeholder + translation: "E-Mail-Adresse" + +- id: hub_ce_registration_step_2_confirmation_nav_title + translation: "Bestätigung" +- id: hub_ce_registration_step_2_confirmation_title + translation: "Bitte bestätige deine E-Mail-Adresse" +- id: hub_ce_registration_step_2_instructions + translation: "Wir senden eine Bestätigungs-E-Mail an " +- id: hub_ce_registration_step_2_check_email + translation: "Bitte prüfe deine E-Mails." + +- id: hub_ce_registration_step_3_license_nav_title + translation: "Lizenzschlüssel" +- id: hub_ce_registration_step_3_license_title + translation: "Deine Community-Edition-Lizenz" +- id: hub_ce_registration_step_3_success + translation: "Deine E-Mail-Adresse wurde erfolgreich verifiziert. Kehre zu deiner Hub-Instanz zurück, sie holt deinen Lizenzschlüssel automatisch ab." + # Hub Managed - id: hub_managed_description translation: "Beantrage Zugang zu einer Managed-Instanz von Cryptomator Hub und hol dein Team mit der clientseitigen Verschlüsselung für deinen Cloud-Speicher an Bord." diff --git a/i18n/en.yaml b/i18n/en.yaml index f04e047c6..f7f7b33a5 100644 --- a/i18n/en.yaml +++ b/i18n/en.yaml @@ -223,13 +223,64 @@ - id: for_individuals_header_title translation: "Keep your cloud data truly yours" - id: for_individuals_header_description - translation: "Data in the cloud is often not sufficiently protected. Cryptomator encrypts your documents, photos, and personal files with just a few clicks – ensuring that only you have access. No one else." + translation: "Cryptomator encrypts your documents, photos, and personal files in just a few clicks – so only you have access. No one else." - id: for_individuals_header_cta translation: "Download Now" - id: for_individuals_header_cta_description translation: "Available for Windows, macOS, Linux, Android, and iOS." -- id: for_individuals_header_woman_laptop_alt - translation: "Person sitting in front of a laptop while Cryptobot next to the person is pointing at the laptop" +- id: for_individuals_header_link + translation: "See how it works" + +- id: for_individuals_finder_locked_path_suffix + translation: " › Vault" +- id: for_individuals_finder_unlocked_path + translation: "Your Drive › Vault" +- id: for_individuals_finder_col_name + translation: "Name" +- id: for_individuals_finder_col_size + translation: "Size" +- id: for_individuals_finder_col_modified + translation: "Date Modified" +- id: for_individuals_finder_file_1_name + translation: "Vacation Photos" +- id: for_individuals_finder_file_1_modified + translation: "Today, 9:41 AM" +- id: for_individuals_finder_file_2_name + translation: "Tax-Return-2025.pdf" +- id: for_individuals_finder_file_2_size + translation: "2.4 MB" +- id: for_individuals_finder_file_2_modified + translation: "Yesterday, 6:07 PM" +- id: for_individuals_finder_file_3_name + translation: "Passport-Scan.jpg" +- id: for_individuals_finder_file_3_size + translation: "1.8 MB" +- id: for_individuals_finder_file_3_modified + translation: "07/12/2026" +- id: for_individuals_finder_file_4_name + translation: "Finances.xlsx" +- id: for_individuals_finder_file_4_size + translation: "96 KB" +- id: for_individuals_finder_file_4_modified + translation: "07/08/2026" +- id: for_individuals_finder_file_5_name + translation: "Lease-Agreement.pdf" +- id: for_individuals_finder_file_5_size + translation: "640 KB" +- id: for_individuals_finder_file_5_modified + translation: "06/27/2026" +- id: for_individuals_finder_file_6_name + translation: "Resume.docx" +- id: for_individuals_finder_file_6_size + translation: "88 KB" +- id: for_individuals_finder_file_6_modified + translation: "06/05/2026" +- id: for_individuals_hero_pill + translation: "End-to-end encrypted – only you hold the key" +- id: for_individuals_finder_items + translation: "6 items" +- id: for_individuals_stats_title + translation: "Trusted by millions worldwide" - id: for_individuals_downloads_title translation: "4M+" @@ -401,11 +452,45 @@ - id: hub_header_title translation: "Secure collaboration in the cloud" - id: hub_header_description - translation: "Cryptomator Hub encrypts your company's confidential data, from personal customer information to internal documents – fully GDPR-compliant, simple to use, and always under your control." + translation: "Cryptomator Hub encrypts your company's confidential data – GDPR-compliant, simple to use, and always under your control." - id: hub_header_managed_cta - translation: "Sign Up Now" + translation: "Start Free Trial" - id: hub_header_managed_cta_description translation: "Start your free 30-day trial today, no credit card required." +- id: hub_header_link + translation: "See how it works" +- id: hub_hero_scene_vault + translation: "Shared Vault" +- id: hub_hero_card_vault_name + translation: "Finance" +- id: hub_hero_group_name + translation: "Accounting Team" +- id: hub_hero_group_subtitle + translation: "Group · 8 members" +- id: hub_hero_tile_audit + translation: "Audit Log" +- id: hub_hero_tile_devices + translation: "Devices" +- id: hub_hero_ad_row_users + translation: "128 users" +- id: hub_hero_ad_row_groups + translation: "12 groups" +- id: hub_hero_node_revoked + translation: "Access revoked" +- id: hub_hero_audit_row_1 + translation: "Access granted · Lena" +- id: hub_hero_audit_row_2 + translation: "Device registered · Jonas" +- id: hub_hero_audit_row_3 + translation: "Access revoked · Michael" +- id: hub_hero_row_owner_desc + translation: "CFO" +- id: hub_hero_tag_external + translation: "External" +- id: hub_hero_tag_owner + translation: "Owner" +- id: hub_hero_row_external_desc + translation: "Tax Advisor" - id: hub_header_group_magic_alt translation: "Cryptobot connects a group of people with its magical abilities through zero-knowledge encryption" @@ -432,6 +517,12 @@ translation: "Download your vault via Cryptomator Hub and open it directly in the Cryptomator app as an existing vault. Instead of entering a password, authentication is securely handled through Hub – keeping everything protected while ensuring easy access." - id: hub_workflow_step_3_alt translation: "Cryptomator app interface with multiple vaults" +- id: hub_workflow_step_4_title + translation: "4. Fully Traceable" +- id: hub_workflow_step_4_description + translation: "Who unlocked which vault, registered a device, or was granted access, and when? The audit log records all security-relevant events and gives you compliance evidence at the push of a button." +- id: hub_workflow_step_4_alt + translation: "Audit log in Cryptomator Hub with recorded events" - id: hub_features_title translation: "Why Cryptomator Hub?" diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html index 5c520002c..4fa615c2b 100644 --- a/layouts/_default/baseof.html +++ b/layouts/_default/baseof.html @@ -7,7 +7,7 @@ {{ block "preloads" . }} {{ end }} - + @@ -49,14 +49,7 @@ {{ end }} - {{ if hugo.IsDevelopment }} - {{ $css := resources.Get "css/main.css" | css.TailwindCSS }} - - {{ else }} - {{ $tailwindOpts := dict "minify" true }} - {{ $css := resources.Get "css/main.css" | css.TailwindCSS $tailwindOpts | fingerprint }} - - {{ end }} + {{ partial "page-css.html" "css/main.css" }} {{ block "styles" . }} {{ end }} @@ -107,23 +100,13 @@ {{- if $showAnniversaryBanner -}} {{ partial "anniversary-banner.html" . }} {{- end -}} - {{- $showThinStrip := or $showWebinarBanner $showSaleBanner -}} {{- $flushHero := or .IsHome .Params.flushHero -}} - {{- $topPadding := cond $flushHero "" "pt-12" -}} - {{- if and $showThinStrip (not $showAnniversaryBanner) -}} - {{- $topPadding = cond $flushHero "" "pt-24 md:pt-18" -}} - {{- else if and (not $showThinStrip) $showAnniversaryBanner -}} - {{- $topPadding = cond $flushHero "" "pt-28 md:pt-24" -}} - {{- else if and $showThinStrip $showAnniversaryBanner -}} - {{- $topPadding = cond $flushHero "" "pt-40 md:pt-32" -}} - {{- end -}} - {{- /* The webinar banner hides itself client-side when no webinar is live/upcoming; collapse its reserved padding to match. */ -}} - {{- $webinarIsThinStrip := and $showWebinarBanner (not $showSaleBanner) -}} - {{- $paddingNoStrip := cond $flushHero "" "pt-12" -}} - {{- if $showAnniversaryBanner -}} - {{- $paddingNoStrip = cond $flushHero "" "pt-28 md:pt-24" -}} + {{- $wrapperClasses := "bg-gray-100 min-h-[80vh]" -}} + {{- $wrapperAttrs := printf "class=\"%s\"" $wrapperClasses | safeHTMLAttr -}} + {{- if not $flushHero -}} + {{- $wrapperAttrs = partial "banner-padding.html" (dict "context" . "classes" $wrapperClasses "base" "pt-12" "thinStrip" "pt-24 md:pt-18" "anniversary" "pt-28 md:pt-24" "both" "pt-40 md:pt-32") -}} {{- end -}} -
{{ i18n "for_individuals_header_description" . | safeHTML }}
+ +{{ i18n "for_individuals_header_cta_description" . | safeHTML }}
+ {{ if .Site.Params.paddleDesktopSalePriceId }} +* {{ i18n "pricing_discount_note" }}
+ {{ end }} +{{ i18n "for_individuals_workflow_step_1_description" }}
-{{ i18n "for_individuals_workflow_step_1_description" }}
+{{ i18n "for_individuals_workflow_step_2_description" }}
-{{ i18n "for_individuals_workflow_step_2_description" }}
+{{ i18n "for_individuals_workflow_step_3_description" }}
+{{ i18n "for_individuals_workflow_step_3_description" }}
+{{ i18n "hub_header_description" . | safeHTML }}
+ -{{ i18n "hub_header_description" . | safeHTML }}
-{{ i18n "hub_header_managed_cta_description" . | safeHTML }}
+ +{{ i18n "hub_header_managed_cta_description" . | safeHTML }}
- + {{ i18n "success_story_read_link" . }}
@@ -50,7 +174,7 @@{{ i18n "hub_video_description" . }}
{{ i18n "hub_workflow_step_3_description" }}
{{ i18n "hub_workflow_step_4_description" }}
+{{ i18n "hub_features_feature_1_description" . | safeHTML }}
@@ -110,8 +244,8 @@{{ i18n "hub_features_feature_2_description" . | safeHTML }}
@@ -119,8 +253,8 @@{{ i18n "hub_features_feature_3_description" . | safeHTML }}
@@ -128,8 +262,8 @@{{ i18n "hub_features_feature_4_description" . | safeHTML }}
@@ -137,8 +271,8 @@{{ i18n "hub_features_feature_5_description" . | safeHTML }}
@@ -146,8 +280,8 @@{{ i18n "hub_features_feature_6_description" . | safeHTML }}
@@ -160,7 +294,7 @@{{ i18n "hub_pricing_description" . }}
- + {{ i18n "hub_pricing_button" . }}{{ i18n "hub_contact_us_description" . | safeHTML }}
- + {{ i18n "hub_contact_us_button" . }}
- {{ .Title }}
{{ i18n "hub_billing_manage_payment_info_invoice" . }}
-
-
+
{{ i18n "hub_billing_manage_next_payment_date_description" . }}:
-
+
{{ i18n "hub_billing_manage_change_quantity_confirmation_increase_warning_invoice" . }}
-
+
{{ i18n "hub_billing_manage_change_quantity_confirmation_prorated_invoice" . }}: {{ $inclVat }}
-
+
{{ i18n "hub_billing_manage_change_quantity_confirmation_credited_invoice" . }}: {{ $inclVat }}
-
+
{{ i18n "hub_billing_manage_change_quantity_confirmation_available_credit_invoice" . }}:
-
+
{{ i18n "hub_billing_manage_change_quantity_confirmation_new_recurring_invoice" . }}:
{{ i18n "hub_billing_checkout_invoice_price_error" . }}
{{ i18n "hub_billing_checkout_community_cta" . }}
{{ i18n "hub_billing_checkout_enterprise_cta" . }}
-
+
{{ i18n "hub_billing_checkout_success_description" . }}
-
+
{{ i18n "hub_billing_checkout_success_invoice_description" . }}
{{ i18n "hub_demo_instruction" }}
{{ i18n "hub_demo_contact_us_description" . | safeHTML }} {{ i18n "hub_managed_contact_us_description" . | safeHTML }} {{ i18n "hub_self_hosted_options_local_description" . }} {{ i18n "hub_self_hosted_options_compose_description" . }} {{ i18n "hub_self_hosted_options_kubernetes_description" . }} {{ i18n "hub_self_hosted_contact_us_description" . }} {{ i18n "home_hero_hub_description" }}
diff --git a/layouts/partials/hub-managed-low-quantity.html b/layouts/partials/hub-managed-low-quantity.html
index db084389e..5bbc7e919 100644
--- a/layouts/partials/hub-managed-low-quantity.html
+++ b/layouts/partials/hub-managed-low-quantity.html
@@ -7,9 +7,9 @@
{{ .Title }}
-
-
{{ .Title }}
+
{{ i18n "hub_billing_checkout_community_title" . }}
@@ -567,15 +567,15 @@
{{ i18n "hub_billing_checkout_community_subtitle" . }}
+
{{ i18n "hub_billing_checkout_standard_title" . }}
{{ partial "checkbox.html" (dict "context" . "alpineVariable" "acceptTerms" "label" (i18n "accept_terms_and_privacy" | safeHTML)) }}
{{ $cardChallengeUrl := printf "%s/billing/paddle-classic/checkout/challenge" .Site.Params.apiBaseUrl }}
{{ partial "captcha.html" (dict "challengeUrl" $cardChallengeUrl "captchaPayload" "subscriptionData.cardCaptcha" "captchaState" "captchaState" "ref" "cardCaptcha") }}
-
{{ i18n "hub_billing_checkout_invoice_non_eu_hint" . }}
-
-
+
{{ i18n "hub_billing_checkout_enterprise_title" . }}
@@ -726,15 +726,15 @@
{{ i18n "hub_billing_checkout_enterprise_subtitle" . }}
{{ i18n "faq_title" . }}
{{ .Title }}
{{ i18n "hub_demo_contact_us_title" . }}
{{ .Title }}
{{ .Title }}
.{{ .Site.Params.hubManagedDomain }}'" readonly>
{{ i18n "hub_managed_step_4_phone" }}
-
+
{{ i18n "hub_managed_step_4_phone_add" }}
@@ -178,7 +178,7 @@
{{ i18n "hub_managed_step_4_message" }}
-
+
{{ i18n "hub_managed_step_4_message_add" }}
@@ -193,7 +193,7 @@
{{ i18n "hub_managed_contact_us_title" . }}
{{ .Title }}
{{ .Title }}
{{ .Title }}
{{ i18n "hub_self_hosted_components_tit
- {{ i18n "hub_self_hosted_components_hub_title" . }}
+ {{ i18n "hub_self_hosted_components_hub_title" . }}
- {{ i18n "hub_self_hosted_components_keycloak_title" . }}
+ {{ i18n "hub_self_hosted_components_keycloak_title" . }}
- {{ i18n "hub_self_hosted_components_database_title" . }}
+ {{ i18n "hub_self_hosted_components_database_title" . }}
{{ i18n "hub_self_hosted_option
- {{ i18n "hub_self_hosted_options_local_title" . }}
+ {{ i18n "hub_self_hosted_options_local_title" . }}
- {{ i18n "hub_self_hosted_options_compose_title" . }}
+ {{ i18n "hub_self_hosted_options_compose_title" . }}
- {{ i18n "hub_self_hosted_options_kubernetes_title" . }}
+ {{ i18n "hub_self_hosted_options_kubernetes_title" . }}
{{ i18n "hub_self_hosted_contact_us_title" . }}
CRYPTOMATOR HUB
+ CRYPTOMATOR HUB
{{ i18n "home_get_started_
@@ -220,14 +198,13 @@
+
CRYPTOMATOR
-
- CRYPTOMATOR HUB
+ {{ partial "hub-wordmark.html" "hidden md:block h-8 mr-2" }}
{{ i18n "hub_billing_manage_license_key_instruction" . }}
-
-
+
{{ end -}}
+CRYPTOMATOR HUB
diff --git a/layouts/partials/nav.html b/layouts/partials/nav.html
index 9425561c3..5aff3c9d4 100644
--- a/layouts/partials/nav.html
+++ b/layouts/partials/nav.html
@@ -3,6 +3,7 @@
{{- $hoverBorderColor := cond .Params.darkNav "hover:border-white" "hover:border-primary" -}}
{{- $backgroundColor := cond .Params.darkNav "bg-dark" "bg-white" -}}
{{- $currentRelPermalink := .RelPermalink -}}
+{{- $productPage := or (in .RelPermalink "/downloads") (in .RelPermalink "/for-individuals") (in .RelPermalink "/for-teams") -}}
-
-
-
-
+ {{- /* baseof emits no padding for flush heroes, so the hero self-clears the fixed nav + banners. */ -}}
+
+
+
+
+