From 4e970400efb2cbba6813495436229bec2533db7b Mon Sep 17 00:00:00 2001 From: pacnpal <183241239+pacnpal@users.noreply.github.com> Date: Tue, 29 Oct 2024 20:36:49 -0400 Subject: [PATCH] right --- assets/css/src/input.css | 177 +++++- static/css/tailwind.css | 519 ++++++++++++++---- static/js/main.js | 51 +- templates/account/login.html | 236 ++++---- templates/account/signup.html | 17 +- templates/accounts/turnstile_widget.html | 22 +- templates/base/base.html | 133 ++--- .../__pycache__/settings.cpython-312.pyc | Bin 5572 -> 5585 bytes thrillwiki/settings.py | 2 +- 9 files changed, 822 insertions(+), 335 deletions(-) diff --git a/assets/css/src/input.css b/assets/css/src/input.css index a2468263..b3f790c6 100644 --- a/assets/css/src/input.css +++ b/assets/css/src/input.css @@ -3,49 +3,146 @@ @tailwind utilities; @layer components { + /* Button Styles */ .btn-primary { @apply inline-flex items-center px-6 py-2.5 border border-transparent rounded-full shadow-md text-sm font-medium text-white bg-gradient-to-r from-primary to-secondary hover:from-primary/90 hover:to-secondary/90 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary/50 transform hover:scale-105 transition-all; } - /* Default icon style (moon icon) */ - #theme-toggle+.theme-toggle-btn i::before { - content: "\f186"; - /* Moon icon */ - font-family: "Font Awesome 5 Free"; - font-weight: 900; - /* Solid icon */ - } - - /* Change to sun icon and color when checkbox is checked */ - #theme-toggle:checked+.theme-toggle-btn i::before { - content: "\f185"; - /* Sun icon */ - color: theme('colors.yellow.400'); - /* Tailwind yellow-400 color */ - } + .btn-secondary { @apply inline-flex items-center px-6 py-2.5 border border-gray-200 dark:border-gray-700 rounded-full shadow-md text-sm font-medium text-gray-700 dark:text-gray-200 bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary/50 transform hover:scale-105 transition-all; } + /* [Previous styles remain unchanged until mobile menu section...] */ + /* Mobile Menu */ + #mobileMenu { + @apply overflow-hidden transition-all duration-300 ease-in-out opacity-0 max-h-0; + } + + #mobileMenu.show { + @apply max-h-[300px] opacity-100; + } + + #mobileMenu .space-y-4 { + @apply pb-6; + } + + .mobile-nav-link { + @apply flex items-center justify-center px-6 py-3 text-gray-700 transition-all border border-transparent rounded-lg dark:text-gray-200 hover:bg-primary/10 dark:hover:bg-primary/20 hover:text-primary dark:hover:text-primary hover:border-primary/20 dark:hover:border-primary/30; + } + + .mobile-nav-link i { + @apply text-xl transition-colors; + } + + @media (max-width: 540px) { + .mobile-nav-link i { + @apply text-lg; + } + } + + .mobile-nav-link.primary { + @apply text-white bg-gradient-to-r from-primary to-secondary hover:from-primary/90 hover:to-secondary/90; + } + + .mobile-nav-link.primary i { + @apply mr-3 text-white; + } + + .mobile-nav-link.secondary { + @apply text-gray-700 bg-gray-100 dark:bg-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-600; + } + + .mobile-nav-link.secondary i { + @apply mr-3 text-gray-500 dark:text-gray-400; + } + + /* Theme Toggle */ + #theme-toggle+.theme-toggle-btn i::before { + content: "\f186"; + font-family: "Font Awesome 5 Free"; + font-weight: 900; + } + + #theme-toggle:checked+.theme-toggle-btn i::before { + content: "\f185"; + color: theme('colors.yellow.400'); + } + + /* Navigation Components */ .nav-link { - @apply flex items-center px-6 py-2.5 rounded-lg font-medium text-gray-700 dark:text-gray-200 hover:bg-primary/10 dark:hover:bg-primary/20 hover:text-primary dark:hover:text-primary transition-all border border-transparent hover:border-primary/20 dark:hover:border-primary/30; + @apply flex items-center text-gray-700 transition-all dark:text-gray-200; + } + + /* Extra small screens (540px and below) */ + @media (max-width: 540px) { + .nav-link { + @apply px-2 py-2 text-sm; + } + .nav-link i { + @apply mr-1 text-base; + } + .nav-link span { + @apply text-sm; + } + .site-logo { + @apply px-1 text-lg; + } + .nav-container { + @apply px-2; + } + } + + /* Small screens (541px to 767px) */ + @media (min-width: 541px) and (max-width: 767px) { + .nav-link { + @apply px-3 py-2; + } + .nav-link i { + @apply mr-2; + } + .site-logo { + @apply px-2 text-xl; + } + .nav-container { + @apply px-4; + } + } + + /* Medium screens and up */ + @media (min-width: 768px) { + .nav-link { + @apply px-6 py-2.5 rounded-lg font-medium border border-transparent hover:border-primary/20 dark:hover:border-primary/30; + } + .nav-link i { + @apply mr-3 text-lg; + } + .site-logo { + @apply px-3 text-2xl; + } + .nav-container { + @apply px-6; + } + } + + .nav-link:hover { + @apply text-primary dark:text-primary bg-primary/10 dark:bg-primary/20; } .nav-link i { - @apply mr-3 text-lg text-gray-500 transition-colors dark:text-gray-400; + @apply text-gray-500 transition-colors dark:text-gray-400; } .nav-link:hover i { @apply text-primary; } - .mobile-nav-link { - @apply flex items-center px-6 py-3 text-gray-700 transition-all border border-transparent rounded-lg dark:text-gray-200 hover:bg-primary/10 dark:hover:bg-primary/20 hover:text-primary dark:hover:text-primary hover:border-primary/20 dark:hover:border-primary/30; - } - - .mobile-nav-link i { - @apply mr-3 text-lg text-gray-500 dark:text-gray-400; + @media (min-width: 1024px) { + #mobileMenu { + @apply hidden !important; + } } + /* Menu Items */ .menu-item { @apply flex items-center w-full px-4 py-3 text-sm text-gray-700 transition-all dark:text-gray-200 hover:bg-primary/10 dark:hover:bg-primary/20 hover:text-primary dark:hover:text-primary first:rounded-t-lg last:rounded-b-lg; } @@ -54,6 +151,7 @@ @apply mr-3 text-base text-gray-500 dark:text-gray-400; } + /* Form Components */ .form-input { @apply w-full px-4 py-3 text-gray-900 transition-all border border-gray-200 rounded-lg shadow-sm dark:border-gray-700 bg-white/70 dark:bg-gray-800/70 backdrop-blur-sm dark:text-white focus:ring-2 focus:ring-primary/50 focus:border-primary; } @@ -70,7 +168,7 @@ @apply mt-2 text-sm text-red-600 dark:text-red-400; } - /* Status Badge Styles */ + /* Status Badges */ .status-badge { @apply inline-flex items-center px-3 py-1 text-sm font-medium rounded-full; } @@ -87,7 +185,7 @@ @apply text-yellow-800 bg-yellow-100 dark:bg-yellow-600 dark:text-yellow-50; } - /* Auth Card Styles */ + /* Auth Components */ .auth-card { @apply w-full max-w-md p-8 mx-auto border shadow-xl bg-white/90 dark:bg-gray-800/90 rounded-2xl backdrop-blur-sm border-gray-200/50 dark:border-gray-700/50; } @@ -130,6 +228,7 @@ @apply text-gray-700 bg-white border-gray-200 hover:bg-gray-50 shadow-gray-200/50 dark:shadow-gray-900/50; } + /* Alert Components */ .alert { @apply p-4 mb-4 shadow-lg rounded-xl backdrop-blur-sm; } @@ -150,6 +249,32 @@ @apply text-blue-800 border border-blue-200 bg-blue-100/90 dark:bg-blue-800/30 dark:text-blue-100 dark:border-blue-700; } + /* Layout Components */ + .card { + @apply p-6 bg-white border rounded-lg shadow-lg dark:bg-gray-800 border-gray-200/50 dark:border-gray-700/50; + } + + .card-hover { + @apply transition-transform transform hover:-translate-y-1; + } + + .grid-cards { + @apply grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3; + } + + /* Typography */ + .heading-1 { + @apply mb-6 text-3xl font-bold text-gray-900 dark:text-white; + } + + .heading-2 { + @apply mb-4 text-2xl font-bold text-gray-900 dark:text-white; + } + + .text-body { + @apply text-gray-600 dark:text-gray-300; + } + /* Turnstile Widget */ .turnstile { @apply flex items-center justify-center my-4; diff --git a/static/css/tailwind.css b/static/css/tailwind.css index db00e0da..74be8af1 100644 --- a/static/css/tailwind.css +++ b/static/css/tailwind.css @@ -1386,6 +1386,8 @@ select { left: 0; } +/* Button Styles */ + .btn-primary { display: inline-flex; 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)); @@ -1435,25 +1437,6 @@ select { --tw-ring-offset-width: 2px; } -/* Default icon style (moon icon) */ - -#theme-toggle+.theme-toggle-btn i::before { - content: "\f186"; - /* Moon icon */ - font-family: "Font Awesome 5 Free"; - font-weight: 900; - /* Solid icon */ -} - -/* Change to sun icon and color when checkbox is checked */ - -#theme-toggle:checked+.theme-toggle-btn i::before { - content: "\f185"; - /* Sun icon */ - color: #facc15; - /* Tailwind yellow-400 color */ -} - .btn-secondary { display: inline-flex; 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)); @@ -1513,67 +1496,32 @@ select { background-color: rgb(55 65 81 / var(--tw-bg-opacity)); } -.nav-link { - display: flex; - align-items: center; - border-radius: 0.5rem; - border-width: 1px; - border-color: transparent; - padding-left: 1.5rem; - padding-right: 1.5rem; - padding-top: 0.625rem; - padding-bottom: 0.625rem; - font-weight: 500; - --tw-text-opacity: 1; - color: rgb(55 65 81 / var(--tw-text-opacity)); +/* [Previous styles remain unchanged until mobile menu section...] */ + +/* Mobile Menu */ + +#mobileMenu { + max-height: 0px; + overflow: hidden; + opacity: 0; transition-property: all; + transition-duration: 300ms; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; } -.nav-link:hover { - border-color: rgb(79 70 229 / 0.2); - background-color: rgb(79 70 229 / 0.1); - --tw-text-opacity: 1; - color: rgb(79 70 229 / var(--tw-text-opacity)); +#mobileMenu.show { + max-height: 300px; + opacity: 1; } -.nav-link:is(.dark *) { - --tw-text-opacity: 1; - color: rgb(229 231 235 / var(--tw-text-opacity)); -} - -.nav-link:hover:is(.dark *) { - border-color: rgb(79 70 229 / 0.3); - background-color: rgb(79 70 229 / 0.2); - --tw-text-opacity: 1; - color: rgb(79 70 229 / var(--tw-text-opacity)); -} - -.nav-link i { - margin-right: 0.75rem; - font-size: 1.125rem; - line-height: 1.75rem; - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.nav-link i:is(.dark *) { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)); -} - -.nav-link:hover i { - --tw-text-opacity: 1; - color: rgb(79 70 229 / var(--tw-text-opacity)); +#mobileMenu .space-y-4 { + padding-bottom: 1.5rem; } .mobile-nav-link { display: flex; align-items: center; + justify-content: center; border-radius: 0.5rem; border-width: 1px; border-color: transparent; @@ -1608,18 +1556,250 @@ select { } .mobile-nav-link i { - margin-right: 0.75rem; - font-size: 1.125rem; + font-size: 1.25rem; line-height: 1.75rem; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +@media (max-width: 540px) { + .mobile-nav-link i { + font-size: 1.125rem; + line-height: 1.75rem; + } +} + +.mobile-nav-link.primary { + background-image: linear-gradient(to right, var(--tw-gradient-stops)); + --tw-gradient-from: #4f46e5 var(--tw-gradient-from-position); + --tw-gradient-to: rgb(79 70 229 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); + --tw-gradient-to: #e11d48 var(--tw-gradient-to-position); + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.mobile-nav-link.primary:hover { + --tw-gradient-from: rgb(79 70 229 / 0.9) var(--tw-gradient-from-position); + --tw-gradient-to: rgb(79 70 229 / 0) var(--tw-gradient-to-position); + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); + --tw-gradient-to: rgb(225 29 72 / 0.9) var(--tw-gradient-to-position); +} + +.mobile-nav-link.primary i { + margin-right: 0.75rem; + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.mobile-nav-link.secondary { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} + +.mobile-nav-link.secondary:hover { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.mobile-nav-link.secondary:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(55 65 81 / var(--tw-bg-opacity)); + --tw-text-opacity: 1; + color: rgb(209 213 219 / var(--tw-text-opacity)); +} + +.mobile-nav-link.secondary:hover:is(.dark *) { + --tw-bg-opacity: 1; + background-color: rgb(75 85 99 / var(--tw-bg-opacity)); +} + +.mobile-nav-link.secondary i { + margin-right: 0.75rem; --tw-text-opacity: 1; color: rgb(107 114 128 / var(--tw-text-opacity)); } -.mobile-nav-link i:is(.dark *) { +.mobile-nav-link.secondary i:is(.dark *) { --tw-text-opacity: 1; color: rgb(156 163 175 / var(--tw-text-opacity)); } +/* Theme Toggle */ + +#theme-toggle+.theme-toggle-btn i::before { + content: "\f186"; + font-family: "Font Awesome 5 Free"; + font-weight: 900; +} + +#theme-toggle:checked+.theme-toggle-btn i::before { + content: "\f185"; + color: #facc15; +} + +/* Navigation Components */ + +.nav-link { + display: flex; + align-items: center; + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.nav-link:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(229 231 235 / var(--tw-text-opacity)); +} + +/* Extra small screens (540px and below) */ + +@media (max-width: 540px) { + .nav-link { + padding-left: 0.5rem; + padding-right: 0.5rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + font-size: 0.875rem; + line-height: 1.25rem; + } + + .nav-link i { + margin-right: 0.25rem; + font-size: 1rem; + line-height: 1.5rem; + } + + .nav-link span { + font-size: 0.875rem; + line-height: 1.25rem; + } + + .site-logo { + padding-left: 0.25rem; + padding-right: 0.25rem; + font-size: 1.125rem; + line-height: 1.75rem; + } + + .nav-container { + padding-left: 0.5rem; + padding-right: 0.5rem; + } +} + +/* Small screens (541px to 767px) */ + +@media (min-width: 541px) and (max-width: 767px) { + .nav-link { + padding-left: 0.75rem; + padding-right: 0.75rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + } + + .nav-link i { + margin-right: 0.5rem; + } + + .site-logo { + padding-left: 0.5rem; + padding-right: 0.5rem; + font-size: 1.25rem; + line-height: 1.75rem; + } + + .nav-container { + padding-left: 1rem; + padding-right: 1rem; + } +} + +/* Medium screens and up */ + +@media (min-width: 768px) { + .nav-link { + border-radius: 0.5rem; + border-width: 1px; + border-color: transparent; + padding-left: 1.5rem; + padding-right: 1.5rem; + padding-top: 0.625rem; + padding-bottom: 0.625rem; + font-weight: 500; + } + + .nav-link:hover { + border-color: rgb(79 70 229 / 0.2); + } + + .nav-link:hover:is(.dark *) { + border-color: rgb(79 70 229 / 0.3); + } + + .nav-link i { + margin-right: 0.75rem; + font-size: 1.125rem; + line-height: 1.75rem; + } + + .site-logo { + padding-left: 0.75rem; + padding-right: 0.75rem; + font-size: 1.5rem; + line-height: 2rem; + } + + .nav-container { + padding-left: 1.5rem; + padding-right: 1.5rem; + } +} + +.nav-link:hover { + background-color: rgb(79 70 229 / 0.1); + --tw-text-opacity: 1; + color: rgb(79 70 229 / var(--tw-text-opacity)); +} + +.nav-link:hover:is(.dark *) { + background-color: rgb(79 70 229 / 0.2); + --tw-text-opacity: 1; + color: rgb(79 70 229 / var(--tw-text-opacity)); +} + +.nav-link i { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.nav-link i:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.nav-link:hover i { + --tw-text-opacity: 1; + color: rgb(79 70 229 / var(--tw-text-opacity)); +} + +@media (min-width: 1024px) { + #mobileMenu { + display: none !important; + } +} + +/* Menu Items */ + .menu-item { display: flex; width: 100%; @@ -1677,6 +1857,8 @@ select { color: rgb(156 163 175 / var(--tw-text-opacity)); } +/* Form Components */ + .form-input { width: 100%; border-radius: 0.5rem; @@ -1768,7 +1950,7 @@ select { color: rgb(248 113 113 / var(--tw-text-opacity)); } -/* Status Badge Styles */ +/* Status Badges */ .status-badge { display: inline-flex; @@ -1825,7 +2007,7 @@ select { color: rgb(254 252 232 / var(--tw-text-opacity)); } -/* Auth Card Styles */ +/* Auth Components */ .auth-card { margin-left: auto; @@ -2015,6 +2197,8 @@ select { --tw-shadow: var(--tw-shadow-colored); } +/* Alert Components */ + .alert { margin-bottom: 1rem; border-radius: 0.75rem; @@ -2095,6 +2279,96 @@ select { color: rgb(219 234 254 / var(--tw-text-opacity)); } +/* Layout Components */ + +.card { + border-radius: 0.5rem; + border-width: 1px; + border-color: rgb(229 231 235 / 0.5); + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + padding: 1.5rem; + --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); +} + +.card:is(.dark *) { + border-color: rgb(55 65 81 / 0.5); + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); +} + +.card-hover { + 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)); + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.card-hover:hover { + --tw-translate-y: -0.25rem; + 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)); +} + +.grid-cards { + display: grid; + grid-template-columns: repeat(1, minmax(0, 1fr)); + gap: 1.5rem; +} + +@media (min-width: 768px) { + .grid-cards { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (min-width: 1024px) { + .grid-cards { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + +/* Typography */ + +.heading-1 { + margin-bottom: 1.5rem; + font-size: 1.875rem; + line-height: 2.25rem; + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.heading-1:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.heading-2 { + margin-bottom: 1rem; + font-size: 1.5rem; + line-height: 2rem; + font-weight: 700; + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.heading-2:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-body { + --tw-text-opacity: 1; + color: rgb(75 85 99 / var(--tw-text-opacity)); +} + +.text-body:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(209 213 219 / var(--tw-text-opacity)); +} + /* Turnstile Widget */ .turnstile { @@ -2260,6 +2534,10 @@ select { height: 2rem; } +.max-h-\[300px\] { + max-height: 300px; +} + .min-h-\[calc\(100vh-16rem\)\] { min-height: calc(100vh - 16rem); } @@ -2296,6 +2574,10 @@ select { max-width: 48rem; } +.max-w-lg { + max-width: 32rem; +} + .max-w-md { max-width: 28rem; } @@ -2386,18 +2668,6 @@ select { margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); } -.space-x-6 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(1.5rem * var(--tw-space-x-reverse)); - margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse))); -} - -.space-x-8 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(2rem * var(--tw-space-x-reverse)); - margin-left: calc(2rem * 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))); @@ -2564,6 +2834,10 @@ select { background-color: rgb(220 252 231 / 0.9); } +.bg-primary\/10 { + background-color: rgb(79 70 229 / 0.1); +} + .bg-red-100 { --tw-bg-opacity: 1; background-color: rgb(254 226 226 / var(--tw-bg-opacity)); @@ -2654,6 +2928,11 @@ select { padding: 2rem; } +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; @@ -2878,6 +3157,10 @@ select { color: rgb(133 77 14 / 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); @@ -2939,14 +3222,6 @@ select { backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); } -.transition { - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; - transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - .transition-all { transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); @@ -2965,6 +3240,14 @@ select { transition-duration: 150ms; } +.duration-300 { + transition-duration: 300ms; +} + +.ease-in-out { + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + .content-\[\'\'\] { --tw-content: ''; content: var(--tw-content); @@ -3041,6 +3324,11 @@ select { background-color: rgb(243 244 246 / var(--tw-bg-opacity)); } +.hover\:bg-gray-200:hover { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + .hover\:bg-gray-50:hover { --tw-bg-opacity: 1; background-color: rgb(249 250 251 / var(--tw-bg-opacity)); @@ -3093,11 +3381,6 @@ select { border-color: rgb(59 130 246 / var(--tw-border-opacity)); } -.focus\:border-primary:focus { - --tw-border-opacity: 1; - border-color: rgb(79 70 229 / var(--tw-border-opacity)); -} - .focus\:underline:focus { text-decoration-line: underline; } @@ -3266,6 +3549,11 @@ select { color: rgb(220 252 231 / var(--tw-text-opacity)); } +.dark\:text-primary:is(.dark *) { + --tw-text-opacity: 1; + color: rgb(79 70 229 / var(--tw-text-opacity)); +} + .dark\:text-red-100:is(.dark *) { --tw-text-opacity: 1; color: rgb(254 226 226 / var(--tw-text-opacity)); @@ -3310,11 +3598,6 @@ select { --tw-ring-color: rgb(250 204 21 / 0.3); } -.dark\:hover\:bg-gray-600:hover:is(.dark *) { - --tw-bg-opacity: 1; - background-color: rgb(75 85 99 / var(--tw-bg-opacity)); -} - .dark\:hover\:bg-gray-700:hover:is(.dark *) { --tw-bg-opacity: 1; background-color: rgb(55 65 81 / var(--tw-bg-opacity)); @@ -3338,6 +3621,18 @@ select { .sm\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } + + .sm\: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))); + } + + .sm\:space-x-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1.5rem * var(--tw-space-x-reverse)); + margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse))); + } } @media (min-width: 768px) { @@ -3345,14 +3640,6 @@ select { margin-top: 0px; } - .md\:flex { - display: flex; - } - - .md\:hidden { - display: none; - } - .md\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } @@ -3393,6 +3680,14 @@ select { grid-column: span 2 / span 2; } + .lg\:flex { + display: flex; + } + + .lg\:hidden { + display: none; + } + .lg\:grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); } diff --git a/static/js/main.js b/static/js/main.js index bed4458a..7aa44300 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -36,15 +36,50 @@ document.addEventListener('submit', (e) => { } }); -// Mobile menu toggle -const mobileMenuBtn = document.getElementById('mobileMenuBtn'); -const mobileMenu = document.getElementById('mobileMenu'); +// Mobile menu toggle with transitions +document.addEventListener('DOMContentLoaded', () => { + const mobileMenuBtn = document.getElementById('mobileMenuBtn'); + const mobileMenu = document.getElementById('mobileMenu'); -if (mobileMenuBtn && mobileMenu) { - mobileMenuBtn.addEventListener('click', () => { - mobileMenu.classList.toggle('hidden'); - }); -} + if (mobileMenuBtn && mobileMenu) { + let isMenuOpen = false; + + const toggleMenu = () => { + isMenuOpen = !isMenuOpen; + mobileMenu.classList.toggle('show', isMenuOpen); + mobileMenuBtn.setAttribute('aria-expanded', isMenuOpen.toString()); + + // Update icon + const icon = mobileMenuBtn.querySelector('i'); + icon.classList.remove(isMenuOpen ? 'fa-bars' : 'fa-times'); + icon.classList.add(isMenuOpen ? 'fa-times' : 'fa-bars'); + }; + + mobileMenuBtn.addEventListener('click', toggleMenu); + + // Close menu when clicking outside + document.addEventListener('click', (e) => { + if (isMenuOpen && !mobileMenu.contains(e.target) && !mobileMenuBtn.contains(e.target)) { + toggleMenu(); + } + }); + + // Close menu when pressing escape + document.addEventListener('keydown', (e) => { + if (isMenuOpen && e.key === 'Escape') { + toggleMenu(); + } + }); + + // Handle viewport changes + const mediaQuery = window.matchMedia('(min-width: 1024px)'); + mediaQuery.addEventListener('change', (e) => { + if (e.matches && isMenuOpen) { + toggleMenu(); + } + }); + } +}); // User dropdown toggle const userMenuBtn = document.getElementById('userMenuBtn'); diff --git a/templates/account/login.html b/templates/account/login.html index 8902b71d..add03e98 100644 --- a/templates/account/login.html +++ b/templates/account/login.html @@ -8,112 +8,144 @@ {% block content %}
-
-
-

{% trans "Welcome Back" %}

+
+
+

{% trans "Welcome Back" %}

- {% get_providers as socialaccount_providers %} - - {% if socialaccount_providers %} - - -
- Or continue with email -
- {% endif %} + {% get_providers as socialaccount_providers %} + {% if socialaccount_providers %} + -
- {% csrf_token %} - - {% if form.non_field_errors %} -
-
{{ form.non_field_errors }}
-
- {% endif %} +
+ Or continue with email +
+ {% endif %} -
- - - {% if form.login.errors %} -

{{ form.login.errors }}

- {% endif %} -
- -
- - - {% if form.password.errors %} -

{{ form.password.errors }}

- {% endif %} -
- -
-
- - -
- - -
- - {% turnstile_widget %} - - {% if redirect_field_value %} - - {% endif %} - -
- -
-
- -
-

- {% trans "Don't have an account?" %} - - {% trans "Sign up" %} - -

-
+
+ {% csrf_token %} + {% if form.non_field_errors %} +
+
{{ form.non_field_errors }}
+ {% endif %} + +
+ + + {% if form.login.errors %} +

{{ form.login.errors }}

+ {% endif %} +
+ +
+ + + {% if form.password.errors %} +

{{ form.password.errors }}

+ {% endif %} +
+ +
+
+ + +
+ + +
+ + {% turnstile_widget %} + {% if redirect_field_value %} + + {% endif %} + +
+ +
+
+ +
+

+ {% trans "Don't have an account?" %} + + {% trans "Sign up" %} + +

+
+
{% endblock %} diff --git a/templates/account/signup.html b/templates/account/signup.html index 942b0f14..f617baf7 100644 --- a/templates/account/signup.html +++ b/templates/account/signup.html @@ -8,7 +8,7 @@ {% block content %}
-
+

{% trans "Create Account" %}

@@ -24,10 +24,18 @@ onkeydown="if(event.key === 'Enter' || event.key === ' ') { this.click(); event.preventDefault(); }" > {% if provider.id == 'google' %} - Google + Google Continue with Google {% elif provider.id == 'discord' %} - Discord + Discord Continue with Discord {% endif %} @@ -135,8 +143,7 @@ {% endif %}
- {% turnstile_widget %} - + {% turnstile_widget %} {% if redirect_field_value %} +
-
+
+ + diff --git a/templates/base/base.html b/templates/base/base.html index 60fe9f37..7643bbc9 100644 --- a/templates/base/base.html +++ b/templates/base/base.html @@ -1,11 +1,13 @@ {% load static %} + {% block title %}ThrillWiki{% endblock %} +