+
-
- {% trans 'We sent you an email that contains a code for your login. Please enter the code in the field below.' %}
-
+
+ - {% trans 'Authenticate' %}
+ - {% trans 'Confirm Code' %}
+ - {% trans 'Account Completion' %}
+ - {% trans 'Done' %}
+
+
+
+ {% trans 'We sent you an email that contains a code for your login. Please enter the code in the field below.' %}
+
{% endif %}
-
-
diff --git a/fbl_integration/templates/partials/fbl_logo.html b/fbl_integration/templates/partials/fbl_logo.html
new file mode 100644
index 0000000..9201a52
--- /dev/null
+++ b/fbl_integration/templates/partials/fbl_logo.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/fbl_integration/urls.py b/fbl_integration/urls.py
index 4678c3a..91a8da9 100644
--- a/fbl_integration/urls.py
+++ b/fbl_integration/urls.py
@@ -1,8 +1,9 @@
from django.urls import path
-from .views import fbl_authentication_start, fbl_authentication_get_code
+from .views import fbl_authentication_start, fbl_authentication_get_code, complete_registration
urlpatterns = [
- path("auth_start", fbl_authentication_start, name="fbl-auth-start"),
- path("auth_get_code", fbl_authentication_get_code, name="fbl-auth-get-code")
+ path("auth_start", fbl_authentication_start, name="fbl_auth_start"),
+ path("auth_get_code", fbl_authentication_get_code, name="fbl_auth_get_code"),
+ path("complete_registration", complete_registration, name="fbl_complete_registration"),
]
diff --git a/fbl_integration/utils.py b/fbl_integration/utils.py
new file mode 100644
index 0000000..c346719
--- /dev/null
+++ b/fbl_integration/utils.py
@@ -0,0 +1,52 @@
+import requests
+from django.conf import settings
+from .models import FblAccount
+
+def fbl_auth_request_code(badge_number: int, dob: str) -> bool:
+ res = requests.post(f'{settings.FBL_AUTH_SERVER}/auth/get-code', data={
+ "badge": badge_number,
+ "password": dob
+ })
+ if res.status_code != 201:
+ return False
+ return True
+
+def fbl_auth_validate_code(badge_number: str, dob: str, validation_code: str) -> str | None:
+ res = requests.post(f'{settings.FBL_AUTH_SERVER}/auth/signin', json={
+ "badge": badge_number,
+ "password": dob,
+ "code": validation_code
+ })
+ if res.status_code != 201:
+ return None
+
+ return res.json()["accessToken"]
+
+def fbl_auth_get_account(jwt_token: str) -> dict[str, str] | None:
+ res = requests.get(f'{settings.FBL_AUTH_SERVER}/attendees/me', headers={
+ "Authorization": f"Bearer {jwt_token}"
+ })
+ if res.status_code != 200:
+ return None
+
+ return res.json()
+
+def get_or_create_account(account_info: dict[str, str]) -> FblAccount:
+ """Get or create a FblAccount object based on the account info"""
+ if FblAccount.objects.filter(account_id=account_info["account_id"]).exists():
+ # Get existing user and update status
+ user = FblAccount.objects.get(account_id=account_info["account_id"])
+ user.status = account_info["status"]
+ user.save()
+ return user
+
+ # Create new user with (generic) username
+ user = FblAccount.create_user(account_info["username"])
+ return FblAccount.objects.create(
+ user=user,
+ badge_number=account_info["badge"],
+ account_id=account_info["account_id"],
+ status=account_info["status"],
+ username=account_info["username"],
+ tags_secured=','.join(account_info["tags_secured"])
+ )
\ No newline at end of file
diff --git a/fbl_integration/views.py b/fbl_integration/views.py
index 6104dd1..21b5103 100644
--- a/fbl_integration/views.py
+++ b/fbl_integration/views.py
@@ -1,19 +1,61 @@
-from django.shortcuts import render
-from .forms import FblAuthForm
+from django.shortcuts import render, redirect
+from django.contrib.auth import login
+from datetime import datetime
+from .forms import FblAuthForm, FblAuthCodeForm, RegistrationCompletionForm
+from .utils import fbl_auth_request_code, fbl_auth_validate_code, fbl_auth_get_account, get_or_create_account
def fbl_authentication_start(request):
+ auth_form = FblAuthForm(request.POST or None)
if request.method == "POST":
- form = FblAuthForm(request.POST)
- if form.is_valid():
+ if auth_form.is_valid():
+
+ valid_info = fbl_auth_request_code(
+ badge_number=auth_form.cleaned_data["badge_number"],
+ dob=auth_form.cleaned_data["dob"]
+ )
+ if valid_info:
+ code_form = FblAuthCodeForm(initial={
+ **auth_form.cleaned_data,
+ "dob": datetime.strptime(auth_form.cleaned_data["dob"], "%Y-%m-%d").strftime("%d/%m/%Y"),
+ })
+
+ return render(request, "fbl_auth_get_code.html", {"get_code_form": code_form})
- # set hidden fields with dob and badge number
- return render(request, "fbl_auth_get_code.html")
- else:
- return render(request, "fbl_auth_start.html", {"form": form})
- else:
- form = FblAuthForm()
+ auth_form.add_error(None, "Invalid badge number or date of birth")
+
+ return render(request, "fbl_auth_start.html", {"form": auth_form})
- return render(request, "auth_start.html", {"form": form})
def fbl_authentication_get_code(request):
- return render(request, "fbl_auth_get_code.html")
\ No newline at end of file
+ code_form = FblAuthCodeForm(request.POST or None)
+ if request.method == "POST":
+ if code_form.is_valid():
+ access_token = fbl_auth_validate_code(
+ badge_number=code_form.cleaned_data["badge_number"],
+ dob=code_form.cleaned_data["dob"],
+ validation_code=code_form.cleaned_data["validation_code"]
+ )
+ if access_token:
+ account_info = fbl_auth_get_account(access_token)
+ fbl_account = get_or_create_account(account_info)
+
+ login(request=request, user=fbl_account.user)
+
+ if not fbl_account.user.email:
+ return redirect("fbl_complete_registration")
+ else:
+ return redirect("all_tickets")
+
+ code_form.add_error(None, "Invalid validation code")
+
+
+ return render(request, "fbl_auth_get_code.html", {"get_code_form": code_form})
+
+def complete_registration(request):
+ form = RegistrationCompletionForm(request.POST or None)
+ if request.method == "POST":
+ if form.is_valid():
+ request.user.email = form.cleaned_data["email"]
+ request.user.save()
+ return redirect("all_tickets")
+ return render(request, "complete_registration.html", {"form": form})
\ No newline at end of file
diff --git a/paw/settings.py b/paw/settings.py
index 412cf7b..25ba106 100644
--- a/paw/settings.py
+++ b/paw/settings.py
@@ -190,3 +190,7 @@ GOOGLE_OAUTH_PROJECT_ID = environ['GOOGLE_OAUTH_PROJECT_ID']
GOOGLE_OAUTH_CLIENT_SECRET = environ['GOOGLE_OAUTH_CLIENT_SECRET']
GOOGLE_OAUTH_REDIRECT_URI = environ['GOOGLE_OAUTH_REDIRECT_URI']
GOOGLE_OAUTH_SCOPES = environ.get('GOOGLE_OAUTH_SCOPES', '').split(",")
+
+# FBL Integration
+FBL_AUTH_ENABLED = environ.get('FBL_AUTH_ENABLED').lower() == 'true'
+FBL_AUTH_SERVER = environ['FBL_AUTH_SERVER']
diff --git a/paw/static/css/paw.css b/paw/static/css/paw.css
index 03898cf..766f45a 100644
--- a/paw/static/css/paw.css
+++ b/paw/static/css/paw.css
@@ -1310,18 +1310,6 @@ html {
}
}
- .btn-outline.btn-primary:hover {
- --tw-text-opacity: 1;
- color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));
- }
-
- @supports (color: color-mix(in oklab, black, black)) {
- .btn-outline.btn-primary:hover {
- background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);
- border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);
- }
- }
-
.btn-outline.btn-accent:hover {
--tw-text-opacity: 1;
color: var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)));
@@ -1707,56 +1695,6 @@ html {
height: auto;
}
-.stats {
- display: inline-grid;
- border-radius: var(--rounded-box, 1rem);
- --tw-bg-opacity: 1;
- background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));
- --tw-text-opacity: 1;
- color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));
-}
-
-:where(.stats) {
- grid-auto-flow: column;
- overflow-x: auto;
-}
-
-.stat {
- display: inline-grid;
- width: 100%;
- grid-template-columns: repeat(1, 1fr);
- -moz-column-gap: 1rem;
- column-gap: 1rem;
- border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));
- --tw-border-opacity: 0.1;
- padding-left: 1.5rem;
- padding-right: 1.5rem;
- padding-top: 1rem;
- padding-bottom: 1rem;
-}
-
-.stat-figure {
- grid-column-start: 2;
- grid-row: span 3 / span 3;
- grid-row-start: 1;
- place-self: center;
- justify-self: end;
-}
-
-.stat-title {
- grid-column-start: 1;
- white-space: nowrap;
- color: var(--fallback-bc,oklch(var(--bc)/0.6));
-}
-
-.stat-value {
- grid-column-start: 1;
- white-space: nowrap;
- font-size: 2.25rem;
- line-height: 2.5rem;
- font-weight: 800;
-}
-
.steps {
display: inline-grid;
grid-auto-flow: column;
@@ -1893,6 +1831,14 @@ html {
var(--togglehandleborder);
}
+.alert-info {
+ border-color: var(--fallback-in,oklch(var(--in)/0.2));
+ --tw-text-opacity: 1;
+ color: var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)));
+ --alert-bg: var(--fallback-in,oklch(var(--in)/1));
+ --alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1));
+}
+
.alert-success {
border-color: var(--fallback-su,oklch(var(--su)/0.2));
--tw-text-opacity: 1;
@@ -1967,15 +1913,6 @@ html {
color: var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)));
}
-.badge-ghost {
- --tw-border-opacity: 1;
- border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));
- --tw-bg-opacity: 1;
- background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));
- --tw-text-opacity: 1;
- color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));
-}
-
.badge-outline.badge-neutral {
--tw-text-opacity: 1;
color: var(--fallback-n,oklch(var(--n)/var(--tw-text-opacity)));
@@ -2018,10 +1955,6 @@ html {
border-color: var(--btn-color, var(--fallback-b2));
}
- .btn-primary {
- --btn-color: var(--fallback-p);
- }
-
.btn-accent {
--btn-color: var(--fallback-a);
}
@@ -2044,11 +1977,6 @@ html {
}
@supports (color: color-mix(in oklab, black, black)) {
- .btn-outline.btn-primary.btn-active {
- background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);
- border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);
- }
-
.btn-outline.btn-accent.btn-active {
background-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black);
border-color: color-mix(in oklab, var(--fallback-a,oklch(var(--a)/1)) 90%, black);
@@ -2076,17 +2004,7 @@ html {
outline-offset: 2px;
}
-.btn-primary {
- --tw-text-opacity: 1;
- color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));
- outline-color: var(--fallback-p,oklch(var(--p)/1));
-}
-
@supports (color: oklch(0 0 0)) {
- .btn-primary {
- --btn-color: var(--p);
- }
-
.btn-accent {
--btn-color: var(--a);
}
@@ -2166,16 +2084,6 @@ html {
background-color: var(--fallback-bc,oklch(var(--bc)/0.2));
}
-.btn-outline.btn-primary {
- --tw-text-opacity: 1;
- color: var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)));
-}
-
-.btn-outline.btn-primary.btn-active {
- --tw-text-opacity: 1;
- color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));
-}
-
.btn-outline.btn-accent {
--tw-text-opacity: 1;
color: var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)));
@@ -2750,19 +2658,6 @@ html {
}
}
-:where(.stats) > :not([hidden]) ~ :not([hidden]) {
- --tw-divide-x-reverse: 0;
- border-right-width: calc(1px * var(--tw-divide-x-reverse));
- border-left-width: calc(1px * calc(1 - var(--tw-divide-x-reverse)));
- --tw-divide-y-reverse: 0;
- border-top-width: calc(0px * calc(1 - var(--tw-divide-y-reverse)));
- border-bottom-width: calc(0px * var(--tw-divide-y-reverse));
-}
-
-:is([dir="rtl"] .stats > :not([hidden]) ~ :not([hidden])) {
- --tw-divide-x-reverse: 1;
-}
-
.steps .step:before {
top: 0px;
grid-column-start: 1;
@@ -3421,10 +3316,6 @@ html:has(.drawer-toggle:checked) {
margin-left: 0.5rem;
}
-.ml-20 {
- margin-left: 5rem;
-}
-
.ml-4 {
margin-left: 1rem;
}
@@ -3453,14 +3344,14 @@ html:has(.drawer-toggle:checked) {
margin-top: 1rem;
}
-.mt-8 {
- margin-top: 2rem;
-}
-
.mt-6 {
margin-top: 1.5rem;
}
+.mt-8 {
+ margin-top: 2rem;
+}
+
.block {
display: block;
}
@@ -3481,10 +3372,6 @@ html:has(.drawer-toggle:checked) {
display: none;
}
-.h-10 {
- height: 2.5rem;
-}
-
.h-12 {
height: 3rem;
}
@@ -3505,22 +3392,18 @@ html:has(.drawer-toggle:checked) {
height: 1.5rem;
}
-.h-7 {
- height: 1.75rem;
-}
-
.h-full {
height: 100%;
}
-.min-h-screen {
- min-height: 100vh;
-}
-
.min-h-full {
min-height: 100%;
}
+.min-h-screen {
+ min-height: 100vh;
+}
+
.w-10 {
width: 2.5rem;
}
@@ -3529,10 +3412,6 @@ html:has(.drawer-toggle:checked) {
width: 3rem;
}
-.w-20 {
- width: 5rem;
-}
-
.w-4 {
width: 1rem;
}
@@ -3549,22 +3428,14 @@ html:has(.drawer-toggle:checked) {
width: 1.5rem;
}
-.w-7 {
- width: 1.75rem;
+.w-72 {
+ width: 18rem;
}
.w-full {
width: 100%;
}
-.w-80 {
- width: 20rem;
-}
-
-.w-72 {
- width: 18rem;
-}
-
.max-w-3xl {
max-width: 48rem;
}
@@ -3601,6 +3472,10 @@ html:has(.drawer-toggle:checked) {
flex-grow: 1;
}
+.transform {
+ 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-pointer {
cursor: pointer;
}
@@ -3645,10 +3520,6 @@ html:has(.drawer-toggle:checked) {
align-self: center;
}
-.overflow-y-auto {
- overflow-y: auto;
-}
-
.whitespace-pre-line {
white-space: pre-line;
}
@@ -3717,11 +3588,6 @@ html:has(.drawer-toggle:checked) {
background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));
}
-.bg-base-content {
- --tw-bg-opacity: 1;
- background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));
-}
-
.stroke-current {
stroke: currentColor;
}
@@ -3751,6 +3617,11 @@ html:has(.drawer-toggle:checked) {
padding-right: 0.5rem;
}
+.px-3 {
+ padding-left: 0.75rem;
+ padding-right: 0.75rem;
+}
+
.py-1 {
padding-top: 0.25rem;
padding-bottom: 0.25rem;
@@ -3761,11 +3632,6 @@ html:has(.drawer-toggle:checked) {
padding-bottom: 0.5rem;
}
-.px-3 {
- padding-left: 0.75rem;
- padding-right: 0.75rem;
-}
-
.text-center {
text-align: center;
}
@@ -3835,26 +3701,11 @@ html:has(.drawer-toggle:checked) {
color: var(--fallback-bc,oklch(var(--bc)/0.85));
}
-.text-error {
- --tw-text-opacity: 1;
- color: var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)));
-}
-
.text-neutral-content {
--tw-text-opacity: 1;
color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));
}
-.text-success {
- --tw-text-opacity: 1;
- color: var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)));
-}
-
-.text-warning {
- --tw-text-opacity: 1;
- color: var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)));
-}
-
.text-white {
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
@@ -3868,273 +3719,15 @@ html:has(.drawer-toggle:checked) {
opacity: 0.5;
}
-.opacity-70 {
- opacity: 0.7;
-}
-
.opacity-60 {
opacity: 0.6;
}
-@media (min-width: 1024px) {
- .lg\:btn {
- display: inline-flex;
- height: 3rem;
- min-height: 3rem;
- flex-shrink: 0;
- cursor: pointer;
- -webkit-user-select: none;
- -moz-user-select: none;
- user-select: none;
- flex-wrap: wrap;
- align-items: center;
- justify-content: center;
- border-radius: var(--rounded-btn, 0.5rem);
- border-color: transparent;
- border-color: oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity));
- padding-left: 1rem;
- padding-right: 1rem;
- text-align: center;
- font-size: 0.875rem;
- line-height: 1em;
- gap: 0.5rem;
- font-weight: 600;
- text-decoration-line: none;
- transition-duration: 200ms;
- transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
- border-width: var(--border-btn, 1px);
- animation: button-pop var(--animation-btn, 0.25s) ease-out;
- transition-property: color, background-color, border-color, opacity, box-shadow, transform;
- --tw-text-opacity: 1;
- color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));
- --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);
- outline-color: var(--fallback-bc,oklch(var(--bc)/1));
- background-color: oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity));
- --tw-bg-opacity: 1;
- --tw-border-opacity: 1;
- }
-
- .lg\:btn[disabled],.lg\:btn:disabled {
- pointer-events: none;
- }
-
- :where(.lg\:btn:is(input[type="checkbox"])),
-:where(.lg\:btn:is(input[type="radio"])) {
- width: auto;
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
- }
-
- .lg\:btn:is(input[type="checkbox"]):after,.lg\:btn:is(input[type="radio"]):after {
- --tw-content: attr(aria-label);
- content: var(--tw-content);
- }
-
- @media (hover: hover) {
- .lg\:btn:hover {
- --tw-border-opacity: 1;
- border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));
- --tw-bg-opacity: 1;
- background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));
- }
-
- @supports (color: color-mix(in oklab, black, black)) {
- .lg\:btn:hover {
- background-color: color-mix(
- in oklab,
- oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,
- black
- );
- border-color: color-mix(
- in oklab,
- oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,
- black
- );
- }
- }
-
- @supports not (color: oklch(0 0 0)) {
- .lg\:btn:hover {
- background-color: var(--btn-color, var(--fallback-b2));
- border-color: var(--btn-color, var(--fallback-b2));
- }
- }
-
- .lg\:btn:hover {
- --tw-border-opacity: 1;
- border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));
- --tw-bg-opacity: 1;
- background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));
- }
-
- @supports (color: color-mix(in oklab, black, black)) {
- .lg\:btn:hover {
- background-color: color-mix(
- in oklab,
- oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,
- black
- );
- border-color: color-mix(
- in oklab,
- oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,
- black
- );
- }
- }
-
- @supports not (color: oklch(0 0 0)) {
- .lg\:btn:hover {
- background-color: var(--btn-color, var(--fallback-b2));
- border-color: var(--btn-color, var(--fallback-b2));
- }
- }
-
- .lg\:btn:hover {
- --tw-border-opacity: 1;
- border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));
- --tw-bg-opacity: 1;
- background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));
- }
-
- @supports (color: color-mix(in oklab, black, black)) {
- .lg\:btn:hover {
- background-color: color-mix(
- in oklab,
- oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,
- black
- );
- border-color: color-mix(
- in oklab,
- oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,
- black
- );
- }
- }
-
- @supports not (color: oklch(0 0 0)) {
- .lg\:btn:hover {
- background-color: var(--btn-color, var(--fallback-b2));
- border-color: var(--btn-color, var(--fallback-b2));
- }
- }
-
- .lg\:btn.glass:hover {
- --glass-opacity: 25%;
- --glass-border-opacity: 15%;
- }
-
- .lg\:btn[disabled]:hover,.lg\:btn:disabled:hover {
- --tw-border-opacity: 0;
- background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));
- --tw-bg-opacity: 0.2;
- color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));
- --tw-text-opacity: 0.2;
- }
-
- @supports (color: color-mix(in oklab, black, black)) {
- .lg\:btn:is(input[type="checkbox"]:checked):hover,.lg\:btn:is(input[type="radio"]:checked):hover {
- background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);
- border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black);
- }
- }
- }
-
- .lg\:btn:active:hover,.lg\:btn:active:focus {
- animation: button-pop 0s ease-out;
- transform: scale(var(--btn-focus-scale, 0.97));
- }
-
- @supports not (color: oklch(0 0 0)) {
- .lg\:btn {
- background-color: var(--btn-color, var(--fallback-b2));
- border-color: var(--btn-color, var(--fallback-b2));
- }
- }
-
- .lg\:btn:focus-visible {
- outline-style: solid;
- outline-width: 2px;
- outline-offset: 2px;
- }
-
- .lg\:btn.glass {
- --tw-shadow: 0 0 #0000;
- --tw-shadow-colored: 0 0 #0000;
- box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
- outline-color: currentColor;
- }
-
- .lg\:btn.glass.btn-active {
- --glass-opacity: 25%;
- --glass-border-opacity: 15%;
- }
-
- .lg\:btn.btn-disabled,.lg\:btn[disabled],.lg\:btn:disabled {
- --tw-border-opacity: 0;
- background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));
- --tw-bg-opacity: 0.2;
- color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));
- --tw-text-opacity: 0.2;
- }
-
- .lg\:btn:is(input[type="checkbox"]:checked),.lg\:btn:is(input[type="radio"]:checked) {
- --tw-border-opacity: 1;
- border-color: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));
- --tw-bg-opacity: 1;
- background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));
- --tw-text-opacity: 1;
- color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));
- }
-
- .lg\:btn:is(input[type="checkbox"]:checked):focus-visible,.lg\:btn:is(input[type="radio"]:checked):focus-visible {
- outline-color: var(--fallback-p,oklch(var(--p)/1));
- }
-
- .lg\:btn-sm {
- height: 2rem;
- min-height: 2rem;
- padding-left: 0.75rem;
- padding-right: 0.75rem;
- font-size: 0.875rem;
- }
-
- .lg\:btn-lg {
- height: 4rem;
- min-height: 4rem;
- padding-left: 1.5rem;
- padding-right: 1.5rem;
- font-size: 1.125rem;
- }
-
- .btn-square:where(.lg\:btn-sm) {
- height: 2rem;
- width: 2rem;
- padding: 0px;
- }
-
- .btn-square:where(.lg\:btn-lg) {
- height: 4rem;
- width: 4rem;
- padding: 0px;
- }
-
- .btn-circle:where(.lg\:btn-sm) {
- height: 2rem;
- width: 2rem;
- border-radius: 9999px;
- padding: 0px;
- }
-
- .btn-circle:where(.lg\:btn-lg) {
- height: 4rem;
- width: 4rem;
- border-radius: 9999px;
- padding: 0px;
- }
+.opacity-70 {
+ opacity: 0.7;
+}
+@media (min-width: 1024px) {
.lg\:drawer-open > .drawer-toggle {
display: none;
}
@@ -4191,34 +3784,14 @@ html:has(.drawer-toggle:checked) {
order: 0;
}
- .lg\:ml-72 {
- margin-left: 18rem;
- }
-
.lg\:block {
display: block;
}
- .lg\:flex {
- display: flex;
- }
-
.lg\:hidden {
display: none;
}
- .lg\:w-72 {
- width: 18rem;
- }
-
- .lg\:w-full {
- width: 100%;
- }
-
- .lg\:max-w-md {
- max-width: 28rem;
- }
-
.lg\:max-w-sm {
max-width: 24rem;
}
@@ -4226,21 +3799,4 @@ html:has(.drawer-toggle:checked) {
.lg\:flex-row {
flex-direction: row;
}
-
- .lg\:justify-start {
- justify-content: flex-start;
- }
-
- .lg\:p-2 {
- padding: 0.5rem;
- }
-
- .lg\:p-4 {
- padding: 1rem;
- }
-
- .lg\:px-3 {
- padding-left: 0.75rem;
- padding-right: 0.75rem;
- }
}
\ No newline at end of file
diff --git a/paw/templates/core/account_finish.html b/paw/templates/core/account_finish.html
index b588893..bbd66a3 100644
--- a/paw/templates/core/account_finish.html
+++ b/paw/templates/core/account_finish.html
@@ -10,10 +10,10 @@
{% trans 'Register a new account' %}
- - {% trans 'Authenticate' %}
- - {% trans 'Set up account' %}
- - {% trans 'Done' %}
-
+
{% trans 'Authenticate' %}
+
{% trans 'Set up account' %}
+
{% trans 'Done' %}
+