First commit
This commit is contained in:
@@ -0,0 +1,317 @@
|
||||
/* =============================================================
|
||||
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,
|
||||
input[type="checkbox"],
|
||||
input[type="radio"],
|
||||
.form-check-input {
|
||||
min-height: 44px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
/* 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));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,300 @@
|
||||
/* ════════════════════════════════════════════════════════════════════════
|
||||
Janitorial QC — Global UI Theme
|
||||
────────────────────────────────────────────────────────────────────────
|
||||
Purpose: unify every signed-in page onto one polished design system by
|
||||
retuning Bootstrap's own components. UI/UX only — no markup/route/JS change.
|
||||
|
||||
Design tokens (matching the app's premium pages: inspections/view,
|
||||
templates/form_editor, etc.):
|
||||
Font DM Sans
|
||||
Accent #2563eb / hover #1d4ed8 / soft #eff6ff
|
||||
Slate text #0f172a · heading #374151 · muted #64748b / #94a3b8
|
||||
border #e2e8f0 / #cbd5e1 · surface #f8fafc / #f1f5f9 · page #eef0f4
|
||||
Chrome navbar #1a1d23 (matches the dark card-headers on premium pages)
|
||||
Green #16a34a Amber #f59e0b Danger #dc2626
|
||||
Shape radius .85rem cards / .5rem controls · soft shadows
|
||||
|
||||
Load order: AFTER bootstrap.min.css, BEFORE page-level {% block extra_css %}
|
||||
so any page's own styles still win.
|
||||
════════════════════════════════════════════════════════════════════════ */
|
||||
|
||||
/* ── 1. Design tokens (retune Bootstrap CSS variables) ───────────────────── */
|
||||
:root {
|
||||
--bs-primary: #2563eb;
|
||||
--bs-primary-rgb: 37, 99, 235;
|
||||
--bs-success: #16a34a;
|
||||
--bs-success-rgb: 22, 163, 74;
|
||||
--bs-warning: #f59e0b;
|
||||
--bs-warning-rgb: 245, 158, 11;
|
||||
--bs-danger: #dc2626;
|
||||
--bs-danger-rgb: 220, 38, 38;
|
||||
|
||||
--bs-link-color: #2563eb;
|
||||
--bs-link-color-rgb: 37, 99, 235;
|
||||
--bs-link-hover-color: #1d4ed8;
|
||||
--bs-link-hover-color-rgb: 29, 78, 216;
|
||||
|
||||
--bs-body-color: #0f172a;
|
||||
--bs-body-color-rgb: 15, 23, 42;
|
||||
--bs-secondary-color: rgba(100, 116, 139, 1);
|
||||
--bs-body-bg: #eef0f4;
|
||||
--bs-border-color: #e2e8f0;
|
||||
|
||||
--bs-border-radius: .55rem;
|
||||
--bs-border-radius-sm: .4rem;
|
||||
--bs-border-radius-lg: .85rem;
|
||||
--bs-border-radius-xl: 1rem;
|
||||
|
||||
--bs-body-font-family: 'DM Sans', system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
||||
|
||||
--jqc-ink: #0f172a;
|
||||
--jqc-heading: #374151;
|
||||
--jqc-muted: #64748b;
|
||||
--jqc-faint: #94a3b8;
|
||||
--jqc-border: #e2e8f0;
|
||||
--jqc-border-2: #cbd5e1;
|
||||
--jqc-surface: #f8fafc;
|
||||
--jqc-surface-2: #f1f5f9;
|
||||
--jqc-accent: #2563eb;
|
||||
--jqc-accent-700: #1d4ed8;
|
||||
--jqc-accent-50: #eff6ff;
|
||||
--jqc-navbar: #2563eb; /* bright blue top bar (matches the app accent) */
|
||||
--jqc-shadow: 0 1px 2px rgba(15, 23, 42, .06), 0 1px 3px rgba(15, 23, 42, .05);
|
||||
--jqc-shadow-md: 0 4px 24px rgba(15, 23, 42, .10);
|
||||
}
|
||||
|
||||
/* ── 2. Base typography ──────────────────────────────────────────────────── */
|
||||
body {
|
||||
font-family: var(--bs-body-font-family);
|
||||
background-color: var(--bs-body-bg);
|
||||
color: var(--jqc-ink);
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
h1, h2, h3, h4, h5, h6,
|
||||
.h1, .h2, .h3, .h4, .h5, .h6 {
|
||||
font-family: var(--bs-body-font-family);
|
||||
font-weight: 700;
|
||||
letter-spacing: -.01em;
|
||||
}
|
||||
.text-muted { color: var(--jqc-muted) !important; }
|
||||
a { text-underline-offset: 2px; }
|
||||
|
||||
/* ── 3. Navbar — bright blue chrome (app accent) ─────────────────────────── */
|
||||
.navbar.bg-primary {
|
||||
background-color: var(--jqc-navbar) !important;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, .08);
|
||||
box-shadow: 0 1px 3px rgba(15, 23, 42, .12);
|
||||
}
|
||||
.navbar .navbar-brand {
|
||||
font-weight: 700;
|
||||
letter-spacing: -.01em;
|
||||
}
|
||||
.navbar-dark .navbar-nav .nav-link {
|
||||
color: rgba(255, 255, 255, .85);
|
||||
border-radius: 6px;
|
||||
padding-inline: .7rem;
|
||||
transition: background-color .15s, color .15s;
|
||||
}
|
||||
.navbar-dark .navbar-nav .nav-link:hover {
|
||||
color: #fff;
|
||||
background-color: rgba(255, 255, 255, .10);
|
||||
}
|
||||
.navbar-dark .navbar-nav .nav-link.active {
|
||||
background-color: rgba(255, 255, 255, .20) !important;
|
||||
box-shadow: inset 0 -2px 0 rgba(255, 255, 255, .65) !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
/* ── 4. Cards ────────────────────────────────────────────────────────────── */
|
||||
.card {
|
||||
border: 1px solid var(--jqc-border);
|
||||
border-radius: var(--bs-border-radius-lg);
|
||||
box-shadow: var(--jqc-shadow);
|
||||
}
|
||||
.card.shadow-sm { box-shadow: var(--jqc-shadow) !important; }
|
||||
.card.shadow,
|
||||
.card.shadow-lg { box-shadow: var(--jqc-shadow-md) !important; }
|
||||
|
||||
.card-header {
|
||||
background-color: var(--jqc-surface);
|
||||
border-bottom: 1px solid var(--jqc-border);
|
||||
color: var(--jqc-heading);
|
||||
font-weight: 600;
|
||||
padding: .7rem 1rem;
|
||||
}
|
||||
.card-header.bg-light { background-color: var(--jqc-surface) !important; }
|
||||
.card-header.bg-white { background-color: #fff !important; }
|
||||
|
||||
/* Colored stat cards (dashboard) — flatten + soften corners */
|
||||
.card.text-white { border: none; }
|
||||
.card.text-white .text-white-50 { color: rgba(255, 255, 255, .72) !important; }
|
||||
|
||||
/* ── 5. Buttons ──────────────────────────────────────────────────────────── */
|
||||
.btn {
|
||||
font-weight: 500;
|
||||
border-radius: var(--bs-border-radius);
|
||||
--bs-btn-focus-box-shadow: 0 0 0 .2rem rgba(37, 99, 235, .25);
|
||||
}
|
||||
.btn-primary {
|
||||
--bs-btn-bg: var(--jqc-accent);
|
||||
--bs-btn-border-color: var(--jqc-accent);
|
||||
--bs-btn-hover-bg: var(--jqc-accent-700);
|
||||
--bs-btn-hover-border-color: var(--jqc-accent-700);
|
||||
--bs-btn-active-bg: var(--jqc-accent-700);
|
||||
--bs-btn-active-border-color: var(--jqc-accent-700);
|
||||
--bs-btn-disabled-bg: var(--jqc-accent);
|
||||
--bs-btn-disabled-border-color: var(--jqc-accent);
|
||||
}
|
||||
.btn-outline-primary {
|
||||
--bs-btn-color: var(--jqc-accent);
|
||||
--bs-btn-border-color: var(--jqc-accent);
|
||||
--bs-btn-hover-bg: var(--jqc-accent);
|
||||
--bs-btn-hover-border-color: var(--jqc-accent);
|
||||
--bs-btn-active-bg: var(--jqc-accent);
|
||||
--bs-btn-active-border-color: var(--jqc-accent);
|
||||
}
|
||||
.btn-success {
|
||||
--bs-btn-bg: var(--bs-success); --bs-btn-border-color: var(--bs-success);
|
||||
--bs-btn-hover-bg: #15803d; --bs-btn-hover-border-color: #15803d;
|
||||
--bs-btn-active-bg: #15803d; --bs-btn-active-border-color: #15803d;
|
||||
--bs-btn-disabled-bg: var(--bs-success); --bs-btn-disabled-border-color: var(--bs-success);
|
||||
}
|
||||
.btn-danger {
|
||||
--bs-btn-bg: var(--bs-danger); --bs-btn-border-color: var(--bs-danger);
|
||||
--bs-btn-hover-bg: #b91c1c; --bs-btn-hover-border-color: #b91c1c;
|
||||
--bs-btn-active-bg: #b91c1c; --bs-btn-active-border-color: #b91c1c;
|
||||
--bs-btn-disabled-bg: var(--bs-danger); --bs-btn-disabled-border-color: var(--bs-danger);
|
||||
}
|
||||
.btn-warning {
|
||||
--bs-btn-bg: var(--bs-warning); --bs-btn-border-color: var(--bs-warning);
|
||||
--bs-btn-color: #422006; --bs-btn-hover-color: #422006;
|
||||
--bs-btn-hover-bg: #d97706; --bs-btn-hover-border-color: #d97706;
|
||||
--bs-btn-active-bg: #d97706; --bs-btn-active-border-color: #d97706;
|
||||
}
|
||||
.btn-outline-secondary {
|
||||
--bs-btn-color: var(--jqc-muted);
|
||||
--bs-btn-border-color: var(--jqc-border-2);
|
||||
--bs-btn-hover-bg: var(--jqc-surface);
|
||||
--bs-btn-hover-color: var(--jqc-accent);
|
||||
--bs-btn-hover-border-color: var(--jqc-accent);
|
||||
--bs-btn-active-bg: var(--jqc-surface-2);
|
||||
--bs-btn-active-color: var(--jqc-ink);
|
||||
--bs-btn-active-border-color: var(--jqc-border-2);
|
||||
}
|
||||
.btn-link { --bs-btn-color: var(--jqc-accent); --bs-btn-hover-color: var(--jqc-accent-700); text-decoration: none; }
|
||||
|
||||
/* ── 6. Forms ────────────────────────────────────────────────────────────── */
|
||||
.form-label {
|
||||
color: var(--jqc-heading);
|
||||
font-weight: 500;
|
||||
margin-bottom: .35rem;
|
||||
}
|
||||
.form-control, .form-select {
|
||||
border-color: var(--jqc-border);
|
||||
color: var(--jqc-ink);
|
||||
border-radius: var(--bs-border-radius);
|
||||
}
|
||||
.form-control::placeholder { color: var(--jqc-faint); }
|
||||
.form-control:focus, .form-select:focus {
|
||||
border-color: var(--jqc-accent);
|
||||
box-shadow: 0 0 0 .2rem rgba(37, 99, 235, .18);
|
||||
}
|
||||
.input-group-text {
|
||||
background-color: var(--jqc-surface);
|
||||
border-color: var(--jqc-border);
|
||||
color: var(--jqc-muted);
|
||||
}
|
||||
.form-check-input:checked {
|
||||
background-color: var(--jqc-accent);
|
||||
border-color: var(--jqc-accent);
|
||||
}
|
||||
.form-check-input:focus {
|
||||
border-color: var(--jqc-accent);
|
||||
box-shadow: 0 0 0 .2rem rgba(37, 99, 235, .18);
|
||||
}
|
||||
|
||||
/* ── 7. Tables ───────────────────────────────────────────────────────────── */
|
||||
.table {
|
||||
--bs-table-color: var(--jqc-ink);
|
||||
--bs-table-border-color: var(--jqc-border);
|
||||
border-color: var(--jqc-border);
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.table > thead th,
|
||||
.table-light, .table-light > th, .table-light > td {
|
||||
background-color: var(--jqc-surface-2);
|
||||
color: var(--jqc-heading);
|
||||
font-weight: 600;
|
||||
border-bottom-color: var(--jqc-border);
|
||||
}
|
||||
.table > thead th {
|
||||
text-transform: none;
|
||||
font-size: .82rem;
|
||||
letter-spacing: .01em;
|
||||
padding-block: .6rem;
|
||||
}
|
||||
.table > tbody > tr { border-color: var(--jqc-border); }
|
||||
.table-hover > tbody > tr:hover > * {
|
||||
background-color: var(--jqc-surface);
|
||||
--bs-table-bg-state: var(--jqc-surface);
|
||||
}
|
||||
/* Cards that wrap a flush table: clip corners so the table follows the radius */
|
||||
.card > .table-responsive:last-child,
|
||||
.card > .card-body.p-0 > .table-responsive,
|
||||
.card > .card-body.p-0 > .table {
|
||||
border-bottom-left-radius: var(--bs-border-radius-lg);
|
||||
border-bottom-right-radius: var(--bs-border-radius-lg);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* ── 8. Badges ───────────────────────────────────────────────────────────── */
|
||||
.badge {
|
||||
font-weight: 600;
|
||||
letter-spacing: .01em;
|
||||
border-radius: .4rem;
|
||||
padding: .35em .6em;
|
||||
}
|
||||
|
||||
/* ── 9. Alerts ───────────────────────────────────────────────────────────── */
|
||||
.alert {
|
||||
border-radius: var(--bs-border-radius);
|
||||
border-width: 1px;
|
||||
}
|
||||
|
||||
/* ── 10. Dropdowns ───────────────────────────────────────────────────────── */
|
||||
.dropdown-menu {
|
||||
border: 1px solid var(--jqc-border);
|
||||
border-radius: var(--bs-border-radius);
|
||||
box-shadow: var(--jqc-shadow-md);
|
||||
padding: .35rem;
|
||||
--bs-dropdown-link-active-bg: var(--jqc-accent);
|
||||
}
|
||||
.dropdown-item {
|
||||
border-radius: var(--bs-border-radius-sm);
|
||||
padding: .45rem .7rem;
|
||||
color: var(--jqc-ink);
|
||||
}
|
||||
.dropdown-item:hover, .dropdown-item:focus {
|
||||
background-color: var(--jqc-surface);
|
||||
color: var(--jqc-accent);
|
||||
}
|
||||
.dropdown-divider { border-top-color: var(--jqc-border); }
|
||||
|
||||
/* ── 11. Misc components ─────────────────────────────────────────────────── */
|
||||
.page-link { color: var(--jqc-accent); }
|
||||
.page-item.active .page-link {
|
||||
background-color: var(--jqc-accent);
|
||||
border-color: var(--jqc-accent);
|
||||
}
|
||||
.nav-tabs .nav-link.active { color: var(--jqc-accent); }
|
||||
.list-group-item-action:hover { background-color: var(--jqc-surface); }
|
||||
.modal-content { border: 1px solid var(--jqc-border); border-radius: var(--bs-border-radius-lg); }
|
||||
.spinner-border.text-primary { color: var(--jqc-accent) !important; }
|
||||
hr { color: var(--jqc-border-2); }
|
||||
|
||||
/* Notification dropdown (base.html) — align accent + hover */
|
||||
.notif-item.unread { border-left-color: var(--jqc-accent) !important; background-color: var(--jqc-accent-50) !important; }
|
||||
.notif-item:hover { background-color: var(--jqc-surface) !important; }
|
||||
|
||||
/* ── 12. Focus visibility (accessibility) ────────────────────────────────── */
|
||||
:focus-visible { outline: 2px solid rgba(37, 99, 235, .45); outline-offset: 1px; }
|
||||
Reference in New Issue
Block a user