modified color palette
This commit is contained in:
@@ -150,7 +150,7 @@ const App = () => {
|
|||||||
|
|
||||||
const handleVerifyTwoFactor = async (code) => {
|
const handleVerifyTwoFactor = async (code) => {
|
||||||
if (!authState.preAuthToken) {
|
if (!authState.preAuthToken) {
|
||||||
showFeedback('warning', 'Primero inicia sesion con usuario y clave')
|
showFeedback('warning', 'Primero inicia sesion con usuario y contraseña')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,12 +203,12 @@ const App = () => {
|
|||||||
}, [authState.accessToken])
|
}, [authState.accessToken])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<main className="min-vh-100 d-flex align-items-center justify-content-center bg-dark-subtle">
|
<main className="app-shell">
|
||||||
<div className="container py-5">
|
<div className="container py-5">
|
||||||
<div className="row justify-content-center">
|
<div className="row justify-content-center">
|
||||||
<div className="col-12 col-md-8 col-lg-6">
|
<div className="col-12 col-md-8 col-lg-6">
|
||||||
<div className="card shadow-lg bg-dark text-light border-0">
|
<div className="card app-card shadow-lg border-0">
|
||||||
<div className="card-body p-4 p-md-5">
|
<div className="card-body app-card-body p-4 p-md-5">
|
||||||
<h1 className="h3 text-center mb-4">Portal 2FA</h1>
|
<h1 className="h3 text-center mb-4">Portal 2FA</h1>
|
||||||
<AlertMessage
|
<AlertMessage
|
||||||
type={feedback.type}
|
type={feedback.type}
|
||||||
@@ -219,7 +219,7 @@ const App = () => {
|
|||||||
{step === 'login' && (
|
{step === 'login' && (
|
||||||
<>
|
<>
|
||||||
<ul className="nav nav-pills mb-4" role="tablist">
|
<ul className="nav nav-pills mb-4" role="tablist">
|
||||||
<li className="nav-item" role="presentation">
|
<li className="nav-item me-2" role="presentation">
|
||||||
<button
|
<button
|
||||||
className={`nav-link ${activeTab === 'login' ? 'active' : ''}`}
|
className={`nav-link ${activeTab === 'login' ? 'active' : ''}`}
|
||||||
type="button"
|
type="button"
|
||||||
@@ -289,13 +289,13 @@ const App = () => {
|
|||||||
|
|
||||||
{step === 'dashboard' && (
|
{step === 'dashboard' && (
|
||||||
<div className="d-flex flex-column gap-3">
|
<div className="d-flex flex-column gap-3">
|
||||||
<div className="bg-dark-subtle rounded p-3">
|
<div className="panel-surface rounded p-3">
|
||||||
<h2 className="h5">Token de acceso</h2>
|
<h2 className="h5">Token de acceso</h2>
|
||||||
<code className="small text-break">{authState.accessToken}</code>
|
<code className="small text-break">{authState.accessToken}</code>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{tokenPayload && (
|
{tokenPayload && (
|
||||||
<div className="bg-dark-subtle rounded p-3">
|
<div className="panel-surface rounded p-3">
|
||||||
<h2 className="h5">Payload decodificado</h2>
|
<h2 className="h5">Payload decodificado</h2>
|
||||||
<pre className="small text-break mb-0">
|
<pre className="small text-break mb-0">
|
||||||
{JSON.stringify(tokenPayload, null, 2)}
|
{JSON.stringify(tokenPayload, null, 2)}
|
||||||
@@ -314,7 +314,7 @@ const App = () => {
|
|||||||
|
|
||||||
{users.length > 0 && (
|
{users.length > 0 && (
|
||||||
<div className="table-responsive">
|
<div className="table-responsive">
|
||||||
<table className="table table-dark table-striped table-bordered align-middle mb-0">
|
<table className="table theme-table align-middle mb-0">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="col">ID</th>
|
<th scope="col">ID</th>
|
||||||
@@ -338,7 +338,7 @@ const App = () => {
|
|||||||
{step !== 'login' && step !== 'dashboard' && (
|
{step !== 'login' && step !== 'dashboard' && (
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="btn btn-outline-light mt-4"
|
className="btn btn-danger mt-4 ms-3"
|
||||||
onClick={resetFlow}
|
onClick={resetFlow}
|
||||||
>
|
>
|
||||||
Cancelar
|
Cancelar
|
||||||
|
|||||||
@@ -1,24 +1,24 @@
|
|||||||
const Enable2FA = ({ secret, otpauthUrl, qrBase64, onBack, onRefresh, isLoading }) => {
|
const Enable2FA = ({ secret, otpauthUrl, qrBase64, onBack, onRefresh, isLoading }) => {
|
||||||
return (
|
return (
|
||||||
<div className="d-flex flex-column gap-3">
|
<div className="d-flex flex-column gap-3">
|
||||||
<p>Escanea el codigo o introduce la clave manualmente en tu app TOTP.</p>
|
<p className="text-white">Escanea el codigo o introduce la contraseña manualmente en tu app TOTP.</p>
|
||||||
{qrBase64 ? (
|
{qrBase64 ? (
|
||||||
<img
|
<img
|
||||||
src={`data:image/png;base64,${qrBase64}`}
|
src={`data:image/png;base64,${qrBase64}`}
|
||||||
alt="Codigo QR 2FA"
|
alt="Codigo QR 2FA"
|
||||||
className="align-self-center border rounded"
|
className="align-self-center qr-frame"
|
||||||
style={{ width: '220px', height: '220px' }}
|
style={{ width: '220px', height: '220px' }}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<div className="alert alert-warning" role="alert">
|
<div className="alert alert-warning" role="alert">
|
||||||
No se pudo generar la imagen QR. Usa la clave manual.
|
No se pudo generar la imagen QR. Usa la contraseña manual.
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div className="bg-dark-subtle rounded p-3">
|
<div className="panel-surface rounded p-3">
|
||||||
<strong>Clave TOTP:</strong>
|
<strong>Clave TOTP:</strong>
|
||||||
<div className="mt-2 text-break">{secret}</div>
|
<div className="mt-2 text-break">{secret}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="bg-dark-subtle rounded p-3">
|
<div className="panel-surface rounded p-3">
|
||||||
<strong>URL OTPAuth:</strong>
|
<strong>URL OTPAuth:</strong>
|
||||||
<div className="mt-2 text-break">{otpauthUrl}</div>
|
<div className="mt-2 text-break">{otpauthUrl}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ const LoginForm = ({ onSubmit, isLoading }) => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label htmlFor="password" className="form-label">Clave</label>
|
<label htmlFor="password" className="form-label">Contraseña</label>
|
||||||
<input
|
<input
|
||||||
id="password"
|
id="password"
|
||||||
name="password"
|
name="password"
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ const RegisterForm = ({ onSubmit, isLoading }) => {
|
|||||||
const handleSubmit = (event) => {
|
const handleSubmit = (event) => {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
if (formState.password !== formState.confirmPassword) {
|
if (formState.password !== formState.confirmPassword) {
|
||||||
setLocalError('Las claves no coinciden')
|
setLocalError('Las contraseñas no coinciden')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
onSubmit({ user_name: formState.user_name, password: formState.password })
|
onSubmit({ user_name: formState.user_name, password: formState.password })
|
||||||
@@ -38,7 +38,7 @@ const RegisterForm = ({ onSubmit, isLoading }) => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label htmlFor="register-password" className="form-label">Clave</label>
|
<label htmlFor="register-password" className="form-label">Contraseña</label>
|
||||||
<input
|
<input
|
||||||
id="register-password"
|
id="register-password"
|
||||||
name="password"
|
name="password"
|
||||||
@@ -50,7 +50,7 @@ const RegisterForm = ({ onSubmit, isLoading }) => {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label htmlFor="register-confirm" className="form-label">Repetir clave</label>
|
<label htmlFor="register-confirm" className="form-label">Repetir contraseña</label>
|
||||||
<input
|
<input
|
||||||
id="register-confirm"
|
id="register-confirm"
|
||||||
name="confirmPassword"
|
name="confirmPassword"
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ const TotpForm = ({ onSubmit, isLoading, onBack }) => {
|
|||||||
{onBack && (
|
{onBack && (
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
className="btn btn-outline-secondary"
|
className="btn btn-primary"
|
||||||
onClick={onBack}
|
onClick={onBack}
|
||||||
disabled={isLoading}
|
disabled={isLoading}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -99,13 +99,13 @@ html {
|
|||||||
|
|
||||||
body {
|
body {
|
||||||
font-family: "Open Sans", sans-serif;
|
font-family: "Open Sans", sans-serif;
|
||||||
color: var(--text-main);
|
color: var(--text-main) !important;
|
||||||
background-color: transparent !important;
|
background-color: transparent !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
main {
|
main {
|
||||||
color: var(--text-main);
|
color: var(--text-main) !important;
|
||||||
background-color: var(--background-main);
|
background-color: var(--background-main) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Tipografía global */
|
/* Tipografía global */
|
||||||
@@ -116,8 +116,8 @@ p,
|
|||||||
span,
|
span,
|
||||||
a,
|
a,
|
||||||
button {
|
button {
|
||||||
font-family: "Open Sans", sans-serif;
|
font-family: "Open Sans", sans-serif !important;
|
||||||
color: var(--text-main);
|
color: var(--text-main) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1,
|
h1,
|
||||||
@@ -126,6 +126,255 @@ h3,
|
|||||||
h4,
|
h4,
|
||||||
h5,
|
h5,
|
||||||
h6 {
|
h6 {
|
||||||
font-family: "Product Sans", sans-serif;
|
font-family: "Product Sans", sans-serif !important;
|
||||||
color: var(--text-main);
|
color: var(--text-main) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ================================
|
||||||
|
THEME STYLES
|
||||||
|
================================== */
|
||||||
|
.app-shell {
|
||||||
|
min-height: 100vh;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background: radial-gradient(circle at top, rgba(53, 158, 188, 0.2), transparent 55%), var(--background-main) !important;
|
||||||
|
color: var(--text-main) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-card {
|
||||||
|
background: var(--background-card) !important;
|
||||||
|
color: var(--text-main) !important;
|
||||||
|
border: 1px solid var(--border-color) !important;
|
||||||
|
box-shadow: var(--shadow-lg) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-card-body {
|
||||||
|
background: linear-gradient(180deg, rgba(14, 16, 28, 0.2), transparent 65%) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-surface {
|
||||||
|
background: var(--background-alt) !important;
|
||||||
|
border: 1px solid var(--border-color) !important;
|
||||||
|
color: var(--text-main) !important;
|
||||||
|
box-shadow: var(--shadow-sm) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-pills .nav-link {
|
||||||
|
color: var(--text-muted) !important;
|
||||||
|
background: transparent !important;
|
||||||
|
border: 1px solid transparent !important;
|
||||||
|
transition: all 0.2s ease-in-out !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-pills .nav-link:hover {
|
||||||
|
color: var(--text-accent) !important;
|
||||||
|
border-color: var(--border-hover) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-pills .nav-link.active {
|
||||||
|
color: var(--text-main) !important;
|
||||||
|
background: linear-gradient(135deg, var(--bondi-blue), var(--bondi-blue-dark)) !important;
|
||||||
|
border-color: transparent !important;
|
||||||
|
box-shadow: var(--shadow-accent) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-control {
|
||||||
|
background: var(--input-bg) !important;
|
||||||
|
border: 1px solid var(--input-border) !important;
|
||||||
|
color: var(--input-text) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-control::placeholder {
|
||||||
|
color: var(--input-placeholder) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-control:focus {
|
||||||
|
background: var(--input-bg) !important;
|
||||||
|
color: var(--input-text) !important;
|
||||||
|
border-color: var(--input-border-focus) !important;
|
||||||
|
box-shadow: 0 0 0 0.25rem rgba(53, 158, 188, 0.25) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-text {
|
||||||
|
color: var(--text-muted) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary {
|
||||||
|
background: linear-gradient(135deg, var(--button-bg), var(--bondi-blue-dark)) !important;
|
||||||
|
border-color: var(--button-bg) !important;
|
||||||
|
color: var(--button-text) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary:hover,
|
||||||
|
.btn-primary:focus {
|
||||||
|
background: linear-gradient(135deg, var(--button-bg-hover), var(--bondi-blue-darker)) !important;
|
||||||
|
border-color: var(--button-bg-hover) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline-primary {
|
||||||
|
color: var(--button-bg) !important;
|
||||||
|
border-color: var(--button-bg) !important;
|
||||||
|
background: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline-primary:hover,
|
||||||
|
.btn-outline-primary:focus {
|
||||||
|
color: var(--button-text) !important;
|
||||||
|
background: var(--button-bg) !important;
|
||||||
|
border-color: var(--button-bg) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline-secondary {
|
||||||
|
color: var(--text-muted) !important;
|
||||||
|
border-color: var(--text-muted) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline-secondary:hover,
|
||||||
|
.btn-outline-secondary:focus {
|
||||||
|
color: var(--text-inverted) !important;
|
||||||
|
background: var(--gun-powder-light) !important;
|
||||||
|
border-color: var(--gun-powder-light) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline-light {
|
||||||
|
color: var(--text-main) !important;
|
||||||
|
border-color: var(--text-main) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-outline-light:hover,
|
||||||
|
.btn-outline-light:focus {
|
||||||
|
color: var(--text-inverted) !important;
|
||||||
|
background: var(--text-main) !important;
|
||||||
|
border-color: var(--text-main) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-success {
|
||||||
|
background: linear-gradient(135deg, var(--success), #2f9a87) !important;
|
||||||
|
border-color: var(--success) !important;
|
||||||
|
color: var(--text-main) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-success:hover,
|
||||||
|
.btn-success:focus {
|
||||||
|
background: linear-gradient(135deg, #2f9a87, #257d6d) !important;
|
||||||
|
border-color: #2f9a87 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-danger {
|
||||||
|
background: linear-gradient(135deg, var(--error), #c0475d) !important;
|
||||||
|
border-color: var(--error) !important;
|
||||||
|
color: var(--text-main) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-danger:hover,
|
||||||
|
.btn-danger:focus {
|
||||||
|
background: linear-gradient(135deg, #c0475d, #9d3547) !important;
|
||||||
|
border-color: #c0475d !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-link {
|
||||||
|
color: var(--text-link) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-link:hover,
|
||||||
|
.btn-link:focus {
|
||||||
|
color: var(--text-accent) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-close {
|
||||||
|
filter: invert(80%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert {
|
||||||
|
background: var(--background-alt) !important;
|
||||||
|
color: var(--text-main) !important;
|
||||||
|
border: 1px solid var(--border-color) !important;
|
||||||
|
box-shadow: var(--shadow-sm) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-info {
|
||||||
|
border-color: var(--info) !important;
|
||||||
|
background: rgba(91, 192, 218, 0.1) !important;
|
||||||
|
color: var(--info) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-success {
|
||||||
|
border-color: var(--success) !important;
|
||||||
|
background: rgba(76, 201, 176, 0.12) !important;
|
||||||
|
color: var(--success) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-warning {
|
||||||
|
border-color: var(--warning) !important;
|
||||||
|
background: rgba(243, 201, 105, 0.14) !important;
|
||||||
|
color: var(--warning) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.alert-danger {
|
||||||
|
border-color: var(--error) !important;
|
||||||
|
background: rgba(232, 93, 117, 0.12) !important;
|
||||||
|
color: var(--error) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-table {
|
||||||
|
background: var(--background-alt) !important;
|
||||||
|
color: var(--text-main) !important;
|
||||||
|
border: 1px solid var(--border-color) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-table thead {
|
||||||
|
background: linear-gradient(135deg, var(--bondi-blue-dark), var(--bondi-blue)) !important;
|
||||||
|
color: var(--text-inverted) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-table tbody tr {
|
||||||
|
border-color: var(--border-color) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-table tbody tr:nth-child(even) {
|
||||||
|
background: rgba(72, 74, 98, 0.35) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.theme-table tbody tr:hover {
|
||||||
|
background: rgba(91, 192, 218, 0.12) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
img.qr-frame {
|
||||||
|
border: 4px solid rgba(91, 192, 218, 0.35) !important;
|
||||||
|
border-radius: 1rem;
|
||||||
|
padding: 0.5rem;
|
||||||
|
background: var(--background-card) !important;
|
||||||
|
box-shadow: var(--shadow-accent) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
display: inline-block;
|
||||||
|
background: rgba(28, 30, 44, 0.6) !important;
|
||||||
|
border: 1px solid var(--border-color) !important;
|
||||||
|
color: var(--text-accent) !important;
|
||||||
|
border-radius: 0.5rem;
|
||||||
|
padding: 0.5rem 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre {
|
||||||
|
background: rgba(28, 30, 44, 0.6) !important;
|
||||||
|
border: 1px solid var(--border-color) !important;
|
||||||
|
color: var(--text-accent) !important;
|
||||||
|
border-radius: 0.75rem;
|
||||||
|
padding: 0.75rem;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-body-secondary {
|
||||||
|
color: var(--text-main) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: var(--text-link) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover,
|
||||||
|
a:focus {
|
||||||
|
color: var(--text-accent) !important;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user