feat(auth): login, roles, user mgmt, setup wizard, and session guard
- New skald-setup crate: interactive first-run wizard that creates the admin user, prompts for encryption choice and password - Auth system: session-based login/logout with cookie, guard middleware - Roles API: CRUD for data-driven roles, seeded on first boot - Users management API: create, list, edit, delete users - Setup state API: check if first admin has been created - Frontend: login-page, setup-page, users-page, roles-page, profile-page components with corresponding CSS - Topbar: avatar dropdown with profile link and logout - Sidebar: nav entries for Users and Roles (admin only) - Page shell CSS: layout support for the new pages - build.sh: builds both skald and skald-setup binaries - run.sh: runs skald-setup before the server loop - CLAUDE.md: updated workspace layout and build/run docs
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
.setup-page,
|
||||
.login-page {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: 9999;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: var(--bs-body-bg);
|
||||
overflow: auto;
|
||||
padding: 24px;
|
||||
}
|
||||
|
||||
.setup-card,
|
||||
.login-card {
|
||||
width: 100%;
|
||||
max-width: 440px;
|
||||
background: var(--card-bg);
|
||||
border: 1px solid var(--card-border);
|
||||
border-radius: 8px;
|
||||
box-shadow: var(--card-shadow);
|
||||
padding: 36px 32px;
|
||||
}
|
||||
|
||||
.setup-logo,
|
||||
.login-logo {
|
||||
text-align: center;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.setup-logo img,
|
||||
.login-logo img {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
border-radius: 14px;
|
||||
}
|
||||
|
||||
.setup-title,
|
||||
.login-title {
|
||||
font-size: 1.5rem;
|
||||
font-weight: 700;
|
||||
text-align: center;
|
||||
margin: 0 0 6px;
|
||||
}
|
||||
|
||||
.setup-subtitle,
|
||||
.login-subtitle {
|
||||
text-align: center;
|
||||
color: var(--placeholder-color);
|
||||
font-size: .9rem;
|
||||
margin: 0 0 28px;
|
||||
}
|
||||
|
||||
.setup-error,
|
||||
.login-error {
|
||||
background: rgba(220, 53, 69, .1);
|
||||
border: 1px solid rgba(220, 53, 69, .35);
|
||||
border-radius: var(--card-radius);
|
||||
padding: 10px 14px;
|
||||
margin-bottom: 18px;
|
||||
font-size: .85rem;
|
||||
color: #dc3545;
|
||||
}
|
||||
|
||||
.setup-warn {
|
||||
background: rgba(255, 193, 7, .1);
|
||||
border: 1px solid rgba(255, 193, 7, .35);
|
||||
border-radius: var(--card-radius);
|
||||
padding: 12px 14px;
|
||||
margin-top: 18px;
|
||||
font-size: .82rem;
|
||||
color: var(--bs-secondary-color);
|
||||
}
|
||||
|
||||
.setup-warn strong {
|
||||
color: #b8860b;
|
||||
}
|
||||
|
||||
[data-bs-theme="dark"] .setup-warn strong {
|
||||
color: #ffc107;
|
||||
}
|
||||
|
||||
.setup-submit,
|
||||
.login-submit {
|
||||
width: 100%;
|
||||
margin-top: 24px;
|
||||
}
|
||||
|
||||
.setup-spinner,
|
||||
.login-spinner {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
border: 2px solid currentColor;
|
||||
border-right-color: transparent;
|
||||
border-radius: 50%;
|
||||
display: inline-block;
|
||||
animation: setup-spin .65s linear infinite;
|
||||
vertical-align: -3px;
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
@keyframes setup-spin {
|
||||
to { transform: rotate(360deg); }
|
||||
}
|
||||
.login-spinner {
|
||||
animation-name: setup-spin;
|
||||
}
|
||||
Reference in New Issue
Block a user