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 -}} -
+
{{ block "main" . }} diff --git a/layouts/downloads/list.html b/layouts/downloads/list.html index e08603941..5c2b8cd6f 100644 --- a/layouts/downloads/list.html +++ b/layouts/downloads/list.html @@ -30,7 +30,7 @@
- Logo + CRYPTOMATOR HUB

{{ i18n "hub_header_title" . | safeHTML }}

diff --git a/layouts/for-individuals/single.html b/layouts/for-individuals/single.html index b871b534a..7e5010a14 100644 --- a/layouts/for-individuals/single.html +++ b/layouts/for-individuals/single.html @@ -1,40 +1,115 @@ {{ define "preloads" }} + + {{- /* Rotation icons for the finder hero; google-drive.svg is the initial src in the markup. */ -}} + + + {{ partial "altcha-css.html" . }} {{ end }} {{ define "main" }} -
-
- -
-
-
- Logo - CRYPTOMATOR + {{- /* baseof emits no padding for flush heroes, so the hero self-clears the fixed nav + banners. */ -}} +
+
+ {{ if .Site.Params.paddleDesktopSalePriceId }} +
+ {{ i18n "for_individuals_header_kicker_sale" . }} +
+ {{ end }} +

{{ i18n "for_individuals_header_title" . | safeHTML }}

+

{{ i18n "for_individuals_header_description" . | safeHTML }}

+ +

{{ i18n "for_individuals_header_cta_description" . | safeHTML }}

+ {{ if .Site.Params.paddleDesktopSalePriceId }} +

* {{ i18n "pricing_discount_note" }}

+ {{ end }} +
+ + {{ partial "hero-wave.html" }} + {{- $finderRow := "grid grid-cols-[minmax(0,1fr)_4.5rem_6.5rem] md:grid-cols-[minmax(0,1fr)_5rem_8.5rem] gap-3 items-center px-5" -}} +
+
+
-
+
+ -
+
+

{{ i18n "for_individuals_stats_title" }}

{{ i18n "for_individuals_downloads_title" }}

@@ -59,36 +134,42 @@

