taler-www

Main taler.net website
Log | Files | Refs | Submodules | README | LICENSE

commit bb8aadda674e2aa3c78eeba3b0f4f5d2b3c6f0e4
parent 8d26ff3a604ef2ce6bc7404c276a31baf70ed1fa
Author: Florian Dold <dold@taler.net>
Date:   Tue, 25 Aug 2026 22:23:55 +0200

wallet page: organize downloads by platform

Diffstat:
Mstatic/styles.css | 280++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
Mtemplate/wallet.html.j2 | 373+++++++++++++++++++++++++++++--------------------------------------------------
2 files changed, 408 insertions(+), 245 deletions(-)

diff --git a/static/styles.css b/static/styles.css @@ -19,19 +19,281 @@ ul nav { background-color: #A5C663; } -.wallet-teaser-text { - padding-bottom: 2em; +.wallet-page { + --wallet-blue: #0042b3; + --wallet-blue-dark: #003281; + --wallet-blue-light: #eef4ff; + --wallet-border: #d8dee8; + --wallet-muted: #545b66; +} + +.wallet-hero { + background: linear-gradient(135deg, #f7faff 0%, #eef4ff 100%); + border-bottom: 1px solid var(--wallet-border); + padding: 3.5rem 1rem 3rem; + text-align: center; } -.install-button { - border: none; - padding: 8px 8px; - background-color: #0042b3; +#body_content .wallet-hero .container { + margin-bottom: 0; + max-width: 800px; + padding-bottom: 0; + padding-top: 0; +} + +.wallet-hero h1 { + font-size: clamp(2.25rem, 5vw, 3.5rem); + font-weight: 700; + letter-spacing: -0.03em; + margin-bottom: 1rem; +} + +.wallet-lead { + color: #303641; + font-size: 1.2rem; + line-height: 1.6; + margin: 0 auto; + max-width: 720px; +} + +.wallet-highlights { + display: flex; + flex-wrap: wrap; + gap: 0.75rem 1.5rem; + justify-content: center; + list-style: none; + margin: 1.5rem 0 0; + padding: 0; +} + +.wallet-highlights li::before { + color: #357a22; + content: "\2713"; + font-weight: 700; + margin-right: 0.4rem; +} + +#body_content .wallet-content { + max-width: 1120px; + padding-bottom: 0; + padding-top: 1rem; +} + +.wallet-section { + margin-top: 3.5rem; +} + +.wallet-section-heading { + margin-bottom: 1.25rem; +} + +.wallet-section-heading h2, +.wallet-demo h2, +.wallet-resources h2 { + font-size: clamp(1.6rem, 3vw, 2rem); + font-weight: 650; + margin-bottom: 0.35rem; +} + +.wallet-section-heading p { + color: var(--wallet-muted); + margin: 0; +} + +.wallet-grid { + display: grid; + gap: 1.5rem; + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.wallet-card { + background: #fff; + border: 1px solid var(--wallet-border); + border-radius: 0.75rem; + box-shadow: 0 0.25rem 1rem rgba(21, 39, 68, 0.06); + display: flex; + flex-direction: column; + justify-content: space-between; + min-height: 250px; + padding: 1.5rem; +} + +.wallet-card h3 { + font-size: 1.65rem; + margin-bottom: 0.65rem; +} + +.wallet-card p:not(.wallet-platform-label) { + color: var(--wallet-muted); +} + +.wallet-platform-label { + color: var(--wallet-blue); + font-size: 0.8rem; + font-weight: 700; + letter-spacing: 0.08em; + margin-bottom: 0.45rem; + text-transform: uppercase; +} + +.wallet-actions { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; + margin-top: 1.5rem; +} + +#body_content .wallet-page a.wallet-button { + align-items: center; + border: 2px solid var(--wallet-blue); + border-radius: 0.4rem; + display: inline-flex; + font-weight: 600; + justify-content: center; + min-height: 44px; + padding: 0.55rem 1rem; + text-align: center; + text-decoration: none; +} + +#body_content .wallet-page a.wallet-button-primary, +#body_content .wallet-page a.wallet-button-primary:link, +#body_content .wallet-page a.wallet-button-primary:visited { + background: var(--wallet-blue); color: #fff; } -.extension.row>.col-lg-6 { - padding-bottom: 2em; +#body_content .wallet-page a.wallet-button-primary:hover { + background: var(--wallet-blue-dark); + border-color: var(--wallet-blue-dark); + color: #fff; +} + +#body_content .wallet-page a.wallet-button-secondary, +#body_content .wallet-page a.wallet-button-secondary:link, +#body_content .wallet-page a.wallet-button-secondary:visited { + background: #fff; + color: var(--wallet-blue-dark); +} + +#body_content .wallet-page a.wallet-button-secondary:hover { + background: var(--wallet-blue-light); + color: var(--wallet-blue-dark); +} + +#body_content .wallet-page a.wallet-button:focus-visible { + outline: 3px solid #f5a623; + outline-offset: 3px; +} + +.wallet-advanced-options { + border-bottom: 1px solid var(--wallet-border); +} + +.wallet-advanced-options details { + border-top: 1px solid var(--wallet-border); + padding: 0; +} + +.wallet-advanced-options summary { + cursor: pointer; + font-size: 1.15rem; + font-weight: 650; + padding: 1.15rem 0.25rem; +} + +.wallet-advanced-options summary:focus-visible { + outline: 3px solid #f5a623; + outline-offset: 3px; +} + +.wallet-details-content { + max-width: 800px; + padding: 0 0.25rem 1.5rem 1.5rem; +} + +.wallet-warning { + background: #fff7e6; + border-left: 4px solid #b96a00; + padding: 0.85rem 1rem; +} + +.wallet-demo { + align-items: center; + background: var(--wallet-blue-light); + border-left: 5px solid var(--wallet-blue); + border-radius: 0.5rem; + display: flex; + gap: 2rem; + justify-content: space-between; + margin-top: 4rem; + padding: 1.75rem 2rem; +} + +.wallet-demo p { + margin-bottom: 0; +} + +.wallet-demo .wallet-button { + flex: 0 0 auto; +} + +.wallet-resources { + margin: 3.5rem 0 1rem; +} + +.wallet-resources ul { + display: flex; + flex-wrap: wrap; + gap: 0.75rem 1.75rem; + list-style: none; + margin: 1rem 0 0; + padding: 0; +} + +.wallet-resources a { + font-weight: 550; +} + +@media (max-width: 767.98px) { + .wallet-hero { + padding: 2.5rem 0.5rem 2.25rem; + } + + .wallet-highlights { + align-items: center; + flex-direction: column; + gap: 0.5rem; + } + + .wallet-section { + margin-top: 2.75rem; + } + + .wallet-grid { + grid-template-columns: 1fr; + } + + .wallet-card { + min-height: auto; + } + + .wallet-actions { + align-items: stretch; + flex-direction: column; + } + + .wallet-demo { + align-items: flex-start; + flex-direction: column; + gap: 1rem; + margin-top: 3rem; + padding: 1.5rem; + } + + .wallet-demo .wallet-button { + width: 100%; + } } a, @@ -110,7 +372,7 @@ footer { } .btn-dark { - background-color: #9d9d9d; + background-color: #595959; } diff --git a/template/wallet.html.j2 b/template/wallet.html.j2 @@ -1,257 +1,158 @@ {% extends "common/base.j2" %} -{% block subtitle %}{{ _("Wallets")}}{% endblock subtitle %} -{% block head_content %} -<link rel="chrome-webstore-item" href="https://chrome.google.com/webstore/detail/millncjiddlpgdmkklmhfadpacifaonc" /> -<script type="application/javascript"> -/* - @licstart The following is the entire license notice for the - JavaScript code in this page. - - Copyright (C) 2015-2020 Taler Systems SA - - The JavaScript code in this page is free software: you can - redistribute it and/or modify it under the terms of the GNU - Lesser General Public License (GNU LGPL) as published by the Free Software - Foundation, either version 2.1 of the License, or (at your option) - any later version. The code is distributed WITHOUT ANY WARRANTY; - without even the implied warranty of MERCHANTABILITY or FITNESS - FOR A PARTICULAR PURPOSE. See the GNU LGPL for more details. - - As additional permission under GNU LGPL version 2.1 section 7, you - may distribute non-source (e.g., minimized or compacted) forms of - that code without the copy of the GNU LGPL normally required by - section 4, provided you include this license notice and a URL - through which recipients can access the Corresponding Source. - - @licend The above is the entire license notice - for the JavaScript code in this page. -*/ - -var chrome_min_version = 51; - -function installWallet() { - if (window.chrome) { - chrome.webstore.install("https://chrome.google.com/webstore/detail/millncjiddlpgdmkklmhfadpacifaonc", onSuccess, onFailure); - } else { - onFailure("Google Chrome or Chromium is required for installation."); - } -} - -try { - taler.onPresent(function () { - document.getElementById("box-present").style.display = "inherit"; - document.getElementById("box-not-present").style.display = "none"; - }); - taler.onAbsent(function () { - document.getElementById("box-present").style.display = "none"; - document.getElementById("box-not-present").style.display = "inherit"; - }); -} catch (err) {} - -function onLoad() { - if (typeof window.chrome != "object") { - document.getElementById("error-chrome").style.display = "inherit"; - } else { - var m = navigator.userAgent.match(/Chrome\/([0-9.]+)/); - if (null == m || m[1].split('.')[0] < chrome_min_version) { - document.getElementById('chrome-min-version').appendChild(document.createTextNode(chrome_min_version)); - document.getElementById('error-chrome-version').style.display = "inherit"; - } - } -} - -document.addEventListener('DOMContentLoaded', onLoad); -</script> - -<style type="text/css"> - .greenbox { - background-color: #5EFF64; - border: solid; - border-radius: 5px; - padding: 0.5em; - } - .bluebox { - background-color: #C2C6FF; - border: solid; - border-radius: 5px; - padding: 0.5em; - } - .error { - font-style: italic; - display: none; - } - #install-result { - font-weight: bold; - } - - main ul li { - margin-bottom: 1em; - } -</style> -{% endblock head_content %} +{% block subtitle %}{{ _("Wallet") }}{% endblock subtitle %} {% block body_content %} -<main id="maincontent"> - <div class="jumbotron"> - <div class="text-center"> - <h1 lang="en">{% trans %}Taler Wallet{% endtrans %}</h1> - </div> +<main id="maincontent" class="wallet-page"> + <header class="wallet-hero"> + <div class="container"> + <h1>{% trans %}Get the GNU Taler Wallet{% endtrans %}</h1> + <p class="wallet-lead"> + {% trans %}Install the free software wallet to make fast, privacy-friendly payments with GNU Taler. Choose your device or browser below.{% endtrans %} + </p> + <ul class="wallet-highlights"> + <li>{% trans %}No registration required{% endtrans %}</li> + <li>{% trans %}Free software{% endtrans %}</li> + <li>{% trans %}Privacy by design{% endtrans %}</li> + </ul> </div> + </header> - <div class="container"> - <div class="row"> - <div class="col-lg-6"> - <h2>{% trans %}Android 7.0 (API 24) or later{% endtrans %}</h2> - <ul> - <li> - <p> - {% trans %}You can <a href="https://taler.net/files/wallet/wallet-nightly-debug-latest.apk" target="_blank" rel="noopener noreferrer">directly download the APK for Android.</a>{% endtrans %} - </p> - </li> - <li> - <a href="https://play.google.com/store/apps/details?id=net.taler.wallet" target="_blank" rel="noopener noreferrer"> - {% trans %}Install the Taler wallet app for Android from the Google Play Store.{% endtrans %} - </a> - </li> - <li> - <a href="https://f-droid.org/en/packages/net.taler.wallet.fdroid/" target="_blank" rel="noopener noreferrer"> - {% trans %}Download the Android app from F-Droid (bypassing Google registration).{% endtrans %} - </a> - </li> - </ul> + <div class="container wallet-content"> + <section class="wallet-section" aria-labelledby="mobile-wallets-heading"> + <div class="wallet-section-heading"> + <h2 id="mobile-wallets-heading">{% trans %}Mobile wallets{% endtrans %}</h2> + <p>{% trans %}Install Taler from the app store for your phone or tablet.{% endtrans %}</p> </div> - <div class="col-lg-6"> - <h2>{% trans %}Ubuntu Touch{% endtrans %}</h2> - <ul> - <li> - <p>{% trans %}You can run the Taler wallet app for Android by installing <a href="https://waydro.id/" target="_blank" rel="noopener noreferrer">Waydroid</a> using - <a href="https://open-store.io/app/waydroidhelper.aaronhafer" target="_blank" rel="noopener noreferrer">Waydroid Helper.</a> - More info about running Android apps on Ubuntu Touch can be found in <a href="https://docs.ubports.com/en/latest/userguide/dailyuse/waydroid.html" target="_blank" rel="noopener noreferrer">the UBports docs.</a>{% endtrans %}</p> - </li> - <li> - <p>{% trans %}After successfully installing Waydroid you can either - <a href="https://taler.net/files/wallet/wallet-nightly-debug-latest.apk" target="_blank" rel="noopener noreferrer"> - directly download the APK for Android,</a>{% endtrans %}</p> - </li> - <li> - <a href="https://f-droid.org/en/packages/net.taler.wallet.fdroid/" target="_blank" rel="noopener noreferrer"> - {% trans %} or download the Android app from F-Droid.{% endtrans %} + <div class="wallet-grid"> + <article class="wallet-card"> + <div> + <p class="wallet-platform-label">{% trans %}Mobile{% endtrans %}</p> + <h3>{% trans %}Android{% endtrans %}</h3> + <p>{% trans %}Requires Android 7 or later.{% endtrans %}</p> + </div> + <div class="wallet-actions"> + <a class="wallet-button wallet-button-primary" + href="https://play.google.com/store/apps/details?id=net.taler.wallet"> + {% trans %}Get it on Google Play{% endtrans %} </a> - </li> - </ul> + <a class="wallet-button wallet-button-secondary" + href="https://f-droid.org/en/packages/net.taler.wallet.fdroid/"> + {% trans %}Get it on F-Droid{% endtrans %} + </a> + </div> + </article> + + <article class="wallet-card"> + <div> + <p class="wallet-platform-label">{% trans %}Mobile{% endtrans %}</p> + <h3>{% trans %}iPhone and iPad{% endtrans %}</h3> + <p>{% trans %}Install the Taler wallet from Apple&#39;s App Store.{% endtrans %}</p> + </div> + <div class="wallet-actions"> + <a class="wallet-button wallet-button-primary" + href="https://apps.apple.com/app/taler-wallet/id6463440117"> + {% trans %}Download on the App Store{% endtrans %} + </a> + </div> + </article> </div> + </section> - <div class="col-lg-6"> - <h2>iOS</h2> - <p> - {% trans %}The Taler wallet for iOS is available in the - <a href="https://apps.apple.com/app/taler-wallet/id6463440117" target="_blank" rel="noopener noreferrer">App Store</a>.{% endtrans %} - </p> - </p> + <section class="wallet-section" aria-labelledby="browser-wallets-heading"> + <div class="wallet-section-heading"> + <h2 id="browser-wallets-heading">{% trans %}Browser extensions{% endtrans %}</h2> + <p>{% trans %}Use Taler directly in a supported desktop browser.{% endtrans %}</p> </div> - <div class="col-lg-12"> - <p class="greenbox" id="box-present" style="display:none"> - {% trans %}Congratulations, the Taler wallet is installed on your device. - Check out the <a href="https://demo.taler.net/">demonstration</a>.{% endtrans %} - </p> - <p class="bluebox" id="box-not-present" style="display:none"> - {% trans %}You don&#39;t have a wallet installed yet.{% endtrans %} - </p> + <div class="wallet-grid"> + <article class="wallet-card"> + <div> + <p class="wallet-platform-label">{% trans %}Browser extension{% endtrans %}</p> + <h3>{% trans %}Chrome and Chromium{% endtrans %}</h3> + <p>{% trans %}Install the extension from the Chrome Web Store.{% endtrans %}</p> + </div> + <div class="wallet-actions"> + <a class="wallet-button wallet-button-primary" + href="https://chromewebstore.google.com/detail/gnu-taler-wallet-web-ui/millncjiddlpgdmkklmhfadpacifaonc"> + {% trans %}Add to Chrome{% endtrans %} + </a> + </div> + </article> + + <article class="wallet-card"> + <div> + <p class="wallet-platform-label">{% trans %}Browser extension{% endtrans %}</p> + <h3>{% trans %}Firefox{% endtrans %}</h3> + <p>{% trans %}Install the extension from Firefox Browser Add-ons.{% endtrans %}</p> + </div> + <div class="wallet-actions"> + <a class="wallet-button wallet-button-primary" + href="https://addons.mozilla.org/en-US/firefox/addon/taler-wallet/"> + {% trans %}Add to Firefox{% endtrans %} + </a> + </div> + </article> </div> - </div> - - <div class="row extension"> - <div class="col-lg-6"> - <h2><a href="https://chrome.google.com/webstore/detail/gnu-taler-wallet/millncjiddlpgdmkklmhfadpacifaonc" target="_blank" rel="noopener noreferrer"> - {% trans %}Google Chrome / Chromium 51+{% endtrans %}</a></h2> - <div id="inline-install-chrome"> - <form target="_blank" action="https://chrome.google.com/webstore/detail/gnu-taler-wallet/millncjiddlpgdmkklmhfadpacifaonc"> - <button action="submit" class="install-button"> - {% trans %}Install wallet{% endtrans %} - </button> - </form> - <noscript> - <em style="color:darkred;"> - {% trans %}JavaScript is disabled, the installation won&#39;t work.{% endtrans %} - </em> - </noscript> - <div id="install-result"></div> - </div> - <p id="error-chrome" class="error"> - {% trans %}<a href="https://www.google.com/chrome" target="_blank" rel="noopener noreferrer">Google Chrome</a> or - <a href="https://www.chromium.org/" target="_blank" rel="noopener noreferrer">Chromium</a> - is required, but it appears you don&#39;t have it installed.{% endtrans %} - </p> - <p id="error-chrome-version" class="error"> - {% trans %}<a href="https://www.google.com/chrome" target="_blank" rel="noopener noreferrer">Google Chrome</a> or - <a href="https://www.chromium.org/" target="_blank" rel="noopener noreferrer">Chromium</a> - version <span id="chrome-min-version"></span> or newer is required, - but it appears you have an older version.{% endtrans %} - </p> - </div> - - <div class="col-lg-6"> - <h2><a href="https://addons.mozilla.org/en-US/firefox/addon/taler-wallet/" target="_blank" rel="noopener noreferrer"> - {% trans %}Mozilla Firefox 57+{% endtrans %}</a></h2> - <div id="inline-install-chrome"> - <form action="https://addons.mozilla.org/firefox/downloads/latest/taler-wallet/"> - <button action="submit" class="install-button"> - {% trans %}Install wallet{% endtrans %} - </button> - </form> - </div> + </section> - <!-- - <h3>Firefox Beta</h3> - <ol> - <li><a href="{{ url('releases/taler-wallet/taler-wallet-stable.xpi', virtual=True) }}">Download the wallet</a> (right click, Save Link As...)</li> - <li>On the <code>about:debugging</code> page, "Load temporary extension"</li> - </ol> - - <h3>Firefox Developer Edition</h3> - <p>Either from the <code>about:debugging</code> page like above, or:</p> - <ol> - <li>On the <code>about:config</code> page set <code>xpinstall.signatures.required</code> to <code>false</code></li> - <li><a href="/releases/taler-wallet/taler-wallet-stable.xpi">Install the wallet</a></li> - </ol> - --> + <section class="wallet-section" aria-labelledby="advanced-wallets-heading"> + <div class="wallet-section-heading"> + <h2 id="advanced-wallets-heading">{% trans %}Other and advanced options{% endtrans %}</h2> + <p>{% trans %}Alternative installation methods for specialist devices and testing.{% endtrans %}</p> </div> - <div class="col-lg-6"> - <h2>{% trans %}Opera 36+{% endtrans %}</h2> - - <ol> - <li> - {% trans %}Install a Chrome extension for Opera{% endtrans %} + <div class="wallet-advanced-options"> + <details> + <summary>{% trans %}Ubuntu Touch{% endtrans %}</summary> + <div class="wallet-details-content"> + <p> + {% trans %}Run the Android wallet on Ubuntu Touch by installing <a href="https://waydro.id/">Waydroid</a> with <a href="https://open-store.io/app/waydroidhelper.aaronhafer">Waydroid Helper</a>. The <a href="https://docs.ubports.com/en/latest/userguide/dailyuse/waydroid.html">UBports documentation</a> explains how to set up Android apps.{% endtrans %} + </p> + <a class="wallet-button wallet-button-secondary" + href="https://f-droid.org/en/packages/net.taler.wallet.fdroid/"> + {% trans %}Get the Android wallet from F-Droid{% endtrans %} </a> - </li> - <li> - {% trans %}<a href="https://chrome.google.com/webstore/detail/gnu-taler-wallet/millncjiddlpgdmkklmhfadpacifaonc" target="_blank" rel="noopener noreferrer"> - Install the Taler wallet from the Chrome Web Store</a>{% endtrans %} - </li> - </ol> + </div> + </details> + + <details> + <summary>{% trans %}Android nightly test build{% endtrans %}</summary> + <div class="wallet-details-content"> + <p class="wallet-warning"> + {% trans %}For testing only. This automatically built debug version may be unstable. Most users should install the wallet from Google Play or F-Droid.{% endtrans %} + </p> + <a class="wallet-button wallet-button-secondary" + href="https://taler.net/files/wallet/wallet-nightly-debug-latest.apk"> + {% trans %}Download the nightly debug APK{% endtrans %} + </a> + </div> + </details> </div> - </div> + </section> - <div class="row extension"> - - <div class="col-lg-6"> - <h2>{% trans %}Other browsers{% endtrans %}</h2> - <p> - {% trans %}Wallets for other browsers will be provided in the near future.{% endtrans %} - </p> - </div> - <div class="row wallet-teaser-text"> - <div class="col-lg-12"> - <form action="{{ "https://demo.taler.net/" + lang + "/" }}" target="_blank" rel="noopener noreferrer" style="display:inline;"> - <button type="submit" class="btn btn-primary">{{ _("Try Demo!")}}</button></br> - </form> - {% trans %}After installing a Taler wallet, you can try out the demonstration on the <a href="https://demo.taler.net">demo page</a>. - The source code for Taler wallets is provided <a href="https://git-www.taler.net/taler-typescript-core.git" target="_blank" rel="noopener noreferrer">here</a>.{% endtrans %} - </div> + <section class="wallet-demo" aria-labelledby="wallet-demo-heading"> + <div> + <h2 id="wallet-demo-heading">{% trans %}Wallet installed? Try a test payment{% endtrans %}</h2> + <p>{% trans %}Explore GNU Taler with KUDOS, an imaginary demo currency. No real money is involved.{% endtrans %}</p> </div> - </div> -</div> + <a class="wallet-button wallet-button-primary" + href="{{ "https://demo.taler.net/" + lang + "/" }}"> + {% trans %}Try the demo{% endtrans %} + </a> + </section> + + <section class="wallet-resources" aria-labelledby="wallet-resources-heading"> + <h2 id="wallet-resources-heading">{% trans %}Help and project information{% endtrans %}</h2> + <ul> + <li><a href="https://docs.taler.net/wallet/index.html">{% trans %}Wallet manuals{% endtrans %}</a></li> + <li><a href="{{ url_localized('faq.html') }}">{% trans %}Wallet FAQ{% endtrans %}</a></li> + <li><a href="{{ url_localized('wallet-privacy-policy.html') }}">{% trans %}Mobile wallet privacy policy{% endtrans %}</a></li> + <li><a href="{{ url_localized('wallet-webextension-privacy-policy.html') }}">{% trans %}Browser extension privacy policy{% endtrans %}</a></li> + <li><a href="https://bugs.taler.net/">{% trans %}Report a problem{% endtrans %}</a></li> + <li><a href="https://git.taler.net/taler/taler-typescript-core/">{% trans %}View the wallet source code{% endtrans %}</a></li> + </ul> + </section> + </div> +</main> {% endblock body_content %}