/* Site-wide styles. Sections: navbar icons / logo / timeline / blog tags,
   then page-specific sections (home, blog, projects, publications). */

/* Navbar icons for Google Scholar and ResearchGate (Simple Icons, CC0).
   Drawn as masks so they follow the text/link color in both themes. */
.nav-ico {
  display: inline-block;
  width: 1.1em;
  height: 1.1em;
  vertical-align: -0.15em;
  background-color: currentColor;
  -webkit-mask: var(--ico) center / contain no-repeat;
          mask: var(--ico) center / contain no-repeat;
}
.nav-scholar  { --ico: url("icons/googlescholar.svg"); }
.nav-rgate    { --ico: url("icons/researchgate.svg"); }

/* Site logo ("Tract") next to the site title. The stroke is a mask so it follows the
   navbar text colour in both themes; the coral dot follows the link colour. */
.navbar-brand {
  --logo: 1.7rem;
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: .55rem;
}
.navbar-brand::before {
  content: "";
  flex: none;
  width: var(--logo);
  height: var(--logo);
  background-color: var(--bs-navbar-brand-color);   /* fixed: does not change on hover, so the dot stays visible on it */
  -webkit-mask: url("logo-stroke.svg") center / contain no-repeat;
          mask: url("logo-stroke.svg") center / contain no-repeat;
}
.navbar-brand::after {
  content: "";
  position: absolute;
  left: 0;
  top: calc(50% - var(--logo) / 2);          /* origin = top-left corner of the logo box */
  width: calc(var(--logo) * 7.2 / 48);
  height: calc(var(--logo) * 7.2 / 48);
  border-radius: 50%;
  background-color: var(--bs-primary);
  /* resting position: just past the lower end of the line */
  transform: translate(calc(var(--logo) * 33.4 / 48), calc(var(--logo) * 32.4 / 48));
}

/* Hover: the dot travels through the line, sways, drops out at the lower end and bursts into
   three small rays (the rays are the three <i> elements in the navbar title, see _quarto.yml).
   Keyframes use the logo box as their coordinate system (48 units = --logo). */
