diff --git a/warpgate-web/src/admin/User.svelte b/warpgate-web/src/admin/User.svelte
index f3cccf3b..fd1b3769 100644
--- a/warpgate-web/src/admin/User.svelte
+++ b/warpgate-web/src/admin/User.svelte
@@ -5,7 +5,7 @@
import { replace } from 'svelte-spa-router'
import { FormGroup, Input } from '@sveltestrap/sveltestrap'
import { stringifyError } from 'common/errors'
- import Alert from 'common/Alert.svelte'
+ import Alert from 'common/sveltestrap-s5-ports/Alert.svelte'
import CredentialEditor from './CredentialEditor.svelte'
interface Props {
@@ -46,7 +46,7 @@
async function remove () {
if (confirm(`Delete user ${user!.username}?`)) {
await api.deleteUser(user!)
- replace('/config')
+ replace('/config/users')
}
}
@@ -114,14 +114,13 @@
Update
Remove
diff --git a/warpgate-web/src/admin/config/Config.svelte b/warpgate-web/src/admin/config/Config.svelte
new file mode 100644
index 00000000..932f5aa1
--- /dev/null
+++ b/warpgate-web/src/admin/config/Config.svelte
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/warpgate-web/src/admin/Parameters.svelte b/warpgate-web/src/admin/config/Parameters.svelte
similarity index 93%
rename from warpgate-web/src/admin/Parameters.svelte
rename to warpgate-web/src/admin/config/Parameters.svelte
index 4aba438b..960deb4f 100644
--- a/warpgate-web/src/admin/Parameters.svelte
+++ b/warpgate-web/src/admin/config/Parameters.svelte
@@ -1,7 +1,7 @@
-
Global parameters
+ global parameters
{#await load()}
diff --git a/warpgate-web/src/admin/config/Roles.svelte b/warpgate-web/src/admin/config/Roles.svelte
new file mode 100644
index 00000000..54fd55fc
--- /dev/null
+++ b/warpgate-web/src/admin/config/Roles.svelte
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+ {#snippet item({ item: role })}
+
+
+ {role.name}
+
+
+ {/snippet}
+
+
+
diff --git a/warpgate-web/src/admin/SSH.svelte b/warpgate-web/src/admin/config/SSHKeys.svelte
similarity index 97%
rename from warpgate-web/src/admin/SSH.svelte
rename to warpgate-web/src/admin/config/SSHKeys.svelte
index 2550f414..092ac252 100644
--- a/warpgate-web/src/admin/SSH.svelte
+++ b/warpgate-web/src/admin/config/SSHKeys.svelte
@@ -1,6 +1,6 @@
+
+
+
+
+ {#snippet item({ item: target })}
+
+
+ {target.name}
+
+
+ {#if target.options.kind === TargetKind.Http}
+ HTTP
+ {/if}
+ {#if target.options.kind === TargetKind.MySql}
+ MySQL
+ {/if}
+ {#if target.options.kind === TargetKind.Postgres}
+ PostgreSQL
+ {/if}
+ {#if target.options.kind === TargetKind.Ssh}
+ SSH
+ {/if}
+ {#if target.options.kind === TargetKind.WebAdmin}
+ This web admin interface
+ {/if}
+
+
+ {/snippet}
+
+
+
diff --git a/warpgate-web/src/admin/Tickets.svelte b/warpgate-web/src/admin/config/Tickets.svelte
similarity index 90%
rename from warpgate-web/src/admin/Tickets.svelte
rename to warpgate-web/src/admin/config/Tickets.svelte
index dfa7fbe7..3e9983dc 100644
--- a/warpgate-web/src/admin/Tickets.svelte
+++ b/warpgate-web/src/admin/config/Tickets.svelte
@@ -1,11 +1,11 @@
+
+
+
+
+ {#snippet item({ item: user })}
+
+
+ {user.username}
+
+
+ {/snippet}
+
+
+
diff --git a/warpgate-web/src/admin/index.html b/warpgate-web/src/admin/index.html
index 671b0407..8d915097 100644
--- a/warpgate-web/src/admin/index.html
+++ b/warpgate-web/src/admin/index.html
@@ -2,7 +2,7 @@
-
+
Warpgate
diff --git a/warpgate-web/src/common/AsyncButton.svelte b/warpgate-web/src/common/AsyncButton.svelte
index 7d1c3e0a..c12a0fa6 100644
--- a/warpgate-web/src/common/AsyncButton.svelte
+++ b/warpgate-web/src/common/AsyncButton.svelte
@@ -1,5 +1,5 @@
+
+
+
+
+ {@html logo}
+
+
+
+
diff --git a/warpgate-web/src/common/ConnectionInstructions.svelte b/warpgate-web/src/common/ConnectionInstructions.svelte
index 8b852f71..b9d87d61 100644
--- a/warpgate-web/src/common/ConnectionInstructions.svelte
+++ b/warpgate-web/src/common/ConnectionInstructions.svelte
@@ -4,7 +4,7 @@
import { serverInfo } from 'gateway/lib/store'
import { makeExampleSSHCommand, makeSSHUsername, makeExampleMySQLCommand, makeExampleMySQLURI, makeMySQLUsername, makeTargetURL, makeExamplePostgreSQLCommand, makePostgreSQLUsername, makeExamplePostgreSQLURI } from 'common/protocols'
import CopyButton from 'common/CopyButton.svelte'
- import Alert from './Alert.svelte'
+ import Alert from './sveltestrap-s5-ports/Alert.svelte'
interface Props {
targetName?: string;
diff --git a/warpgate-web/src/common/Logo.svelte b/warpgate-web/src/common/Logo.svelte
deleted file mode 100644
index 7edafb93..00000000
--- a/warpgate-web/src/common/Logo.svelte
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
-
- {@html logo}
-
-
-
diff --git a/warpgate-web/src/common/NavListItem.svelte b/warpgate-web/src/common/NavListItem.svelte
new file mode 100644
index 00000000..026052cf
--- /dev/null
+++ b/warpgate-web/src/common/NavListItem.svelte
@@ -0,0 +1,80 @@
+
+
+
+
+
{title}
+ {#if description}
+
{description}
+ {/if}
+
+
+
+
+
+
+
+
diff --git a/warpgate-web/src/common/ThemeSwitcher.svelte b/warpgate-web/src/common/ThemeSwitcher.svelte
index fdca073f..d382032c 100644
--- a/warpgate-web/src/common/ThemeSwitcher.svelte
+++ b/warpgate-web/src/common/ThemeSwitcher.svelte
@@ -5,7 +5,7 @@
import { get } from 'svelte/store'
import { currentTheme, setCurrentTheme } from 'theme'
- import Tooltip from './Tooltip.svelte'
+ import Tooltip from './sveltestrap-s5-ports/Tooltip.svelte'
function toggle () {
if (get(currentTheme) === 'auto') {
diff --git a/warpgate-web/src/common/Alert.svelte b/warpgate-web/src/common/sveltestrap-s5-ports/Alert.svelte
similarity index 100%
rename from warpgate-web/src/common/Alert.svelte
rename to warpgate-web/src/common/sveltestrap-s5-ports/Alert.svelte
diff --git a/warpgate-web/src/common/sveltestrap-s5-ports/Badge.svelte b/warpgate-web/src/common/sveltestrap-s5-ports/Badge.svelte
new file mode 100644
index 00000000..e93c37cd
--- /dev/null
+++ b/warpgate-web/src/common/sveltestrap-s5-ports/Badge.svelte
@@ -0,0 +1,72 @@
+
+
+{#if href}
+
+ {@render children?.()}
+ {#if positioned || indicator}
+ {ariaLabel}
+ {/if}
+
+{:else}
+
+ {@render children?.()}
+ {#if positioned || indicator}
+ {ariaLabel}
+ {/if}
+
+{/if}
diff --git a/warpgate-web/src/common/ModalHeader.svelte b/warpgate-web/src/common/sveltestrap-s5-ports/ModalHeader.svelte
similarity index 100%
rename from warpgate-web/src/common/ModalHeader.svelte
rename to warpgate-web/src/common/sveltestrap-s5-ports/ModalHeader.svelte
diff --git a/warpgate-web/src/common/Tooltip.svelte b/warpgate-web/src/common/sveltestrap-s5-ports/Tooltip.svelte
similarity index 100%
rename from warpgate-web/src/common/Tooltip.svelte
rename to warpgate-web/src/common/sveltestrap-s5-ports/Tooltip.svelte
diff --git a/warpgate-web/src/common/_sveltestrapUtils.ts b/warpgate-web/src/common/sveltestrap-s5-ports/_sveltestrapUtils.ts
similarity index 100%
rename from warpgate-web/src/common/_sveltestrapUtils.ts
rename to warpgate-web/src/common/sveltestrap-s5-ports/_sveltestrapUtils.ts
diff --git a/warpgate-web/src/embed/EmbeddedUI.svelte b/warpgate-web/src/embed/EmbeddedUI.svelte
index e38b7594..2dd242a0 100644
--- a/warpgate-web/src/embed/EmbeddedUI.svelte
+++ b/warpgate-web/src/embed/EmbeddedUI.svelte
@@ -1,7 +1,7 @@
-
-
{$serverInfo!.username}
-
User
-
+
{$serverInfo!.username}
{#if $serverInfo}
diff --git a/warpgate-web/src/gateway/TargetList.svelte b/warpgate-web/src/gateway/TargetList.svelte
index 84baf2cc..d174fa9e 100644
--- a/warpgate-web/src/gateway/TargetList.svelte
+++ b/warpgate-web/src/gateway/TargetList.svelte
@@ -8,7 +8,7 @@ import Fa from 'svelte-fa'
import { Modal, ModalBody } from '@sveltestrap/sveltestrap'
import { serverInfo } from './lib/store'
import { firstBy } from 'thenby'
-import ModalHeader from 'common/ModalHeader.svelte'
+import ModalHeader from 'common/sveltestrap-s5-ports/ModalHeader.svelte'
let selectedTarget: TargetSnapshot|undefined = $state()
diff --git a/warpgate-web/src/gateway/index.html b/warpgate-web/src/gateway/index.html
index aea73491..38a3c92a 100644
--- a/warpgate-web/src/gateway/index.html
+++ b/warpgate-web/src/gateway/index.html
@@ -3,7 +3,7 @@
-
+
Warpgate
diff --git a/warpgate-web/src/theme/_theme.scss b/warpgate-web/src/theme/_theme.scss
index 8b6403f7..e250aaff 100644
--- a/warpgate-web/src/theme/_theme.scss
+++ b/warpgate-web/src/theme/_theme.scss
@@ -1,5 +1,37 @@
@use "sass:map";
+@mixin button-variant(
+ $background,
+ $border,
+ $color: color-contrast($background),
+ $hover-background: if($color == $color-contrast-dark, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),
+ $hover-border: if($color == $color-contrast-dark, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),
+ $hover-color: color-contrast($hover-background),
+ $active-background: if($color == $color-contrast-dark, shade-color($background, $btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),
+ $active-border: if($color == $color-contrast-dark, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),
+ $active-color: color-contrast($active-background),
+ $disabled-background: $background,
+ $disabled-border: $border,
+ $disabled-color: $btn-disabled-color,
+ $text-color: if($color == $color-contrast-light, shade-color($background, $btn-color-shade-amount), tint-color($background, $btn-color-tint-amount))
+) {
+ $real-background: if($color == $color-contrast-dark, shade-color($background, $btn-bg-shade-amount), tint-color($background, $btn-bg-tint-amount));
+ $real-color: if($color == $color-contrast-light, shade-color($background, $btn-color-shade-amount), tint-color($background, $btn-color-tint-amount));
+ --#{$prefix}btn-color: #{$real-color};
+ --#{$prefix}btn-bg: #{$real-background};
+ --#{$prefix}btn-border-color: #{if($color == $color-contrast-dark, shade-color($background, $btn-border-shade-amount), tint-color($background, $btn-border-tint-amount))};
+ --#{$prefix}btn-hover-color: #{$hover-color};
+ --#{$prefix}btn-hover-bg: #{$hover-background};
+ --#{$prefix}btn-hover-border-color: #{$hover-border};
+ --#{$prefix}btn-focus-shadow-rgb: #{to-rgb(mix($color, $border, 15%))};
+ --#{$prefix}btn-active-color: #{$active-color};
+ --#{$prefix}btn-active-bg: #{$active-background};
+ --#{$prefix}btn-active-border-color: #{$active-border};
+ --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};
+ --#{$prefix}btn-disabled-color: #{$disabled-color};
+ --#{$prefix}btn-disabled-bg: #{$real-background};
+}
+
// Layout & components
@import "bootstrap/scss/root";
@import "bootstrap/scss/reboot";
@@ -12,7 +44,7 @@
@import "bootstrap/scss/buttons";
@import "bootstrap/scss/transitions";
@import "bootstrap/scss/dropdown";
-// @import "bootstrap/scss/button-group";
+@import "bootstrap/scss/button-group";
// @import "bootstrap/scss/nav";
// @import "bootstrap/scss/navbar";
// @import "bootstrap/scss/card";
@@ -52,8 +84,19 @@ $font-family-os: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue",
margin: 0.25rem 0 1.5rem;
h1 {
+ font-family: 'Poppins';
+ font-weight: 700;
+ font-size: 2.5rem;
margin: 0;
}
+
+ .counter {
+ display: inline-block;
+ padding: 0px 10px;
+ background: var(--bs-body-color);
+ color: var(--bs-body-bg);
+ border-radius: 5px;
+ }
}
.alert {
@@ -72,7 +115,7 @@ footer {
align-items: center;
padding: .5rem 0;
margin: 2rem 0 1rem;
- border-top: 1px solid rgba($body-color, .5);
+ border-top: 1px solid rgba($body-color, .2);
}
input:-webkit-autofill {
@@ -91,6 +134,11 @@ input:-webkit-autofill:focus {
font-family: $font-family-os;
}
+.btn {
+ text-decoration: underline;
+ text-decoration-color: var(--#{$prefix}btn-active-bg);
+}
+
.page-item.active .page-link {
text-decoration: underline;
}
@@ -109,3 +157,48 @@ input:-webkit-autofill:focus {
width: map.get($grid-breakpoints, "md");
}
}
+
+a {
+ text-decoration-color: var(--wg-link-underline-color);
+ text-underline-offset: 2px;
+
+ &:hover, &.active {
+ text-decoration-color: var(--wg-link-hover-underline-color);
+ }
+}
+
+
+// Make these vars reusable from everywhere
+body {
+ --bs-list-group-color: #{$list-group-color};
+ --bs-list-group-bg: #{$list-group-bg};
+ --bs-list-group-border-color: #{$list-group-border-color};
+ --bs-list-group-border-width: #{$list-group-border-width};
+ --bs-list-group-border-radius: #{$list-group-border-radius};
+ --bs-list-group-item-padding-x: #{$list-group-item-padding-x};
+ --bs-list-group-item-padding-y: #{$list-group-item-padding-y};
+ --bs-list-group-action-color: #{$list-group-action-color};
+ --bs-list-group-action-hover-color: #{$list-group-action-hover-color};
+ --bs-list-group-action-hover-bg: #{$list-group-hover-bg};
+ --bs-list-group-action-active-color: #{$list-group-action-active-color};
+ --bs-list-group-action-active-bg: #{$list-group-action-active-bg};
+ --bs-list-group-disabled-color: #{$list-group-disabled-color};
+ --bs-list-group-disabled-bg: #{$list-group-disabled-bg};
+ --bs-list-group-active-color: #{$list-group-active-color};
+ --bs-list-group-active-bg: #{$list-group-active-bg};
+ --bs-list-group-active-border-color: #{$list-group-active-border-color};
+
+ --wg-link-underline-color: #{$link-underline-color};
+ --wg-link-hover-underline-color: #{$link-hover-underline-color};
+}
+
+@each $theme-color, $value in $theme-colors {
+ .text-bg-#{$theme-color} {
+ $color: color-contrast($value);
+ $real-background: if($color == $color-contrast-dark, shade-color($value, $btn-bg-shade-amount), tint-color($value, $btn-bg-tint-amount));
+ $real-color: if($color == $color-contrast-light, shade-color($value, $btn-color-shade-amount), tint-color($value, $btn-color-tint-amount));
+
+ color: $real-color if($enable-important-utilities, !important, null);
+ background-color: $real-background if($enable-important-utilities, !important, null);
+ }
+}
diff --git a/warpgate-web/src/theme/fonts.css b/warpgate-web/src/theme/fonts.css
new file mode 100644
index 00000000..3c4f285d
--- /dev/null
+++ b/warpgate-web/src/theme/fonts.css
@@ -0,0 +1,7 @@
+@font-face {
+ font-family: 'Poppins';
+ font-style: normal;
+ font-display: block; /* changed */
+ font-weight: 700;
+ src: url(./../../node_modules/@fontsource/poppins/files/poppins-latin-700-normal.woff2) format('woff2'), url(./../../node_modules/@fontsource/poppins/files/poppins-latin-700-normal.woff) format('woff');
+}
diff --git a/warpgate-web/src/theme/index.ts b/warpgate-web/src/theme/index.ts
index 5e506016..61c6581b 100644
--- a/warpgate-web/src/theme/index.ts
+++ b/warpgate-web/src/theme/index.ts
@@ -1,4 +1,5 @@
import '@fontsource/work-sans'
+import './fonts.css'
import { get, writable } from 'svelte/store'
diff --git a/warpgate-web/src/theme/theme.dark.scss b/warpgate-web/src/theme/theme.dark.scss
index 91685a79..e385e2ad 100644
--- a/warpgate-web/src/theme/theme.dark.scss
+++ b/warpgate-web/src/theme/theme.dark.scss
@@ -29,18 +29,8 @@
@import "theme";
-a {
- text-decoration-color: rgba($link-color, .5);
- text-underline-offset: 2px;
-
- &:hover, &.active {
- color: $link-hover-color;
- text-decoration-color: rgba($link-hover-color, .75);
- }
-}
-
header {
- border-bottom: 1px solid rgba($body-color, .5);
+ border-bottom: 1px solid rgba($body-color, .2);
}
.list-group-item-action {
diff --git a/warpgate-web/src/theme/theme.light.scss b/warpgate-web/src/theme/theme.light.scss
index 4feeb90c..9695005e 100644
--- a/warpgate-web/src/theme/theme.light.scss
+++ b/warpgate-web/src/theme/theme.light.scss
@@ -5,15 +5,6 @@
@import "bootstrap/scss/utilities";
@import "theme";
-a {
- text-decoration-color: rgba($body-color, 0.25);
- text-underline-offset: 2px;
-
- &:hover, &.active {
- text-decoration-color: $body-color;
- }
-}
-
header {
border-bottom: 1px solid rgba($body-color, .75);
}
diff --git a/warpgate-web/src/theme/vars.common.scss b/warpgate-web/src/theme/vars.common.scss
index d6a7977e..1d1381c7 100644
--- a/warpgate-web/src/theme/vars.common.scss
+++ b/warpgate-web/src/theme/vars.common.scss
@@ -8,3 +8,29 @@ $pagination-hover-bg: transparent;
$pagination-focus-bg: transparent;
$modal-header-border-color: transparent;
$dropdown-link-hover-bg: transparent;
+
+$btn-padding-x: 1.5rem;
+
+$btn-bg-shade-amount: 75%;
+$btn-bg-tint-amount: 60%;
+$btn-border-shade-amount: 75%;
+$btn-border-tint-amount: 65%;
+$btn-color-shade-amount: 10%;
+$btn-color-tint-amount: 50%;
+
+$btn-hover-bg-shade-amount: 60%;
+$btn-hover-bg-tint-amount: 50%;
+$btn-hover-border-shade-amount: 60%;
+$btn-hover-border-tint-amount: 10%;
+
+$btn-active-bg-shade-amount: 50%;
+// $btn-active-bg-tint-amount
+$btn-active-border-shade-amount: 40%;
+// $btn-active-border-tint-amount
+
+$tooltip-color: #c1c9e4;
+
+$badge-font-size: .8em;
+$badge-font-weight: 400;
+$badge-padding-y: .55em;
+$badge-padding-x: .85em;
diff --git a/warpgate-web/src/theme/vars.dark.scss b/warpgate-web/src/theme/vars.dark.scss
index 4c49a2b6..fd8fcaca 100644
--- a/warpgate-web/src/theme/vars.dark.scss
+++ b/warpgate-web/src/theme/vars.dark.scss
@@ -1,6 +1,6 @@
@import "bootstrap/scss/functions";
-$body-bg: #1d1d20;
+$body-bg: #14141a;
$body-color: #c1c9e4;
$font-family-sans-serif: "Work Sans", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
@@ -21,22 +21,19 @@ $teal: #20c997;
$cyan: #0dcaf0;
$primary: $blue;
-$secondary: #627c84;
+$secondary: #748d95;
$light: transparent;
$info: $blue;
$component-active-bg: $primary;
-$input-bg: #ffffff08;
+$input-bg: #1c1c24;
$input-border-color: #ced4da40;
$input-color: #ccc;
-$input-focus-bg: #ffffff08;
+$input-focus-bg: #1b1b22;
$input-focus-border-color: tint-color($component-active-bg, 25%) ;
$input-disabled-bg: $input-bg;
-$form-check-input-border: 2px solid $input-border-color;
-$form-switch-color: $input-color;
-
$input-btn-focus-color-opacity: .25;
$input-btn-border-width: 2px;
@@ -60,6 +57,7 @@ $modal-content-bg: $body-bg;
$btn-close-color: $secondary;
$btn-link-disabled-color: rgba(255, 255, 255, .5);
+$btn-disabled-color: #969696;
$alert-bg-scale: 100%;
$alert-border-scale: 50%;
@@ -67,5 +65,21 @@ $alert-color-scale: 0%;
$code-color: #84f1fe;
+$form-check-input-border: 2px solid $input-border-color;
+$form-switch-color: $secondary;
+$form-check-color: $primary;
+
@import "bootstrap/scss/variables";
@import "./vars.common.scss";
+
+$link-underline-color: rgba($link-color, .5);
+$link-hover-underline-color: rgba($link-hover-color, .75);
+
+
+
+$form-check-input-width: 1.3em;
+$form-switch-width: 2.5em;
+$form-switch-padding-start: 3em;
+
+$form-check-input-checked-border-color: shade-color($form-check-color, $btn-active-border-shade-amount);
+$form-check-input-checked-bg-color: shade-color($form-check-color, $btn-active-bg-shade-amount);
diff --git a/warpgate-web/src/theme/vars.light.scss b/warpgate-web/src/theme/vars.light.scss
index ec6af4c1..0a476ca4 100644
--- a/warpgate-web/src/theme/vars.light.scss
+++ b/warpgate-web/src/theme/vars.light.scss
@@ -9,20 +9,40 @@ $alert-border-radius: 0;
$alert-border-scale: -30%;
-$blue: #306F84 !default;
+$blue: #3573ac !default;
$purple: #5C398F !default;
$pink: #B53D6D !default;
-$red: #D35D47 !default;
-$orange: #fd7e14 !default;
-$yellow: #D38F47 !default;
-$green: #87C041 !default;
+$red: #842716 !default;
+$orange: #a84c01 !default;
+$yellow: #916101 !default;
+$green: #417106 !default;
$teal: #20c997 !default;
-$cyan: #0dcaf0 !default;
+$cyan: #0e6b7e !default;
+// $primary: $blue;
+$secondary: #506579;
+
+$btn-disabled-color: #969696;
+
+
+$form-switch-color: $secondary;
+// $form-check-color: $primary;
$form-check-input-border: 2px solid rgba(#000, .25);
-
@import "bootstrap/scss/variables";
@import "./vars.common.scss";
+$form-check-color: $primary;
+
$text-muted: $gray-500;
+
+$link-underline-color: rgba($body-color, 0.25);
+$link-hover-underline-color: $body-color;
+
+
+$form-check-input-width: 1.3em;
+$form-switch-width: 2.5em;
+$form-switch-padding-start: 3em;
+
+$form-check-input-checked-border-color: tint-color($form-check-color, $btn-active-border-tint-amount);
+$form-check-input-checked-bg-color: tint-color($form-check-color, $btn-active-bg-tint-amount);
diff --git a/warpgate-web/yarn.lock b/warpgate-web/yarn.lock
index 442e6008..92c37103 100644
--- a/warpgate-web/yarn.lock
+++ b/warpgate-web/yarn.lock
@@ -213,6 +213,11 @@
dependencies:
levn "^0.4.1"
+"@fontsource/poppins@^5.1.0":
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/@fontsource/poppins/-/poppins-5.1.0.tgz#919205f53d99ec4751a945057ef525f06681df8a"
+ integrity sha512-tpLXlnNi2fwQjiipvuj4uNFHCdoLA8izRsKdoexZuEzjx0r/g1aKLf4ta6lFgF7L+/+AFdmaXFlUwwvmDzYH+g==
+
"@fontsource/work-sans@^4.5.12":
version "4.5.14"
resolved "https://registry.yarnpkg.com/@fontsource/work-sans/-/work-sans-4.5.14.tgz#965bf103baa9f812d042b5f678a34f632fa76f2e"
@@ -426,95 +431,6 @@
resolved "https://registry.yarnpkg.com/@otplib/preset-browser/-/preset-browser-12.0.1.tgz#3f7f4dec25f8fcb5eed533c90df76784f219f088"
integrity sha512-64Eb6JLRRcER2NuIIVQIVNb3yn4mJLUwN1i3icmmNpTS+r4izwdM3eQs9wbeRjjX46kgfMZqPFYsC9JuGM0TKw==
-"@parcel/watcher-android-arm64@2.5.0":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a"
- integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==
-
-"@parcel/watcher-darwin-arm64@2.5.0":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f"
- integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==
-
-"@parcel/watcher-darwin-x64@2.5.0":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb"
- integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==
-
-"@parcel/watcher-freebsd-x64@2.5.0":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82"
- integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==
-
-"@parcel/watcher-linux-arm-glibc@2.5.0":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42"
- integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==
-
-"@parcel/watcher-linux-arm-musl@2.5.0":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4"
- integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==
-
-"@parcel/watcher-linux-arm64-glibc@2.5.0":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03"
- integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==
-
-"@parcel/watcher-linux-arm64-musl@2.5.0":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732"
- integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==
-
-"@parcel/watcher-linux-x64-glibc@2.5.0":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz#2e254600fda4e32d83942384d1106e1eed84494d"
- integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==
-
-"@parcel/watcher-linux-x64-musl@2.5.0":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz#01fcea60fedbb3225af808d3f0a7b11229792eef"
- integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==
-
-"@parcel/watcher-win32-arm64@2.5.0":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154"
- integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==
-
-"@parcel/watcher-win32-ia32@2.5.0":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220"
- integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==
-
-"@parcel/watcher-win32-x64@2.5.0":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7"
- integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==
-
-"@parcel/watcher@^2.4.1":
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.0.tgz#5c88818b12b8de4307a9d3e6dc3e28eba0dfbd10"
- integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==
- dependencies:
- detect-libc "^1.0.3"
- is-glob "^4.0.3"
- micromatch "^4.0.5"
- node-addon-api "^7.0.0"
- optionalDependencies:
- "@parcel/watcher-android-arm64" "2.5.0"
- "@parcel/watcher-darwin-arm64" "2.5.0"
- "@parcel/watcher-darwin-x64" "2.5.0"
- "@parcel/watcher-freebsd-x64" "2.5.0"
- "@parcel/watcher-linux-arm-glibc" "2.5.0"
- "@parcel/watcher-linux-arm-musl" "2.5.0"
- "@parcel/watcher-linux-arm64-glibc" "2.5.0"
- "@parcel/watcher-linux-arm64-musl" "2.5.0"
- "@parcel/watcher-linux-x64-glibc" "2.5.0"
- "@parcel/watcher-linux-x64-musl" "2.5.0"
- "@parcel/watcher-win32-arm64" "2.5.0"
- "@parcel/watcher-win32-ia32" "2.5.0"
- "@parcel/watcher-win32-x64" "2.5.0"
-
"@popperjs/core@^2.11.8":
version "2.11.8"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
@@ -1076,7 +992,7 @@ chardet@^0.7.0:
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
-chokidar@^3.5.1:
+"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.1:
version "3.6.0"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
@@ -1091,7 +1007,7 @@ chokidar@^3.5.1:
optionalDependencies:
fsevents "~2.3.2"
-chokidar@^4.0.0, chokidar@^4.0.1:
+chokidar@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41"
integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==
@@ -1351,11 +1267,6 @@ detect-europe-js@^0.1.2:
resolved "https://registry.yarnpkg.com/detect-europe-js/-/detect-europe-js-0.1.2.tgz#aa76642e05dae786efc2e01a23d4792cd24c7b88"
integrity sha512-lgdERlL3u0aUdHocoouzT10d9I89VVhk0qNRmll7mXdGfJT1/wqZ2ZLA4oJAjeACPY5fT1wsbq2AT+GkuInsow==
-detect-libc@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
- integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==
-
dijkstrajs@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23"
@@ -2144,10 +2055,10 @@ ignore@^5.1.1, ignore@^5.2.0, ignore@^5.3.1:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
-immutable@^5.0.2:
- version "5.0.3"
- resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.0.3.tgz#aa037e2313ea7b5d400cd9298fa14e404c933db1"
- integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==
+immutable@^4.0.0:
+ version "4.3.7"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381"
+ integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==
import-fresh@^3.2.1:
version "3.3.0"
@@ -2519,7 +2430,7 @@ merge2@^1.3.0:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-micromatch@^4.0.4, micromatch@^4.0.5:
+micromatch@^4.0.4:
version "4.0.8"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
@@ -2610,11 +2521,6 @@ netmask@^2.0.2:
resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7"
integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==
-node-addon-api@^7.0.0:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558"
- integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==
-
node-fetch@^2.6.1:
version "2.7.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
@@ -3101,16 +3007,14 @@ safe-regex-test@^1.0.3:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
-sass@~1.82:
- version "1.82.0"
- resolved "https://registry.yarnpkg.com/sass/-/sass-1.82.0.tgz#30da277af3d0fa6042e9ceabd0d984ed6d07df70"
- integrity sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q==
+sass@1.78:
+ version "1.78.0"
+ resolved "https://registry.yarnpkg.com/sass/-/sass-1.78.0.tgz#cef369b2f9dc21ea1d2cf22c979f52365da60841"
+ integrity sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==
dependencies:
- chokidar "^4.0.0"
- immutable "^5.0.2"
+ chokidar ">=3.0.0 <4.0.0"
+ immutable "^4.0.0"
source-map-js ">=0.6.2 <2.0.0"
- optionalDependencies:
- "@parcel/watcher" "^2.4.1"
semver@^6.1.0, semver@^6.3.1:
version "6.3.1"
diff --git a/warpgate/src/commands/run.rs b/warpgate/src/commands/run.rs
index e2697e23..8f9365ec 100644
--- a/warpgate/src/commands/run.rs
+++ b/warpgate/src/commands/run.rs
@@ -27,7 +27,14 @@ pub(crate) async fn command(cli: &crate::Cli, enable_admin_token: bool) -> Resul
})
});
- let config = load_config(&cli.config, true)?;
+ let config = match load_config(&cli.config, true) {
+ Ok(config) => config,
+ Err(error) => {
+ error!(?error, "Failed to load config file");
+ std::process::exit(1);
+ }
+ };
+
let services = Services::new(config.clone(), admin_token).await?;
install_database_logger(services.db.clone());
diff --git a/warpgate/src/config.rs b/warpgate/src/config.rs
index 9a295a06..1e4f079c 100644
--- a/warpgate/src/config.rs
+++ b/warpgate/src/config.rs
@@ -10,10 +10,6 @@ use warpgate_common::helpers::fs::secure_file;
use warpgate_common::{WarpgateConfig, WarpgateConfigStore};
pub fn load_config(path: &Path, secure: bool) -> Result
{
- if secure {
- secure_file(path).context("Could not secure config")?;
- }
-
let mut store: serde_yaml::Value = Config::builder()
.add_source(File::from(path))
.add_source(Environment::with_prefix("WARPGATE"))
@@ -22,6 +18,10 @@ pub fn load_config(path: &Path, secure: bool) -> Result {
.try_deserialize()
.context("Could not parse YAML")?;
+ if secure {
+ secure_file(path).context("Could not secure config")?;
+ }
+
check_and_migrate_config(&mut store);
let store: WarpgateConfigStore =