feat: max simultaneous printers enforced + capacity bands on Gantt
Deploy via Portainer / deploy (push) Successful in 0s
Deploy via Portainer / deploy (push) Successful in 0s
This commit is contained in:
@@ -105,10 +105,49 @@
|
||||
.stock-ok { color: #22c55e; }
|
||||
.stock-low { color: #f59e0b; }
|
||||
.stock-empty { color: #ef4444; }
|
||||
|
||||
/* ── Mobile responsive ───────────────────────────────────────────────── */
|
||||
@media (max-width: 767.98px) {
|
||||
#sidebar { display: none !important; }
|
||||
#main { margin-left: 0 !important; padding: 1rem 0.75rem; }
|
||||
/* Empêcher le zoom auto iOS sur les inputs */
|
||||
input, select, textarea { font-size: max(1rem, 16px) !important; }
|
||||
.card { border-radius: 8px; }
|
||||
.stat-card { padding: 1rem; }
|
||||
.stat-card .value { font-size: 1.4rem; }
|
||||
.final-price { font-size: 1.5rem; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- ── Mobile top bar (d-md-none = visible seulement < 768px) ─────────── -->
|
||||
<nav id="mobileTopBar"
|
||||
class="d-flex d-md-none align-items-center sticky-top px-3 gap-2"
|
||||
style="background:#1a1d23;height:52px;z-index:1100">
|
||||
<button class="btn p-1" style="color:#9ba3af;font-size:1.3rem;line-height:1"
|
||||
data-bs-toggle="offcanvas" data-bs-target="#mobileSidebar" aria-label="Menu">
|
||||
<i class="bi bi-list"></i>
|
||||
</button>
|
||||
<span class="text-white fw-bold">
|
||||
<i class="bi bi-layers-half me-1"></i>3D<span style="color:#ff6b35">Pricing</span>
|
||||
</span>
|
||||
</nav>
|
||||
|
||||
<!-- ── Mobile offcanvas sidebar ──────────────────────────────────────── -->
|
||||
<div class="offcanvas offcanvas-start" tabindex="-1" id="mobileSidebar"
|
||||
style="background:#1a1d23;width:240px">
|
||||
<div class="offcanvas-header" style="border-bottom:1px solid #2e323d;padding:.75rem 1.25rem">
|
||||
<span class="text-white fw-bold">
|
||||
<i class="bi bi-layers-half me-1"></i>3D<span style="color:#ff6b35">Pricing</span>
|
||||
</span>
|
||||
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas"></button>
|
||||
</div>
|
||||
<div class="offcanvas-body p-0" style="overflow-y:auto">
|
||||
<div id="mobileNavInner"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="sidebar">
|
||||
<div class="brand">
|
||||
<span class="brand-text"><i class="bi bi-layers-half"></i> 3D<span>Pricing</span></span>
|
||||
@@ -221,6 +260,33 @@
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<!-- ── Peuple l'offcanvas mobile depuis le sidebar desktop ───────────── -->
|
||||
<script>
|
||||
(function () {
|
||||
const sidebarNav = document.querySelector('#sidebar nav');
|
||||
const sidebarUser = document.querySelector('#sidebar .sidebar-user');
|
||||
const mobileInner = document.getElementById('mobileNavInner');
|
||||
if (!sidebarNav || !mobileInner) return;
|
||||
|
||||
// Clone le nav et force l'affichage des labels (jamais en mode collapsed)
|
||||
const navClone = sidebarNav.cloneNode(true);
|
||||
navClone.querySelectorAll('.nav-label, .nav-section').forEach(el => {
|
||||
el.style.opacity = '1';
|
||||
el.style.pointerEvents = 'auto';
|
||||
});
|
||||
// Ferme l'offcanvas au clic sur un lien
|
||||
navClone.querySelectorAll('a').forEach(a => a.setAttribute('data-bs-dismiss', 'offcanvas'));
|
||||
mobileInner.appendChild(navClone);
|
||||
|
||||
// Clone la zone utilisateur en bas
|
||||
if (sidebarUser) {
|
||||
const userClone = sidebarUser.cloneNode(true);
|
||||
userClone.style.cssText += ';opacity:1;pointer-events:auto;margin-top:auto';
|
||||
userClone.querySelectorAll('a').forEach(a => a.setAttribute('data-bs-dismiss', 'offcanvas'));
|
||||
mobileInner.appendChild(userClone);
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
{% block scripts %}{% endblock %}
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user