81d065b9bb
Universal: PR Check / Branch Policy (pull_request) Successful in 1s
Universal: PR Check / Validate PR (pull_request) Successful in 9s
Generic: Project CI / Lint & Validate (pull_request) Successful in 32s
Generic: Standards Compliance / Secret Scanning (push) Failing after 9s
Universal: PR Check / Secret Scan (pull_request) Successful in 51s
Generic: Standards Compliance / License Header Validation (push) Successful in 9s
Generic: Standards Compliance / Repository Structure Validation (push) Successful in 8s
Generic: Standards Compliance / Coding Standards Check (push) Successful in 10s
Generic: Standards Compliance / Workflow Configuration Check (push) Failing after 9s
Generic: Standards Compliance / Documentation Quality Check (push) Successful in 8s
Generic: Standards Compliance / README Completeness Check (push) Failing after 7s
Generic: Standards Compliance / Version Consistency Check (push) Successful in 1m2s
Generic: Standards Compliance / Script Integrity Validation (push) Successful in 26s
Generic: Standards Compliance / Git Repository Hygiene (push) Successful in 1m5s
Generic: Standards Compliance / File Naming Standards (push) Successful in 10s
Generic: Standards Compliance / Line Length Check (push) Successful in 23s
Generic: Standards Compliance / Insecure Code Pattern Detection (push) Successful in 10s
Generic: Standards Compliance / Code Complexity Analysis (push) Successful in 1m2s
Generic: Standards Compliance / Code Duplication Detection (push) Successful in 1m8s
Generic: Standards Compliance / Dead Code Detection (push) Successful in 16s
Generic: Standards Compliance / File Size Limits (push) Successful in 16s
Generic: Standards Compliance / TODO/FIXME Tracking (push) Successful in 14s
Generic: Standards Compliance / Dependency Vulnerability Scanning (push) Successful in 1m3s
Deploy (Prod) / Build & Deploy to Prod (push) Successful in 5m9s
Generic: Standards Compliance / Broken Link Detection (push) Successful in 12s
Generic: Standards Compliance / API Documentation Coverage (push) Successful in 7s
Generic: Standards Compliance / Accessibility Check (push) Successful in 7s
Generic: Standards Compliance / Performance Metrics (push) Successful in 8s
Generic: Standards Compliance / Binary File Detection (push) Successful in 2m12s
Generic: Standards Compliance / Unused Dependencies Check (push) Successful in 55s
Generic: Standards Compliance / Terraform Configuration Validation (push) Successful in 12s
Generic: Standards Compliance / Enterprise Readiness Check (push) Successful in 55s
Generic: Standards Compliance / Repository Health Check (push) Successful in 54s
Generic: Project CI / Tests (pull_request) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Universal: PR Check / Report Issues (pull_request) Has been cancelled
Generic: Standards Compliance / Compliance Summary (push) Has been cancelled
Comprehensive MokoGIT theme/branding built from the authoritative mokoconsulting.tech
design tokens (MokoOnyx *.custom.css):
- Theme: replace gitea themes entirely with theme-mokogit-{light,dark,auto} (default
mokogit-auto); brand tokens (primary #010156 / accent #3f8ff0, navy nav+footer #112855,
semantic palette); mokogit-brand.css component reskin; runtime custom-stylesheet override
hook (templates/custom/header.tmpl -> mokogit-custom.css, re-skin live with no rebuild).
- Font Awesome 7 Free 7.1.0: vendored unmodified (CSS headers intact + webfonts + verbatim
LICENSE.txt), license-compliant for distribution/white-label (Icons CC BY 4.0, Fonts SIL
OFL 1.1, Code MIT); attributed in THIRD-PARTY-NOTICES.md, README, and wiki.
- Light/dark toggle: navbar sun/moon control, server-persisted via the existing
/user/settings/appearance/theme endpoint (anonymous falls back to localStorage).
- Accessibility menu: 6 options (text resize, color invert, high contrast, link highlight,
readable font, pause animations); localStorage-persisted, applied on <html>, ARIA/keyboard.
- PWA: service worker (network-first navigation + cached offline fallback) + branded offline
page + enhanced manifest (display standalone, navy theme_color, app shortcuts); manifest
icon sourced from the site-admin branding icon if set, else the bundled MokoGIT logo.
Verified: `go build ./...` and `vite build` both green; only mokogit themes emit.
141 lines
3.6 KiB
CSS
141 lines
3.6 KiB
CSS
/* MokoGIT accessibility menu — panel UI + the effect classes toggled on <html>.
|
|
Ported from the mokoconsulting.tech / MokoOnyx accessibility widget. */
|
|
|
|
/* ---- navbar toggle button ---- */
|
|
.mokogit-a11y-toggle,
|
|
.mokogit-theme-toggle {
|
|
background: none;
|
|
border: none;
|
|
cursor: pointer;
|
|
color: inherit;
|
|
}
|
|
|
|
/* theme toggle: show sun in dark mode (click -> go light), moon in light mode */
|
|
.mokogit-theme-toggle .fa-moon { display: inline-block; }
|
|
.mokogit-theme-toggle .fa-sun { display: none; }
|
|
.mokogit-theme-toggle.is-dark .fa-moon { display: none; }
|
|
.mokogit-theme-toggle.is-dark .fa-sun { display: inline-block; }
|
|
|
|
/* ---- panel ---- */
|
|
.a11y-panel {
|
|
position: fixed;
|
|
z-index: 1000;
|
|
min-width: 260px;
|
|
max-width: 320px;
|
|
padding: 12px;
|
|
background: var(--color-body);
|
|
color: var(--color-text);
|
|
border: 1px solid var(--color-secondary);
|
|
border-radius: var(--border-radius, 4px);
|
|
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
|
|
}
|
|
|
|
.a11y-panel-title {
|
|
font-weight: 600;
|
|
margin-bottom: 8px;
|
|
padding-bottom: 8px;
|
|
border-bottom: 1px solid var(--color-secondary);
|
|
}
|
|
|
|
.a11y-row {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 8px;
|
|
padding: 6px 0;
|
|
}
|
|
|
|
.a11y-row-label { font-size: 0.95em; }
|
|
|
|
.a11y-size-controls { display: flex; align-items: center; gap: 4px; }
|
|
|
|
.a11y-size-btn {
|
|
min-width: 28px;
|
|
height: 28px;
|
|
padding: 0 8px;
|
|
border: 1px solid var(--color-secondary);
|
|
border-radius: var(--border-radius, 4px);
|
|
background: var(--color-secondary-bg, var(--color-box-body));
|
|
color: inherit;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.a11y-size-value { min-width: 44px; text-align: center; font-variant-numeric: tabular-nums; }
|
|
|
|
/* toggle switch */
|
|
.a11y-switch {
|
|
position: relative;
|
|
width: 40px;
|
|
height: 22px;
|
|
border-radius: 11px;
|
|
border: 1px solid var(--color-secondary);
|
|
background: var(--color-secondary);
|
|
cursor: pointer;
|
|
transition: background 0.15s ease;
|
|
flex: 0 0 auto;
|
|
}
|
|
.a11y-switch::after {
|
|
content: "";
|
|
position: absolute;
|
|
top: 2px;
|
|
left: 2px;
|
|
width: 16px;
|
|
height: 16px;
|
|
border-radius: 50%;
|
|
background: #fff;
|
|
transition: transform 0.15s ease;
|
|
}
|
|
.a11y-switch.is-on { background: var(--color-primary); border-color: var(--color-primary); }
|
|
.a11y-switch.is-on::after { transform: translateX(18px); }
|
|
|
|
.a11y-reset-all {
|
|
margin-top: 10px;
|
|
width: 100%;
|
|
padding: 6px 10px;
|
|
border: 1px solid var(--color-secondary);
|
|
border-radius: var(--border-radius, 4px);
|
|
background: var(--color-secondary-bg, var(--color-box-body));
|
|
color: inherit;
|
|
cursor: pointer;
|
|
}
|
|
|
|
/* ==== effect classes toggled on <html> ==== */
|
|
|
|
/* invert colors (keep media upright) */
|
|
html.a11y-inverted { filter: invert(1) hue-rotate(180deg); }
|
|
html.a11y-inverted img,
|
|
html.a11y-inverted video,
|
|
html.a11y-inverted picture,
|
|
html.a11y-inverted canvas,
|
|
html.a11y-inverted [style*="background-image"] { filter: invert(1) hue-rotate(180deg); }
|
|
|
|
/* high contrast */
|
|
html.a11y-high-contrast { filter: contrast(1.3); }
|
|
html.a11y-high-contrast a { text-decoration: underline; }
|
|
|
|
/* highlight links */
|
|
html.a11y-highlight-links a {
|
|
text-decoration: underline !important;
|
|
outline: 1px solid currentcolor;
|
|
outline-offset: 1px;
|
|
background: rgba(255, 235, 59, 0.25);
|
|
}
|
|
|
|
/* readable font */
|
|
html.a11y-readable-font,
|
|
html.a11y-readable-font * {
|
|
font-family: Verdana, Tahoma, "Segoe UI", Arial, sans-serif !important;
|
|
letter-spacing: 0.02em;
|
|
line-height: 1.7;
|
|
}
|
|
|
|
/* pause animations */
|
|
html.a11y-pause-animations *,
|
|
html.a11y-pause-animations *::before,
|
|
html.a11y-pause-animations *::after {
|
|
animation-duration: 0s !important;
|
|
animation-iteration-count: 1 !important;
|
|
transition-duration: 0s !important;
|
|
scroll-behavior: auto !important;
|
|
}
|