Een dating-app op basis van brieven, niet van gezichten!

main

Deze repository wordt als momentopname gepubliceerd: een clone bevat de volledige inhoud, maar geen commitgeschiedenis.

4.5 kB Ruw bestand
/* 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));
  }
}