rustpbx 0.4.7

A SIP PBX implementation in Rust
Documentation
{% extends "console/auth_layout.html" %}

{% block title %}{{ "auth.login" | t }} ยท {{site_name|default('RustPBX')}}{% endblock %}

{% block content %}
<section class="flex items-center justify-center py-16 px-4">
    <div class="w-full max-w-md space-y-8 rounded-2xl bg-white/80 p-8 shadow-xl ring-1 ring-black/5 backdrop-blur">
        <div class="space-y-2 text-center">
            <h1 class="text-2xl font-semibold text-slate-900">{{ "auth.login_welcome" | t }}</h1>
            <p class="text-sm text-slate-500">{{ "auth.login_subtitle" | t }}</p>
            {% if demo_mode %}
            <div
                class="mt-6 rounded-xl bg-amber-50 p-4 text-sm text-amber-800 border-2 border-amber-200 shadow-sm text-left">
                <div class="flex items-center gap-2 font-bold text-amber-900 mb-3">
                    <svg class="h-5 w-5 text-amber-600" viewBox="0 0 20 20" fill="currentColor">
                        <path fill-rule="evenodd"
                            d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 2h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z"
                            clip-rule="evenodd" />
                    </svg>
                    {{ "auth.demo_title" | t }}
                </div>
                <div class="space-y-2 font-mono">
                    <div
                        class="flex justify-between items-center bg-white/60 px-3 py-2 rounded-lg border border-amber-100">
                        <span class="text-xs text-amber-600 font-sans font-medium uppercase tracking-wider">{{ "auth.user" | t }}</span>
                        <span class="select-all font-bold text-amber-900">demo@miuda.ai</span>
                    </div>
                    <div
                        class="flex justify-between items-center bg-white/60 px-3 py-2 rounded-lg border border-amber-100">
                        <span class="text-xs text-amber-600 font-sans font-medium uppercase tracking-wider">{{ "auth.pass" | t }}</span>
                        <span class="select-all font-bold text-amber-900">hello@miuda.ai</span>
                    </div>
                </div>
                <p class="mt-3 text-[11px] text-amber-600 font-sans italic text-center text-balance leading-tight">
                    {{ "auth.demo_notice" | t }}</p>
            </div>
            {% endif %}
        </div>
        {% if error_message %}
        <div class="rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-600">
            {{ error_message | default("") }}
        </div>
        {% endif %}
        <form action="{{ login_action }}" method="post" class="space-y-6">
            <input type="hidden" name="next" value="{{ next | default('') }}" />
            <div class="space-y-2 text-left">
                <label class="block text-sm font-medium text-slate-700">{{ "auth.email_or_username" | t }}</label>
                <input type="text" name="identifier" value="{{ identifier }}" required
                    class="w-full rounded-xl border border-slate-200 px-4 py-3 text-sm shadow-sm focus:border-sky-400 focus:outline-none focus:ring-2 focus:ring-sky-200"
                    placeholder="{{ 'auth.identifier_placeholder' | t }}" />
            </div>
            <div class="space-y-2 text-left" x-data="{ reveal: false }">
                <label class="block text-sm font-medium text-slate-700">{{ "auth.password" | t }}</label>
                <div class="relative flex items-center">
                    <input :type="reveal ? 'text' : 'password'" name="password" required
                        class="w-full rounded-xl border border-slate-200 px-4 py-3 pr-12 text-sm shadow-sm focus:border-sky-400 focus:outline-none focus:ring-2 focus:ring-sky-200"
                        placeholder="{{ 'auth.password_placeholder' | t }}" />
                    <button type="button" @click="reveal = !reveal"
                        x-text="reveal ? '{{ 'auth.hide' | t }}' : '{{ 'auth.show' | t }}'"
                        class="absolute right-3 text-xs font-medium text-slate-500"></button>
                </div>
            </div>
            <div class="flex items-center justify-between text-sm">
                <a href="{{ forgot_url }}" class="font-medium text-sky-600 hover:text-sky-500">{{ "auth.forgot_password" | t }}</a>
                {% if register_url %}
                <a href="{{ register_url }}" class="text-slate-500 hover:text-slate-700">{{ "auth.register" | t }}</a>
                {% else %}
                <span class="text-slate-400" title="{{ 'auth.registration_disabled_title' | t }}">{{ "auth.registration_disabled" | t }}</span>
                {% endif %}
            </div>
            <button type="submit"
                class="w-full rounded-xl bg-sky-600 px-4 py-3 text-sm font-semibold text-white shadow-lg shadow-sky-200 transition hover:bg-sky-500 focus:outline-none focus:ring-2 focus:ring-sky-300">{{ "auth.login_button" | t }}</button>
        </form>
    </div>
</section>
{% endblock %}