feat: v4.0.2 — qualité & robustesse (session expiry UX, validation, mobile, tests)

- Session expiry: redirects ajoutent ?expired=1 → bannière "Session expired" sur login
- Page titles: titre vide → 'Untitled' par défaut (au lieu de chaîne vide)
- Error handling: try/catch dans create_page avec message user-friendly (500)
- Mobile responsive: sidebar slide-in, modales centrées, landing page adaptative
- 10 nouveaux tests de non-régression: landing, register, 404, validation, duplicate
- 143 tests passent (133 + 10)
This commit is contained in:
2026-07-20 08:07:22 -04:00
parent a5831456e1
commit ed465333e4
5 changed files with 200 additions and 19 deletions
+83
View File
@@ -6,6 +6,89 @@
<title>FlowDeck — {% block title_prefix %}Home{% endblock %}</title>
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg">
<link rel="stylesheet" href="/static/css/app.css?v=3.0.0">
<style>
/* ── Mobile responsive (v4.0.2) ── */
@media (max-width: 768px) {
.sidebar {
position: fixed;
left: 0;
top: 0;
bottom: 0;
z-index: 100;
width: 280px;
transform: translateX(-100%);
transition: transform .2s ease;
}
.sidebar.mobile-open {
transform: translateX(0);
box-shadow: 4px 0 24px rgba(0,0,0,.5);
}
.sidebar-overlay.visible {
position: fixed;
inset: 0;
background: rgba(0,0,0,.5);
z-index: 99;
}
.main-wrapper {
margin-left: 0 !important;
width: 100%;
}
.unified-header {
padding: 8px 12px;
}
.page-editor-wrapper {
padding: 16px 8px;
}
.page-title-block {
padding: 16px 8px;
}
.blocks-container {
padding: 0 4px;
}
.share-dialog, .more-menu, .activity-popover {
position: fixed !important;
top: 50% !important;
left: 50% !important;
transform: translate(-50%, -50%) !important;
width: 92vw;
max-width: 400px;
max-height: 80vh;
overflow-y: auto;
}
.landing-nav {
padding: 12px 16px;
}
.hero {
padding: 40px 16px 30px;
}
.hero h1 {
font-size: 1.8rem;
}
.features {
grid-template-columns: 1fr;
padding: 0 16px 30px;
}
.library-card-grid {
grid-template-columns: 1fr;
}
.view-tabs {
overflow-x: auto;
flex-wrap: nowrap;
}
}
@media (max-width: 480px) {
.hero h1 {
font-size: 1.5rem;
}
.hero p {
font-size: 15px;
}
.btn {
padding: 8px 16px;
font-size: 13px;
}
}
</style>
<script src="/static/js/htmx.min.js"></script>
<script src="/static/js/alpine.min.js" defer></script>
<script src="/static/js/sortable.min.js" defer></script>