.navbar-brand .tract-rays i {
  position: absolute;
  left: 0;
  top: calc(50% - var(--logo) / 2);
  width: calc(var(--logo) * 3.2 / 48);
  height: calc(var(--logo) * 1.5 / 48);
  margin: calc(var(--logo) * -.75 / 48) 0 0 calc(var(--logo) * -1.6 / 48);
  border-radius: 999px;
  background-color: var(--bs-primary);
  opacity: 0;
  pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
  .navbar-brand:is(:hover, :focus-visible)::after { animation: tract-dot 3.8s linear infinite; }
  .navbar-brand:is(:hover, :focus-visible) .tract-rays i { animation: tract-ray 3.8s linear infinite; }
}
@keyframes tract-dot {
  0.00% { transform: translate(calc(var(--logo) * 6.400 / 48), calc(var(--logo) * 8.400 / 48)) scale(0.000,0.000); opacity: 1; }
  4.00% { transform: translate(calc(var(--logo) * 6.400 / 48), calc(var(--logo) * 8.400 / 48)) scale(1.000,1.000); opacity: 1; }
  4.62% { transform: translate(calc(var(--logo) * 7.307 / 48), calc(var(--logo) * 8.579 / 48)) scale(1.015,1.015); opacity: 1; }
  5.24% { transform: translate(calc(var(--logo) * 8.214 / 48), calc(var(--logo) * 8.977 / 48)) scale(1.011,1.011); opacity: 1; }
  5.86% { transform: translate(calc(var(--logo) * 9.121 / 48), calc(var(--logo) * 9.258 / 48)) scale(0.982,0.982); opacity: 1; }
  6.48% { transform: translate(calc(var(--logo) * 10.028 / 48), calc(var(--logo) * 9.092 / 48)) scale(0.940,0.940); opacity: 1; }
  7.10% { transform: translate(calc(var(--logo) * 10.935 / 48), calc(var(--logo) * 8.363 / 48)) scale(0.909,0.909); opacity: 1; }
  7.72% { transform: translate(calc(var(--logo) * 11.842 / 48), calc(var(--logo) * 7.291 / 48)) scale(0.914,0.914); opacity: 1; }
  8.34% { transform: translate(calc(var(--logo) * 12.749 / 48), calc(var(--logo) * 6.478 / 48)) scale(0.967,0.967); opacity: 1; }
  8.96% { transform: translate(calc(var(--logo) * 13.656 / 48), calc(var(--logo) * 6.523 / 48)) scale(1.042,1.042); opacity: 1; }
  9.58% { transform: translate(calc(var(--logo) * 14.563 / 48), calc(var(--logo) * 7.297 / 48)) scale(1.100,1.100); opacity: 1; }
  10.20% { transform: translate(calc(var(--logo) * 15.470 / 48), calc(var(--logo) * 8.498 / 48)) scale(1.120,1.120); opacity: 1; }
  10.82% { transform: translate(calc(var(--logo) * 16.377 / 48), calc(var(--logo) * 9.661 / 48)) scale(1.093,1.093); opacity: 1; }
  11.44% { transform: translate(calc(var(--logo) * 17.284 / 48), calc(var(--logo) * 10.335 / 48)) scale(1.030,1.030); opacity: 1; }
  12.06% { transform: translate(calc(var(--logo) * 18.191 / 48), calc(var(--logo) * 10.259 / 48)) scale(0.956,0.956); opacity: 1; }
  12.68% { transform: translate(calc(var(--logo) * 19.098 / 48), calc(var(--logo) * 9.462 / 48)) scale(0.898,0.898); opacity: 1; }
  13.30% { transform: translate(calc(var(--logo) * 20.005 / 48), calc(var(--logo) * 8.254 / 48)) scale(0.880,0.880); opacity: 1; }
  13.92% { transform: translate(calc(var(--logo) * 20.912 / 48), calc(var(--logo) * 7.102 / 48)) scale(0.909,0.909); opacity: 1; }
  14.54% { transform: translate(calc(var(--logo) * 21.819 / 48), calc(var(--logo) * 6.453 / 48)) scale(0.973,0.973); opacity: 1; }
  15.16% { transform: translate(calc(var(--logo) * 22.726 / 48), calc(var(--logo) * 6.559 / 48)) scale(1.047,1.047); opacity: 1; }
  15.78% { transform: translate(calc(var(--logo) * 23.633 / 48), calc(var(--logo) * 7.379 / 48)) scale(1.103,1.103); opacity: 1; }
  16.40% { transform: translate(calc(var(--logo) * 24.540 / 48), calc(var(--logo) * 8.595 / 48)) scale(1.119,1.119); opacity: 1; }
  17.02% { transform: translate(calc(var(--logo) * 25.447 / 48), calc(var(--logo) * 9.735 / 48)) scale(1.089,1.089); opacity: 1; }
  17.64% { transform: translate(calc(var(--logo) * 26.354 / 48), calc(var(--logo) * 10.357 / 48)) scale(1.025,1.025); opacity: 1; }
  18.26% { transform: translate(calc(var(--logo) * 27.261 / 48), calc(var(--logo) * 10.221 / 48)) scale(0.950,0.950); opacity: 1; }
  18.88% { transform: translate(calc(var(--logo) * 28.168 / 48), calc(var(--logo) * 9.378 / 48)) scale(0.895,0.895); opacity: 1; }
  19.50% { transform: translate(calc(var(--logo) * 29.101 / 48), calc(var(--logo) * 8.196 / 48)) scale(0.881,0.881); opacity: 1; }
  20.12% { transform: translate(calc(var(--logo) * 30.321 / 48), calc(var(--logo) * 7.284 / 48)) scale(0.913,0.913); opacity: 1; }
  20.74% { transform: translate(calc(var(--logo) * 31.611 / 48), calc(var(--logo) * 7.109 / 48)) scale(0.978,0.978); opacity: 1; }
  21.36% { transform: translate(calc(var(--logo) * 32.583 / 48), calc(var(--logo) * 7.816 / 48)) scale(1.052,1.052); opacity: 1; }
  21.98% { transform: translate(calc(var(--logo) * 32.958 / 48), calc(var(--logo) * 9.173 / 48)) scale(1.106,1.106); opacity: 1; }
  22.60% { transform: translate(calc(var(--logo) * 32.757 / 48), calc(var(--logo) * 10.712 / 48)) scale(1.119,1.119); opacity: 1; }
  23.22% { transform: translate(calc(var(--logo) * 32.313 / 48), calc(var(--logo) * 11.994 / 48)) scale(1.085,1.085); opacity: 1; }
  23.84% { transform: translate(calc(var(--logo) * 32.107 / 48), calc(var(--logo) * 12.832 / 48)) scale(1.019,1.019); opacity: 1; }
  24.46% { transform: translate(calc(var(--logo) * 32.491 / 48), calc(var(--logo) * 13.360 / 48)) scale(0.945,0.945); opacity: 1; }
  25.08% { transform: translate(calc(var(--logo) * 33.483 / 48), calc(var(--logo) * 13.901 / 48)) scale(0.893,0.893); opacity: 1; }
  25.70% { transform: translate(calc(var(--logo) * 34.731 / 48), calc(var(--logo) * 14.738 / 48)) scale(0.882,0.882); opacity: 1; }
  26.32% { transform: translate(calc(var(--logo) * 35.685 / 48), calc(var(--logo) * 15.911 / 48)) scale(0.917,0.917); opacity: 1; }
  26.94% { transform: translate(calc(var(--logo) * 35.883 / 48), calc(var(--logo) * 17.179 / 48)) scale(0.984,0.984); opacity: 1; }
  27.56% { transform: translate(calc(var(--logo) * 35.181 / 48), calc(var(--logo) * 18.164 / 48)) scale(1.057,1.057); opacity: 1; }
  28.18% { transform: translate(calc(var(--logo) * 33.819 / 48), calc(var(--logo) * 18.588 / 48)) scale(1.109,1.109); opacity: 1; }
  28.80% { transform: translate(calc(var(--logo) * 32.273 / 48), calc(var(--logo) * 18.461 / 48)) scale(1.118,1.118); opacity: 1; }
  29.42% { transform: translate(calc(var(--logo) * 30.995 / 48), calc(var(--logo) * 18.109 / 48)) scale(1.081,1.081); opacity: 1; }
  30.04% { transform: translate(calc(var(--logo) * 30.179 / 48), calc(var(--logo) * 17.996 / 48)) scale(1.013,1.013); opacity: 1; }
  30.66% { transform: translate(calc(var(--logo) * 29.695 / 48), calc(var(--logo) * 18.467 / 48)) scale(0.940,0.940); opacity: 1; }
  31.28% { transform: translate(calc(var(--logo) * 29.212 / 48), calc(var(--logo) * 19.532 / 48)) scale(0.890,0.890); opacity: 1; }
  31.90% { transform: translate(calc(var(--logo) * 28.438 / 48), calc(var(--logo) * 20.836 / 48)) scale(0.883,0.883); opacity: 1; }
  32.52% { transform: translate(calc(var(--logo) * 27.528 / 48), calc(var(--logo) * 21.906 / 48)) scale(0.921,0.921); opacity: 1; }
  33.14% { transform: translate(calc(var(--logo) * 26.621 / 48), calc(var(--logo) * 22.393 / 48)) scale(0.990,0.990); opacity: 1; }
  33.76% { transform: translate(calc(var(--logo) * 25.714 / 48), calc(var(--logo) * 22.107 / 48)) scale(1.063,1.063); opacity: 1; }
  34.38% { transform: translate(calc(var(--logo) * 24.807 / 48), calc(var(--logo) * 21.159 / 48)) scale(1.111,1.111); opacity: 1; }
  35.00% { transform: translate(calc(var(--logo) * 23.900 / 48), calc(var(--logo) * 19.917 / 48)) scale(1.116,1.116); opacity: 1; }
  35.62% { transform: translate(calc(var(--logo) * 22.993 / 48), calc(var(--logo) * 18.862 / 48)) scale(1.077,1.077); opacity: 1; }
  36.24% { transform: translate(calc(var(--logo) * 22.086 / 48), calc(var(--logo) * 18.404 / 48)) scale(1.007,1.007); opacity: 1; }
  36.86% { transform: translate(calc(var(--logo) * 21.179 / 48), calc(var(--logo) * 18.719 / 48)) scale(0.935,0.935); opacity: 1; }
  37.48% { transform: translate(calc(var(--logo) * 20.272 / 48), calc(var(--logo) * 19.687 / 48)) scale(0.888,0.888); opacity: 1; }
  38.10% { transform: translate(calc(var(--logo) * 19.365 / 48), calc(var(--logo) * 20.930 / 48)) scale(0.884,0.884); opacity: 1; }
  38.72% { transform: translate(calc(var(--logo) * 18.458 / 48), calc(var(--logo) * 21.969 / 48)) scale(0.926,0.926); opacity: 1; }
  39.34% { transform: translate(calc(var(--logo) * 17.551 / 48), calc(var(--logo) * 22.399 / 48)) scale(0.996,0.996); opacity: 1; }
  39.96% { transform: translate(calc(var(--logo) * 16.644 / 48), calc(var(--logo) * 22.054 / 48)) scale(1.067,1.067); opacity: 1; }
  40.58% { transform: translate(calc(var(--logo) * 15.737 / 48), calc(var(--logo) * 21.068 / 48)) scale(1.113,1.113); opacity: 1; }
  41.20% { transform: translate(calc(var(--logo) * 14.830 / 48), calc(var(--logo) * 19.823 / 48)) scale(1.115,1.115); opacity: 1; }
  41.82% { transform: translate(calc(var(--logo) * 13.923 / 48), calc(var(--logo) * 18.802 / 48)) scale(1.072,1.072); opacity: 1; }
  42.44% { transform: translate(calc(var(--logo) * 13.016 / 48), calc(var(--logo) * 18.400 / 48)) scale(1.001,1.001); opacity: 1; }
  43.06% { transform: translate(calc(var(--logo) * 12.030 / 48), calc(var(--logo) * 18.783 / 48)) scale(0.930,0.930); opacity: 1; }
  43.68% { transform: translate(calc(var(--logo) * 11.087 / 48), calc(var(--logo) * 19.910 / 48)) scale(0.886,0.886); opacity: 1; }
  44.30% { transform: translate(calc(var(--logo) * 10.552 / 48), calc(var(--logo) * 21.351 / 48)) scale(0.886,0.886); opacity: 1; }
  44.92% { transform: translate(calc(var(--logo) * 10.296 / 48), calc(var(--logo) * 22.567 / 48)) scale(0.930,0.930); opacity: 1; }
  45.54% { transform: translate(calc(var(--logo) * 9.969 / 48), calc(var(--logo) * 23.223 / 48)) scale(1.002,1.002); opacity: 1; }
  46.16% { transform: translate(calc(var(--logo) * 9.228 / 48), calc(var(--logo) * 23.346 / 48)) scale(1.072,1.072); opacity: 1; }
  46.78% { transform: translate(calc(var(--logo) * 7.970 / 48), calc(var(--logo) * 23.268 / 48)) scale(1.115,1.115); opacity: 1; }
  47.40% { transform: translate(calc(var(--logo) * 6.436 / 48), calc(var(--logo) * 23.414 / 48)) scale(1.113,1.113); opacity: 1; }
  48.02% { transform: translate(calc(var(--logo) * 5.117 / 48), calc(var(--logo) * 24.043 / 48)) scale(1.067,1.067); opacity: 1; }
  48.64% { transform: translate(calc(var(--logo) * 4.506 / 48), calc(var(--logo) * 25.111 / 48)) scale(0.996,0.996); opacity: 1; }
  49.26% { transform: translate(calc(var(--logo) * 4.833 / 48), calc(var(--logo) * 26.319 / 48)) scale(0.925,0.925); opacity: 1; }
  49.88% { transform: translate(calc(var(--logo) * 5.936 / 48), calc(var(--logo) * 27.314 / 48)) scale(0.884,0.884); opacity: 1; }
  50.50% { transform: translate(calc(var(--logo) * 7.339 / 48), calc(var(--logo) * 27.919 / 48)) scale(0.888,0.888); opacity: 1; }
  51.12% { transform: translate(calc(var(--logo) * 8.499 / 48), calc(var(--logo) * 28.250 / 48)) scale(0.935,0.935); opacity: 1; }
  51.74% { transform: translate(calc(var(--logo) * 9.082 / 48), calc(var(--logo) * 28.641 / 48)) scale(1.007,1.007); opacity: 1; }
  52.36% { transform: translate(calc(var(--logo) * 9.119 / 48), calc(var(--logo) * 29.427 / 48)) scale(1.077,1.077); opacity: 1; }
  52.98% { transform: translate(calc(var(--logo) * 8.953 / 48), calc(var(--logo) * 30.711 / 48)) scale(1.116,1.116); opacity: 1; }
  53.60% { transform: translate(calc(var(--logo) * 9.021 / 48), calc(var(--logo) * 32.256 / 48)) scale(1.111,1.111); opacity: 1; }
  54.22% { transform: translate(calc(var(--logo) * 9.597 / 48), calc(var(--logo) * 33.580 / 48)) scale(1.062,1.062); opacity: 1; }
  54.84% { transform: translate(calc(var(--logo) * 10.648 / 48), calc(var(--logo) * 34.198 / 48)) scale(0.990,0.990); opacity: 1; }
  55.46% { transform: translate(calc(var(--logo) * 11.877 / 48), calc(var(--logo) * 33.886 / 48)) scale(0.921,0.921); opacity: 1; }
  56.08% { transform: translate(calc(var(--logo) * 12.888 / 48), calc(var(--logo) * 32.833 / 48)) scale(0.883,0.883); opacity: 1; }
  56.70% { transform: translate(calc(var(--logo) * 13.795 / 48), calc(var(--logo) * 31.594 / 48)) scale(0.890,0.890); opacity: 1; }
  57.32% { transform: translate(calc(var(--logo) * 14.702 / 48), calc(var(--logo) * 30.667 / 48)) scale(0.940,0.940); opacity: 1; }
  57.94% { transform: translate(calc(var(--logo) * 15.609 / 48), calc(var(--logo) * 30.412 / 48)) scale(1.013,1.013); opacity: 1; }
  58.56% { transform: translate(calc(var(--logo) * 16.516 / 48), calc(var(--logo) * 30.928 / 48)) scale(1.081,1.081); opacity: 1; }
  59.18% { transform: translate(calc(var(--logo) * 17.423 / 48), calc(var(--logo) * 32.015 / 48)) scale(1.118,1.118); opacity: 1; }
  59.80% { transform: translate(calc(var(--logo) * 18.330 / 48), calc(var(--logo) * 33.251 / 48)) scale(1.109,1.109); opacity: 1; }
  60.42% { transform: translate(calc(var(--logo) * 19.237 / 48), calc(var(--logo) * 34.157 / 48)) scale(1.057,1.057); opacity: 1; }
  61.04% { transform: translate(calc(var(--logo) * 20.144 / 48), calc(var(--logo) * 34.382 / 48)) scale(0.984,0.984); opacity: 1; }
  61.66% { transform: translate(calc(var(--logo) * 21.051 / 48), calc(var(--logo) * 33.839 / 48)) scale(0.917,0.917); opacity: 1; }
  62.28% { transform: translate(calc(var(--logo) * 21.958 / 48), calc(var(--logo) * 32.737 / 48)) scale(0.882,0.882); opacity: 1; }
  62.90% { transform: translate(calc(var(--logo) * 22.865 / 48), calc(var(--logo) * 31.589 / 48)) scale(0.903,0.903); opacity: 1; }
  63.52% { transform: translate(calc(var(--logo) * 23.772 / 48), calc(var(--logo) * 31.109 / 48)) scale(0.960,0.960); opacity: 1; }
  64.14% { transform: translate(calc(var(--logo) * 24.679 / 48), calc(var(--logo) * 31.325 / 48)) scale(1.010,1.010); opacity: 1; }
  64.76% { transform: translate(calc(var(--logo) * 25.586 / 48), calc(var(--logo) * 31.891 / 48)) scale(1.031,1.031); opacity: 1; }
  65.38% { transform: translate(calc(var(--logo) * 26.493 / 48), calc(var(--logo) * 32.348 / 48)) scale(1.022,1.022); opacity: 1; }
  66.00% { transform: translate(calc(var(--logo) * 27.400 / 48), calc(var(--logo) * 32.400 / 48)) scale(1.000,1.000); opacity: 1; }
  69.00% { transform: translate(calc(var(--logo) * 30.600 / 48), calc(var(--logo) * 32.400 / 48)) scale(1.000,1.000); opacity: 1; }
  71.00% { transform: translate(calc(var(--logo) * 32.000 / 48), calc(var(--logo) * 32.800 / 48)) scale(1.000,1.000); opacity: 1; }
  72.00% { transform: translate(calc(var(--logo) * 32.533 / 48), calc(var(--logo) * 33.178 / 48)) scale(1.000,1.000); opacity: 1; }
  73.00% { transform: translate(calc(var(--logo) * 33.067 / 48), calc(var(--logo) * 34.311 / 48)) scale(1.000,1.000); opacity: 1; }
  74.00% { transform: translate(calc(var(--logo) * 33.600 / 48), calc(var(--logo) * 36.200 / 48)) scale(1.000,1.000); opacity: 1; }
  75.50% { transform: translate(calc(var(--logo) * 33.800 / 48), calc(var(--logo) * 36.800 / 48)) scale(1.400,0.650); opacity: 1; }
  78.00% { transform: translate(calc(var(--logo) * 33.700 / 48), calc(var(--logo) * 36.300 / 48)) scale(1.000,1.000); opacity: 1; }
  80.50% { transform: translate(calc(var(--logo) * 33.700 / 48), calc(var(--logo) * 36.300 / 48)) scale(1.350,1.350); opacity: 1; }
  85.00% { transform: translate(calc(var(--logo) * 33.700 / 48), calc(var(--logo) * 36.300 / 48)) scale(0.000,0.000); opacity: 0; }
  100.00% { transform: translate(calc(var(--logo) * 33.700 / 48), calc(var(--logo) * 36.300 / 48)) scale(0.000,0.000); opacity: 0; }
}
@keyframes tract-ray {
  0%, 79%  { opacity: 0; transform: translate(calc(var(--logo) * 37.3 / 48), calc(var(--logo) * 39.9 / 48)) rotate(var(--a)) translateX(calc(var(--logo) * 4 / 48)) scaleX(.4); }
  81%      { opacity: 1; transform: translate(calc(var(--logo) * 37.3 / 48), calc(var(--logo) * 39.9 / 48)) rotate(var(--a)) translateX(calc(var(--logo) * 5 / 48)) scaleX(1); }
  92%      { opacity: 0; transform: translate(calc(var(--logo) * 37.3 / 48), calc(var(--logo) * 39.9 / 48)) rotate(var(--a)) translateX(calc(var(--logo) * 8.6 / 48)) scaleX(.45); }
  100%     { opacity: 0; transform: translate(calc(var(--logo) * 37.3 / 48), calc(var(--logo) * 39.9 / 48)) rotate(var(--a)) translateX(calc(var(--logo) * 8.6 / 48)) scaleX(.45); }
}

