Files
xamxam/app/public/assets/css/common.css
Pontoporeia 7ccadbb224 refactor public search bar
- one big input with positioned magnifying glass icon
- fix search input left padding to prevent placeholder overlapping magnifying glass
- add !important to search input styles to override base form element rules
- reduce search input vertical padding
- bump search input vertical padding to space-2xs
2026-05-19 00:08:05 +02:00

706 lines
17 KiB
CSS
Raw 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.
@import url("./variables.css");
*,
*::before,
*::after {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
height: 100%;
overflow: hidden;
}
body {
font-family: var(--font-body);
background: var(--bg-primary);
color: var(--text-primary);
background: linear-gradient(
180deg,
rgba(0, 0, 0, 0) 92%,
rgba(149, 87, 181, 1) 100%
);
display: flex;
flex-direction: column;
}
a {
color: inherit;
text-decoration: none;
}
a:hover {
text-decoration: none;
}
header {
vertical-align: center;
flex-shrink: 0;
background: linear-gradient(
180deg,
var(--gradient-1) 0%,
var(--gradient-2) 33%,
var(--gradient-3) 66%,
var(--gradient-4) 100%
);
.nav-logo {
text-decoration: none;
font-size: var(--step--1);
}
.nav-left {
display: flex;
align-items: center;
gap: var(--space-l);
}
.nav-left-links,
.nav-right-links {
display: flex;
gap: var(--space-l);
align-items: center;
list-style: none;
margin: 0;
padding: 0;
}
nav {
padding: var(--space-s) var(--space-s);
display: flex;
align-items: center;
justify-content: space-between;
font-size: var(--step-0);
a {
font-family: var(--font-display);
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--accent-foreground);
text-decoration: none;
padding: var(--space-3xs) var(--space-xs);
border-radius: var(--radius);
text-shadow:
0 0 16px var(--header-shadow-strong),
0 0 32px var(--header-shadow-soft);
}
ul {
display: flex;
gap: var(--space-l);
align-items: center;
list-style: none;
margin: 0;
padding: 0;
}
ul a {
transition: opacity 0.15s;
}
ul a:hover {
opacity: 1;
}
}
ul a[aria-current="page"] {
opacity: 1;
border-bottom: 1px solid var(--header-nav-active-border);
padding-bottom: 1px;
}
/* nav-top-row: transparent wrapper at desktop — children become
direct flex items of nav, preserving the existing layout */
.nav-top-row {
display: contents;
}
/* nav-mobile-links: mobile-only dropdown, hidden at desktop */
.nav-mobile-links {
display: none; /* overridden to block inside the mobile media query */
}
}
/* ============================================================
HAMBURGER MENU — public nav (pure CSS, checkbox trick)
DOM order inside <header> (public only):
input.menu-btn ← off-screen checkbox
nav
div.nav-top-row ← always-visible row (logo + burger)
div.nav-left ← logo + desktop link list
ul.nav-right-links ← desktop right links
label.menu-icon ← burger icon trigger
ul.nav-mobile-links ← full dropdown (hidden by default)
At desktop: .menu-icon and .nav-mobile-links are display:none.
.nav-top-row is display:contents so its children
participate directly in navs flex row.
At mobile: nav becomes a flex column. .nav-top-row is a real
flex row (logo | burger). .nav-mobile-links expands
via max-height on checkbox:checked.
============================================================ */
/* Off-screen checkbox — triggered by its label */
.menu-btn {
position: absolute;
top: -9999px;
left: -9999px;
}
/* Burger label — takes no space at desktop */
.menu-icon {
display: none;
cursor: pointer;
padding: var(--space-2xs) var(--space-s);
align-items: center;
justify-content: center;
}
/* Middle bar of the burger icon */
.navicon {
background: var(--accent-foreground);
display: block;
height: 2px;
width: 24px;
position: relative;
transition: all 0.3s ease-out;
}
/* Top and bottom bars */
.navicon::before,
.navicon::after {
content: "";
background: var(--accent-foreground);
display: block;
height: 2px;
width: 100%;
position: absolute;
transition: all 0.3s ease-out;
}
.navicon::before {
top: -7px;
}
.navicon::after {
bottom: -7px;
}
/* ---- Mobile ---- */
@media screen and (max-width: 640px) {
/* Nav becomes a flex column: top-row on row 1, dropdown on row 2 */
header nav[aria-label="Navigation principale"] {
display: flex;
flex-direction: column;
align-items: stretch;
padding: 0;
}
/* Top row: logo left, hamburger right */
header nav[aria-label="Navigation principale"] .nav-top-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--space-s);
}
/* Hide desktop link lists inside the top row */
header nav[aria-label="Navigation principale"] .nav-left-links,
header nav[aria-label="Navigation principale"] .nav-right-links {
display: none;
}
/* Reveal the hamburger icon */
.menu-icon {
display: flex;
}
/* Dropdown: shown as block but clipped to zero height by default */
header nav[aria-label="Navigation principale"] .nav-mobile-links {
display: block; /* override the desktop display:none */
list-style: none;
margin: 0;
padding: 0;
max-height: 0;
overflow: hidden;
transition: max-height 0.2s ease-out;
}
/* ---- Open state ---- */
.menu-btn:checked
~ nav[aria-label="Navigation principale"]
.nav-mobile-links {
max-height: 300px;
}
/* Dropdown link rows */
header nav[aria-label="Navigation principale"] .nav-mobile-links li {
border-top: 1px solid var(--header-nav-active-border);
text-align: left;
}
header nav[aria-label="Navigation principale"] .nav-mobile-links li a {
display: block;
width: 100%;
padding: var(--space-s) var(--space-s);
text-align: left;
}
/* ---- Animate burger → X ---- */
.menu-btn:checked
~ nav[aria-label="Navigation principale"]
.menu-icon
.navicon {
background: transparent;
}
.menu-btn:checked
~ nav[aria-label="Navigation principale"]
.menu-icon
.navicon::before {
transform: rotate(-45deg);
top: 0;
}
.menu-btn:checked
~ nav[aria-label="Navigation principale"]
.menu-icon
.navicon::after {
transform: rotate(45deg);
bottom: 0;
}
}
main {
flex: 1;
min-height: 0;
overflow-wrap: anywhere;
}
main * {
overflow-wrap: anywhere;
word-break: break-word;
}
/* ============================================================
HEADINGS — global scale, shared by admin + public pages
All headings use the same font size (slightly smaller than
the previous h1). Individual page overrides for size have
been removed so everything inherits from here.
============================================================ */
:where(h1, h2, h3, h4, h5, h6) {
font-family: var(--font-display);
font-size: var(--step-2);
font-weight: 400;
margin: 0 0 var(--space-l) 0;
line-height: 1.15;
}
/* ============================================================
SEARCH BAR (shared)
============================================================ */
.header-search-wrap {
padding: 0 0;
flex-shrink: 0;
background-color: var(--gradient-4);
background: linear-gradient(180deg, var(--gradient-4) 0%, #ffffffee 100%);
}
.header-search-form {
width: 100%;
}
.header-search-input-wrap {
position: relative;
display: flex;
align-items: center;
}
.header-search-icon {
position: absolute;
left: var(--space-s);
width: 18px;
height: 18px;
stroke: var(--accent-primary);
pointer-events: none;
}
.header-search-input-wrap input {
width: 100%;
padding: var(--space-2xs) var(--space-s) !important;
padding-left: calc(18px + var(--space-l)) !important;
border: 1px solid var(--accent-primary) !important;
border-radius: var(--radius) !important;
background: var(--bg-primary) !important;
font-size: var(--step-0) !important;
color: var(--text-primary) !important;
font-family: inherit !important;
}
.header-search-input-wrap input::placeholder {
color: var(--accent-primary) !important;
}
/* ============================================================
ACCESSIBILITY UTILITIES
============================================================ */
/* Visually-hidden but screen-reader-accessible */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
/* Skip-to-content link (visible only on keyboard focus) */
.skip-link {
position: absolute;
top: -999px;
left: 1rem;
z-index: 9999;
padding: var(--space-2xs) var(--space-s);
background: var(--accent-primary);
color: var(--text-primary);
font-size: var(--step--1);
font-weight: 600;
text-decoration: none;
border-radius: 0 0 4px 4px;
}
.skip-link:focus {
top: 0;
}
/* Consistent keyboard-focus ring for all interactive elements */
:focus-visible {
outline: none;
box-shadow: 0 0 0 2px var(--accent-primary);
}
/* Respect user motion preferences */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
transition-duration: 0.01ms !important;
animation-duration: 0.01ms !important;
}
}
/* ============================================================
FORM ELEMENTS — base input / select / textarea / button
============================================================ */
label {
display: block;
margin-bottom: var(--space-3xs);
}
input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="hidden"]):not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="color"]),
select,
textarea {
font-family: inherit;
font-size: var(--step--1);
padding: var(--space-2xs) var(--space-xs);
border: 1px solid var(--border-primary);
border-radius: var(--radius);
background: transparent;
color: var(--text-primary);
transition: border-color 0.15s;
}
input:not([type="checkbox"]):not([type="radio"]):not([type="file"]):not([type="hidden"]):not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="color"]):focus,
select:focus,
textarea:focus {
outline: none;
border: 2px solid var(--accent-primary);
}
input::placeholder,
textarea::placeholder {
color: var(--text-tertiary);
font-size: var(--step--1);
}
textarea {
resize: vertical;
min-height: 80px;
line-height: 1.5;
}
select {
cursor: pointer;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23999' stroke-width='1.5' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 0.5rem center;
padding-right: 1.5rem;
-webkit-appearance: none;
appearance: none;
}
/* ============================================================
BUTTONS — shared .btn base class
Targets both <a> and <button>, always has a background.
border-radius: var(--radius); padding: var(--space-xs)
============================================================ */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--space-3xs);
padding: var(--space-xs);
border-radius: var(--radius);
font-size: var(--step--1);
font-family: inherit;
font-weight: 500;
letter-spacing: 0.04em;
cursor: pointer;
text-decoration: none;
line-height: 1.3;
border: none;
transition:
background 0.15s,
opacity 0.15s,
box-shadow 0.15s,
filter 0.15s;
width: fit-content;
}
.btn:hover {
filter: brightness(0.92);
}
/* Primary: accent background, white text */
.btn--primary {
background: var(--accent-primary);
color: var(--accent-foreground);
border: 1px solid transparent;
}
.btn--primary:hover {
background: var(--accent-secondary);
filter: none;
}
/* Secondary: light background with border */
.btn--secondary {
background: var(--bg-primary);
color: var(--text-secondary);
border: 1px solid var(--border-primary);
}
.btn--secondary:hover {
border-color: var(--text-secondary);
color: var(--text-primary);
filter: none;
}
/* Muted secondary: bg-secondary background */
.btn--muted {
background: var(--bg-secondary);
color: var(--text-secondary);
border: 1px solid var(--border-primary);
}
.btn--muted:hover {
background: var(--bg-tertiary);
color: var(--text-primary);
filter: none;
}
/* Ghost: transparent bg, border, for links styled as buttons */
.btn--ghost {
background: transparent;
color: var(--text-secondary);
border: 1px solid var(--border-primary);
}
.btn--ghost:hover {
border-color: var(--text-secondary);
color: var(--text-primary);
filter: none;
}
/* Danger: red background */
.btn--danger {
background: var(--accent-red);
color: var(--accent-foreground);
}
.btn--danger:hover {
filter: brightness(0.9);
}
/* Warning: yellow background */
.btn--warning {
background: var(--accent-yellow);
color: var(--text-primary);
}
.btn--warning:hover {
filter: brightness(0.9);
}
/* Success: green background */
.btn--success {
background: var(--accent-green);
color: var(--accent-foreground);
}
.btn--success:hover {
filter: brightness(0.9);
}
/* Small size modifier */
.btn--sm {
padding: var(--space-2xs) var(--space-xs);
font-size: var(--step--2);
}
/* Large size modifier */
.btn--lg {
padding: var(--space-s) var(--space-m);
font-size: var(--step-0);
}
/* Semantic colour modifiers on the muted base (for table/action buttons) */
.btn--blue {
background: var(--blue-muted-bg);
color: var(--accent-blue);
border: 1px solid var(--blue-muted-border);
}
.btn--blue:hover {
background: var(--blue-muted-bg-hover);
filter: none;
}
.btn--yellow {
background: var(--yellow-muted-bg);
color: var(--accent-yellow);
border: 1px solid var(--yellow-muted-border);
}
.btn--yellow:hover {
background: var(--yellow-muted-bg-hover);
filter: none;
}
.btn--green {
background: var(--green-muted-bg);
color: var(--accent-green);
border: 1px solid var(--green-muted-border);
}
.btn--green:hover {
background: var(--green-muted-bg-hover);
filter: none;
}
.btn--red {
background: var(--error-muted-bg);
color: var(--error);
border: 1px solid var(--danger-border-muted);
}
.btn--red:hover {
filter: brightness(0.9);
}
/* ============================================================
SEMANTIC HTML ELEMENTS — baseline styling shared everywhere
============================================================ */
fieldset {
/*background: var(--bg-secondary);*/
border: 1px solid var(--border-primary);
border-radius: var(--radius);
padding: var(--space-m);
margin: 0;
}
fieldset > *:not(:last-child) {
margin-bottom: var(--space-xs);
}
legend {
font-size: var(--step--1);
font-weight: 600;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--text-secondary);
padding: 0 var(--space-2xs);
}
small {
font-size: var(--step--2);
color: var(--text-secondary);
display: block;
margin-top: var(--space-3xs);
}
table {
width: 100%;
border-collapse: collapse;
font-size: var(--step--1);
}
th {
text-align: left;
font-size: var(--step--2);
letter-spacing: 0.08em;
text-transform: uppercase;
padding: var(--space-3xs) var(--space-xs);
border-bottom: 1px solid var(--border-primary);
color: var(--text-secondary);
font-weight: 400;
white-space: nowrap;
}
td {
padding: var(--space-2xs) var(--space-xs);
border-bottom: 1px solid var(--border-primary);
vertical-align: top;
}
dialog {
border: 1px solid var(--border-primary);
border-radius: var(--radius);
background: var(--bg-primary);
color: var(--text-primary);
padding: 0;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18);
}
dialog::backdrop {
background: rgba(0, 0, 0, 0.45);
}
details > summary {
cursor: pointer;
list-style: none;
}
details > summary::-webkit-details-marker {
display: none;
}
:where(video, audio, iframe) {
border: 1px solid var(--bg-primary);
border-radius: 15px;
}
audio::-webkit-media-controls-enclosure {
border-radius: var(--radius);
}