feat: LineIcons Duotone, page profil, widgets dashboard, sidebar gauche/droite

- Intégration LineIcons Duotone (css/ + toutes les pages)
- Remplacement de tous les symboles Unicode par des icônes lnid-*
- Page profile.html : préférences thème, position sidebar, langue
- Dashboard : système de widgets add/remove + drag-and-drop natif
- Sidebar gauche/droite configurable per-user (data-sidebar CSS + FOUC script)
- Store ui : sidebarPosition, applySidebarPosition(), setSidebarPosition()
- Composant profilePage() dans app.js
- nav.profile ajouté dans fr.json et en.json
- SUIVI.md mis à jour

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
enzo 2026-03-21 18:38:48 +01:00
parent 9739dbaee8
commit 5f6681dd17
19 changed files with 11717 additions and 148 deletions

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -488,10 +488,13 @@ input, select, textarea { font-family: inherit; font-size: inherit; }
}
.sidebar-icon {
font-size: 1.1rem;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2rem;
flex-shrink: 0;
width: 1.25rem;
text-align: center;
line-height: 1;
}
.sidebar-label {
@ -594,3 +597,27 @@ html.is-animating .transition-fade {
}
[x-cloak] { display: none !important; }
/* ── Sidebar droite ─────────────────────────────────────────────────────────── */
[data-sidebar="right"] .sidebar {
left: auto;
right: 0;
border-right: none;
border-left: 1px solid var(--neu-border);
}
[data-sidebar="right"] .main-layout {
margin-left: 0;
margin-right: var(--sidebar-width);
transition: margin-right 0.2s ease;
}
[data-sidebar="right"] .sidebar.collapsed ~ .main-layout {
margin-right: var(--sidebar-width-collapsed);
}
@media (max-width: 768px) {
[data-sidebar="right"] .main-layout {
margin-right: var(--sidebar-width-collapsed);
}
}

View file

@ -445,3 +445,167 @@
.confirm-summary { padding: 1rem; display: flex; flex-direction: column; gap: .5rem; border-radius: .5rem; }
.confirm-row { display: flex; gap: 1rem; font-size: .875rem; }
.confirm-label { font-weight: 600; min-width: 80px; color: var(--neu-text-muted); }
/* ── Page header ─────────────────────────────────────────────────────────────── */
.page-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 1.25rem;
gap: 1rem;
}
.page-title { font-size: 1.25rem; font-weight: 700; }
/* ── Dashboard widgets ───────────────────────────────────────────────────────── */
.widgets-grid {
display: grid;
gap: 1.25rem;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
}
.widget {
min-height: 160px;
cursor: grab;
user-select: none;
transition: var(--neu-transition);
}
.widget:active { cursor: grabbing; }
.widget:hover { transform: translateY(-2px); }
.widget-title {
font-size: .875rem;
font-weight: 700;
color: var(--neu-text-muted);
text-transform: uppercase;
letter-spacing: .5px;
margin: 0 0 .75rem 0;
}
/* Widget config panel */
.widget-config {
margin-bottom: 1.25rem;
padding: 1rem;
}
.widget-config-title {
font-weight: 700;
margin: 0 0 .75rem 0;
font-size: .9rem;
}
.widget-config-row {
display: flex;
align-items: center;
gap: .75rem;
padding: .5rem .25rem;
border-radius: .375rem;
cursor: grab;
transition: background .15s;
}
.widget-config-row:hover { background: rgba(108, 142, 244, 0.06); }
.widget-toggle-label {
display: flex;
align-items: center;
gap: .5rem;
margin-left: auto;
font-size: .8rem;
color: var(--neu-text-muted);
cursor: pointer;
}
.drag-handle { color: var(--neu-text-muted); font-size: 1rem; }
/* Widget: status (stats) */
.stat-rows { display: flex; flex-direction: column; gap: .5rem; }
.stat-row {
display: flex;
align-items: center;
gap: .75rem;
font-size: .9rem;
}
.stat-icon { font-size: 1.1rem; width: 1.25rem; flex-shrink: 0; }
.stat-num { font-size: 1.5rem; font-weight: 700; min-width: 2rem; }
.stat-label { color: var(--neu-text-muted); }
/* Widget: lxc-list */
.lxc-row {
display: flex;
align-items: center;
gap: .5rem;
padding: .375rem 0;
border-bottom: 1px solid var(--neu-border);
font-size: .85rem;
}
.lxc-row:last-child { border-bottom: none; }
.lxc-name { flex: 1; font-weight: 500; }
.lxc-cpu, .lxc-ram { color: var(--neu-text-muted); font-size: .8rem; min-width: 3.5rem; text-align: right; }
/* Widget: links */
.links-grid {
display: flex;
flex-wrap: wrap;
gap: .75rem;
}
.link-btn {
flex: 1;
min-width: 80px;
justify-content: center;
gap: .375rem;
}
/* ── Profil / préférences ────────────────────────────────────────────────────── */
.settings-section {
margin-bottom: 1.25rem;
}
.settings-section h3 {
display: flex;
align-items: center;
gap: .5rem;
font-size: 1rem;
font-weight: 700;
margin: 0 0 1rem 0;
padding-bottom: .75rem;
border-bottom: 1px solid var(--neu-border);
}
.profile-info { display: flex; flex-direction: column; gap: .5rem; }
.profile-row {
display: flex;
align-items: center;
gap: 1rem;
font-size: .9rem;
padding: .375rem 0;
}
.profile-label {
font-weight: 600;
color: var(--neu-text-muted);
min-width: 100px;
}
.profile-value { color: var(--neu-text); }
.badge-admin {
background: rgba(108, 142, 244, 0.15);
color: var(--neu-primary);
padding: 2px 8px;
border-radius: 9999px;
font-size: .75rem;
font-weight: 600;
}
.badge-user {
background: rgba(127, 136, 153, 0.15);
color: var(--neu-text-muted);
padding: 2px 8px;
border-radius: 9999px;
font-size: .75rem;
font-weight: 600;
}
/* Groupe de boutons (thème, sidebar position) */
.btn-group {
display: flex;
gap: .5rem;
flex-wrap: wrap;
}
/* ── Logo auth LineIcons ─────────────────────────────────────────────────────── */
.logo-icon {
font-size: 2.5rem;
color: var(--neu-primary);
display: block;
line-height: 1;
}