/* Timelines (quarto-timeline extension): follow the site's accent and text colours.
   Line, dot background and card colours already switch with the dark theme. */
.timeline {
  --tl-color-dot: var(--bs-link-color);
  --tl-color-label: var(--bs-emphasis-color);
  max-width: 100%;
  overflow-x: auto;   /* wide timelines scroll inside their box on phones, not the page */
}

/* ---- Blog tags / categories: sharp-edged inverted chips ------------------
   Light theme: black box, white text. Dark theme: white box, black text.
   (emphasis colour = black in light, white in dark; body-bg is the opposite) */
.quarto-title .quarto-categories .quarto-category,
.quarto-listing-category .category {
  background-color: var(--bs-emphasis-color);
  color: var(--bs-body-bg);
  border: 0;
  border-radius: 0;
  opacity: 1;
}
.quarto-title .quarto-categories .quarto-category a { color: inherit; }
.quarto-listing-category .category:hover,
.quarto-listing-category .category.active {
  background-color: var(--bs-link-color);
  color: #000;
}

/* ======================================================================
   Home page (index.qmd)
   ====================================================================== */
/* Section headings ("Latest posts", "Featured publications") at body-text size */
.about-contents h2 { font-size: 1rem; line-height: 1.7; }
/* Post and paper titles in those lists at body-text size too */
.about-contents .listing-title { font-size: 1rem; line-height: 1.7; font-weight: 700; }
.about-contents .listing-title a { font-weight: inherit; }