{{ i18n "for_individu

-
-
-
- {{i18n -
-
-

{{ i18n "for_individuals_workflow_step_1_title" }}

-

{{ i18n "for_individuals_workflow_step_1_description" }}

-
-
+
+ +
+
+
+
+ {{i18n +
+
+

{{ i18n "for_individuals_workflow_step_1_title" }}

+

{{ i18n "for_individuals_workflow_step_1_description" }}

+
+
-
-
- {{i18n -
-
-

{{ i18n "for_individuals_workflow_step_2_title" }}

-

{{ i18n "for_individuals_workflow_step_2_description" }}

-
-
+
+
+ {{i18n +
+
+

{{ i18n "for_individuals_workflow_step_2_title" }}

+

{{ i18n "for_individuals_workflow_step_2_description" }}

+
+
-
-
- {{i18n -
-
-

{{ i18n "for_individuals_workflow_step_3_title" }}

-

{{ i18n "for_individuals_workflow_step_3_description" }}

+
+
+ {{i18n +
+
+

{{ i18n "for_individuals_workflow_step_3_title" }}

+

{{ i18n "for_individuals_workflow_step_3_description" }}

+
+
+
@@ -213,6 +294,8 @@

{{ i18n "home_newsletter_title" . }} {{ $newsletterJs := resources.Get "js/newsletter.js" }} {{ $altchaJs := resources.Get "js/altcha/altcha.js" }} @@ -220,6 +303,8 @@

{{ i18n "home_newsletter_title" . }} {{ else }} + {{ $finderJs := resources.Get "js/finder-hero.js" | minify | fingerprint }} + {{ $newsletterJs := resources.Get "js/newsletter.js" | minify | fingerprint }} {{ $altchaJs := resources.Get "js/altcha/altcha.js" }} diff --git a/layouts/for-teams/single.html b/layouts/for-teams/single.html index 945611101..e39feae0f 100644 --- a/layouts/for-teams/single.html +++ b/layouts/for-teams/single.html @@ -1,28 +1,152 @@ {{ define "preloads" }} + {{ partial "altcha-css.html" . }} {{ end }} {{ define "main" }} -
-
-
+ {{ partial "hero-wave.html" }} +

{{ $walbuschPage := .Site.GetPage (printf "/success-stories/walbusch.%s.html" .Language.Lang) }} {{ if $walbuschPage }} @@ -40,7 +164,7 @@

{{ i18n "hub_header_title" . | safeHTML }}

- + {{ i18n "success_story_read_link" . }}

@@ -50,7 +174,7 @@

{{ i18n "hub_header_title" . | safeHTML }}

-

{{ i18n "hub_video_title" . }}

+

{{ i18n "hub_video_title" . }}

{{ i18n "hub_video_description" . }}

@@ -64,7 +188,7 @@

{{ i18n "hub_video_title" . }}

- {{i18n + {{i18n

{{ i18n "hub_workflow_step_1_title" }}

@@ -74,7 +198,7 @@

{{ i18n "hub_workflow_step_1_title" }}

- {{i18n + {{i18n

{{ i18n "hub_workflow_step_2_title" }}

@@ -84,13 +208,23 @@

{{ i18n "hub_workflow_step_2_title" }}

- {{i18n + {{i18n

{{ i18n "hub_workflow_step_3_title" }}

{{ i18n "hub_workflow_step_3_description" }}

+ +
+
+ {{i18n +
+
+

{{ i18n "hub_workflow_step_4_title" }}

+

{{ i18n "hub_workflow_step_4_description" }}

+
+
@@ -101,8 +235,8 @@

{{ i18n "hub_features_title" . }}

-
-

{{ i18n "hub_features_feature_1_title" . }}

+
+

{{ i18n "hub_features_feature_1_title" . }}

{{ i18n "hub_features_feature_1_description" . | safeHTML }}

@@ -110,8 +244,8 @@

{{ i18n "hub_fe

-
-

{{ i18n "hub_features_feature_2_title" . }}

+
+

{{ i18n "hub_features_feature_2_title" . }}

{{ i18n "hub_features_feature_2_description" . | safeHTML }}

@@ -119,8 +253,8 @@

{{ i18

-
-

{{ i18n "hub_features_feature_3_title" . }}

+
+

{{ i18n "hub_features_feature_3_title" . }}

{{ i18n "hub_features_feature_3_description" . | safeHTML }}

@@ -128,8 +262,8 @@

{{ i18n "h

-
-

{{ i18n "hub_features_feature_4_title" . }}

+
+

{{ i18n "hub_features_feature_4_title" . }}

{{ i18n "hub_features_feature_4_description" . | safeHTML }}

@@ -137,8 +271,8 @@

{{ i18n "hub_

-
-

{{ i18n "hub_features_feature_5_title" . }}

+
+

{{ i18n "hub_features_feature_5_title" . }}

{{ i18n "hub_features_feature_5_description" . | safeHTML }}

@@ -146,8 +280,8 @@

{{ i18n "hub_f

-
-

{{ i18n "hub_features_feature_6_title" . }}

+
+

{{ i18n "hub_features_feature_6_title" . }}

{{ i18n "hub_features_feature_6_description" . | safeHTML }}

@@ -160,7 +294,7 @@

{{ i18n

{{ i18n "hub_pricing_title" . }}

{{ i18n "hub_pricing_description" . }}

- + {{ i18n "hub_pricing_button" . }}
@@ -171,9 +305,9 @@

{{ i18n "hub_deployment_tit
-
+

- {{ i18n "pricing_hub_managed_title" . }} + {{ i18n "pricing_hub_managed_title" . }}

@@ -187,29 +321,29 @@

  • - + {{ i18n "hub_deployment_managed_benefit_1" . }}
  • - + {{ i18n "hub_deployment_managed_benefit_2" . }}
  • - + {{ i18n "hub_deployment_managed_benefit_3" . }}
- + {{ i18n "pricing_hub_managed_cta" . }}
-
+

- {{ i18n "pricing_hub_self_hosted_title" . }} + {{ i18n "pricing_hub_self_hosted_title" . }}

@@ -219,20 +353,20 @@

  • - + {{ i18n "hub_deployment_self_hosted_benefit_1" . }}
  • - + {{ i18n "hub_deployment_self_hosted_benefit_2" . }}
  • - + {{ i18n "hub_deployment_self_hosted_benefit_3" . }}
- + {{ i18n "pricing_hub_self_hosted_cta" . }}
@@ -264,7 +398,7 @@

{{ i18n "faq_title" . }}

{{ i18n "hub_contact_us_title" . }}

{{ i18n "hub_contact_us_description" . | safeHTML }}

- + {{ i18n "hub_contact_us_button" . }}
@@ -276,7 +410,7 @@

{{ i18n "hub_newsletter_title" . }}

{{ i18n "hub_newsletter_instruction" . | safeHTML }}

- @@ -292,8 +426,8 @@

{{ i18n "hub_newsletter_title" . }}

- - + +

{{ end }} diff --git a/layouts/hub-billing/single.html b/layouts/hub-billing/single.html index 352614c37..110e18137 100644 --- a/layouts/hub-billing/single.html +++ b/layouts/hub-billing/single.html @@ -59,7 +59,7 @@

{{ i18n "hub_billing_createsession_found_description" . }}

- @@ -73,7 +73,7 @@

- @@ -122,7 +122,7 @@

{{ i18n "hub_billing_loadfailed_description" . }}

- + {{ i18n "hub_contact_us_button" . }}

@@ -159,7 +159,7 @@

{{ .Title }}

{{ i18n "hub_billing_manage_status_quantity_description" . }}:

- @@ -186,11 +186,11 @@

{{ .Title }}

- - @@ -209,7 +209,7 @@

{{ .Title }}

{{ i18n "hub_billing_manage_payment_info_invoice" . }}

- @@ -229,9 +229,9 @@

{{ .Title }}

-
+
- +
@@ -245,8 +245,8 @@

- @@ -268,9 +268,9 @@

-
+
- +
@@ -301,13 +301,13 @@

- + {{ i18n "hub_billing_manage_next_payment_date_description" . }}:

- + {{ i18n "hub_billing_manage_change_quantity_confirmation_increase_warning_invoice" . }}

@@ -326,20 +326,20 @@

- + {{ i18n "hub_billing_manage_change_quantity_confirmation_prorated_invoice" . }}: {{ $inclVat }}

- + {{ i18n "hub_billing_manage_change_quantity_confirmation_credited_invoice" . }}: {{ $inclVat }}

{{/* no VAT note here: available credit pools the account's credit notes, which need not share this subscription's tax */}}

- + {{ i18n "hub_billing_manage_change_quantity_confirmation_available_credit_invoice" . }}:

- + {{ i18n "hub_billing_manage_change_quantity_confirmation_new_recurring_invoice" . }}:

@@ -348,13 +348,13 @@

- {{/* Paddle Classic fills nextPayment and EspoCRM fills invoicePreview, so a quote arrived when either is set. The customer must not commit a change whose price the page cannot show. */}} - @@ -429,7 +429,7 @@

{{ i18n "hub_billing_checkout_invoice_price_error" . }}

- @@ -516,8 +516,8 @@

-
- @@ -549,8 +549,8 @@

{{ .Title }}

-
-

+
+

{{ i18n "hub_billing_checkout_community_title" . }}

@@ -567,15 +567,15 @@

{{ i18n "hub_billing_checkout_community_subtitle" . }}

-
+
- +

{{ i18n "hub_billing_checkout_community_cta" . }}

- + {{ i18n "hub_billing_checkout_community_action" . }} @@ -583,15 +583,15 @@

-
-

+
+

{{ i18n "hub_billing_checkout_standard_title" . }}

{{ i18n "hub_billing_monthly" . }} - @@ -682,7 +682,7 @@

{{ 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") }} - @@ -698,7 +698,7 @@

{{ i18n "hub_billing_checkout_invoice_non_eu_hint" . }}

- @@ -708,8 +708,8 @@

-
-

+
+

{{ i18n "hub_billing_checkout_enterprise_title" . }}

@@ -726,15 +726,15 @@

{{ i18n "hub_billing_checkout_enterprise_subtitle" . }}

-
+
- +

{{ i18n "hub_billing_checkout_enterprise_cta" . }}

- + {{ i18n "hub_billing_checkout_enterprise_action" . }} @@ -766,11 +766,11 @@

{{ i18n "faq_title" . }}

{{ .Title }}

- + {{ i18n "hub_billing_checkout_success_description" . }}

- + {{ i18n "hub_billing_checkout_success_invoice_description" . }}

{{ partial "hub-license-block.html" . }} diff --git a/layouts/hub-demo/single.html b/layouts/hub-demo/single.html index 5809ba7f5..d9e940e98 100644 --- a/layouts/hub-demo/single.html +++ b/layouts/hub-demo/single.html @@ -40,7 +40,7 @@

{{ i18n "hub_demo_success_url" }}:
-
+
{{ i18n "hub_demo_success_username" }}:
@@ -61,7 +61,7 @@

{{ i18n "hub_demo_instruction" }}

- {{ $challengeUrl := printf "%s/connect/store/challenge" .Site.Params.apiBaseUrl }} @@ -74,7 +74,7 @@

{{ i18n "hub_demo_contact_us_title" . }}

{{ i18n "hub_demo_contact_us_description" . | safeHTML }}

- + {{ i18n "hub_demo_contact_us_button" . }}
diff --git a/layouts/hub-managed/single.html b/layouts/hub-managed/single.html index a5c1c11d3..1e276c0af 100644 --- a/layouts/hub-managed/single.html +++ b/layouts/hub-managed/single.html @@ -24,7 +24,7 @@

{{ .Title }}

-
@@ -37,10 +37,10 @@

{{ .Title }}

@@ -72,7 +72,7 @@

- @@ -101,7 +101,7 @@

.{{ .Site.Params.hubManagedDomain }}'" readonly>

- @@ -126,7 +126,7 @@

- @@ -168,7 +168,7 @@

{{ 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 @@

- @@ -229,7 +229,7 @@

{{ i18n "hub_managed_contact_us_title" . }}

{{ i18n "hub_managed_contact_us_description" . | safeHTML }}

- + {{ i18n "hub_managed_contact_us_button" . }}
diff --git a/layouts/hub-register/single.html b/layouts/hub-register/single.html index d9f4a4f04..31cbbb2b4 100644 --- a/layouts/hub-register/single.html +++ b/layouts/hub-register/single.html @@ -23,7 +23,7 @@

{{ .Title }}

-
@@ -35,7 +35,7 @@

{{ .Title }}