diff --git a/src/cryptoadvance/specter/managers/config_manager.py b/src/cryptoadvance/specter/managers/config_manager.py index 340403e44..5bc6ca5f5 100644 --- a/src/cryptoadvance/specter/managers/config_manager.py +++ b/src/cryptoadvance/specter/managers/config_manager.py @@ -185,7 +185,7 @@ class ConfigManager(GenericDataManager): def update_tor_type(self, tor_type, user): """update the Tor type to use""" - if self.data.get("tor_type", "builtin") != tor_type: + if self.data.get("tor_type") != tor_type: self.data["tor_type"] = tor_type self._save() @@ -205,7 +205,6 @@ class ConfigManager(GenericDataManager): if self.data["tor_control_port"] != tor_control_port: self.data["tor_control_port"] = tor_control_port self._save() - self.update_tor_controller() def generate_torrc_password(self, overwrite=False): if "torrc_password" not in self.data or overwrite: diff --git a/src/cryptoadvance/specter/server_endpoints/filters.py b/src/cryptoadvance/specter/server_endpoints/filters.py index aaed69c53..435dc6a19 100644 --- a/src/cryptoadvance/specter/server_endpoints/filters.py +++ b/src/cryptoadvance/specter/server_endpoints/filters.py @@ -137,11 +137,7 @@ def altunit(context, value): if value < 0: return "-" if app.specter.price_check and (app.specter.alt_rate and app.specter.alt_symbol): - rate = ( - "{:,.2f}".format(float(value) * float(app.specter.alt_rate)) - .rstrip("0") - .rstrip(".") - ) + rate = "{:,.0f}".format(float(value) * float(app.specter.alt_rate)) if app.specter.alt_symbol in ["$", "£"]: return app.specter.alt_symbol + rate else: diff --git a/src/cryptoadvance/specter/server_endpoints/settings.py b/src/cryptoadvance/specter/server_endpoints/settings.py index 35ac05559..15ee9e584 100644 --- a/src/cryptoadvance/specter/server_endpoints/settings.py +++ b/src/cryptoadvance/specter/server_endpoints/settings.py @@ -222,7 +222,7 @@ def general(): @login_required def tor(): """ - controls the tor related settings + Controls the Tor related settings GET for displaying the page, POST for updates param action might be "save", "test_tor" or "toggle_hidden_service" param proxy_url the Tor deamon url, usually something like socks5h://localhost:9050 @@ -235,6 +235,7 @@ def tor(): current_version = notify_upgrade(app, flash) proxy_url = app.specter.proxy_url only_tor = app.specter.only_tor + unselectOnlyTor = False tor_control_port = app.specter.tor_control_port tor_type = app.specter.tor_type # This is true if the Python interpreter has been bundled with the application into a single executable, so basically it is true for the apps but not for pip-installations @@ -248,17 +249,64 @@ def tor(): hidden_service = request.form.get("hidden_service") == "on" if action == "save": - logger.info("Updating Tor settings...") - app.specter.update_tor_type(tor_type, current_user) + # Remove the built-in Tor setup if the user has it and is checking the "Disabled" radio button + if tor_type == "disabled" and app.specter.tor_type == "builtin": + if app.specter.is_tor_dameon_running(): + app.specter.tor_daemon.stop_tor_daemon() + shutil.rmtree(os.path.join(app.specter.data_folder, "tor-binaries")) + os.remove(os.path.join(app.specter.data_folder, "torrc")) + flash("Tor disabled. Built-in Tor setup uninstalled") + # Also reset Tor only mode if it was used + if app.specter.only_tor: + unselectOnlyTor = True + app.specter.update_only_tor(False, current_user) + # Reset Tor only mode if it was used if user chooses the disable option + if tor_type == "disabled" and app.specter.tor_type == "custom": + if app.specter.only_tor: + unselectOnlyTor = True + app.specter.update_only_tor(False, current_user) if tor_type == "custom": - app.specter.update_proxy_url(proxy_url, current_user) - app.specter.update_tor_control_port(tor_control_port, current_user) + # Only save the custom setup if we can connect + try: + requests_session = requests.Session() + requests_session.proxies["http"] = proxy_url + requests_session.proxies["https"] = proxy_url + res = requests_session.get( + "http://2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion/", # Tor Project onion v3 website + timeout=30, + ) + if res.status_code == 200: + app.specter.update_proxy_url(proxy_url, current_user) + app.specter.update_tor_control_port( + tor_control_port, current_user + ) + flash(_("Custom Tor setup is working and saved!"), "info") + except Exception: + flash( + _("Custom Tor setup is not working and couldn't be saved!"), + "error", + ) + return redirect(request.referrer or "/") else: proxy_url = "socks5h://localhost:9050" tor_control_port = "" - app.specter.update_only_tor(only_tor, current_user) + logger.info("Updating Tor settings...") + app.specter.update_tor_type(tor_type, current_user) + + # Updates "only_tor" to True only if tor_type is not "disabled"; setting to False without check for existing Tor config + if only_tor == True: + if tor_type == "disabled": + flash( + "You can't enforce to use Tor with Tor being disabled.", "error" + ) + unselectOnlyTor = True + else: + app.specter.update_only_tor(only_tor, current_user) + else: + app.specter.update_only_tor(only_tor, current_user) + if hidden_service != app.specter.config["tor_status"]: if not app.config["DEBUG"]: if app.specter.config["auth"].get("method", "none") == "none": @@ -302,19 +350,25 @@ def tor(): logger.info("Starting Tor...") try: app.specter.tor_daemon.start_tor_daemon() + if only_tor: + app.specter.update_only_tor(True, current_user) flash(_("Specter has started Tor")) except Exception as e: flash(_("Failed to start Tor, error: {}").format(e), "error") logger.error(f"Failed to start Tor, error: {e}") + elif action == "stoptor": logger.info("Stopping Tor...") try: app.specter.tor_daemon.stop_tor_daemon() - time.sleep(1) + time.sleep(2) + if app.specter.only_tor: + unselectOnlyTor = True + app.specter.update_only_tor(False, current_user) flash(_("Specter stopped Tor successfully")) except Exception as e: flash(_("Failed to stop Tor, error: {}").format(e), "error") - logger.exception(f"Failed to start Tor, error: {e}", e) + logger.exception(f"Failed to stop Tor, error: {e}", e) elif action == "uninstalltor": logger.info("Uninstalling Tor...") try: @@ -322,6 +376,8 @@ def tor(): app.specter.tor_daemon.stop_tor_daemon() shutil.rmtree(os.path.join(app.specter.data_folder, "tor-binaries")) os.remove(os.path.join(app.specter.data_folder, "torrc")) + tor_type = "disabled" + app.specter.update_tor_type(tor_type, current_user) flash(_("Tor uninstalled successfully")) except Exception as e: flash(_("Failed to uninstall Tor, error: {}").format(e), "error") @@ -377,6 +433,7 @@ def tor(): tor_builtin_possible=tor_builtin_possible, proxy_url=proxy_url, only_tor=only_tor, + unselectOnlyTor=unselectOnlyTor, tor_control_port=tor_control_port, tor_service_id=app.tor_service_id, torbrowser_installed=os.path.isfile(app.specter.torbrowser_path), diff --git a/src/cryptoadvance/specter/specter.py b/src/cryptoadvance/specter/specter.py index f3c2f0ab2..af0e05126 100644 --- a/src/cryptoadvance/specter/specter.py +++ b/src/cryptoadvance/specter/specter.py @@ -168,7 +168,7 @@ class Specter: if self.tor_type == "builtin" and os.path.isfile(self.torbrowser_path): self.tor_daemon.start_tor_daemon() - if self.tor_type != "none": + if self.tor_type != "disabled": self.update_tor_controller() self.checker = Checker(lambda: self.check(check_all=True), desc="health") @@ -402,13 +402,13 @@ class Specter: # mark def update_tor_control_port(self, tor_control_port, user): """set the control port of the tor daemon""" - if self.config_manager.update_tor_control_port: - self.update_tor_controller() + self.config_manager.update_tor_control_port(tor_control_port, user) # mark def generate_torrc_password(self, overwrite=False): self.config_manager.generate_torrc_password(overwrite) + # This is only used for the custom Tor setup, the built-in setup uses TorDaemonController def update_tor_controller(self): if "torrc_password" not in self.config: # Will be missing if the user did not go through the built-in Tor setup @@ -614,7 +614,7 @@ class Specter: @property def tor_type(self): - return self.user_config.get("tor_type", "none") + return self.user_config.get("tor_type", "disabled") @property def proxy_url(self): diff --git a/src/cryptoadvance/specter/static/output.css b/src/cryptoadvance/specter/static/output.css index 24f3cdadb..2e40f6e3a 100644 --- a/src/cryptoadvance/specter/static/output.css +++ b/src/cryptoadvance/specter/static/output.css @@ -1,5 +1,5 @@ /* -! tailwindcss v3.2.7 | MIT License | https://tailwindcss.com +! tailwindcss v3.2.4 | MIT License | https://tailwindcss.com */ /* @@ -1072,6 +1072,14 @@ input[type="number"]::-webkit-outer-spin-button, right: 0px; } +.right-2 { + right: 0.5rem; +} + +.top-2 { + top: 0.5rem; +} + .right-0\.5 { right: 0.125rem; } @@ -1080,18 +1088,6 @@ input[type="number"]::-webkit-outer-spin-button, right: 2.5rem; } -.right-2 { - right: 0.5rem; -} - -.top-0 { - top: 0px; -} - -.top-2 { - top: 0.5rem; -} - .top-2\.5 { top: 0.625rem; } @@ -1100,24 +1096,32 @@ input[type="number"]::-webkit-outer-spin-button, top: 45%; } -.z-30 { - z-index: 30; +.top-0 { + top: 0px; } .z-50 { z-index: 50; } +.z-30 { + z-index: 30; +} + .col-span-4 { grid-column: span 4 / span 4; } +.m-1 { + margin: 0.25rem; +} + .m-0 { margin: 0px; } -.m-1 { - margin: 0.25rem; +.m-auto { + margin: auto; } .m-3 { @@ -1128,13 +1132,19 @@ input[type="number"]::-webkit-outer-spin-button, margin: 1rem; } -.m-auto { - margin: auto; +.my-2 { + margin-top: 0.5rem; + margin-bottom: 0.5rem; } -.-mx-3 { - margin-left: -0.75rem; - margin-right: -0.75rem; +.my-10 { + margin-top: 2.5rem; + margin-bottom: 2.5rem; +} + +.my-3 { + margin-top: 0.75rem; + margin-bottom: 0.75rem; } .-mx-4 { @@ -1142,16 +1152,16 @@ input[type="number"]::-webkit-outer-spin-button, margin-right: -1rem; } +.my-\[2px\] { + margin-top: 2px; + margin-bottom: 2px; +} + .mx-2 { margin-left: 0.5rem; margin-right: 0.5rem; } -.mx-3 { - margin-left: 0.75rem; - margin-right: 0.75rem; -} - .mx-4 { margin-left: 1rem; margin-right: 1rem; @@ -1162,145 +1172,135 @@ input[type="number"]::-webkit-outer-spin-button, margin-bottom: 0.25rem; } -.my-10 { - margin-top: 2.5rem; - margin-bottom: 2.5rem; -} - -.my-2 { - margin-top: 0.5rem; - margin-bottom: 0.5rem; -} - -.my-3 { - margin-top: 0.75rem; - margin-bottom: 0.75rem; -} - .my-5 { margin-top: 1.25rem; margin-bottom: 1.25rem; } -.my-\[2px\] { - margin-top: 2px; - margin-bottom: 2px; -} - -.-mb-px { - margin-bottom: -1px; -} - -.-mt-\[2px\] { - margin-top: -2px; -} - -.mb-0 { - margin-bottom: 0px; -} - -.mb-1 { - margin-bottom: 0.25rem; -} - -.mb-10 { - margin-bottom: 2.5rem; -} - -.mb-12 { - margin-bottom: 3rem; -} - -.mb-2 { - margin-bottom: 0.5rem; -} - -.mb-3 { - margin-bottom: 0.75rem; -} - -.mb-4 { - margin-bottom: 1rem; -} - -.mb-5 { - margin-bottom: 1.25rem; -} - -.mb-8 { - margin-bottom: 2rem; -} - -.ml-2 { - margin-left: 0.5rem; -} - -.ml-4 { - margin-left: 1rem; -} - -.ml-5 { - margin-left: 1.25rem; -} - -.ml-6 { - margin-left: 1.5rem; -} - -.mr-0 { - margin-right: 0px; -} - -.mr-1 { - margin-right: 0.25rem; -} - -.mr-2 { - margin-right: 0.5rem; -} - -.mr-3 { +.mx-3 { + margin-left: 0.75rem; margin-right: 0.75rem; } -.mr-4 { - margin-right: 1rem; -} - -.mt-1 { - margin-top: 0.25rem; -} - -.mt-10 { - margin-top: 2.5rem; -} - -.mt-16 { - margin-top: 4rem; -} - -.mt-2 { - margin-top: 0.5rem; +.-mx-3 { + margin-left: -0.75rem; + margin-right: -0.75rem; } .mt-20 { margin-top: 5rem; } +.mt-5 { + margin-top: 1.25rem; +} + .mt-3 { margin-top: 0.75rem; } +.mt-8 { + margin-top: 2rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-0 { + margin-bottom: 0px; +} + +.-mb-px { + margin-bottom: -1px; +} + +.mr-2 { + margin-right: 0.5rem; +} + +.mb-5 { + margin-bottom: 1.25rem; +} + +.mt-10 { + margin-top: 2.5rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.-mt-\[2px\] { + margin-top: -2px; +} + +.mr-1 { + margin-right: 0.25rem; +} + +.ml-4 { + margin-left: 1rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mr-4 { + margin-right: 1rem; +} + +.ml-6 { + margin-left: 1.5rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mr-3 { + margin-right: 0.75rem; +} + .mt-4 { margin-top: 1rem; } -.mt-5 { - margin-top: 1.25rem; +.mb-1 { + margin-bottom: 0.25rem; } -.mt-8 { - margin-top: 2rem; +.mt-1 { + margin-top: 0.25rem; +} + +.mr-0 { + margin-right: 0px; +} + +.ml-5 { + margin-left: 1.25rem; +} + +.ml-2 { + margin-left: 0.5rem; +} + +.mb-12 { + margin-bottom: 3rem; +} + +.mb-10 { + margin-bottom: 2.5rem; +} + +.mt-16 { + margin-top: 4rem; } .mt-\[-1px\] { @@ -1347,34 +1347,30 @@ input[type="number"]::-webkit-outer-spin-button, display: none; } -.h-10 { - height: 2.5rem; -} - -.h-11 { - height: 2.75rem; -} - -.h-12 { - height: 3rem; -} - -.h-14 { - height: 3.5rem; +.h-screen { + height: 100vh; } .h-16 { height: 4rem; } -.h-2 { - height: 0.5rem; +.h-full { + height: 100%; +} + +.h-8 { + height: 2rem; } .h-3 { height: 0.75rem; } +.h-14 { + height: 3.5rem; +} + .h-4 { height: 1rem; } @@ -1387,46 +1383,110 @@ input[type="number"]::-webkit-outer-spin-button, height: 1.5rem; } -.h-64 { - height: 16rem; +.h-9 { + height: 2.25rem; +} + +.h-2 { + height: 0.5rem; +} + +.h-10 { + height: 2.5rem; +} + +.h-12 { + height: 3rem; } .h-7 { height: 1.75rem; } -.h-8 { - height: 2rem; +.h-11 { + height: 2.75rem; } -.h-9 { - height: 2.25rem; -} - -.h-full { - height: 100%; -} - -.h-screen { - height: 100vh; -} - -.max-h-\[40px\] { - max-height: 40px; +.h-64 { + height: 16rem; } .max-h-screen { max-height: 100vh; } +.max-h-\[40px\] { + max-height: 40px; +} + .min-h-\[64px\] { min-height: 64px; } +.w-screen { + width: 100vw; +} + +.w-32 { + width: 8rem; +} + +.w-8 { + width: 2rem; +} + +.w-full { + width: 100%; +} + .w-1 { width: 0.25rem; } +.w-96 { + width: 24rem; +} + +.w-20 { + width: 5rem; +} + +.w-\[344px\] { + width: 344px; +} + +.w-6 { + width: 1.5rem; +} + +.w-5 { + width: 1.25rem; +} + +.w-4 { + width: 1rem; +} + +.w-7 { + width: 1.75rem; +} + +.w-\[calc\(680px\/2\)\] { + width: calc(680px / 2); +} + +.w-72 { + width: 18rem; +} + +.w-\[300px\] { + width: 300px; +} + +.w-48 { + width: 12rem; +} + .w-10 { width: 2.5rem; } @@ -1435,102 +1495,46 @@ input[type="number"]::-webkit-outer-spin-button, width: 3rem; } -.w-20 { - width: 5rem; -} - -.w-32 { - width: 8rem; +.w-64 { + width: 16rem; } .w-36 { width: 9rem; } -.w-4 { - width: 1rem; -} - .w-44 { width: 11rem; } -.w-48 { - width: 12rem; -} - -.w-5 { - width: 1.25rem; -} - -.w-6 { - width: 1.5rem; -} - -.w-64 { - width: 16rem; -} - -.w-7 { - width: 1.75rem; -} - -.w-72 { - width: 18rem; -} - -.w-8 { - width: 2rem; -} - .w-9 { width: 2.25rem; } -.w-96 { - width: 24rem; +.min-w-\[300px\] { + min-width: 300px; } -.w-\[300px\] { - width: 300px; -} - -.w-\[344px\] { - width: 344px; -} - -.w-\[calc\(680px\/2\)\] { - width: calc(680px / 2); -} - -.w-full { - width: 100%; -} - -.w-screen { - width: 100vw; +.min-w-full { + min-width: 100%; } .min-w-0 { min-width: 0px; } -.min-w-\[300px\] { - min-width: 300px; -} - .max-w-\[1100px\] { max-width: 1100px; } -.max-w-\[40px\] { - max-width: 40px; -} - .max-w-\[700px\] { max-width: 700px; } +.max-w-\[40px\] { + max-width: 40px; +} + .max-w-prose { max-width: 65ch; } @@ -1539,14 +1543,14 @@ input[type="number"]::-webkit-outer-spin-button, flex-shrink: 0; } -.shrink { - flex-shrink: 1; -} - .shrink-0 { flex-shrink: 0; } +.shrink { + flex-shrink: 1; +} + .flex-grow { flex-grow: 1; } @@ -1555,16 +1559,16 @@ input[type="number"]::-webkit-outer-spin-button, flex-grow: 1; } -.grow-0 { - flex-grow: 0; +.grow-\[3\] { + flex-grow: 3; } .grow-\[1\] { flex-grow: 1; } -.grow-\[3\] { - flex-grow: 3; +.grow-0 { + flex-grow: 0; } .rotate-90 { @@ -1590,6 +1594,10 @@ input[type="number"]::-webkit-outer-spin-button, cursor: pointer; } +.cursor-auto { + cursor: auto; +} + .select-none { -webkit-user-select: none; -moz-user-select: none; @@ -1606,6 +1614,10 @@ input[type="number"]::-webkit-outer-spin-button, appearance: none; } +.grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + .grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } @@ -1614,10 +1626,6 @@ input[type="number"]::-webkit-outer-spin-button, grid-template-columns: repeat(3, minmax(0, 1fr)); } -.grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); -} - .grid-rows-1 { grid-template-rows: repeat(1, minmax(0, 1fr)); } @@ -1654,16 +1662,16 @@ input[type="number"]::-webkit-outer-spin-button, justify-content: space-between; } -.gap-2 { - gap: 0.5rem; +.gap-5 { + gap: 1.25rem; } .gap-3 { gap: 0.75rem; } -.gap-5 { - gap: 1.25rem; +.gap-2 { + gap: 0.5rem; } .gap-x-5 { @@ -1671,52 +1679,63 @@ input[type="number"]::-webkit-outer-spin-button, column-gap: 1.25rem; } -.space-x-1 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.25rem * var(--tw-space-x-reverse)); - margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-2 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.5rem * var(--tw-space-x-reverse)); - margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); -} - .space-x-3 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(0.75rem * var(--tw-space-x-reverse)); margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse))); } +.space-y-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); +} + +.space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); +} + .space-x-4 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(1rem * var(--tw-space-x-reverse)); margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); } +.space-x-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.25rem * var(--tw-space-x-reverse)); + margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); +} + .space-x-5 > :not([hidden]) ~ :not([hidden]) { --tw-space-x-reverse: 0; margin-right: calc(1.25rem * var(--tw-space-x-reverse)); margin-left: calc(1.25rem * calc(1 - var(--tw-space-x-reverse))); } +.space-y-5 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1.25rem * var(--tw-space-y-reverse)); +} + .space-y-1 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); } -.space-y-3 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); +.divide-y > :not([hidden]) ~ :not([hidden]) { + --tw-divide-y-reverse: 0; + border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); + border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); } -.space-y-5 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(1.25rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(1.25rem * var(--tw-space-y-reverse)); +.divide-gray-200 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-divide-opacity)); } .self-end { @@ -1757,29 +1776,24 @@ input[type="number"]::-webkit-outer-spin-button, word-break: break-all; } -.rounded { - border-radius: 0.25rem; -} - -.rounded-full { - border-radius: 9999px; -} - .rounded-lg { border-radius: 0.5rem; } -.rounded-md { - border-radius: 0.375rem; +.rounded { + border-radius: 0.25rem; } .rounded-xl { border-radius: 0.75rem; } -.rounded-b-xl { - border-bottom-right-radius: 0.75rem; - border-bottom-left-radius: 0.75rem; +.rounded-full { + border-radius: 9999px; +} + +.rounded-md { + border-radius: 0.375rem; } .rounded-l-md { @@ -1792,6 +1806,11 @@ input[type="number"]::-webkit-outer-spin-button, border-top-right-radius: 0.75rem; } +.rounded-b-xl { + border-bottom-right-radius: 0.75rem; + border-bottom-left-radius: 0.75rem; +} + .border { border-width: 1px; } @@ -1812,14 +1831,14 @@ input[type="number"]::-webkit-outer-spin-button, border-left-width: 2px; } -.border-r { - border-right-width: 1px; -} - .border-r-2 { border-right-width: 2px; } +.border-r { + border-right-width: 1px; +} + .border-t { border-top-width: 1px; } @@ -1832,14 +1851,18 @@ input[type="number"]::-webkit-outer-spin-button, border-style: solid; } +.border-dark-700 { + --tw-border-opacity: 1; + border-color: rgb(27 28 33 / var(--tw-border-opacity)); +} + .border-dark-600 { --tw-border-opacity: 1; border-color: rgb(44 45 49 / var(--tw-border-opacity)); } -.border-dark-700 { - --tw-border-opacity: 1; - border-color: rgb(27 28 33 / var(--tw-border-opacity)); +.border-transparent { + border-color: transparent; } .border-link { @@ -1847,8 +1870,14 @@ input[type="number"]::-webkit-outer-spin-button, border-color: rgb(41 151 255 / var(--tw-border-opacity)); } -.border-transparent { - border-color: transparent; +.bg-dark-900 { + --tw-bg-opacity: 1; + background-color: rgb(15 16 21 / var(--tw-bg-opacity)); +} + +.bg-dark-700 { + --tw-bg-opacity: 1; + background-color: rgb(27 28 33 / var(--tw-bg-opacity)); } .bg-accent { @@ -1856,6 +1885,40 @@ input[type="number"]::-webkit-outer-spin-button, background-color: rgb(46 92 255 / var(--tw-bg-opacity)); } +.bg-dark-800 { + --tw-bg-opacity: 1; + background-color: rgb(20 21 26 / var(--tw-bg-opacity)); +} + +.bg-dark-600 { + --tw-bg-opacity: 1; + background-color: rgb(44 45 49 / var(--tw-bg-opacity)); +} + +.bg-white\/10 { + background-color: rgb(255 255 255 / 0.1); +} + +.bg-dark-500 { + --tw-bg-opacity: 1; + background-color: rgb(63 64 68 / var(--tw-bg-opacity)); +} + +.bg-red-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 226 226 / var(--tw-bg-opacity)); +} + +.bg-orange-100 { + --tw-bg-opacity: 1; + background-color: rgb(255 237 213 / var(--tw-bg-opacity)); +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + .bg-black\/40 { background-color: rgb(0 0 0 / 0.4); } @@ -1865,116 +1928,47 @@ input[type="number"]::-webkit-outer-spin-button, background-color: rgb(87 88 91 / var(--tw-bg-opacity)); } -.bg-dark-500 { +.bg-red-800 { --tw-bg-opacity: 1; - background-color: rgb(63 64 68 / var(--tw-bg-opacity)); + background-color: rgb(153 27 27 / var(--tw-bg-opacity)); } -.bg-dark-600 { +.bg-gray-50 { --tw-bg-opacity: 1; - background-color: rgb(44 45 49 / var(--tw-bg-opacity)); -} - -.bg-dark-700 { - --tw-bg-opacity: 1; - background-color: rgb(27 28 33 / var(--tw-bg-opacity)); -} - -.bg-dark-800 { - --tw-bg-opacity: 1; - background-color: rgb(20 21 26 / var(--tw-bg-opacity)); + background-color: rgb(249 250 251 / var(--tw-bg-opacity)); } .bg-dark-800\/70 { background-color: rgb(20 21 26 / 0.7); } -.bg-dark-900 { - --tw-bg-opacity: 1; - background-color: rgb(15 16 21 / var(--tw-bg-opacity)); -} - -.bg-orange-100 { - --tw-bg-opacity: 1; - background-color: rgb(255 237 213 / var(--tw-bg-opacity)); -} - -.bg-red-100 { - --tw-bg-opacity: 1; - background-color: rgb(254 226 226 / var(--tw-bg-opacity)); -} - .bg-red-600 { --tw-bg-opacity: 1; background-color: rgb(220 38 38 / var(--tw-bg-opacity)); } -.bg-red-800 { - --tw-bg-opacity: 1; - background-color: rgb(153 27 27 / var(--tw-bg-opacity)); -} - -.bg-white { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} - -.bg-white\/10 { - background-color: rgb(255 255 255 / 0.1); -} - .fill-current { fill: currentColor; } -.p-1 { - padding: 0.25rem; -} - -.p-2 { - padding: 0.5rem; -} - -.p-3 { - padding: 0.75rem; -} - .p-4 { padding: 1rem; } +.p-3 { + padding: 0.75rem; +} + +.p-1 { + padding: 0.25rem; +} + .p-5 { padding: 1.25rem; } -.px-1 { - padding-left: 0.25rem; - padding-right: 0.25rem; -} - -.px-1\.5 { - padding-left: 0.375rem; - padding-right: 0.375rem; -} - -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} - -.px-3 { - padding-left: 0.75rem; - padding-right: 0.75rem; -} - -.px-4 { - padding-left: 1rem; - padding-right: 1rem; -} - -.px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; +.p-2 { + padding: 0.5rem; } .px-\[calc\(\(100\%-700px\)\/2\)\] { @@ -1982,9 +1976,14 @@ input[type="number"]::-webkit-outer-spin-button, padding-right: calc((100% - 700px) / 2); } -.py-1 { - padding-top: 0.25rem; - padding-bottom: 0.25rem; +.py-20 { + padding-top: 5rem; + padding-bottom: 5rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; } .py-2 { @@ -1992,9 +1991,29 @@ input[type="number"]::-webkit-outer-spin-button, padding-bottom: 0.5rem; } -.py-20 { - padding-top: 5rem; - padding-bottom: 5rem; +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-1\.5 { + padding-left: 0.375rem; + padding-right: 0.375rem; +} + +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; } .py-3 { @@ -2002,27 +2021,57 @@ input[type="number"]::-webkit-outer-spin-button, padding-bottom: 0.75rem; } +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + .py-5 { padding-top: 1.25rem; padding-bottom: 1.25rem; } -.pb-0 { - padding-bottom: 0px; +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; } -.pb-4 { - padding-bottom: 1rem; +.pr-1 { + padding-right: 0.25rem; } .pb-6 { padding-bottom: 1.5rem; } +.pr-3 { + padding-right: 0.75rem; +} + +.pt-3 { + padding-top: 0.75rem; +} + .pl-1 { padding-left: 0.25rem; } +.pb-4 { + padding-bottom: 1rem; +} + +.pb-0 { + padding-bottom: 0px; +} + +.pr-8 { + padding-right: 2rem; +} + +.pt-8 { + padding-top: 2rem; +} + .pl-2 { padding-left: 0.5rem; } @@ -2031,24 +2080,8 @@ input[type="number"]::-webkit-outer-spin-button, padding-left: 1rem; } -.pr-1 { - padding-right: 0.25rem; -} - -.pr-3 { - padding-right: 0.75rem; -} - -.pr-8 { - padding-right: 2rem; -} - -.pt-3 { - padding-top: 0.75rem; -} - -.pt-8 { - padding-top: 2rem; +.text-left { + text-align: left; } .text-center { @@ -2063,6 +2096,11 @@ input[type="number"]::-webkit-outer-spin-button, vertical-align: middle; } +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + .text-\[0px\] { font-size: 0px; } @@ -2072,11 +2110,6 @@ input[type="number"]::-webkit-outer-spin-button, line-height: 1.5rem; } -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} - .text-sm { font-size: 0.875rem; line-height: 1.25rem; @@ -2091,6 +2124,10 @@ input[type="number"]::-webkit-outer-spin-button, font-weight: 500; } +.uppercase { + text-transform: uppercase; +} + .capitalize { text-transform: capitalize; } @@ -2099,17 +2136,36 @@ input[type="number"]::-webkit-outer-spin-button, font-style: italic; } -.leading-4 { - line-height: 1rem; -} - .leading-none { line-height: 1; } -.text-accent { +.leading-4 { + line-height: 1rem; +} + +.tracking-wider { + letter-spacing: 0.05em; +} + +.text-white { --tw-text-opacity: 1; - color: rgb(46 92 255 / var(--tw-text-opacity)); + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-dark-200 { + --tw-text-opacity: 1; + color: rgb(159 159 161 / var(--tw-text-opacity)); +} + +.text-red-700 { + --tw-text-opacity: 1; + color: rgb(185 28 28 / var(--tw-text-opacity)); +} + +.text-orange-700 { + --tw-text-opacity: 1; + color: rgb(194 65 12 / var(--tw-text-opacity)); } .text-black { @@ -2122,14 +2178,9 @@ input[type="number"]::-webkit-outer-spin-button, color: rgb(207 207 208 / var(--tw-text-opacity)); } -.text-dark-200 { +.text-accent { --tw-text-opacity: 1; - color: rgb(159 159 161 / var(--tw-text-opacity)); -} - -.text-dark-300 { - --tw-text-opacity: 1; - color: rgb(111 112 115 / var(--tw-text-opacity)); + color: rgb(46 92 255 / var(--tw-text-opacity)); } .text-link { @@ -2137,19 +2188,14 @@ input[type="number"]::-webkit-outer-spin-button, color: rgb(41 151 255 / var(--tw-text-opacity)); } -.text-orange-700 { +.text-dark-300 { --tw-text-opacity: 1; - color: rgb(194 65 12 / var(--tw-text-opacity)); + color: rgb(111 112 115 / var(--tw-text-opacity)); } -.text-red-700 { +.text-gray-500 { --tw-text-opacity: 1; - color: rgb(185 28 28 / var(--tw-text-opacity)); -} - -.text-white { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); + color: rgb(107 114 128 / var(--tw-text-opacity)); } .underline { @@ -2160,22 +2206,22 @@ input[type="number"]::-webkit-outer-spin-button, text-decoration-line: none; } -.opacity-0 { - opacity: 0; -} - -.opacity-100 { - opacity: 1; -} - .opacity-20 { opacity: 0.2; } +.opacity-0 { + opacity: 0; +} + .opacity-40 { opacity: 0.4; } +.opacity-100 { + opacity: 1; +} + .shadow { --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); @@ -2275,16 +2321,16 @@ input[type="number"]::-webkit-outer-spin-button, background-color: rgb(44 45 49 / var(--tw-bg-opacity)) !important; } +.hover\:border-dark-600:hover { + --tw-border-opacity: 1; + border-color: rgb(44 45 49 / var(--tw-border-opacity)); +} + .hover\:border-dark-800:hover { --tw-border-opacity: 1; border-color: rgb(20 21 26 / var(--tw-border-opacity)); } -.hover\:bg-dark-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(63 64 68 / var(--tw-bg-opacity)); -} - .hover\:bg-dark-700:hover { --tw-bg-opacity: 1; background-color: rgb(27 28 33 / var(--tw-bg-opacity)); @@ -2295,9 +2341,9 @@ input[type="number"]::-webkit-outer-spin-button, background-color: rgb(20 21 26 / var(--tw-bg-opacity)); } -.hover\:text-dark-50:hover { - --tw-text-opacity: 1; - color: rgb(231 231 232 / var(--tw-text-opacity)); +.hover\:bg-dark-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(63 64 68 / var(--tw-bg-opacity)); } .hover\:text-white:hover { @@ -2305,6 +2351,11 @@ input[type="number"]::-webkit-outer-spin-button, color: rgb(255 255 255 / var(--tw-text-opacity)); } +.hover\:text-dark-50:hover { + --tw-text-opacity: 1; + color: rgb(231 231 232 / var(--tw-text-opacity)); +} + .hover\:underline:hover { text-decoration-line: underline; } diff --git a/src/cryptoadvance/specter/templates/settings/tor_settings.jinja b/src/cryptoadvance/specter/templates/settings/tor_settings.jinja index 927a88309..88206bc28 100644 --- a/src/cryptoadvance/specter/templates/settings/tor_settings.jinja +++ b/src/cryptoadvance/specter/templates/settings/tor_settings.jinja @@ -15,15 +15,15 @@ Info
- {{ _("This anonymizes connections to block explorers, price providers and Electrum servers if Tor is activated here.") }} + {{ _("Activating Tor here automatically anonymizes connections to Electrum servers and to Spotbit price providers. If you want to enforce Tor for more, check out the 'Force calls over Tor' option below.") }}
-