Een dating-app op basis van brieven, niet van gezichten!
Deze repository wordt als momentopname gepubliceerd: een clone bevat de volledige inhoud, maar geen commitgeschiedenis.
/* Globale basisstijlen. Kleuren spiegelen src/theme.js (BLUE = #3D63C9). */
* {
box-sizing: border-box;
}
html,
body {
margin: 0;
/* geen "rubber band" over de hele pagina op iOS; scrollen gebeurt in de shell */
overscroll-behavior-y: none;
}
button {
font-family: inherit;
cursor: pointer;
}
input,
textarea {
font-family: inherit;
}
input:focus-visible,
textarea:focus-visible,
button:focus-visible {
outline: 3px solid #3d63c9;
outline-offset: 2px;
}
/* Checkbox in de stijl van de chips en invoervelden: inktrand, aangevinkt = inkt met wit vinkje (INK = #1F2C55) */
input[type="checkbox"] {
appearance: none;
-webkit-appearance: none;
flex-shrink: 0;
width: 20px;
height: 20px;
margin: 0;
border: 2px solid #1f2c55;
border-radius: 0;
background: #fff;
cursor: pointer;
vertical-align: middle;
}
input[type="checkbox"]:checked {
background-color: #1f2c55;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3 8.5l3 3 7-7' fill='none' stroke='%23fff' stroke-width='2.4' stroke-linecap='square'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: center;
background-size: 14px;
}
input[type="checkbox"]:disabled {
cursor: default;
}
/* Laadscherm: envelop zweeft zachtjes */
@keyframes loading-float {
0%,
100% {
transform: translateY(0) rotate(-1.5deg);
}
50% {
transform: translateY(-8px) rotate(1.5deg);
}
}
.loading-envelope {
animation: loading-float 2.4s ease-in-out infinite;
filter: drop-shadow(0 6px 0 rgba(31, 44, 85, 0.12));
}
@media (prefers-reduced-motion: reduce) {
* {
transition: none !important;
animation: none !important;
}
}
/* ---------- Layout-shell (mobielvriendelijk) ----------
De shell is precies één schermhoogte hoog: kop en tabs staan vast, alleen de inhoud
(.app-main) scrolt — als een app, niet als een webpagina. 100dvh volgt de zichtbare
hoogte op telefoons (adresbalk in/uit); 100vh is de fallback. Safe-area-insets houden
de inhoud vrij van notch en home-indicator (viewport-fit=cover). */
.app-bg {
height: 100vh;
height: 100dvh;
}
.app-shell {
max-width: 480px;
margin: 0 auto;
height: 100vh;
height: 100dvh;
display: flex;
flex-direction: column;
overflow: hidden;
}
/* Notch/statusbalk vrijhouden — ónder de luchtpostrand, niet erboven: de rand loopt tot
aan de schermrand (ook achter de camera-notch), de inhoud begint pas onder de statusbalk.
De rand zelf (8px, AirmailEdge) telt mee als safe-area, dus die gaat van de inset af. */
.safe-top {
height: max(0px, calc(env(safe-area-inset-top, 0px) - 8px));
}
/* Alles in de shell (rand, kop, tabs) houdt zijn hoogte; alleen .app-main rekt en scrolt */
.app-shell > * {
flex-shrink: 0;
}
/* Het scrollende deel van elk scherm; onderaan blijft de home-indicator/navigatiebalk vrij.
Let op: zet in views geen inline `padding` (shorthand) — die overschrijft de safe-area.
Alleen paddingTop is veilig; een view met een eigen voet ónder het scrollvlak (ThreadView:
de tabbalk) zet paddingBottom en laat die voet de inset regelen. */
.app-main {
flex: 1 1 0;
min-height: 0;
overflow-y: auto;
overscroll-behavior-y: contain;
-webkit-overflow-scrolling: touch;
padding: 20px 20px calc(20px + env(safe-area-inset-bottom, 0px));
}
/* Dialogen (melden, privacy, inzage): sheet vanaf de onderkant, met ruimte voor de home-indicator */
.dialog-backdrop {
position: fixed;
inset: 0;
display: flex;
align-items: flex-end;
justify-content: center;
z-index: 50;
}
.dialog-sheet {
width: 100%;
max-width: 480px;
max-height: 92vh;
max-height: 92dvh;
overflow-y: auto;
padding-bottom: env(safe-area-inset-bottom, 0px);
}
/* ---------- Tablets ----------
De kolom mag breder. Niet op breedte alleen: een telefoon in landschap is óók breed, maar laag,
en daar helpt een bredere kolom niets — de regels worden lang terwijl de hoogte al krap is. Pas
als het scherm in béíde richtingen ruim is (tablet, uitgevouwen foldable) gaat hij naar 640px.
Breder wordt het niet: dan worden de regels van een brief te lang om prettig te lezen. Staat
ná .dialog-sheet, want een mediaquery telt niet mee in de specificiteit — bij gelijke
specificiteit wint de laatste regel. */
@media (min-width: 600px) and (min-height: 600px) {
.app-shell,
.dialog-sheet {
max-width: 640px;
}
/* Iets meer lucht langs de randen, in verhouding tot de bredere kolom */
.app-main {
padding: 28px 28px calc(28px + env(safe-area-inset-bottom, 0px));
}
}