.nuc-wrap { display:flex; justify-content:center; padding:24px 12px; font-family:-apple-system,BlinkMacSystemFont,”Segoe UI”,Roboto,Helvetica,Arial,sans-serif; }
.nuc-card { width:100%; max-width:420px; background:#fff; border:1px solid #e2e8f0; border-radius:16px; box-shadow:0 10px 30px rgba(15,23,42,.08); padding:32px 28px; color:#0f172a; }
.nuc-brand { display:flex; align-items:center; gap:10px; margin-bottom:24px; }
.nuc-mark { width:40px; height:40px; border-radius:10px; background:#007AFF; color:#fff; display:flex; align-items:center; justify-content:center; font-weight:700; font-size:18px; }
.nuc-name { font-size:16px; font-weight:700; }
.nuc-card h2 { font-size:20px; margin:0 0 6px; }
.nuc-sub { margin:0 0 22px; color:#64748b; font-size:14px; line-height:1.45; }
.nuc-field { margin-bottom:16px; }
.nuc-field label { display:block; font-size:13px; font-weight:600; margin-bottom:6px; }
.nuc-input-wrap { position:relative; }
.nuc-card input[type=”password”], .nuc-card input[type=”text”] { width:100%; padding:12px 56px 12px 14px; font-size:15px; border:1px solid #cbd5e1; border-radius:10px; outline:none; }
.nuc-card input:focus { border-color:#007AFF; }
.nuc-toggle { position:absolute; right:8px; top:50%; transform:translateY(-50%); background:none; border:none; color:#64748b; cursor:pointer; font-size:13px; padding:4px 6px; }
.nuc-btn { width:100%; padding:13px; font-size:15px; font-weight:600; color:#fff; background:#007AFF; border:none; border-radius:10px; cursor:pointer; }
.nuc-btn:hover { background:#0a63c9; }
.nuc-btn:disabled { opacity:.6; cursor:not-allowed; }
.nuc-hint { font-size:12px; color:#64748b; margin-top:6px; }
.nuc-msg { padding:12px 14px; border-radius:10px; font-size:14px; line-height:1.4; margin-bottom:18px; display:none; }
.nuc-msg.error { background:#fef2f2; color:#dc2626; border:1px solid #fecaca; display:block; }
.nuc-msg.success { background:#f0fdf4; color:#16a34a; border:1px solid #bbf7d0; display:block; }
.nuc-center { text-align:center; }
.nuc-spinner { width:24px; height:24px; border:3px solid #e2e8f0; border-top-color:#007AFF; border-radius:50%; animation:nuc-spin .8s linear infinite; margin:8px auto; }
@keyframes nuc-spin { to { transform:rotate(360deg); } }
.nuc-hidden { display:none !important; }
Verifying your reset link…
Your password has been updated.
You can now return to the Niko UEL Central app and sign in with your new password.
This password reset link is invalid or has expired.
Open the Niko UEL Central app, tap Forgot Password, and request a new reset email.
https://cdn.jsdelivr.net/npm/@supabase/supabase-js@2
(function () {
// —- CONFIG: replace with your project values (anon key is safe to expose) —-
var SUPABASE_URL = ‘
https://obumahhycgidavcmvmrd.supabase.co’;
var SUPABASE_ANON_KEY = ‘eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Im9idW1haGh5Y2dpZGF2Y212bXJkIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDg1MDgyOTMsImV4cCI6MjA2NDA4NDI5M30.oRZ634uHrpJHHrA8m_yd6jEWvn5pp4j8fF6HnuV5jQQ’;
// ——————————————————————————-
var client = window.supabase.createClient(SUPABASE_URL, SUPABASE_ANON_KEY, {
auth: { detectSessionInUrl: true, persistSession: false, autoRefreshToken: false }
});
var el = function (id) { return document.getElementById(id); };
var states = { loading: el(‘nuc-loading’), form: el(‘nuc-form’), success: el(‘nuc-success’), invalid: el(‘nuc-invalid’) };
var formMsg = el(‘nuc-form-msg’);
var recoveryReady = false;
function show(state) {
Object.keys(states).forEach(function (k) { states[k].classList.add(‘nuc-hidden’); });
state.classList.remove(‘nuc-hidden’);
}
function setMsg(text, type) { formMsg.textContent = text; formMsg.className = ‘nuc-msg ‘ + (type || ”); }
client.auth.onAuthStateChange(function (event, session) {
if ((event === ‘PASSWORD_RECOVERY’ || event === ‘SIGNED_IN’) && session) {
recoveryReady = true; show(states.form);
}
});
Array.prototype.forEach.call(document.querySelectorAll(‘.nuc-toggle’), function (btn) {
btn.addEventListener(‘click’, function () {
var input = el(btn.getAttribute(‘data-target’));
var isPw = input.type === ‘password’;
input.type = isPw ? ‘text’ : ‘password’;
btn.textContent = isPw ? ‘Hide’ : ‘Show’;
});
});
(async function init() {
try {
var url = new URL(window.location.href);
var code = url.searchParams.get(‘code’);
if (code) {
var ex = await client.auth.exchangeCodeForSession(code);
if (ex.error) throw ex.error;
recoveryReady = true; show(states.form); return;
}
var sess = await client.auth.getSession();
if (sess.data && sess.data.session) { recoveryReady = true; show(states.form); return; }
setTimeout(function () { if (!recoveryReady) show(states.invalid); }, 1500);
} catch (err) {
console.error(‘Reset link validation failed:’, err);
show(states.invalid);
}
})();
el(‘nuc-reset-form’).addEventListener(‘submit’, async function (e) {
e.preventDefault();
var password = el(‘nuc-password’).value;
var confirm = el(‘nuc-confirm’).value;
if (password.length < 8) { setMsg('Password must be at least 8 characters.', 'error'); return; }
if (password !== confirm) { setMsg('Passwords do not match.', 'error'); return; }
if (!recoveryReady) { setMsg('Your reset session is not ready. Please reopen the link from your email.', 'error'); return; }
var btn = el('nuc-submit');
btn.disabled = true; btn.textContent = 'Updating\u2026'; setMsg('', '');
try {
var res = await client.auth.updateUser({ password: password });
if (res.error) throw res.error;
await client.auth.signOut();
show(states.success);
} catch (err) {
console.error('Password update failed:', err);
setMsg(err.message || 'Could not update password. The link may have expired \u2014 request a new one.', 'error');
btn.disabled = false; btn.textContent = 'Update password';
}
});
})();