diff --git a/src/app/components/login-dialog/login-dialog.component.css b/src/app/components/login-dialog/login-dialog.component.css index acea1e8..813b554 100644 --- a/src/app/components/login-dialog/login-dialog.component.css +++ b/src/app/components/login-dialog/login-dialog.component.css @@ -1,58 +1,293 @@ -@import '../../button-template.css'; +:host { + --auth-sans: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + --auth-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', monospace; + --auth-neon: #ff45c8; + --auth-neon-soft: rgba(255, 69, 200, 0.55); + --auth-bg: #06060d; +} .dialog-overlay { position: fixed; inset: 0; - background: rgba(2, 2, 10, 0.58); + background: rgba(4, 2, 12, 0.72); + backdrop-filter: blur(6px); display: grid; place-items: center; z-index: 350; padding: 1rem; + animation: backdrop-in 180ms ease-out both; } .dialog-card { - width: min(460px, 100%); - background: var(--dlg-bg); - border: 1.5px solid var(--dlg-border); - box-shadow: var(--bb-glow); - border-radius: 4px; - padding: 1rem; + position: relative; + width: min(420px, 100%); + background: + radial-gradient(120% 80% at 50% 0%, rgba(255, 69, 200, 0.10), transparent 60%), + linear-gradient(180deg, #0a0612 0%, #06060d 100%); + border: 1px solid var(--auth-neon-soft); + border-radius: 14px; + padding: 28px 26px 22px; display: grid; - gap: 0.7rem; + gap: 14px; + font-family: var(--auth-sans); + color: #fff; + box-shadow: + 0 0 0 1px rgba(255, 69, 200, 0.06) inset, + 0 0 30px rgba(255, 69, 200, 0.18), + 0 30px 60px rgba(0, 0, 0, 0.55); + overflow: hidden; + animation: dialog-in 220ms cubic-bezier(0.2, 0.8, 0.2, 1) both; +} + +.dialog-card::before { + content: ''; + position: absolute; + inset: 0; + pointer-events: none; + background: linear-gradient( + 180deg, + transparent 0%, + rgba(255, 69, 200, 0.06) 50%, + transparent 100% + ); + height: 35%; + animation: scanline 4.5s linear infinite; + mix-blend-mode: screen; +} + +.dialog-card::after { + content: ''; + position: absolute; + inset: 0; + pointer-events: none; + background-image: + repeating-linear-gradient( + 0deg, + rgba(255, 255, 255, 0.012) 0px, + rgba(255, 255, 255, 0.012) 1px, + transparent 1px, + transparent 3px + ); + border-radius: inherit; +} + +.dialog-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + position: relative; + z-index: 1; +} + +.brand-tag { + font-family: var(--auth-mono); + font-size: 10px; + letter-spacing: 2.5px; + color: var(--auth-neon); + text-transform: uppercase; + opacity: 0.85; + animation: pulse-glow 2.4s ease-in-out infinite; +} + +.brand-tag::before { + content: ''; + display: inline-block; + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--auth-neon); + margin-right: 8px; + vertical-align: 1px; + box-shadow: 0 0 8px var(--auth-neon); +} + +.close-btn { + background: transparent; + border: 1px solid rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.65); + width: 28px; + height: 28px; + border-radius: 8px; + cursor: pointer; + font-size: 16px; + line-height: 1; + display: grid; + place-items: center; + transition: all 0.18s ease; +} + +.close-btn:hover { + color: var(--auth-neon); + border-color: var(--auth-neon-soft); + box-shadow: 0 0 10px rgba(255, 69, 200, 0.35); } .dialog-title { - font-family: 'Bebas Neue', sans-serif; - font-size: 22px; - letter-spacing: 2px; - color: var(--bb-title); - text-align: center; + font-family: var(--auth-sans); + font-weight: 700; + font-size: 26px; + letter-spacing: 0.5px; + color: #fff; + margin: 4px 0 0; + position: relative; + z-index: 1; +} + +.dialog-subtitle { + font-family: var(--auth-mono); + font-size: 11px; + color: rgba(255, 255, 255, 0.45); + letter-spacing: 0.6px; + margin-bottom: 6px; + position: relative; + z-index: 1; +} + +form { + display: grid; + gap: 12px; + position: relative; + z-index: 1; +} + +.field { + display: grid; + gap: 6px; +} + +.field-label { + font-family: var(--auth-mono); + font-size: 10px; + letter-spacing: 1.5px; + text-transform: uppercase; + color: rgba(255, 255, 255, 0.55); } .dialog-input { width: 100%; - background: rgba(4, 4, 20, 0.62); - border: 1px solid var(--bb-border); - color: var(--bb-title); - border-radius: 2px; - padding: 0.6rem 0.7rem; - font-family: 'Space Mono', monospace; + background: rgba(8, 5, 20, 0.6); + border: 1px solid rgba(255, 255, 255, 0.08); + color: #fff; + border-radius: 10px; + padding: 12px 14px; + font-family: var(--auth-mono); font-size: 13px; + letter-spacing: 0.3px; + transition: border-color 0.18s ease, box-shadow 0.18s ease, background 0.18s ease; +} + +.dialog-input::placeholder { + color: rgba(255, 255, 255, 0.28); } .dialog-input:focus { outline: none; - box-shadow: 0 0 0 2px rgba(0, 213, 255, 0.25); -} - -.dialog-textarea { - min-height: 120px; - resize: vertical; + border-color: var(--auth-neon); + background: rgba(20, 6, 26, 0.7); + box-shadow: 0 0 0 3px rgba(255, 69, 200, 0.15), 0 0 18px rgba(255, 69, 200, 0.18); } .text-danger { - color: #dc3545; - font-size: 0.875rem; + color: #ff6ea0; + font-family: var(--auth-mono); + font-size: 11px; + letter-spacing: 0.3px; +} + +.error-banner { + font-family: var(--auth-mono); + font-size: 12px; + padding: 10px 12px; + border-radius: 8px; + background: rgba(255, 69, 110, 0.08); + border: 1px solid rgba(255, 69, 110, 0.35); + color: #ff9bb4; + animation: shake 0.35s ease-out; +} + +.dialog-actions { + display: flex; + gap: 10px; + margin-top: 6px; + position: relative; + z-index: 1; +} + +.btn { + flex: 1; + border-radius: 10px; + padding: 12px 14px; + font-family: var(--auth-sans); + font-weight: 600; + font-size: 13px; + letter-spacing: 0.4px; + cursor: pointer; + transition: all 0.18s ease; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; +} + +.btn-ghost { + background: transparent; + border: 1px solid rgba(255, 255, 255, 0.1); + color: rgba(255, 255, 255, 0.7); +} + +.btn-ghost:hover:not(:disabled) { + color: #fff; + border-color: rgba(255, 255, 255, 0.25); + background: rgba(255, 255, 255, 0.03); +} + +.btn-primary { + background: var(--auth-neon); + border: 1px solid var(--auth-neon); + color: #1a0210; + box-shadow: 0 0 18px rgba(255, 69, 200, 0.45); +} + +.btn-primary:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: 0 0 26px rgba(255, 69, 200, 0.7); +} + +.btn:disabled { + opacity: 0.45; + cursor: not-allowed; + transform: none; +} + +.alt-line { + margin-top: 4px; + text-align: center; + font-family: var(--auth-mono); + font-size: 11px; + color: rgba(255, 255, 255, 0.45); + position: relative; + z-index: 1; +} + +.alt-line a { + color: var(--auth-neon); + cursor: pointer; + text-decoration: none; + margin-left: 4px; +} + +.alt-line a:hover { + text-shadow: 0 0 8px var(--auth-neon-soft); +} + +.spinner { + width: 14px; + height: 14px; + border: 2px solid rgba(26, 2, 16, 0.35); + border-top-color: #1a0210; + border-radius: 50%; + animation: spin 0.7s linear infinite; } .sr-only { @@ -66,3 +301,28 @@ white-space: nowrap !important; border: 0 !important; } + +@keyframes scanline { + 0% { transform: translateY(-100%); } + 100% { transform: translateY(300%); } +} +@keyframes pulse-glow { + 0%, 100% { opacity: 0.85; } + 50% { opacity: 1; } +} +@keyframes dialog-in { + from { opacity: 0; transform: translateY(8px) scale(0.96); } + to { opacity: 1; transform: translateY(0) scale(1); } +} +@keyframes backdrop-in { + from { opacity: 0; } + to { opacity: 1; } +} +@keyframes shake { + 0%, 100% { transform: translateX(0); } + 20%, 60% { transform: translateX(-4px); } + 40%, 80% { transform: translateX(4px); } +} +@keyframes spin { + to { transform: rotate(360deg); } +} diff --git a/src/app/components/login-dialog/login-dialog.component.html b/src/app/components/login-dialog/login-dialog.component.html index 0be3592..e6ff05d 100644 --- a/src/app/components/login-dialog/login-dialog.component.html +++ b/src/app/components/login-dialog/login-dialog.component.html @@ -1,34 +1,49 @@
\ No newline at end of file + diff --git a/src/app/components/register-dialog/register-dialog.component.css b/src/app/components/register-dialog/register-dialog.component.css index acea1e8..dbc3953 100644 --- a/src/app/components/register-dialog/register-dialog.component.css +++ b/src/app/components/register-dialog/register-dialog.component.css @@ -1,58 +1,298 @@ -@import '../../button-template.css'; +:host { + --auth-sans: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; + --auth-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', monospace; + --auth-neon: #ff45c8; + --auth-neon-soft: rgba(255, 69, 200, 0.55); + --auth-bg: #06060d; +} .dialog-overlay { position: fixed; inset: 0; - background: rgba(2, 2, 10, 0.58); + background: rgba(4, 2, 12, 0.72); + backdrop-filter: blur(6px); display: grid; place-items: center; z-index: 350; padding: 1rem; + animation: backdrop-in 180ms ease-out both; } .dialog-card { - width: min(460px, 100%); - background: var(--dlg-bg); - border: 1.5px solid var(--dlg-border); - box-shadow: var(--bb-glow); - border-radius: 4px; - padding: 1rem; + position: relative; + width: min(440px, 100%); + background: + radial-gradient(120% 80% at 50% 0%, rgba(255, 69, 200, 0.10), transparent 60%), + linear-gradient(180deg, #0a0612 0%, #06060d 100%); + border: 1px solid var(--auth-neon-soft); + border-radius: 14px; + padding: 28px 26px 22px; display: grid; - gap: 0.7rem; + gap: 14px; + font-family: var(--auth-sans); + color: #fff; + box-shadow: + 0 0 0 1px rgba(255, 69, 200, 0.06) inset, + 0 0 30px rgba(255, 69, 200, 0.18), + 0 30px 60px rgba(0, 0, 0, 0.55); + overflow: hidden; + animation: dialog-in 220ms cubic-bezier(0.2, 0.8, 0.2, 1) both; +} + +.dialog-card::before { + content: ''; + position: absolute; + inset: 0; + pointer-events: none; + background: linear-gradient( + 180deg, + transparent 0%, + rgba(255, 69, 200, 0.06) 50%, + transparent 100% + ); + height: 35%; + animation: scanline 4.5s linear infinite; + mix-blend-mode: screen; +} + +.dialog-card::after { + content: ''; + position: absolute; + inset: 0; + pointer-events: none; + background-image: repeating-linear-gradient( + 0deg, + rgba(255, 255, 255, 0.012) 0px, + rgba(255, 255, 255, 0.012) 1px, + transparent 1px, + transparent 3px + ); + border-radius: inherit; +} + +.dialog-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + position: relative; + z-index: 1; +} + +.brand-tag { + font-family: var(--auth-mono); + font-size: 10px; + letter-spacing: 2.5px; + color: var(--auth-neon); + text-transform: uppercase; + opacity: 0.85; + animation: pulse-glow 2.4s ease-in-out infinite; +} + +.brand-tag::before { + content: ''; + display: inline-block; + width: 6px; + height: 6px; + border-radius: 50%; + background: var(--auth-neon); + margin-right: 8px; + vertical-align: 1px; + box-shadow: 0 0 8px var(--auth-neon); +} + +.close-btn { + background: transparent; + border: 1px solid rgba(255, 255, 255, 0.08); + color: rgba(255, 255, 255, 0.65); + width: 28px; + height: 28px; + border-radius: 8px; + cursor: pointer; + font-size: 16px; + line-height: 1; + display: grid; + place-items: center; + transition: all 0.18s ease; +} + +.close-btn:hover { + color: var(--auth-neon); + border-color: var(--auth-neon-soft); + box-shadow: 0 0 10px rgba(255, 69, 200, 0.35); } .dialog-title { - font-family: 'Bebas Neue', sans-serif; - font-size: 22px; - letter-spacing: 2px; - color: var(--bb-title); - text-align: center; + font-family: var(--auth-sans); + font-weight: 700; + font-size: 26px; + letter-spacing: 0.5px; + color: #fff; + margin: 4px 0 0; + position: relative; + z-index: 1; +} + +.dialog-subtitle { + font-family: var(--auth-mono); + font-size: 11px; + color: rgba(255, 255, 255, 0.45); + letter-spacing: 0.6px; + margin-bottom: 6px; + position: relative; + z-index: 1; +} + +form { + display: grid; + gap: 12px; + position: relative; + z-index: 1; +} + +.field { + display: grid; + gap: 6px; +} + +.field-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 10px; +} + +.field-label { + font-family: var(--auth-mono); + font-size: 10px; + letter-spacing: 1.5px; + text-transform: uppercase; + color: rgba(255, 255, 255, 0.55); } .dialog-input { width: 100%; - background: rgba(4, 4, 20, 0.62); - border: 1px solid var(--bb-border); - color: var(--bb-title); - border-radius: 2px; - padding: 0.6rem 0.7rem; - font-family: 'Space Mono', monospace; + background: rgba(8, 5, 20, 0.6); + border: 1px solid rgba(255, 255, 255, 0.08); + color: #fff; + border-radius: 10px; + padding: 12px 14px; + font-family: var(--auth-mono); font-size: 13px; + letter-spacing: 0.3px; + transition: border-color 0.18s ease, box-shadow 0.18s ease, background 0.18s ease; +} + +.dialog-input::placeholder { + color: rgba(255, 255, 255, 0.28); } .dialog-input:focus { outline: none; - box-shadow: 0 0 0 2px rgba(0, 213, 255, 0.25); -} - -.dialog-textarea { - min-height: 120px; - resize: vertical; + border-color: var(--auth-neon); + background: rgba(20, 6, 26, 0.7); + box-shadow: 0 0 0 3px rgba(255, 69, 200, 0.15), 0 0 18px rgba(255, 69, 200, 0.18); } .text-danger { - color: #dc3545; - font-size: 0.875rem; + color: #ff6ea0; + font-family: var(--auth-mono); + font-size: 11px; + letter-spacing: 0.3px; +} + +.error-banner { + font-family: var(--auth-mono); + font-size: 12px; + padding: 10px 12px; + border-radius: 8px; + background: rgba(255, 69, 110, 0.08); + border: 1px solid rgba(255, 69, 110, 0.35); + color: #ff9bb4; + animation: shake 0.35s ease-out; +} + +.dialog-actions { + display: flex; + gap: 10px; + margin-top: 6px; + position: relative; + z-index: 1; +} + +.btn { + flex: 1; + border-radius: 10px; + padding: 12px 14px; + font-family: var(--auth-sans); + font-weight: 600; + font-size: 13px; + letter-spacing: 0.4px; + cursor: pointer; + transition: all 0.18s ease; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; +} + +.btn-ghost { + background: transparent; + border: 1px solid rgba(255, 255, 255, 0.1); + color: rgba(255, 255, 255, 0.7); +} + +.btn-ghost:hover:not(:disabled) { + color: #fff; + border-color: rgba(255, 255, 255, 0.25); + background: rgba(255, 255, 255, 0.03); +} + +.btn-primary { + background: var(--auth-neon); + border: 1px solid var(--auth-neon); + color: #1a0210; + box-shadow: 0 0 18px rgba(255, 69, 200, 0.45); +} + +.btn-primary:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: 0 0 26px rgba(255, 69, 200, 0.7); +} + +.btn:disabled { + opacity: 0.45; + cursor: not-allowed; + transform: none; +} + +.alt-line { + margin-top: 4px; + text-align: center; + font-family: var(--auth-mono); + font-size: 11px; + color: rgba(255, 255, 255, 0.45); + position: relative; + z-index: 1; +} + +.alt-line a { + color: var(--auth-neon); + cursor: pointer; + text-decoration: none; + margin-left: 4px; +} + +.alt-line a:hover { + text-shadow: 0 0 8px var(--auth-neon-soft); +} + +.spinner { + width: 14px; + height: 14px; + border: 2px solid rgba(26, 2, 16, 0.35); + border-top-color: #1a0210; + border-radius: 50%; + animation: spin 0.7s linear infinite; } .sr-only { @@ -66,3 +306,28 @@ white-space: nowrap !important; border: 0 !important; } + +@keyframes scanline { + 0% { transform: translateY(-100%); } + 100% { transform: translateY(300%); } +} +@keyframes pulse-glow { + 0%, 100% { opacity: 0.85; } + 50% { opacity: 1; } +} +@keyframes dialog-in { + from { opacity: 0; transform: translateY(8px) scale(0.96); } + to { opacity: 1; transform: translateY(0) scale(1); } +} +@keyframes backdrop-in { + from { opacity: 0; } + to { opacity: 1; } +} +@keyframes shake { + 0%, 100% { transform: translateX(0); } + 20%, 60% { transform: translateX(-4px); } + 40%, 80% { transform: translateX(4px); } +} +@keyframes spin { + to { transform: rotate(360deg); } +} diff --git a/src/app/components/register-dialog/register-dialog.component.html b/src/app/components/register-dialog/register-dialog.component.html index 4c75996..123ad58 100644 --- a/src/app/components/register-dialog/register-dialog.component.html +++ b/src/app/components/register-dialog/register-dialog.component.html @@ -1,40 +1,65 @@ \ No newline at end of file + diff --git a/src/app/pages/welcome/Auth Dialog.html b/src/app/pages/welcome/Auth Dialog.html new file mode 100644 index 0000000..32dfb08 --- /dev/null +++ b/src/app/pages/welcome/Auth Dialog.html @@ -0,0 +1,89 @@ + + + + + +