Files

333 lines
9.0 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* =============================================================
iPad & iPad mini Responsive Overrides
Target breakpoints:
iPad mini : 744px × 1133px (portrait) / 1133px × 744px (landscape)
iPad (10th): 820px × 1180px (portrait) / 1180px × 820px (landscape)
iPad Air : 820px × 1180px (portrait)
iPad Pro 11: 834px × 1194px (portrait)
All covered by max-width: 1194px + touch-specific rules.
============================================================= */
/* ── 1. Global touch-friendly baseline ── */
@media (pointer: coarse), (max-width: 1194px) {
/* Minimum 44px touch targets on interactive elements */
.btn,
.nav-link,
.dropdown-item {
min-height: 44px;
display: inline-flex;
align-items: center;
}
/* Checkboxes and radios are deliberately NOT in the rule above.
`display: inline-flex` on a native <input type="radio"> replaces its
intrinsic box with a flex container: the control keeps painting its glyph
at its natural ~16px size while the element claims a 44px-tall box, so the
visible dot and the actual hit area stop coinciding. Taps land next to the
control and nothing happens — which is exactly how the per-account
notification matrix (Inherit / On / Off) came to look unclickable.
Grow the target without touching `display`: keep the native box, scale the
glyph up, and give it margin so neighbouring options stay separable. Any
control that needs a genuinely large tap area should wrap the input in a
<label> that fills the cell (see customers/manage.html). */
input[type="checkbox"],
input[type="radio"],
.form-check-input {
transform: scale(1.35);
margin: 6px;
}
/* Slightly larger form controls for finger input */
.form-control,
.form-select {
min-height: 44px;
font-size: 1rem;
}
/* Prevent double-tap zoom on buttons */
button,
a {
touch-action: manipulation;
}
}
/* ── 2. Navbar — collapse at iPad widths ── */
@media (max-width: 1024px) {
.navbar-collapse .navbar-nav .nav-link {
padding: 0.75rem 1rem;
font-size: 1rem;
}
.navbar-collapse {
padding-bottom: 0.5rem;
}
}
/* ── 3. Container padding on iPad ── */
@media (max-width: 1024px) {
.container-fluid {
padding-left: 1rem;
padding-right: 1rem;
}
}
/* ── 4. Dashboard stat cards — 2-up on iPad mini portrait ── */
@media (max-width: 820px) {
.col-md-3 {
flex: 0 0 50%;
max-width: 50%;
}
}
/* ── 5. Form grid — THE critical fix ──
The form editor/execute/preview use a fixed 12-column grid where
each column is 72px wide (total ≈ 920px + gaps).
On iPads this overflows horizontally.
Solution: scale the grid using CSS custom properties + clamp()
so it always fits within the viewport while maintaining proportions.
─────────────────────────────────────────────────────────────── */
@media (max-width: 1024px) {
/* Override the fixed cell width with a fluid value */
:root {
--grid-cols: 12;
--grid-gap: 8px;
/* Each cell = (available_width - 11 gaps) / 12 columns */
--cell-w-fluid: calc((min(96vw, 900px) - 11 * var(--grid-gap)) / var(--grid-cols));
}
/* Execute & preview .form-grid */
.form-grid {
grid-template-columns: repeat(12, var(--cell-w-fluid)) !important;
width: 100% !important; /* remove max-content so it fills container */
overflow-x: visible !important;
}
/* Row height scales proportionally: original ratio was 52/72 ≈ 0.72 */
.form-grid {
grid-auto-rows: calc(var(--cell-w-fluid) * 0.72) !important;
}
/* Cells: let font scale with viewport */
.fg-cell .field-lbl {
font-size: clamp(0.6rem, 1.2vw, 0.74rem) !important;
}
.fg-cell .form-control,
.fg-cell .form-select {
font-size: clamp(0.65rem, 1.3vw, 0.76rem) !important;
min-height: unset; /* override the 44px rule inside grids — cells are constrained */
padding: 0.15rem 0.35rem !important;
}
/* insp-body / preview-body scroll container */
.insp-body,
.preview-body {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
padding: 1rem !important;
}
}
/* ── 6. Form editor layout — sidebar panels ── */
@media (max-width: 1024px) {
/* Editor uses a 3-column CSS grid: sidebar | canvas | properties.
On iPad: stack canvas below sidebars, or let sidebars collapse. */
.editor-layout {
grid-template-columns: 1fr !important;
grid-template-rows: auto 1fr auto !important;
}
.editor-sidebar-left,
.editor-sidebar-right {
max-height: 220px;
overflow-y: auto;
}
}
/* ── 7. Tables ── */
@media (max-width: 1024px) {
/* Ensure all tables have horizontal scroll */
.table-responsive {
-webkit-overflow-scrolling: touch;
}
/* Tables not wrapped in .table-responsive */
table:not(.tbl-field) {
display: block;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
width: 100%;
}
/* Table action buttons — stack vertically if needed */
td .btn + form,
td .btn + .btn {
margin-top: 4px;
display: block;
}
}
/* ── 8. Cards & layout — improve spacing ── */
@media (max-width: 820px) {
/* Full-width cards on narrow iPad portrait */
.col-md-6[class*="offset-"],
.col-md-8[class*="offset-"] {
margin-left: 0 !important;
max-width: 100% !important;
flex: 0 0 100% !important;
}
.card-body {
padding: 1rem;
}
/* Page header action buttons — stack on small iPads */
.col-md-4.text-end.d-flex {
flex-wrap: wrap;
gap: 0.5rem !important;
justify-content: flex-start !important;
}
}
/* ── 9. Inspection execute — header & footer ── */
@media (max-width: 1024px) {
.insp-wrap {
padding: 0 0.5rem 5rem !important;
}
.insp-header {
flex-direction: column;
align-items: flex-start !important;
gap: 0.75rem !important;
padding: 1rem !important;
border-radius: 12px 12px 0 0;
}
.insp-header .d-flex.gap-2 {
flex-wrap: wrap;
width: 100%;
}
.insp-footer {
flex-direction: column;
align-items: stretch !important;
gap: 0.5rem !important;
padding: 0.75rem 1rem !important;
}
.insp-footer .btn {
width: 100%;
justify-content: center;
}
/* Flag Issue button — full width on small screens */
.insp-header .btn {
flex: 1;
justify-content: center;
}
}
/* ── 10. Preview header ── */
@media (max-width: 1024px) {
.preview-wrap {
padding: 0.5rem 0.5rem 3rem !important;
margin-top: 0.5rem !important;
}
.preview-header {
flex-direction: column;
align-items: flex-start !important;
gap: 0.75rem !important;
padding: 1rem !important;
}
}
/* ── 11. Modals — full width on iPad mini ── */
@media (max-width: 768px) {
.modal-dialog {
margin: 0.5rem;
max-width: calc(100vw - 1rem);
}
}
/* ── 12. Rating stars — tap targets sized to grid cell, not oversized ── */
@media (pointer: coarse) {
/* Inside the inspection form grid, stars must stay compact to fit their cell.
The grid cell height is ~50px; 1.6rem stars at 44px each would overflow. */
.rating-stars button {
font-size: 1rem; /* fits within grid cell rows */
padding: 0.15rem;
min-height: unset; /* do not enforce 44px — cell height controls this */
min-width: unset;
}
/* Outside the grid (e.g. standalone forms), keep comfortable tap targets */
:not(.form-grid) .rating-stars button {
font-size: 1.4rem;
padding: 0.2rem;
}
/* Upload zone — compact inside grid, comfortable outside */
.upload-zone {
min-height: 44px; /* reduced from 80px — fits grid cell */
}
/* Signature pad — taller for finger drawing */
.signature-pad-wrap {
min-height: 120px !important;
}
/* Sig clear button — larger touch target */
.sig-clear {
padding: 0.3rem 0.6rem !important;
font-size: 0.75rem !important;
}
}
/* ── 13. Facility view action buttons row ── */
@media (max-width: 1024px) {
.col-md-4.text-end {
text-align: left !important;
margin-top: 0.75rem;
}
}
/* ── 14. Reports — filter bar ── */
@media (max-width: 820px) {
.row.g-3 .col-md-3,
.row.g-3 .col-md-4,
.row.g-3 .col-md-2 {
flex: 0 0 50%;
max-width: 50%;
}
}
/* ── 15. Checklist items in legacy inspect view ── */
@media (max-width: 1024px) {
.checklist-item {
padding: 0.75rem !important;
}
.rating-option {
min-width: 44px;
min-height: 44px;
}
}
/* ── 16. Prevent subpixel rendering issues on Retina displays ── */
@media (-webkit-min-device-pixel-ratio: 2) {
.card,
.modal-content {
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
}
/* ── 17. Safe-area insets (iPad with home indicator) ── */
@supports (padding-bottom: env(safe-area-inset-bottom)) {
.insp-footer,
.container-fluid {
padding-bottom: max(0.75rem, env(safe-area-inset-bottom));
}
}