commit 05b7ed71025895c1121336daf64eeb65868f4bba
parent 06236f0d6a92fb11191c061277dfb604873a70ff
Author: Florian Dold <florian@dold.me>
Date: Mon, 6 Jul 2026 18:09:24 +0200
use externally packaged SPA
Diffstat:
12 files changed, 58 insertions(+), 1779 deletions(-)
diff --git a/.gitmodules b/.gitmodules
@@ -2,7 +2,3 @@
path = doc/prebuilt
url = ../taler-docs.git
branch = prebuilt
-[submodule "contrib/wallet-core"]
- path = contrib/wallet-core
- url = ../taler-typescript-core.git
- branch = prebuilt
diff --git a/bootstrap b/bootstrap
@@ -19,7 +19,6 @@ if [ -d .git ]; then
echo "$0: Updating submodules"
echo | git submodule update --init --force
fi
-./contrib/check-prebuilt
# This is more portable than `which' but comes with
# the caveat of not(?) properly working on busybox's ash:
diff --git a/contrib/check-prebuilt b/contrib/check-prebuilt
@@ -1,15 +0,0 @@
-#!/usr/bin/env python3
-
-import os
-import sys
-
-contrib = os.path.abspath(os.path.dirname(__file__))
-
-spa_ver_lock = open(contrib + "/" + "spa.lock").read().strip()
-spa_ver_prebuilt = open(contrib + "/" + "wallet-core/challenger/version.txt").read().strip()
-
-if spa_ver_lock != spa_ver_prebuilt:
- print("SPA version mismatch (contrib/spa.lock)")
- print("lockfile has version", spa_ver_lock)
- print("prebuilt has version", spa_ver_prebuilt)
- sys.exit(1)
diff --git a/contrib/main.css b/contrib/main.css
@@ -1,1752 +0,0 @@
-/* src/scss/main.css */
-*,
-::before,
-::after {
- box-sizing: border-box;
- border-width: 0;
- border-style: solid;
- border-color: #e5e7eb;
-}
-::before,
-::after {
- --tw-content: "";
-}
-html {
- line-height: 1.5;
- -webkit-text-size-adjust: 100%;
- -moz-tab-size: 4;
- -o-tab-size: 4;
- tab-size: 4;
- font-family:
- ui-sans-serif,
- system-ui,
- -apple-system,
- BlinkMacSystemFont,
- "Segoe UI",
- Roboto,
- "Helvetica Neue",
- Arial,
- "Noto Sans",
- sans-serif,
- "Apple Color Emoji",
- "Segoe UI Emoji",
- "Segoe UI Symbol",
- "Noto Color Emoji";
- font-feature-settings: normal;
- font-variation-settings: normal;
-}
-body {
- margin: 0;
- line-height: inherit;
-}
-hr {
- height: 0;
- color: inherit;
- border-top-width: 1px;
-}
-abbr:where([title]) {
- -webkit-text-decoration: underline dotted;
- text-decoration: underline dotted;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- font-size: inherit;
- font-weight: inherit;
-}
-a {
- color: inherit;
- text-decoration: inherit;
-}
-b,
-strong {
- font-weight: bolder;
-}
-code,
-kbd,
-samp,
-pre {
- font-family:
- ui-monospace,
- SFMono-Regular,
- Menlo,
- Monaco,
- Consolas,
- "Liberation Mono",
- "Courier New",
- monospace;
- font-size: 1em;
-}
-small {
- font-size: 80%;
-}
-sub,
-sup {
- font-size: 75%;
- line-height: 0;
- position: relative;
- vertical-align: baseline;
-}
-sub {
- bottom: -0.25em;
-}
-sup {
- top: -0.5em;
-}
-table {
- text-indent: 0;
- border-color: inherit;
- border-collapse: collapse;
-}
-button,
-input,
-optgroup,
-select,
-textarea {
- font-family: inherit;
- font-size: 100%;
- font-weight: inherit;
- line-height: inherit;
- color: inherit;
- margin: 0;
- padding: 0;
-}
-button,
-select {
- text-transform: none;
-}
-button,
-[type=button],
-[type=reset],
-[type=submit] {
- -webkit-appearance: button;
- background-color: transparent;
- background-image: none;
-}
-:-moz-focusring {
- outline: auto;
-}
-:-moz-ui-invalid {
- box-shadow: none;
-}
-progress {
- vertical-align: baseline;
-}
-::-webkit-inner-spin-button,
-::-webkit-outer-spin-button {
- height: auto;
-}
-[type=search] {
- -webkit-appearance: textfield;
- outline-offset: -2px;
-}
-::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-::-webkit-file-upload-button {
- -webkit-appearance: button;
- font: inherit;
-}
-summary {
- display: list-item;
-}
-blockquote,
-dl,
-dd,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-hr,
-figure,
-p,
-pre {
- margin: 0;
-}
-fieldset {
- margin: 0;
- padding: 0;
-}
-legend {
- padding: 0;
-}
-ol,
-ul,
-menu {
- list-style: none;
- margin: 0;
- padding: 0;
-}
-textarea {
- resize: vertical;
-}
-input::-moz-placeholder,
-textarea::-moz-placeholder {
- opacity: 1;
- color: #9ca3af;
-}
-input::placeholder,
-textarea::placeholder {
- opacity: 1;
- color: #9ca3af;
-}
-button,
-[role=button] {
- cursor: pointer;
-}
-:disabled {
- cursor: default;
-}
-img,
-svg,
-video,
-canvas,
-audio,
-iframe,
-embed,
-object {
- display: block;
- vertical-align: middle;
-}
-img,
-video {
- max-width: 100%;
- height: auto;
-}
-[hidden] {
- display: none;
-}
-[type=text],
-[type=email],
-[type=url],
-[type=password],
-[type=number],
-[type=date],
-[type=datetime-local],
-[type=month],
-[type=search],
-[type=tel],
-[type=time],
-[type=week],
-[multiple],
-textarea,
-select {
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- background-color: #fff;
- border-color: #6b7280;
- border-width: 1px;
- border-radius: 0px;
- padding-top: 0.5rem;
- padding-right: 0.75rem;
- padding-bottom: 0.5rem;
- padding-left: 0.75rem;
- font-size: 1rem;
- line-height: 1.5rem;
- --tw-shadow: 0 0 #0000;
-}
-[type=text]:focus,
-[type=email]:focus,
-[type=url]:focus,
-[type=password]:focus,
-[type=number]:focus,
-[type=date]:focus,
-[type=datetime-local]:focus,
-[type=month]:focus,
-[type=search]:focus,
-[type=tel]:focus,
-[type=time]:focus,
-[type=week]:focus,
-[multiple]:focus,
-textarea:focus,
-select:focus {
- outline: 2px solid transparent;
- outline-offset: 2px;
- --tw-ring-inset: var(--tw-empty, );
- --tw-ring-offset-width: 0px;
- --tw-ring-offset-color: #fff;
- --tw-ring-color: #2563eb;
- --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
- --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
- box-shadow:
- var(--tw-ring-offset-shadow),
- var(--tw-ring-shadow),
- var(--tw-shadow);
- border-color: #2563eb;
-}
-input::-moz-placeholder,
-textarea::-moz-placeholder {
- color: #6b7280;
- opacity: 1;
-}
-input::placeholder,
-textarea::placeholder {
- color: #6b7280;
- opacity: 1;
-}
-::-webkit-datetime-edit-fields-wrapper {
- padding: 0;
-}
-::-webkit-date-and-time-value {
- min-height: 1.5em;
-}
-::-webkit-datetime-edit,
-::-webkit-datetime-edit-year-field,
-::-webkit-datetime-edit-month-field,
-::-webkit-datetime-edit-day-field,
-::-webkit-datetime-edit-hour-field,
-::-webkit-datetime-edit-minute-field,
-::-webkit-datetime-edit-second-field,
-::-webkit-datetime-edit-millisecond-field,
-::-webkit-datetime-edit-meridiem-field {
- padding-top: 0;
- padding-bottom: 0;
-}
-select {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
- background-position: right 0.5rem center;
- background-repeat: no-repeat;
- background-size: 1.5em 1.5em;
- padding-right: 2.5rem;
- -webkit-print-color-adjust: exact;
- print-color-adjust: exact;
-}
-[multiple] {
- background-image: initial;
- background-position: initial;
- background-repeat: unset;
- background-size: initial;
- padding-right: 0.75rem;
- -webkit-print-color-adjust: unset;
- print-color-adjust: unset;
-}
-[type=checkbox],
-[type=radio] {
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- padding: 0;
- -webkit-print-color-adjust: exact;
- print-color-adjust: exact;
- display: inline-block;
- vertical-align: middle;
- background-origin: border-box;
- -webkit-user-select: none;
- -moz-user-select: none;
- user-select: none;
- flex-shrink: 0;
- height: 1rem;
- width: 1rem;
- color: #2563eb;
- background-color: #fff;
- border-color: #6b7280;
- border-width: 1px;
- --tw-shadow: 0 0 #0000;
-}
-[type=checkbox] {
- border-radius: 0px;
-}
-[type=radio] {
- border-radius: 100%;
-}
-[type=checkbox]:focus,
-[type=radio]:focus {
- outline: 2px solid transparent;
- outline-offset: 2px;
- --tw-ring-inset: var(--tw-empty, );
- --tw-ring-offset-width: 2px;
- --tw-ring-offset-color: #fff;
- --tw-ring-color: #2563eb;
- --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
- --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
- box-shadow:
- var(--tw-ring-offset-shadow),
- var(--tw-ring-shadow),
- var(--tw-shadow);
-}
-[type=checkbox]:checked,
-[type=radio]:checked {
- border-color: transparent;
- background-color: currentColor;
- background-size: 100% 100%;
- background-position: center;
- background-repeat: no-repeat;
-}
-[type=checkbox]:checked {
- background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");
-}
-[type=radio]:checked {
- background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
-}
-[type=checkbox]:checked:hover,
-[type=checkbox]:checked:focus,
-[type=radio]:checked:hover,
-[type=radio]:checked:focus {
- border-color: transparent;
- background-color: currentColor;
-}
-[type=checkbox]:indeterminate {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");
- border-color: transparent;
- background-color: currentColor;
- background-size: 100% 100%;
- background-position: center;
- background-repeat: no-repeat;
-}
-[type=checkbox]:indeterminate:hover,
-[type=checkbox]:indeterminate:focus {
- border-color: transparent;
- background-color: currentColor;
-}
-[type=file] {
- background: unset;
- border-color: inherit;
- border-width: 0;
- border-radius: 0;
- padding: 0;
- font-size: unset;
- line-height: inherit;
-}
-[type=file]:focus {
- outline: 1px solid ButtonText;
- outline: 1px auto -webkit-focus-ring-color;
-}
-*,
-::before,
-::after {
- --tw-border-spacing-x: 0;
- --tw-border-spacing-y: 0;
- --tw-translate-x: 0;
- --tw-translate-y: 0;
- --tw-rotate: 0;
- --tw-skew-x: 0;
- --tw-skew-y: 0;
- --tw-scale-x: 1;
- --tw-scale-y: 1;
- --tw-pan-x: ;
- --tw-pan-y: ;
- --tw-pinch-zoom: ;
- --tw-scroll-snap-strictness: proximity;
- --tw-gradient-from-position: ;
- --tw-gradient-via-position: ;
- --tw-gradient-to-position: ;
- --tw-ordinal: ;
- --tw-slashed-zero: ;
- --tw-numeric-figure: ;
- --tw-numeric-spacing: ;
- --tw-numeric-fraction: ;
- --tw-ring-inset: ;
- --tw-ring-offset-width: 0px;
- --tw-ring-offset-color: #fff;
- --tw-ring-color: rgb(59 130 246 / 0.5);
- --tw-ring-offset-shadow: 0 0 #0000;
- --tw-ring-shadow: 0 0 #0000;
- --tw-shadow: 0 0 #0000;
- --tw-shadow-colored: 0 0 #0000;
- --tw-blur: ;
- --tw-brightness: ;
- --tw-contrast: ;
- --tw-grayscale: ;
- --tw-hue-rotate: ;
- --tw-invert: ;
- --tw-saturate: ;
- --tw-sepia: ;
- --tw-drop-shadow: ;
- --tw-backdrop-blur: ;
- --tw-backdrop-brightness: ;
- --tw-backdrop-contrast: ;
- --tw-backdrop-grayscale: ;
- --tw-backdrop-hue-rotate: ;
- --tw-backdrop-invert: ;
- --tw-backdrop-opacity: ;
- --tw-backdrop-saturate: ;
- --tw-backdrop-sepia: ;
-}
-::backdrop {
- --tw-border-spacing-x: 0;
- --tw-border-spacing-y: 0;
- --tw-translate-x: 0;
- --tw-translate-y: 0;
- --tw-rotate: 0;
- --tw-skew-x: 0;
- --tw-skew-y: 0;
- --tw-scale-x: 1;
- --tw-scale-y: 1;
- --tw-pan-x: ;
- --tw-pan-y: ;
- --tw-pinch-zoom: ;
- --tw-scroll-snap-strictness: proximity;
- --tw-gradient-from-position: ;
- --tw-gradient-via-position: ;
- --tw-gradient-to-position: ;
- --tw-ordinal: ;
- --tw-slashed-zero: ;
- --tw-numeric-figure: ;
- --tw-numeric-spacing: ;
- --tw-numeric-fraction: ;
- --tw-ring-inset: ;
- --tw-ring-offset-width: 0px;
- --tw-ring-offset-color: #fff;
- --tw-ring-color: rgb(59 130 246 / 0.5);
- --tw-ring-offset-shadow: 0 0 #0000;
- --tw-ring-shadow: 0 0 #0000;
- --tw-shadow: 0 0 #0000;
- --tw-shadow-colored: 0 0 #0000;
- --tw-blur: ;
- --tw-brightness: ;
- --tw-contrast: ;
- --tw-grayscale: ;
- --tw-hue-rotate: ;
- --tw-invert: ;
- --tw-saturate: ;
- --tw-sepia: ;
- --tw-drop-shadow: ;
- --tw-backdrop-blur: ;
- --tw-backdrop-brightness: ;
- --tw-backdrop-contrast: ;
- --tw-backdrop-grayscale: ;
- --tw-backdrop-hue-rotate: ;
- --tw-backdrop-invert: ;
- --tw-backdrop-opacity: ;
- --tw-backdrop-saturate: ;
- --tw-backdrop-sepia: ;
-}
-.\!container {
- width: 100% !important;
-}
-.container {
- width: 100%;
-}
-@media (min-width: 640px) {
- .\!container {
- max-width: 640px !important;
- }
- .container {
- max-width: 640px;
- }
-}
-@media (min-width: 768px) {
- .\!container {
- max-width: 768px !important;
- }
- .container {
- max-width: 768px;
- }
-}
-@media (min-width: 1024px) {
- .\!container {
- max-width: 1024px !important;
- }
- .container {
- max-width: 1024px;
- }
-}
-@media (min-width: 1280px) {
- .\!container {
- max-width: 1280px !important;
- }
- .container {
- max-width: 1280px;
- }
-}
-@media (min-width: 1536px) {
- .\!container {
- max-width: 1536px !important;
- }
- .container {
- max-width: 1536px;
- }
-}
-.sr-only {
- position: absolute;
- width: 1px;
- height: 1px;
- padding: 0;
- margin: -1px;
- overflow: hidden;
- clip: rect(0, 0, 0, 0);
- white-space: nowrap;
- border-width: 0;
-}
-.pointer-events-none {
- pointer-events: none;
-}
-.pointer-events-auto {
- pointer-events: auto;
-}
-.visible {
- visibility: visible;
-}
-.fixed {
- position: fixed;
-}
-.absolute {
- position: absolute;
-}
-.relative {
- position: relative;
-}
-.-inset-0 {
- inset: -0px;
-}
-.-inset-0\.5 {
- inset: -0.125rem;
-}
-.-inset-1 {
- inset: -0.25rem;
-}
-.-inset-2 {
- inset: -0.5rem;
-}
-.-inset-2\.5 {
- inset: -0.625rem;
-}
-.inset-0 {
- inset: 0px;
-}
-.inset-y-0 {
- top: 0px;
- bottom: 0px;
-}
-.bottom-0 {
- bottom: 0px;
-}
-.bottom-4 {
- bottom: 1rem;
-}
-.left-0 {
- left: 0px;
-}
-.right-0 {
- right: 0px;
-}
-.top-0 {
- top: 0px;
-}
-.isolate {
- isolation: isolate;
-}
-.z-10 {
- z-index: 10;
-}
-.z-20 {
- z-index: 20;
-}
-.col-span-full {
- grid-column: 1 / -1;
-}
-.mx-8 {
- margin-left: 2rem;
- margin-right: 2rem;
-}
-.mx-auto {
- margin-left: auto;
- margin-right: auto;
-}
-.my-2 {
- margin-top: 0.5rem;
- margin-bottom: 0.5rem;
-}
-.my-4 {
- margin-top: 1rem;
- margin-bottom: 1rem;
-}
-.-ml-px {
- margin-left: -1px;
-}
-.-mt-2 {
- margin-top: -0.5rem;
-}
-.-mt-5 {
- margin-top: -1.25rem;
-}
-.mb-4 {
- margin-bottom: 1rem;
-}
-.mb-6 {
- margin-bottom: 1.5rem;
-}
-.ml-3 {
- margin-left: 0.75rem;
-}
-.ml-4 {
- margin-left: 1rem;
-}
-.ml-6 {
- margin-left: 1.5rem;
-}
-.mr-2 {
- margin-right: 0.5rem;
-}
-.mt-0 {
- margin-top: 0px;
-}
-.mt-0\.5 {
- margin-top: 0.125rem;
-}
-.mt-1 {
- margin-top: 0.25rem;
-}
-.mt-10 {
- margin-top: 2.5rem;
-}
-.mt-16 {
- margin-top: 4rem;
-}
-.mt-2 {
- margin-top: 0.5rem;
-}
-.mt-2\.5 {
- margin-top: 0.625rem;
-}
-.mt-3 {
- margin-top: 0.75rem;
-}
-.mt-4 {
- margin-top: 1rem;
-}
-.mt-6 {
- margin-top: 1.5rem;
-}
-.mt-8 {
- margin-top: 2rem;
-}
-.block {
- display: block;
-}
-.flex {
- display: flex;
-}
-.inline-flex {
- display: inline-flex;
-}
-.grid {
- display: grid;
-}
-.contents {
- display: contents;
-}
-.\!hidden {
- display: none !important;
-}
-.hidden {
- display: none;
-}
-.h-10 {
- height: 2.5rem;
-}
-.h-12 {
- height: 3rem;
-}
-.h-16 {
- height: 4rem;
-}
-.h-24 {
- height: 6rem;
-}
-.h-3 {
- height: 0.75rem;
-}
-.h-4 {
- height: 1rem;
-}
-.h-5 {
- height: 1.25rem;
-}
-.h-6 {
- height: 1.5rem;
-}
-.h-7 {
- height: 1.75rem;
-}
-.h-8 {
- height: 2rem;
-}
-.h-full {
- height: 100%;
-}
-.max-h-60 {
- max-height: 15rem;
-}
-.min-h-full {
- min-height: 100%;
-}
-.w-10 {
- width: 2.5rem;
-}
-.w-12 {
- width: 3rem;
-}
-.w-3 {
- width: 0.75rem;
-}
-.w-4 {
- width: 1rem;
-}
-.w-5 {
- width: 1.25rem;
-}
-.w-6 {
- width: 1.5rem;
-}
-.w-8 {
- width: 2rem;
-}
-.w-auto {
- width: auto;
-}
-.w-full {
- width: 100%;
-}
-.w-screen {
- width: 100vw;
-}
-.min-w-0 {
- min-width: 0px;
-}
-.max-w-2xl {
- max-width: 42rem;
-}
-.max-w-7xl {
- max-width: 80rem;
-}
-.max-w-full {
- max-width: 100%;
-}
-.max-w-md {
- max-width: 28rem;
-}
-.max-w-xl {
- max-width: 36rem;
-}
-.flex-1 {
- flex: 1 1 0%;
-}
-.flex-auto {
- flex: 1 1 auto;
-}
-.flex-shrink-0 {
- flex-shrink: 0;
-}
-.shrink-0 {
- flex-shrink: 0;
-}
-.flex-grow {
- flex-grow: 1;
-}
-.rotate-45 {
- --tw-rotate: 45deg;
- transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
-}
-.cursor-default {
- cursor: default;
-}
-.cursor-not-allowed {
- cursor: not-allowed;
-}
-.cursor-pointer {
- cursor: pointer;
-}
-.select-none {
- -webkit-user-select: none;
- -moz-user-select: none;
- user-select: none;
-}
-.grid-cols-1 {
- grid-template-columns: repeat(1, minmax(0, 1fr));
-}
-.flex-row {
- flex-direction: row;
-}
-.flex-col {
- flex-direction: column;
-}
-.items-start {
- align-items: flex-start;
-}
-.items-center {
- align-items: center;
-}
-.items-stretch {
- align-items: stretch;
-}
-.justify-start {
- justify-content: flex-start;
-}
-.justify-end {
- justify-content: flex-end;
-}
-.justify-center {
- justify-content: center;
-}
-.justify-between {
- justify-content: space-between;
-}
-.gap-x-0 {
- -moz-column-gap: 0px;
- column-gap: 0px;
-}
-.gap-x-0\.5 {
- -moz-column-gap: 0.125rem;
- column-gap: 0.125rem;
-}
-.gap-x-1 {
- -moz-column-gap: 0.25rem;
- column-gap: 0.25rem;
-}
-.gap-x-1\.5 {
- -moz-column-gap: 0.375rem;
- column-gap: 0.375rem;
-}
-.gap-x-3 {
- -moz-column-gap: 0.75rem;
- column-gap: 0.75rem;
-}
-.gap-x-6 {
- -moz-column-gap: 1.5rem;
- column-gap: 1.5rem;
-}
-.gap-x-8 {
- -moz-column-gap: 2rem;
- column-gap: 2rem;
-}
-.gap-y-2 {
- row-gap: 0.5rem;
-}
-.gap-y-6 {
- row-gap: 1.5rem;
-}
-.gap-y-7 {
- row-gap: 1.75rem;
-}
-.gap-y-8 {
- row-gap: 2rem;
-}
-.-space-y-px > :not([hidden]) ~ :not([hidden]) {
- --tw-space-y-reverse: 0;
- margin-top: calc(-1px * calc(1 - var(--tw-space-y-reverse)));
- margin-bottom: calc(-1px * var(--tw-space-y-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-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-10 > :not([hidden]) ~ :not([hidden]) {
- --tw-space-y-reverse: 0;
- margin-top: calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));
- margin-bottom: calc(2.5rem * var(--tw-space-y-reverse));
-}
-.space-y-4 > :not([hidden]) ~ :not([hidden]) {
- --tw-space-y-reverse: 0;
- margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
- margin-bottom: calc(1rem * 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));
-}
-.divide-gray-900\/10 > :not([hidden]) ~ :not([hidden]) {
- border-color: rgb(17 24 39 / 0.1);
-}
-.overflow-auto {
- overflow: auto;
-}
-.overflow-hidden {
- overflow: hidden;
-}
-.overflow-y-scroll {
- overflow-y: scroll;
-}
-.truncate {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.whitespace-break-spaces {
- white-space: break-spaces;
-}
-.rounded {
- border-radius: 0.25rem;
-}
-.rounded-full {
- border-radius: 9999px;
-}
-.rounded-lg {
- border-radius: 0.5rem;
-}
-.rounded-md {
- border-radius: 0.375rem;
-}
-.rounded-none {
- border-radius: 0px;
-}
-.rounded-sm {
- border-radius: 0.125rem;
-}
-.rounded-l-md {
- border-top-left-radius: 0.375rem;
- border-bottom-left-radius: 0.375rem;
-}
-.rounded-r-md {
- border-top-right-radius: 0.375rem;
- border-bottom-right-radius: 0.375rem;
-}
-.rounded-bl-md {
- border-bottom-left-radius: 0.375rem;
-}
-.rounded-br-md {
- border-bottom-right-radius: 0.375rem;
-}
-.rounded-tl-md {
- border-top-left-radius: 0.375rem;
-}
-.rounded-tr-md {
- border-top-right-radius: 0.375rem;
-}
-.border {
- border-width: 1px;
-}
-.border-0 {
- border-width: 0px;
-}
-.border-2 {
- border-width: 2px;
-}
-.border-b {
- border-bottom-width: 1px;
-}
-.border-l-0 {
- border-left-width: 0px;
-}
-.border-r-0 {
- border-right-width: 0px;
-}
-.border-r-2 {
- border-right-width: 2px;
-}
-.border-dashed {
- border-style: dashed;
-}
-.border-gray-200 {
- --tw-border-opacity: 1;
- border-color: rgb(229 231 235 / var(--tw-border-opacity));
-}
-.border-gray-300 {
- --tw-border-opacity: 1;
- border-color: rgb(209 213 219 / var(--tw-border-opacity));
-}
-.border-gray-900\/25 {
- border-color: rgb(17 24 39 / 0.25);
-}
-.border-indigo-200 {
- --tw-border-opacity: 1;
- border-color: rgb(199 210 254 / var(--tw-border-opacity));
-}
-.border-indigo-400 {
- --tw-border-opacity: 1;
- border-color: rgb(129 140 248 / var(--tw-border-opacity));
-}
-.border-indigo-600 {
- --tw-border-opacity: 1;
- border-color: rgb(79 70 229 / var(--tw-border-opacity));
-}
-.border-transparent {
- border-color: transparent;
-}
-.border-opacity-25 {
- --tw-border-opacity: 0.25;
-}
-.bg-black {
- --tw-bg-opacity: 1;
- background-color: rgb(0 0 0 / var(--tw-bg-opacity));
-}
-.bg-gray-100 {
- --tw-bg-opacity: 1;
- background-color: rgb(243 244 246 / var(--tw-bg-opacity));
-}
-.bg-gray-50 {
- --tw-bg-opacity: 1;
- background-color: rgb(249 250 251 / var(--tw-bg-opacity));
-}
-.bg-indigo-50 {
- --tw-bg-opacity: 1;
- background-color: rgb(238 242 255 / var(--tw-bg-opacity));
-}
-.bg-indigo-600 {
- --tw-bg-opacity: 1;
- background-color: rgb(79 70 229 / var(--tw-bg-opacity));
-}
-.bg-indigo-700 {
- --tw-bg-opacity: 1;
- background-color: rgb(67 56 202 / var(--tw-bg-opacity));
-}
-.bg-red-50 {
- --tw-bg-opacity: 1;
- background-color: rgb(254 242 242 / var(--tw-bg-opacity));
-}
-.bg-red-600 {
- --tw-bg-opacity: 1;
- background-color: rgb(220 38 38 / var(--tw-bg-opacity));
-}
-.bg-slate-200 {
- --tw-bg-opacity: 1;
- background-color: rgb(226 232 240 / var(--tw-bg-opacity));
-}
-.bg-transparent {
- background-color: transparent;
-}
-.bg-white {
- --tw-bg-opacity: 1;
- background-color: rgb(255 255 255 / var(--tw-bg-opacity));
-}
-.stroke-gray-700\/50 {
- stroke: rgb(55 65 81 / 0.5);
-}
-.object-cover {
- -o-object-fit: cover;
- object-fit: cover;
-}
-.p-1 {
- padding: 0.25rem;
-}
-.p-2 {
- padding: 0.5rem;
-}
-.p-3 {
- padding: 0.75rem;
-}
-.p-4 {
- padding: 1rem;
-}
-.px-2 {
- padding-left: 0.5rem;
- padding-right: 0.5rem;
-}
-.px-3 {
- padding-left: 0.75rem;
- padding-right: 0.75rem;
-}
-.px-3\.5 {
- padding-left: 0.875rem;
- padding-right: 0.875rem;
-}
-.px-4 {
- padding-left: 1rem;
- padding-right: 1rem;
-}
-.px-6 {
- padding-left: 1.5rem;
- padding-right: 1.5rem;
-}
-.py-1 {
- padding-top: 0.25rem;
- padding-bottom: 0.25rem;
-}
-.py-1\.5 {
- padding-top: 0.375rem;
- padding-bottom: 0.375rem;
-}
-.py-12 {
- padding-top: 3rem;
- padding-bottom: 3rem;
-}
-.py-2 {
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
-}
-.py-2\.5 {
- padding-top: 0.625rem;
- padding-bottom: 0.625rem;
-}
-.py-4 {
- padding-top: 1rem;
- padding-bottom: 1rem;
-}
-.py-6 {
- padding-top: 1.5rem;
- padding-bottom: 1.5rem;
-}
-.pb-4 {
- padding-bottom: 1rem;
-}
-.pl-1 {
- padding-left: 0.25rem;
-}
-.pl-10 {
- padding-left: 2.5rem;
-}
-.pl-2 {
- padding-left: 0.5rem;
-}
-.pl-3 {
- padding-left: 0.75rem;
-}
-.pr-10 {
- padding-right: 2.5rem;
-}
-.pr-12 {
- padding-right: 3rem;
-}
-.pr-2 {
- padding-right: 0.5rem;
-}
-.pr-3 {
- padding-right: 0.75rem;
-}
-.pr-4 {
- padding-right: 1rem;
-}
-.pr-9 {
- padding-right: 2.25rem;
-}
-.pt-2 {
- padding-top: 0.5rem;
-}
-.pt-3 {
- padding-top: 0.75rem;
-}
-.pt-4 {
- padding-top: 1rem;
-}
-.pt-5 {
- padding-top: 1.25rem;
-}
-.text-left {
- text-align: left;
-}
-.text-center {
- text-align: center;
-}
-.text-3xl {
- font-size: 1.875rem;
- line-height: 2.25rem;
-}
-.text-\[0\.625rem\] {
- font-size: 0.625rem;
-}
-.text-base {
- font-size: 1rem;
- line-height: 1.5rem;
-}
-.text-lg {
- font-size: 1.125rem;
- line-height: 1.75rem;
-}
-.text-sm {
- font-size: 0.875rem;
- line-height: 1.25rem;
-}
-.text-xl {
- font-size: 1.25rem;
- line-height: 1.75rem;
-}
-.text-xs {
- font-size: 0.75rem;
- line-height: 1rem;
-}
-.font-bold {
- font-weight: 700;
-}
-.font-medium {
- font-weight: 500;
-}
-.font-normal {
- font-weight: 400;
-}
-.font-semibold {
- font-weight: 600;
-}
-.leading-5 {
- line-height: 1.25rem;
-}
-.leading-6 {
- line-height: 1.5rem;
-}
-.leading-7 {
- line-height: 1.75rem;
-}
-.leading-8 {
- line-height: 2rem;
-}
-.leading-none {
- line-height: 1;
-}
-.tracking-tight {
- letter-spacing: -0.025em;
-}
-.text-gray-300 {
- --tw-text-opacity: 1;
- color: rgb(209 213 219 / var(--tw-text-opacity));
-}
-.text-gray-400 {
- --tw-text-opacity: 1;
- color: rgb(156 163 175 / var(--tw-text-opacity));
-}
-.text-gray-500 {
- --tw-text-opacity: 1;
- color: rgb(107 114 128 / var(--tw-text-opacity));
-}
-.text-gray-600 {
- --tw-text-opacity: 1;
- color: rgb(75 85 99 / var(--tw-text-opacity));
-}
-.text-gray-700 {
- --tw-text-opacity: 1;
- color: rgb(55 65 81 / var(--tw-text-opacity));
-}
-.text-gray-900 {
- --tw-text-opacity: 1;
- color: rgb(17 24 39 / var(--tw-text-opacity));
-}
-.text-indigo-200 {
- --tw-text-opacity: 1;
- color: rgb(199 210 254 / var(--tw-text-opacity));
-}
-.text-indigo-600 {
- --tw-text-opacity: 1;
- color: rgb(79 70 229 / var(--tw-text-opacity));
-}
-.text-indigo-700 {
- --tw-text-opacity: 1;
- color: rgb(67 56 202 / var(--tw-text-opacity));
-}
-.text-red-400 {
- --tw-text-opacity: 1;
- color: rgb(248 113 113 / var(--tw-text-opacity));
-}
-.text-red-600 {
- --tw-text-opacity: 1;
- color: rgb(220 38 38 / var(--tw-text-opacity));
-}
-.text-red-700 {
- --tw-text-opacity: 1;
- color: rgb(185 28 28 / var(--tw-text-opacity));
-}
-.text-red-800 {
- --tw-text-opacity: 1;
- color: rgb(153 27 27 / var(--tw-text-opacity));
-}
-.text-red-900 {
- --tw-text-opacity: 1;
- color: rgb(127 29 29 / var(--tw-text-opacity));
-}
-.text-white {
- --tw-text-opacity: 1;
- color: rgb(255 255 255 / var(--tw-text-opacity));
-}
-.opacity-0 {
- opacity: 0;
-}
-.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);
- box-shadow:
- var(--tw-ring-offset-shadow, 0 0 #0000),
- var(--tw-ring-shadow, 0 0 #0000),
- var(--tw-shadow);
-}
-.shadow-lg {
- --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
- --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
- box-shadow:
- var(--tw-ring-offset-shadow, 0 0 #0000),
- var(--tw-ring-shadow, 0 0 #0000),
- var(--tw-shadow);
-}
-.shadow-sm {
- --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
- --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
- box-shadow:
- var(--tw-ring-offset-shadow, 0 0 #0000),
- var(--tw-ring-shadow, 0 0 #0000),
- var(--tw-shadow);
-}
-.shadow-xl {
- --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
- --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);
- box-shadow:
- var(--tw-ring-offset-shadow, 0 0 #0000),
- var(--tw-ring-shadow, 0 0 #0000),
- var(--tw-shadow);
-}
-.ring-1 {
- --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
- --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);
- box-shadow:
- var(--tw-ring-offset-shadow),
- var(--tw-ring-shadow),
- var(--tw-shadow, 0 0 #0000);
-}
-.ring-2 {
- --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
- --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
- box-shadow:
- var(--tw-ring-offset-shadow),
- var(--tw-ring-shadow),
- var(--tw-shadow, 0 0 #0000);
-}
-.ring-inset {
- --tw-ring-inset: inset;
-}
-.ring-black {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity));
-}
-.ring-gray-200 {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity));
-}
-.ring-gray-300 {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity));
-}
-.ring-gray-900\/5 {
- --tw-ring-color: rgb(17 24 39 / 0.05);
-}
-.ring-indigo-600 {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity));
-}
-.ring-red-300 {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(252 165 165 / var(--tw-ring-opacity));
-}
-.ring-opacity-5 {
- --tw-ring-opacity: 0.05;
-}
-.filter {
- filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
-}
-.duration-300 {
- transition-duration: 300ms;
-}
-.placeholder\:text-gray-400::-moz-placeholder {
- --tw-text-opacity: 1;
- color: rgb(156 163 175 / var(--tw-text-opacity));
-}
-.placeholder\:text-gray-400::placeholder {
- --tw-text-opacity: 1;
- color: rgb(156 163 175 / var(--tw-text-opacity));
-}
-.placeholder\:text-red-300::-moz-placeholder {
- --tw-text-opacity: 1;
- color: rgb(252 165 165 / var(--tw-text-opacity));
-}
-.placeholder\:text-red-300::placeholder {
- --tw-text-opacity: 1;
- color: rgb(252 165 165 / var(--tw-text-opacity));
-}
-.focus-within\:z-10:focus-within {
- z-index: 10;
-}
-.focus-within\:outline-none:focus-within {
- outline: 2px solid transparent;
- outline-offset: 2px;
-}
-.focus-within\:ring-2:focus-within {
- --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
- --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
- box-shadow:
- var(--tw-ring-offset-shadow),
- var(--tw-ring-shadow),
- var(--tw-shadow, 0 0 #0000);
-}
-.focus-within\:ring-inset:focus-within {
- --tw-ring-inset: inset;
-}
-.focus-within\:ring-indigo-600:focus-within {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity));
-}
-.focus-within\:ring-offset-2:focus-within {
- --tw-ring-offset-width: 2px;
-}
-.hover\:bg-gray-100:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(243 244 246 / var(--tw-bg-opacity));
-}
-.hover\:bg-gray-50:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(249 250 251 / var(--tw-bg-opacity));
-}
-.hover\:bg-gray-500\/20:hover {
- background-color: rgb(107 114 128 / 0.2);
-}
-.hover\:bg-indigo-500:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(99 102 241 / var(--tw-bg-opacity));
-}
-.hover\:bg-indigo-600:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(79 70 229 / var(--tw-bg-opacity));
-}
-.hover\:bg-red-500:hover {
- --tw-bg-opacity: 1;
- background-color: rgb(239 68 68 / var(--tw-bg-opacity));
-}
-.hover\:bg-opacity-75:hover {
- --tw-bg-opacity: 0.75;
-}
-.hover\:text-gray-400:hover {
- --tw-text-opacity: 1;
- color: rgb(156 163 175 / var(--tw-text-opacity));
-}
-.hover\:text-gray-500:hover {
- --tw-text-opacity: 1;
- color: rgb(107 114 128 / var(--tw-text-opacity));
-}
-.hover\:text-indigo-500:hover {
- --tw-text-opacity: 1;
- color: rgb(99 102 241 / var(--tw-text-opacity));
-}
-.hover\:text-indigo-600:hover {
- --tw-text-opacity: 1;
- color: rgb(79 70 229 / var(--tw-text-opacity));
-}
-.hover\:text-white:hover {
- --tw-text-opacity: 1;
- color: rgb(255 255 255 / var(--tw-text-opacity));
-}
-.hover\:opacity-70:hover {
- opacity: 0.7;
-}
-.hover\:ring-indigo-500:hover {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity));
-}
-.focus\:z-10:focus {
- z-index: 10;
-}
-.focus\:outline-none:focus {
- outline: 2px solid transparent;
- outline-offset: 2px;
-}
-.focus\:ring-0:focus {
- --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
- --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);
- box-shadow:
- var(--tw-ring-offset-shadow),
- var(--tw-ring-shadow),
- var(--tw-shadow, 0 0 #0000);
-}
-.focus\:ring-2:focus {
- --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
- --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);
- box-shadow:
- var(--tw-ring-offset-shadow),
- var(--tw-ring-shadow),
- var(--tw-shadow, 0 0 #0000);
-}
-.focus\:ring-inset:focus {
- --tw-ring-inset: inset;
-}
-.focus\:ring-indigo-500:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity));
-}
-.focus\:ring-indigo-600:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity));
-}
-.focus\:ring-red-500:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity));
-}
-.focus\:ring-white:focus {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity));
-}
-.focus\:ring-offset-2:focus {
- --tw-ring-offset-width: 2px;
-}
-.focus\:ring-offset-indigo-600:focus {
- --tw-ring-offset-color: #4f46e5;
-}
-.focus-visible\:outline:focus-visible {
- outline-style: solid;
-}
-.focus-visible\:outline-2:focus-visible {
- outline-width: 2px;
-}
-.focus-visible\:outline-offset-2:focus-visible {
- outline-offset: 2px;
-}
-.focus-visible\:outline-indigo-600:focus-visible {
- outline-color: #4f46e5;
-}
-.disabled\:cursor-not-allowed:disabled {
- cursor: not-allowed;
-}
-.disabled\:bg-gray-50:disabled {
- --tw-bg-opacity: 1;
- background-color: rgb(249 250 251 / var(--tw-bg-opacity));
-}
-.disabled\:text-gray-500:disabled {
- --tw-text-opacity: 1;
- color: rgb(107 114 128 / var(--tw-text-opacity));
-}
-.disabled\:ring-gray-200:disabled {
- --tw-ring-opacity: 1;
- --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity));
-}
-.group:hover .group-hover\:flex {
- display: flex;
-}
-.group:hover .group-hover\:border-indigo-600 {
- --tw-border-opacity: 1;
- border-color: rgb(79 70 229 / var(--tw-border-opacity));
-}
-.group:hover .group-hover\:stroke-gray-700\/75 {
- stroke: rgb(55 65 81 / 0.75);
-}
-.group:hover .group-hover\:text-indigo-600 {
- --tw-text-opacity: 1;
- color: rgb(79 70 229 / var(--tw-text-opacity));
-}
-.group:hover .group-hover\:text-white {
- --tw-text-opacity: 1;
- color: rgb(255 255 255 / var(--tw-text-opacity));
-}
-.group.attention-danger .group-\[\.attention-danger\]\:bg-red-50 {
- --tw-bg-opacity: 1;
- background-color: rgb(254 242 242 / var(--tw-bg-opacity));
-}
-.group.attention-info .group-\[\.attention-info\]\:bg-blue-50 {
- --tw-bg-opacity: 1;
- background-color: rgb(239 246 255 / var(--tw-bg-opacity));
-}
-.group.attention-success .group-\[\.attention-success\]\:bg-green-50 {
- --tw-bg-opacity: 1;
- background-color: rgb(240 253 244 / var(--tw-bg-opacity));
-}
-.group.attention-warning .group-\[\.attention-warning\]\:bg-yellow-50 {
- --tw-bg-opacity: 1;
- background-color: rgb(254 252 232 / var(--tw-bg-opacity));
-}
-.group.attention-danger .group-\[\.attention-danger\]\:text-red-400 {
- --tw-text-opacity: 1;
- color: rgb(248 113 113 / var(--tw-text-opacity));
-}
-.group.attention-danger .group-\[\.attention-danger\]\:text-red-700 {
- --tw-text-opacity: 1;
- color: rgb(185 28 28 / var(--tw-text-opacity));
-}
-.group.attention-danger .group-\[\.attention-danger\]\:text-red-800 {
- --tw-text-opacity: 1;
- color: rgb(153 27 27 / var(--tw-text-opacity));
-}
-.group.attention-info .group-\[\.attention-info\]\:text-blue-400 {
- --tw-text-opacity: 1;
- color: rgb(96 165 250 / var(--tw-text-opacity));
-}
-.group.attention-info .group-\[\.attention-info\]\:text-blue-700 {
- --tw-text-opacity: 1;
- color: rgb(29 78 216 / var(--tw-text-opacity));
-}
-.group.attention-info .group-\[\.attention-info\]\:text-blue-800 {
- --tw-text-opacity: 1;
- color: rgb(30 64 175 / var(--tw-text-opacity));
-}
-.group.attention-success .group-\[\.attention-success\]\:text-green-400 {
- --tw-text-opacity: 1;
- color: rgb(74 222 128 / var(--tw-text-opacity));
-}
-.group.attention-success .group-\[\.attention-success\]\:text-green-700 {
- --tw-text-opacity: 1;
- color: rgb(21 128 61 / var(--tw-text-opacity));
-}
-.group.attention-success .group-\[\.attention-success\]\:text-green-800 {
- --tw-text-opacity: 1;
- color: rgb(22 101 52 / var(--tw-text-opacity));
-}
-.group.attention-warning .group-\[\.attention-warning\]\:text-yellow-400 {
- --tw-text-opacity: 1;
- color: rgb(250 204 21 / var(--tw-text-opacity));
-}
-.group.attention-warning .group-\[\.attention-warning\]\:text-yellow-700 {
- --tw-text-opacity: 1;
- color: rgb(161 98 7 / var(--tw-text-opacity));
-}
-.group.attention-warning .group-\[\.attention-warning\]\:text-yellow-800 {
- --tw-text-opacity: 1;
- color: rgb(133 77 14 / var(--tw-text-opacity));
-}
-@media (min-width: 640px) {
- .sm\:col-span-2 {
- grid-column: span 2 / span 2;
- }
- .sm\:col-span-6 {
- grid-column: span 6 / span 6;
- }
- .sm\:mt-20 {
- margin-top: 5rem;
- }
- .sm\:inline {
- display: inline;
- }
- .sm\:flex {
- display: flex;
- }
- .sm\:hidden {
- display: none;
- }
- .sm\:grid-cols-6 {
- grid-template-columns: repeat(6, minmax(0, 1fr));
- }
- .sm\:justify-between {
- justify-content: space-between;
- }
- .sm\:px-0 {
- padding-left: 0px;
- padding-right: 0px;
- }
- .sm\:px-6 {
- padding-left: 1.5rem;
- padding-right: 1.5rem;
- }
- .sm\:text-4xl {
- font-size: 2.25rem;
- line-height: 2.5rem;
- }
- .sm\:text-sm {
- font-size: 0.875rem;
- line-height: 1.25rem;
- }
- .sm\:leading-6 {
- line-height: 1.5rem;
- }
-}
-@media (min-width: 768px) {
- .md\:order-1 {
- order: 1;
- }
- .md\:col-span-2 {
- grid-column: span 2 / span 2;
- }
- .md\:mt-0 {
- margin-top: 0px;
- }
- .md\:grid-cols-3 {
- grid-template-columns: repeat(3, minmax(0, 1fr));
- }
-}
-@media (min-width: 1024px) {
- .lg\:px-8 {
- padding-left: 2rem;
- padding-right: 2rem;
- }
-}
-/*# sourceMappingURL=main.css.map */
diff --git a/contrib/meson.build b/contrib/meson.build
@@ -8,9 +8,8 @@ configure_file(
install_dir: get_option('bindir'),
)
-
install_subdir(
- 'wallet-core' / 'challenger',
+ 'spa',
strip_directory: true,
install_dir: get_option('datadir') / 'challenger' / 'spa',
)
diff --git a/contrib/spa.lock b/contrib/spa.lock
@@ -1 +0,0 @@
-1.5.14
-\ No newline at end of file
diff --git a/contrib/spa/index.html b/contrib/spa/index.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+<body>
+ <h1>Taler Merchant Web UI not installed</h1>
+ <p>This is a fallback page shown when the Taler Merchant Web UI is not
+ available.</p>
+ <p>Please make sure the page is installed and the
+ <code>BACKOFFICE_SPA_DIR</code> option in the <code>[merchant]</code> section of
+ the taler-merchant configuration is set correctly.</p>
+</body>
+</html>
diff --git a/contrib/wallet-core b/contrib/wallet-core
@@ -1 +0,0 @@
-Subproject commit 45c7768f9153846198dac99b6a9015477b9d7d2a
diff --git a/src/challenger/challenger-httpd.c b/src/challenger/challenger-httpd.c
@@ -87,6 +87,8 @@ char *CH_address_hint;
char *CH_auth_command;
+char *CH_spa_dir;
+
/**
* Function called first by MHD with the full URL.
@@ -743,6 +745,22 @@ run (void *cls,
}
}
+ if (GNUNET_OK ==
+ GNUNET_CONFIGURATION_get_value_filename (config,
+ "challenger",
+ "SPA_DIR",
+ &CH_spa_dir))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Loading challenger SPA from %s\n",
+ CH_spa_dir);
+ }
+ else
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+ "Loading challenger SPA from default location\n");
+ }
+
global_ret = EXIT_NOTCONFIGURED;
GNUNET_SCHEDULER_add_shutdown (&do_shutdown,
NULL);
diff --git a/src/challenger/challenger-httpd.h b/src/challenger/challenger-httpd.h
@@ -189,6 +189,13 @@ extern struct GNUNET_TIME_Relative CH_token_expiration;
extern struct GNUNET_TIME_Relative CH_pin_retransmission_frequency;
/**
+ * Absolute directory path of the (externally packaged) challenger SPA.
+ *
+ * Can be NULL.
+ */
+extern char *CH_spa_dir;
+
+/**
* JSON object with key-object pairs mapping address keys (from the
* form) to an object with a field "regex" containing a regular
* expressions expressing restrictions on values for the address and a
diff --git a/src/challenger/challenger-httpd_spa.c b/src/challenger/challenger-httpd_spa.c
@@ -53,8 +53,24 @@ CH_handler_spa (struct CH_HandlerContext *hc,
enum GNUNET_GenericReturnValue
CH_spa_init ()
{
- spa = TALER_MHD_spa_load (CHALLENGER_project_data (),
- "spa/");
+ bool have_spa = false;
+ if (NULL != CH_spa_dir)
+ {
+ struct stat sb;
+ have_spa = stat (CH_spa_dir, &sb) == 0 && S_ISDIR (sb.st_mode);
+ if (! have_spa)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ "SPA not found at '%s', using fallback\n",
+ CH_spa_dir);
+ }
+ }
+ if (! have_spa)
+ spa = TALER_MHD_spa_load (CHALLENGER_project_data (),
+ "spa/");
+ else
+ spa = TALER_MHD_spa_load_dir (CH_spa_dir);
+
if (NULL == spa)
{
GNUNET_break (0);
diff --git a/src/challenger/challenger.conf b/src/challenger/challenger.conf
@@ -49,3 +49,6 @@ AUTH_COMMAND = /usr/bin/true
#
# ADDRESS_TYPE =
ADDRESS_TYPE = postal
+
+# Where is the webui installed?
+SPA_DIR = $PREFIX/share/challenger-webui/