/* Compact spacing in the post / paper lists and between the two sections */
.about-contents h2 { margin-top: 1.4rem; margin-bottom: .5rem; padding-bottom: 0; }
.about-contents .quarto-listing { padding-bottom: 0; }
.about-contents div.quarto-post { margin-bottom: .7rem; padding-bottom: .1rem; }
.about-contents .listing-title,
.about-contents .listing-description { line-height: 1.45; }
.about-contents .listing-description { margin-bottom: 0; }

/* Narrower date column in the post / paper lists (default is 20% of the row) */
.about-contents div.quarto-post .metadata { flex-basis: 5rem; }

/* ======================================================================
   Blog page (blog/blog.qmd)
   ====================================================================== */
/* Narrower date column (default is 20% of the row) */
div.quarto-post .metadata { flex-basis: 8rem; }

/* Tag filter: a horizontal row above the list instead of the right margin */
#blog-tags { margin: 0 0 1.5rem; }
#blog-tags .quarto-listing-category-title { display: none; }
#blog-tags .quarto-listing-category { display: flex; flex-wrap: wrap; gap: .4rem; }
#blog-tags .category {
  margin: 0; padding: .25em .75em; font-size: .65em; line-height: 1.5;
  text-transform: uppercase; cursor: pointer;
}
#blog-tags .category .category-count { opacity: .6; margin-left: .3em; }
/* tags shown under each post, same look */
.listing-categories { margin-top: .4rem; }
div.quarto-post .listing-categories .listing-category {
  background-color: var(--bs-emphasis-color) !important; color: var(--bs-body-bg) !important;
  border: 0 !important; border-radius: 0 !important; opacity: 1 !important;
  padding: .25em .75em; font-size: .65em; text-transform: uppercase;
}
div.quarto-post .listing-categories .listing-category:hover { background-color: var(--bs-link-color) !important; color: #000 !important; }

/* ======================================================================
   Projects page (projects/index.qmd)
   ====================================================================== */
/* Project tiles: light grey, sharp-edged, no border */
.quarto-listing-grid .card,
.quarto-grid-item.card {
  border: 0;
  border-radius: 0;
  background: #f2f2f2;
  box-shadow: none;
}
.quarto-dark .quarto-listing-grid .card,
.quarto-dark .quarto-grid-item.card {
  background: #1a1a1a;
}

/* ======================================================================
   Publications page (publications.qmd)
   ====================================================================== */
/* --- layout: single, narrow column ------------------------------------ */
.pub-list { max-width: 46rem; margin-inline: auto; }
/* publication list inside a project page: left-aligned, full width */
.pub-list.pub-list-inline { max-width: none; margin-inline: 0; }

/* --- year headings ---------------------------------------------------- */
.pub-year-group { margin-block: 2rem 1.25rem; }
.pub-year {
  font-size: .8rem; font-weight: 600; letter-spacing: .12em;
  text-transform: uppercase; color: var(--bs-secondary-color, #6c757d);
  margin: 0 0 .75rem; padding-bottom: .35rem;
  border-bottom: 1px solid var(--bs-border-color, #e5e5e5);
}

/* --- one publication -------------------------------------------------- */
.pub-item { margin-bottom: 1.1rem; }
.pub-title { line-height: 1.35; }
.pub-title a { color: var(--bs-emphasis-color); text-decoration: none; }
.pub-title a:hover { color: var(--bs-link-color); text-decoration: none; }
.pub-meta {
  font-size: .9rem; color: var(--bs-secondary-color, #6c757d); margin-top: .15rem;
}
.pub-meta strong { color: var(--bs-body-color, inherit); font-weight: 700; }

/* --- PDF button after the source line --------------------------------- */
.pub-meta a.pub-pdf {
  display: inline-block; margin-left: .25rem; padding: .05rem .45rem;
  font-size: .72rem; font-weight: 700; letter-spacing: .04em; line-height: 1.4;
  color: #000; background: #e6e6e6;  /* same in light and dark theme */
  border-radius: 0; text-decoration: none; vertical-align: .05em;
  transition: background-color .12s ease, color .12s ease;
}
.pub-meta a.pub-pdf:hover { background: var(--bs-link-color); color: #000; }

/* --- filter buttons --------------------------------------------------- */
.pub-filters {
  display: flex; flex-wrap: wrap; gap: .5rem;
  max-width: 46rem; margin: 0 auto 1.5rem;
}
.pub-filter {
  font-size: .82rem; padding: .3rem .8rem;
  border: 0; border-radius: 0; font-weight: 700;
  background: transparent; color: var(--bs-body-color, inherit);
  cursor: pointer; line-height: 1;
  transition: background-color .12s ease, color .12s ease;
}
.pub-filter:hover { background: var(--bs-tertiary-bg, #f2f2f2); }
.pub-filter[aria-pressed="true"] {
  background: var(--bs-emphasis-color, #1a1a1a);
  color: var(--bs-body-bg, #fff);
}
