
html, body { height: 100%; margin: 0; overflow: hidden; }
body {
  background: radial-gradient(ellipse at 50% 38%, #45403a 0%, #2e2a26 55%, #1d1a17 100%);
  overscroll-behavior: none;
  -webkit-user-select: none; user-select: none;
}
#stage {
  position: fixed; inset: 0;
  display: flex; align-items: center; justify-content: center;
  touch-action: none;
}
#flipbook { position: relative; }
#flipbook.open { box-shadow: 0 22px 60px rgba(0,0,0,.55), 0 4px 14px rgba(0,0,0,.4); }

/* ---------- hard covers ---------- */
.cover {
  background:
    radial-gradient(ellipse at 30% 25%, rgba(255,255,255,.09), rgba(255,255,255,0) 55%),
    linear-gradient(135deg, #142e56 0%, #24487f 46%, #142e56 100%);
  box-shadow: inset 0 0 40px rgba(0,0,0,.35);
}
.cover-front::before, .cover-back::before {
  content: ''; position: absolute; top: 0; bottom: 0; width: 12%;
  pointer-events: none; z-index: 2;
}
.cover-front::before { left: 0;  background: linear-gradient(to right, rgba(0,0,0,.5), rgba(0,0,0,.14) 55%, rgba(0,0,0,0)); }
.cover-back::before  { right: 0; background: linear-gradient(to left,  rgba(0,0,0,.5), rgba(0,0,0,.14) 55%, rgba(0,0,0,0)); }
.cover-inner { position: absolute; inset: 0; }
.cover-frame {
  position: absolute; inset: 7%;
  border: 3px double #c9a84c; border-radius: 3px;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  text-align: center; color: #e7c96f;
  font-family: Georgia, 'Palatino Linotype', serif;
  padding: 0 6%;
}
.cover-title {
  font-variant: small-caps; letter-spacing: .1em;
  font-size: 2em; line-height: 1.25;
  text-shadow: 0 2px 3px rgba(0,0,0,.55);
}
.cover-orn { color: #b89a4e; font-size: 1.5em; margin-top: 1.1em; }
.cover-orn.big { font-size: 2.4em; }
.cover-sub { letter-spacing: .5em; font-size: .68em; margin-top: 1em; color: #cdb069; text-indent: .5em; }
.cover-author { margin-top: 2.4em; font-variant: small-caps; letter-spacing: .18em; font-size: 1.02em; color: #e2c26a; }

/* ---------- endpapers ---------- */
.endpaper {
  background:
    repeating-linear-gradient(45deg, rgba(120,96,58,.05) 0 3px, rgba(0,0,0,0) 3px 6px),
    linear-gradient(#e8dfc8, #dcd2b6);
  box-shadow: inset 0 0 55px rgba(96,74,40,.25);
}

/* ---------- paper pages ---------- */
.paper {
  background:
    radial-gradient(ellipse at 50% 45%, #faf5e9 55%, #f1e8d4 92%, #eadfc7 100%);
  color: #33291f;
}
/* inner spine shadow — the fold between the two pages of a spread */
.pg-right::before {
  content: ''; position: absolute; top: 0; bottom: 0; left: 0; width: 9%;
  background: linear-gradient(to right, rgba(84,26,18,.30), rgba(84,26,18,.10) 52%, rgba(84,26,18,0));
  pointer-events: none; z-index: 3;
}
.pg-left::before {
  content: ''; position: absolute; top: 0; bottom: 0; right: 0; width: 9%;
  background: linear-gradient(to left, rgba(84,26,18,.26), rgba(84,26,18,.09) 52%, rgba(84,26,18,0));
  pointer-events: none; z-index: 3;
}
.pg-single::before {
  content: ''; position: absolute; top: 0; bottom: 0; left: 0; width: 6%;
  background: linear-gradient(to right, rgba(62,44,16,.18), rgba(84,26,18,0));
  pointer-events: none; z-index: 3;
}
/* outer edge — hint of the closed page stack */
.pg-right::after, .pg-left::after {
  content: ''; position: absolute; top: 0; bottom: 0; width: 7px;
  pointer-events: none; z-index: 3; opacity: .5;
}
.pg-right::after { right: 0; background: repeating-linear-gradient(to left, rgba(90,70,40,.16) 0 1px, rgba(0,0,0,0) 1px 3px); }
.pg-left::after  { left: 0;  background: repeating-linear-gradient(to right, rgba(90,70,40,.16) 0 1px, rgba(0,0,0,0) 1px 3px); }

/* ---------- text ---------- */
.textenv {
  font-family: Georgia, 'Palatino Linotype', 'Book Antiqua', 'Times New Roman', serif;
  line-height: 1.55; text-align: justify;
  hyphens: auto; -webkit-hyphens: auto; -ms-hyphens: auto;
  text-rendering: optimizeLegibility;
  color: #33291f;
}
.textenv p { margin: 0; text-indent: 1.5em; }
.textenv p.noind { text-indent: 0; }
.chead { margin-bottom: 1.25em; }
.cnum {
  text-align: center; font-variant: small-caps;
  letter-spacing: .24em; font-size: 1.26em;
  padding-top: 1em; text-indent: .24em; color: #4a3b28;
}
.corn { text-align: center; color: #8a744a; margin-top: .4em; font-size: 1em; }
.brk { text-align: center; margin: 1.1em 0; color: #8a744a; font-size: .78em; letter-spacing: .5em; text-indent: .5em; }
.theend { text-align: center; margin-top: 2.6em; letter-spacing: .4em; text-indent: .4em; font-size: 1.02em; color: #5a4a33; }
.folio { text-align: center; font-size: .66em; letter-spacing: .18em; color: #8d7b5f; font-family: Georgia, serif; }

/* ---------- title page ---------- */
.titlepage {
  position: absolute; inset: 10% 12%;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  text-align: center; font-family: Georgia, 'Palatino Linotype', serif; color: #3d3020;
}
.tp-title { font-variant: small-caps; font-size: 1.85em; letter-spacing: .1em; line-height: 1.3; }
.tp-rule { width: 42%; height: 1px; background: #a08c5a; margin: 1.4em 0; }
.tp-sub { letter-spacing: .45em; font-size: .72em; color: #6a583c; text-indent: .45em; }
.tp-by { margin-top: 2.2em; font-style: italic; font-size: .85em; color: #6a583c; }
.tp-author { margin-top: .5em; font-variant: small-caps; letter-spacing: .16em; font-size: 1.12em; }
.tp-orn { margin-top: 2.2em; color: #8a744a; font-size: 1.3em; }

/* ---------- chrome ---------- */
.nav {
  position: fixed; top: 50%; transform: translateY(-50%);
  z-index: 60; cursor: pointer;
  font: 46px/1 Georgia, serif; color: rgba(255,255,255,.30);
  padding: 26px 14px; transition: color .2s;
  background: none; border: 0; margin: 0;
  -webkit-appearance: none; appearance: none;
}
.nav:hover { color: rgba(255,255,255,.75); }
#nav-prev { left: 4px; }
#nav-next { right: 4px; }

#hint {
  position: fixed; left: 50%; bottom: 58px; transform: translateX(-50%);
  z-index: 60; font: 12.5px/1.4 Georgia, serif; letter-spacing: .06em;
  color: rgba(255,255,255,.45); background: rgba(0,0,0,.25);
  padding: 6px 14px; border-radius: 20px; white-space: nowrap;
  transition: opacity 1.2s; pointer-events: none;
}
#hint.gone { opacity: 0; }

#loader {
  position: fixed; inset: 0; z-index: 100;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px;
  background: rgba(24,21,18,.82);
  font: 15px Georgia, serif; letter-spacing: .08em; color: #d8c9a6;
  opacity: 0; pointer-events: none; transition: opacity .25s;
}
#loader.show { opacity: 1; pointer-events: auto; }
#loader .spin {
  width: 34px; height: 34px; border-radius: 50%;
  border: 3px solid rgba(216,201,166,.25); border-top-color: #d8c9a6;
  animation: lspin .9s linear infinite;
}
@keyframes lspin { to { transform: rotate(360deg); } }

/* ---------- embossed cover tooling ---------- */
.cover-inner::before {
  content: ''; position: absolute; inset: 2.2%;
  pointer-events: none; opacity: .9;
  background-image: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='28'%20height='28'%3E%20%3Cg%20fill='none'%20stroke-width='1.4'%3E%20%3Cg%20transform='translate(0.9,0.9)'%20stroke='rgba(0,0,0,0.50)'%3E%20%3Cpath%20d='M14%206%20L22%2014%20L14%2022%20L6%2014%20Z'/%3E%3Ccircle%20cx='14'%20cy='14'%20r='1.8'/%3E%20%3C/g%3E%20%3Cg%20transform='translate(-0.6,-0.6)'%20stroke='rgba(255,255,255,0.13)'%3E%20%3Cpath%20d='M14%206%20L22%2014%20L14%2022%20L6%2014%20Z'/%3E%3Ccircle%20cx='14'%20cy='14'%20r='1.8'/%3E%20%3C/g%3E%20%3C/g%3E%3C/svg%3E"), url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='28'%20height='28'%3E%20%3Cg%20fill='none'%20stroke-width='1.4'%3E%20%3Cg%20transform='translate(0.9,0.9)'%20stroke='rgba(0,0,0,0.50)'%3E%20%3Cpath%20d='M14%206%20L22%2014%20L14%2022%20L6%2014%20Z'/%3E%3Ccircle%20cx='14'%20cy='14'%20r='1.8'/%3E%20%3C/g%3E%20%3Cg%20transform='translate(-0.6,-0.6)'%20stroke='rgba(255,255,255,0.13)'%3E%20%3Cpath%20d='M14%206%20L22%2014%20L14%2022%20L6%2014%20Z'/%3E%3Ccircle%20cx='14'%20cy='14'%20r='1.8'/%3E%20%3C/g%3E%20%3C/g%3E%3C/svg%3E"), url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='28'%20height='28'%3E%20%3Cg%20fill='none'%20stroke-width='1.4'%3E%20%3Cg%20transform='translate(0.9,0.9)'%20stroke='rgba(0,0,0,0.50)'%3E%20%3Cpath%20d='M14%206%20L22%2014%20L14%2022%20L6%2014%20Z'/%3E%3Ccircle%20cx='14'%20cy='14'%20r='1.8'/%3E%20%3C/g%3E%20%3Cg%20transform='translate(-0.6,-0.6)'%20stroke='rgba(255,255,255,0.13)'%3E%20%3Cpath%20d='M14%206%20L22%2014%20L14%2022%20L6%2014%20Z'/%3E%3Ccircle%20cx='14'%20cy='14'%20r='1.8'/%3E%20%3C/g%3E%20%3C/g%3E%3C/svg%3E"), url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='28'%20height='28'%3E%20%3Cg%20fill='none'%20stroke-width='1.4'%3E%20%3Cg%20transform='translate(0.9,0.9)'%20stroke='rgba(0,0,0,0.50)'%3E%20%3Cpath%20d='M14%206%20L22%2014%20L14%2022%20L6%2014%20Z'/%3E%3Ccircle%20cx='14'%20cy='14'%20r='1.8'/%3E%20%3C/g%3E%20%3Cg%20transform='translate(-0.6,-0.6)'%20stroke='rgba(255,255,255,0.13)'%3E%20%3Cpath%20d='M14%206%20L22%2014%20L14%2022%20L6%2014%20Z'/%3E%3Ccircle%20cx='14'%20cy='14'%20r='1.8'/%3E%20%3C/g%3E%20%3C/g%3E%3C/svg%3E");
  background-repeat: repeat-x, repeat-x, repeat-y, repeat-y;
  background-position: left top, left bottom, left top, right top;
  background-size: 28px 28px;
}
.cover-inner::after {
  content: ''; position: absolute; inset: 1.4%;
  pointer-events: none; opacity: .95;
  background-image: url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='56'%20height='56'%3E%20%3Cg%20fill='none'%20stroke-width='1.5'%3E%20%3Cg%20transform='translate(1,1)'%20stroke='rgba(0,0,0,0.50)'%3E%20%3Ccircle%20cx='28'%20cy='28'%20r='16'/%3E%3Ccircle%20cx='28'%20cy='28'%20r='9'/%3E%20%3Cpath%20d='M28%2012%20Q31%2020%2028%2024%20Q25%2020%2028%2012%20Z%20M28%2044%20Q31%2036%2028%2032%20Q25%2036%2028%2044%20Z%20M12%2028%20Q20%2031%2024%2028%20Q20%2025%2012%2028%20Z%20M44%2028%20Q36%2031%2032%2028%20Q36%2025%2044%2028%20Z'/%3E%20%3C/g%3E%20%3Cg%20transform='translate(-0.7,-0.7)'%20stroke='rgba(255,255,255,0.13)'%3E%20%3Ccircle%20cx='28'%20cy='28'%20r='16'/%3E%3Ccircle%20cx='28'%20cy='28'%20r='9'/%3E%20%3Cpath%20d='M28%2012%20Q31%2020%2028%2024%20Q25%2020%2028%2012%20Z%20M28%2044%20Q31%2036%2028%2032%20Q25%2036%2028%2044%20Z%20M12%2028%20Q20%2031%2024%2028%20Q20%2025%2012%2028%20Z%20M44%2028%20Q36%2031%2032%2028%20Q36%2025%2044%2028%20Z'/%3E%20%3C/g%3E%20%3C/g%3E%3C/svg%3E"), url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='56'%20height='56'%3E%20%3Cg%20fill='none'%20stroke-width='1.5'%3E%20%3Cg%20transform='translate(1,1)'%20stroke='rgba(0,0,0,0.50)'%3E%20%3Ccircle%20cx='28'%20cy='28'%20r='16'/%3E%3Ccircle%20cx='28'%20cy='28'%20r='9'/%3E%20%3Cpath%20d='M28%2012%20Q31%2020%2028%2024%20Q25%2020%2028%2012%20Z%20M28%2044%20Q31%2036%2028%2032%20Q25%2036%2028%2044%20Z%20M12%2028%20Q20%2031%2024%2028%20Q20%2025%2012%2028%20Z%20M44%2028%20Q36%2031%2032%2028%20Q36%2025%2044%2028%20Z'/%3E%20%3C/g%3E%20%3Cg%20transform='translate(-0.7,-0.7)'%20stroke='rgba(255,255,255,0.13)'%3E%20%3Ccircle%20cx='28'%20cy='28'%20r='16'/%3E%3Ccircle%20cx='28'%20cy='28'%20r='9'/%3E%20%3Cpath%20d='M28%2012%20Q31%2020%2028%2024%20Q25%2020%2028%2012%20Z%20M28%2044%20Q31%2036%2028%2032%20Q25%2036%2028%2044%20Z%20M12%2028%20Q20%2031%2024%2028%20Q20%2025%2012%2028%20Z%20M44%2028%20Q36%2031%2032%2028%20Q36%2025%2044%2028%20Z'/%3E%20%3C/g%3E%20%3C/g%3E%3C/svg%3E"), url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='56'%20height='56'%3E%20%3Cg%20fill='none'%20stroke-width='1.5'%3E%20%3Cg%20transform='translate(1,1)'%20stroke='rgba(0,0,0,0.50)'%3E%20%3Ccircle%20cx='28'%20cy='28'%20r='16'/%3E%3Ccircle%20cx='28'%20cy='28'%20r='9'/%3E%20%3Cpath%20d='M28%2012%20Q31%2020%2028%2024%20Q25%2020%2028%2012%20Z%20M28%2044%20Q31%2036%2028%2032%20Q25%2036%2028%2044%20Z%20M12%2028%20Q20%2031%2024%2028%20Q20%2025%2012%2028%20Z%20M44%2028%20Q36%2031%2032%2028%20Q36%2025%2044%2028%20Z'/%3E%20%3C/g%3E%20%3Cg%20transform='translate(-0.7,-0.7)'%20stroke='rgba(255,255,255,0.13)'%3E%20%3Ccircle%20cx='28'%20cy='28'%20r='16'/%3E%3Ccircle%20cx='28'%20cy='28'%20r='9'/%3E%20%3Cpath%20d='M28%2012%20Q31%2020%2028%2024%20Q25%2020%2028%2012%20Z%20M28%2044%20Q31%2036%2028%2032%20Q25%2036%2028%2044%20Z%20M12%2028%20Q20%2031%2024%2028%20Q20%2025%2012%2028%20Z%20M44%2028%20Q36%2031%2032%2028%20Q36%2025%2044%2028%20Z'/%3E%20%3C/g%3E%20%3C/g%3E%3C/svg%3E"), url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='56'%20height='56'%3E%20%3Cg%20fill='none'%20stroke-width='1.5'%3E%20%3Cg%20transform='translate(1,1)'%20stroke='rgba(0,0,0,0.50)'%3E%20%3Ccircle%20cx='28'%20cy='28'%20r='16'/%3E%3Ccircle%20cx='28'%20cy='28'%20r='9'/%3E%20%3Cpath%20d='M28%2012%20Q31%2020%2028%2024%20Q25%2020%2028%2012%20Z%20M28%2044%20Q31%2036%2028%2032%20Q25%2036%2028%2044%20Z%20M12%2028%20Q20%2031%2024%2028%20Q20%2025%2012%2028%20Z%20M44%2028%20Q36%2031%2032%2028%20Q36%2025%2044%2028%20Z'/%3E%20%3C/g%3E%20%3Cg%20transform='translate(-0.7,-0.7)'%20stroke='rgba(255,255,255,0.13)'%3E%20%3Ccircle%20cx='28'%20cy='28'%20r='16'/%3E%3Ccircle%20cx='28'%20cy='28'%20r='9'/%3E%20%3Cpath%20d='M28%2012%20Q31%2020%2028%2024%20Q25%2020%2028%2012%20Z%20M28%2044%20Q31%2036%2028%2032%20Q25%2036%2028%2044%20Z%20M12%2028%20Q20%2031%2024%2028%20Q20%2025%2012%2028%20Z%20M44%2028%20Q36%2031%2032%2028%20Q36%2025%2044%2028%20Z'/%3E%20%3C/g%3E%20%3C/g%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: left top, right top, left bottom, right bottom;
  background-size: 52px 52px;
}

/* ---------- illustration captions & display lines ---------- */
.illus {
  margin: 1.15em 5%; padding: .5em 3%;
  text-align: center; font-style: italic;
  font-size: .84em; line-height: 1.45; color: #6b5a3e;
  border-top: 1px solid rgba(122,100,60,.4);
  border-bottom: 1px solid rgba(122,100,60,.4);
}
.disp {
  text-align: center; margin: 1em 8%;
  font-variant: small-caps; letter-spacing: .12em;
  font-size: .95em; color: #4a3b28;
}

.ctitle {
  text-align: center; font-variant: small-caps;
  letter-spacing: .08em; font-size: 1.05em;
  margin-top: .45em; color: #5a4a33;
}
.verse {
  text-align: center; font-style: italic;
  margin: 1.1em 0; line-height: 1.65; color: #4a3b28;
}

.letter {
  margin: 1.1em 6%; padding: .7em 1em;
  font-size: .88em; line-height: 1.6; font-style: italic;
  color: #4a3b28; background: rgba(146,120,70,.07);
  border-left: 2px solid rgba(122,100,60,.45);
}

.songtitle {
  text-align: center; font-variant: small-caps; letter-spacing: .18em;
  text-indent: .18em; font-size: .92em; color: #5a4a33; margin: 1.2em 0 .3em;
}
.plate {
  margin: 1.2em auto; padding: .45em 1.2em; width: fit-content;
  text-align: center; letter-spacing: .3em; text-indent: .3em; font-size: .86em;
  color: #4a3b28; border: 1px solid rgba(122,100,60,.55); border-radius: 2px;
  background: rgba(170,150,95,.14);
}
.prog {
  margin: 1.1em 6%; text-align: center; font-size: .85em; line-height: 1.75;
  color: #4a3b28; border-top: 1px solid rgba(122,100,60,.4);
  border-bottom: 1px solid rgba(122,100,60,.4); padding: .7em 0;
}


/* ---------- skip to page (fixed overlay: never touches #flipbook) ---------- */
#skipbar {
  position: fixed; left: 50%; bottom: 12px;
  transform: translateX(-50%) translateY(10px);
  z-index: 70;
  display: flex; align-items: center; gap: 8px;
  opacity: 0; pointer-events: none;
  transition: opacity .32s ease, transform .32s ease;
  font-family: Georgia, 'Palatino Linotype', serif;
}
#skipbar.vis { opacity: 1; pointer-events: auto; transform: translateX(-50%) translateY(0); }

#skipbar button {
  font: 13.5px/1 Georgia, serif; letter-spacing: .06em;
  color: #ffeec0; background: rgba(38,10,66,.85);
  border: 1px solid rgba(255,216,106,.55); border-radius: 18px;
  padding: 9px 16px; cursor: pointer;
  -webkit-appearance: none; appearance: none;
  transition: background .18s, color .18s, border-color .18s;
}
#skipbar button:hover { background: rgba(70,21,122,.94); color: #fff8dc; border-color: #ffd86a; }
#skipbar button:focus-visible { outline: 2px solid #ffd86a; outline-offset: 2px; }

#skip-wrap {
  display: none; align-items: center; gap: 6px;
  background: rgba(38,10,66,.9);
  border: 1px solid rgba(255,216,106,.55); border-radius: 18px;
  padding: 5px 6px 5px 12px;
}
#skip-wrap.open { display: flex; }
#skip-btn.gone { display: none; }

#skip-input {
  width: 74px; font: 14px/1 Georgia, serif; text-align: center;
  color: #1b0733; background: #f8f0e2;
  border: 1px solid rgba(255,216,106,.7); border-radius: 12px;
  padding: 7px 8px; -webkit-appearance: none; appearance: none;
}
#skip-input:focus { outline: 2px solid #ffd86a; outline-offset: 1px; }
#skip-err {
  font: 11.5px/1 Georgia, serif; letter-spacing: .05em;
  color: rgba(255,238,192,.72); padding-right: 8px; white-space: nowrap;
}

@keyframes skipShake {
  0%,100% { transform: translateX(0); }
  20% { transform: translateX(-5px); } 40% { transform: translateX(5px); }
  60% { transform: translateX(-3px); } 80% { transform: translateX(3px); }
}
#skip-wrap.bad { animation: skipShake .34s ease; border-color: #ff5c7a; }
#skip-wrap.bad #skip-err { color: #ffb3c1; }

@media (prefers-reduced-motion: reduce) {
  #skipbar { transition: opacity .2s ease; transform: translateX(-50%); }
  #skipbar.vis { transform: translateX(-50%); }
  #skip-wrap.bad { animation: none; }
}

/* ---------- chapter half-title page ----------
   Same cream stock, margins and rules as a text page; no folio, as a printed
   half-title carries none. .chapanim is an empty full-bleed stage kept for
   per-chapter artwork later. Animation "rise and settle": numeral lifts, a
   hairline draws outward from the centre, the title follows.                */
.paper.intro { overflow: hidden; }

.intropage {
  position: absolute; inset: 0;
  display: flex; flex-direction: column;
  align-items: center; justify-content: center;
}
.chapanim { position: absolute; inset: 0; pointer-events: none; }

.intro-label {
  position: relative; z-index: 2;
  text-align: center; padding: 0 14%;
  font-family: Georgia, 'Palatino Linotype', serif;
  color: #3a2f22;
}
.intro-label .il-num {
  display: block; font-size: .74em; letter-spacing: .34em;
  text-transform: uppercase; color: #8a6d3a;
}
.intro-label .il-rule {
  display: block; height: 1px; width: 0; margin: 1.15em auto;
  background: linear-gradient(to right, transparent, #b08d4c, transparent);
}
.intro-label .il-txt {
  display: block; font-size: 1.42em; line-height: 1.35; letter-spacing: .04em;
}
.intro-label .il-txt.il-solo {
  font-size: 1.9em; letter-spacing: .3em; text-indent: .3em; text-transform: uppercase;
}

/* the reveal runs when the page comes into view, not on a loop */
.intropage .il-num,
.intropage .il-rule,
.intropage .il-txt { opacity: 0; }

.intropage.play .il-num  { animation: introUp   .70s ease-out .10s both; }
.intropage.play .il-rule { animation: introRule .60s ease-out .68s both; }
.intropage.play .il-txt  { animation: introUp   .80s ease-out 1.00s both; }

@keyframes introUp   { from { opacity: 0; transform: translateY(12px); }
                       to   { opacity: 1; transform: none; } }
@keyframes introRule { from { width: 0;  opacity: 0; }
                       to   { width: 42%; opacity: 1; } }

@media (prefers-reduced-motion: reduce) {
  .intropage .il-num, .intropage .il-txt { opacity: 1; }
  .intropage .il-rule { opacity: 1; width: 42%; }
  .intropage.play .il-num,
  .intropage.play .il-rule,
  .intropage.play .il-txt { animation: none; }
}


/* ---------- translator's footnote ----------
   Three notes in Crime and Punishment are the translator's, not Dostoevsky's.
   They are set smaller and ruled off so they can't be mistaken for the text. */
.tnote { font-size: .82em; line-height: 1.5; color: #5b4f3f; margin: 1.05em 0 .95em;
         padding-top: .55em; border-top: 1px solid rgba(90,70,40,.28); text-indent: 0; }
/* A note with no marker of its own gets a dagger; a note that carries its
   own asterisk marker prints that instead, so the reader can match it. */
.tnote.dagger::before { content: '\2020\2003'; color: #937a45; }
.tn-m { color: #937a45; margin-right: .6em; font-weight: 700; letter-spacing: .04em; }


/* ---------- part half-title ----------
   'Part I' owns a whole leaf, like a chapter half-title. .partanim is a
   full-bleed stage left deliberately empty: the per-part animation goes there
   later and needs no change to the page geometry. The page keeps the ordinary
   paper aesthetic rather than going dark. */
.paper.part { overflow: hidden; }
.parttitle { position: absolute; inset: 0; display: flex;
             flex-direction: column; align-items: center; justify-content: center; }
.partanim  { position: absolute; inset: 0; pointer-events: none; }
.part-label { position: relative; z-index: 2; text-align: center; padding: 0 14%;
              font-family: Georgia,'Palatino Linotype',serif; color: #3a2f22; }
.part-label .pt-rule { display: block; height: 1px; width: 0; margin: 1.5em auto;
              background: linear-gradient(to right, transparent, #b08d4c, transparent); }

/* The word sits small and widely tracked above a big display numeral. */
.part-label .pt-word { display: block; font-size: .95em; letter-spacing: .52em;
              text-indent: .52em; text-transform: uppercase; color: #7a6440;
              margin-bottom: .18em; }
.part-label .pt-num  { display: block; font-size: 5.6em; line-height: 1;
              letter-spacing: .10em; text-indent: .10em; font-weight: 700;
              text-transform: uppercase;
              background: linear-gradient(180deg, #6b5636 0%, #b08d4c 42%,
                                          #e6cd92 62%, #8a6f42 100%);
              -webkit-background-clip: text; background-clip: text;
              color: #8a6f42; -webkit-text-fill-color: transparent;
              filter: drop-shadow(0 2px 0 rgba(255,252,244,.55))
                      drop-shadow(0 -1px 0 rgba(74,58,32,.28)); }
/* The legend's name, under the numeral. Optional: only parts that carry a
   "sub" get one. Set in italic at text size so it reads as a name rather
   than competing with the display numeral above it. */
.part-label .pt-sub  { display: block; margin-top: .70em; font-size: 1.06em;
              font-style: italic; letter-spacing: .06em; line-height: 1.35;
              color: #6b5636; }
/* A label with no numeral -- "Epilogue" -- is set as one modest line. */
.parttitle.solo .pt-num { font-size: 2.3em; letter-spacing: .30em; text-indent: .30em; }

/* ---- the animated stage behind the lettering ----
   Three rings open outward from the centre and six motes drift up through
   them. Every looping period is distinct, per the out-of-phase rule that
   governs the covers; the one-shot reveals are staged so the rules draw,
   then the word, then the numeral lands. */
.partanim .pa-ring { position: absolute; left: 50%; top: 50%; border-radius: 50%;
              border: 1px solid rgba(176,141,76,.42); opacity: 0;
              transform: translate(-50%,-50%) scale(.2); }
.partanim .g0 { width: 34%; padding-bottom: 34%; }
.partanim .g1 { width: 52%; padding-bottom: 52%; border-color: rgba(176,141,76,.30); }
.partanim .g2 { width: 72%; padding-bottom: 72%; border-color: rgba(176,141,76,.20); }
.partanim .pa-mote { position: absolute; width: 5px; height: 5px; border-radius: 50%;
              background: rgba(176,141,76,.55); opacity: 0; }
.partanim .m0 { left: 22%; bottom: 16%; }
.partanim .m1 { left: 37%; bottom: 10%; }
.partanim .m2 { left: 52%; bottom: 19%; }
.partanim .m3 { left: 66%; bottom: 12%; }
.partanim .m4 { left: 78%; bottom: 22%; }
.partanim .m5 { left: 45%; bottom: 26%; }

.parttitle .pt-word, .parttitle .pt-num, .parttitle .pt-rule,
.parttitle .pt-sub { opacity: 0; }
.parttitle.play .pt-rule:first-child { animation: ptRule .60s ease-out .10s both; }
.parttitle.play .pt-word { animation: ptUp .70s ease-out .46s both; }
.parttitle.play .pt-num  { animation: ptNum .95s cubic-bezier(.19,1,.22,1) .62s both; }
/* The legend's name arrives after the numeral has settled, and before
   the closing rule draws itself. */
.parttitle.play .pt-sub  { animation: ptUp .70s ease-out 1.16s both; }
.parttitle.play .pt-rule:last-child  { animation: ptRule .60s ease-out 1.62s both; }
.parttitle.play .g0 { animation: ptRing 1.50s cubic-bezier(.22,.9,.3,1) .30s both,
                                 ptBreathe 7.30s ease-in-out 1.9s infinite; }
.parttitle.play .g1 { animation: ptRing 1.70s cubic-bezier(.22,.9,.3,1) .48s both,
                                 ptBreathe 9.10s ease-in-out 2.2s infinite; }
.parttitle.play .g2 { animation: ptRing 1.90s cubic-bezier(.22,.9,.3,1) .66s both,
                                 ptBreathe 11.40s ease-in-out 2.6s infinite; }
.parttitle.play .m0 { animation: ptMote 6.20s ease-in-out 1.40s infinite; }
.parttitle.play .m1 { animation: ptMote 7.10s ease-in-out 1.95s infinite; }
.parttitle.play .m2 { animation: ptMote 8.30s ease-in-out 2.40s infinite; }
.parttitle.play .m3 { animation: ptMote 9.40s ease-in-out 1.70s infinite; }
.parttitle.play .m4 { animation: ptMote 10.60s ease-in-out 2.80s infinite; }
.parttitle.play .m5 { animation: ptMote 11.90s ease-in-out 3.20s infinite; }

/* ---------- the sand sequence on a part page ----------
   Three stages, in this order: the Book's title fades in letter by letter,
   the letters blow away downwind, and the numeral resolves in the space they
   leave. build.py bakes each letter's two delays and its own drift into
   inline custom properties, so the stagger is scaled to the length of the
   title and every Book page runs to the same clock however long its title is.

   The title is laid over the whole leaf rather than stacked above the label,
   so the numeral appears exactly where the title was standing rather than
   somewhere underneath it. Words are inline-block: a line may break between
   words and never inside one.

   Note on the two animations per letter. sandOut is declared with `both`, so
   during its delay it holds its own first frame -- and its first frame is the
   fully-arrived letter, which is precisely what sandIn finished on. That is
   what lets the two run back to back on one element without the second one
   wiping out the first while it waits. */
/* Tracking and word space have to be set against each other. These titles
   are capitals, and tracked-out capitals need a word space that grows with
   the tracking -- at .12em of tracking against a .42em gap the two readings
   were close enough that the line ran together and you could not see where
   one word ended. The tracking is now half what it was and the word space
   two and a half times, which puts them an order of magnitude apart. */
.parttitle.sandseq .pt-sand { position: absolute; inset: 10% 11%; z-index: 3;
              display: flex; flex-wrap: wrap; gap: .35em 0;
              align-items: center; justify-content: center; align-content: center;
              font-family: Georgia,'Palatino Linotype',serif; color: #3a2f22;
              font-size: 1.06em; line-height: 1.85; letter-spacing: .06em;
              pointer-events: none; }

/* The word-space, and why it is a margin rather than the flex gap above.
   The letters are wrapped in one aria-hidden span so a screen reader gets the
   title once from the container instead of spelling it out. That wrapper is
   the ONLY child of the flex box, so flex gap had nothing to apply between --
   and because the builder joins the word spans with no whitespace at all,
   there was no word-space in the markup either. The words were separated by
   precisely the trailing letter-spacing of their last letter, which is to say
   by exactly the same distance as the letters inside them, which is exactly
   what a reader reported: you could not see where one word ended.

   display:contents lifts the words back out to be the flex items, and the
   margin gives them a word-space that holds whatever layout context they end
   up in. Belt and braces on purpose: this went wrong once already. */
.parttitle.sandseq .pt-sand .sandwrap { display: contents; }
.parttitle.sandseq .pt-sand .w { display: inline-block; white-space: nowrap;
              margin-right: 1.05em; }
.parttitle.sandseq .pt-sand .w:last-child { margin-right: 0; }
.parttitle.sandseq .pt-sand .l { display: inline-block; opacity: 0;
              will-change: transform, opacity, filter; }
/* The hold. The last letter of a title arrives at 1.55s -- one second of
   stagger plus its own .55s -- so the hold is what is left for reading it,
   not the whole of the number below. At 2.20s the assembled title stood for
   two thirds of a second, which is not long enough to read a line that can
   run to two hundred and fifty characters. At 5.60s it stands for four
   seconds. Everything downstream is timed off this number. */
.parttitle.sandseq.play .pt-sand .l {
              animation: sandIn .55s ease-out var(--fd) both,
                         sandOut 1.05s cubic-bezier(.42,0,.86,.24)
                                 calc(5.60s + var(--bd)) both; }

/* The numeral waits for the title to be most of the way gone: the first
   letters are still in the air when it starts to arrive. These four move with
   the hold above -- 3.40s later than they were, because the hold is. */
.parttitle.sandseq.play .pt-rule:first-child { animation: ptRule .60s ease-out 7.26s both; }
.parttitle.sandseq.play .pt-word { animation: ptUp .70s ease-out 7.42s both; }
.parttitle.sandseq.play .pt-num  { animation: ptNum .95s cubic-bezier(.19,1,.22,1) 7.58s both; }
.parttitle.sandseq.play .pt-rule:last-child { animation: ptRule .60s ease-out 8.00s both; }

@keyframes sandIn  { from { opacity:0; transform: translateY(12px) scale(.94);
                            filter: blur(3px); }
                     to   { opacity:1; transform:none; filter: blur(0); } }
@keyframes sandOut { 0%   { opacity:1; transform:none; filter: blur(0); }
                     22%  { opacity:.94;
                            transform: translate(calc(var(--dx) * .07), calc(var(--dy) * .07))
                                       rotate(calc(var(--r) * .05)); filter: blur(.4px); }
                     100% { opacity:0;
                            transform: translate(var(--dx), var(--dy))
                                       rotate(var(--r)) scale(.55); filter: blur(4px); } }

/* A reader who has asked for less motion gets the same three facts without
   the weather: the title simply is there, and the numeral simply is there. */
@media (prefers-reduced-motion: reduce) {
  .parttitle.sandseq .pt-sand .l,
  .parttitle.sandseq.play .pt-sand .l { animation: none; opacity: 1; }
  .parttitle.sandseq.play .pt-word,
  .parttitle.sandseq.play .pt-num,
  .parttitle.sandseq.play .pt-rule { animation-delay: 0s; }
}

@keyframes ptUp   { from { opacity:0; transform: translateY(14px); } to { opacity:1; transform:none; } }
@keyframes ptRule { from { width:0; opacity:0; } to { width:46%; opacity:1; } }
@keyframes ptNum  { 0%   { opacity:0; transform: translateY(26px) scale(.82); letter-spacing:.34em; }
                    100% { opacity:1; transform:none; letter-spacing:.10em; } }
@keyframes ptRing { from { opacity:0; transform: translate(-50%,-50%) scale(.2); }
                    to   { opacity:1; transform: translate(-50%,-50%) scale(1); } }
@keyframes ptBreathe { 0%,100% { opacity:.55; } 50% { opacity:1; } }
@keyframes ptMote { 0%   { opacity:0; transform: translateY(0) scale(.7); }
                    18%  { opacity:.85; }
                    82%  { opacity:.85; }
                    100% { opacity:0; transform: translateY(-190px) scale(1.25); } }


/* ---------- signature and subhead ----------
   Both were emitted by the engine but never styled: 75 signature lines across
   Little Women, Pride and Prejudice and The Jungle Book were rendering as
   ordinary paragraphs. A signature closes a letter, so it sits right and
   italic; a subhead is a minor division inside a chapter. */
.sig { text-align: right; font-style: italic; text-indent: 0;
       margin: .35em 0 1.05em; padding-right: .4em; color: #40362a; }
.subhead { text-align: center; text-indent: 0; margin: 1.35em 0 .85em;
           font-size: .93em; letter-spacing: .17em; text-transform: uppercase;
           color: #5b4a33; }


/* moonera cover. Scoped under .cover-front. */

/* The reset every illustrated cover needs. Without it the engine
   keeps its own 3px double gold border at inset 7%, which the
   600x820 artwork overflows, and keeps rendering .cover-sub from
   the book config, whose &nbsp;-joined words cannot wrap and run
   off both edges. The SVG sets its own lettering. */
.cover-front .cover-frame { padding: 0; border: 0; }
.cover-front .cover-title { width: 100%; font-size: 1em; letter-spacing: 0; text-shadow: none; }
.cover-front svg.cvsvg { width: 100%; height: auto; display: block; }
.cover-front .cover-orn, .cover-front .cover-sub, .cover-front .cover-author { display: none; }

/* The engine also stamps an embossed border of its own on every
   cover: .cover-inner::before repeats a diamond band along all
   four edges at 2.2% inset, and ::after sets rosettes in the four
   corners at 1.4%. Both are drawn as a dark copy offset against a
   light one -- the emboss technique. On a full-bleed illustration
   that reads as a frame the art is trapped inside, so it is off
   here. The back cover keeps it. */
.cover-front .cover-inner::before,
.cover-front .cover-inner::after { display: none; }

.cover-front .cvsvg text { font-family: Georgia,'Times New Roman',serif; text-anchor: middle; }

.cover-front .sn0 { animation: cvSparkN0 6.80s cubic-bezier(.3,0,.5,1) 0.00s infinite; }
@keyframes cvSparkN0 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .sn1 { animation: cvSparkN1 6.80s cubic-bezier(.3,0,.5,1) 0.06s infinite; }
@keyframes cvSparkN1 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .sn2 { animation: cvSparkN2 6.80s cubic-bezier(.3,0,.5,1) 0.11s infinite; }
@keyframes cvSparkN2 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .sn3 { animation: cvSparkN3 6.80s cubic-bezier(.3,0,.5,1) 0.17s infinite; }
@keyframes cvSparkN3 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .sn4 { animation: cvSparkN4 6.80s cubic-bezier(.3,0,.5,1) 0.22s infinite; }
@keyframes cvSparkN4 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .sn5 { animation: cvSparkN5 6.80s cubic-bezier(.3,0,.5,1) 0.28s infinite; }
@keyframes cvSparkN5 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .sn6 { animation: cvSparkN6 6.80s cubic-bezier(.3,0,.5,1) 0.33s infinite; }
@keyframes cvSparkN6 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .sn7 { animation: cvSparkN7 6.80s cubic-bezier(.3,0,.5,1) 0.39s infinite; }
@keyframes cvSparkN7 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .sn8 { animation: cvSparkN8 6.80s cubic-bezier(.3,0,.5,1) 0.44s infinite; }
@keyframes cvSparkN8 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .fn { animation: cvFlushN 6.80s ease-out 0.00s infinite; }
@keyframes cvFlushN { 0%,4% { opacity:0; } 24% { opacity:.85; } 52%   { opacity:.22; } 70%,100% { opacity:0; } }
.cover-front .sf0 { animation: cvSparkF0 6.80s cubic-bezier(.3,0,.5,1) 0.19s infinite; }
@keyframes cvSparkF0 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .sf1 { animation: cvSparkF1 6.80s cubic-bezier(.3,0,.5,1) 0.24s infinite; }
@keyframes cvSparkF1 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .sf2 { animation: cvSparkF2 6.80s cubic-bezier(.3,0,.5,1) 0.30s infinite; }
@keyframes cvSparkF2 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .sf3 { animation: cvSparkF3 6.80s cubic-bezier(.3,0,.5,1) 0.35s infinite; }
@keyframes cvSparkF3 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .sf4 { animation: cvSparkF4 6.80s cubic-bezier(.3,0,.5,1) 0.41s infinite; }
@keyframes cvSparkF4 { 0%   { stroke-dashoffset:34; stroke-opacity:0; } 8%   { stroke-opacity:1; } 44%  { stroke-dashoffset:-340; stroke-opacity:0; } 100% { stroke-dashoffset:-340; stroke-opacity:0; } }
.cover-front .ff { animation: cvFlushF 6.80s ease-out 0.19s infinite; }
@keyframes cvFlushF { 0%,4% { opacity:0; } 24% { opacity:.85; } 52%   { opacity:.22; } 70%,100% { opacity:0; } }
.cover-front .e0 { animation: cvEye0 5.30s ease-in-out 0.00s infinite; }
@keyframes cvEye0 { 0%,100% { fill-opacity:.85; } 50% { fill-opacity:1; } }
.cover-front .e1 { animation: cvEye1 6.10s ease-in-out 0.90s infinite; }
@keyframes cvEye1 { 0%,100% { fill-opacity:.35; } 50% { fill-opacity:.7; } }
.cover-front .i0 { animation: cvIris0 3.70s ease-in-out 0.50s infinite; }
@keyframes cvIris0 { 0%,100% { fill-opacity:.5; } 50% { fill-opacity:1; } }
.cover-front .lips { animation: cvLips 9.30s ease-in-out 0.00s infinite; }
@keyframes cvLips { 0%,100% { stroke-opacity:.7; } 50% { stroke-opacity:1; } }
.cover-front .mother { transform-box: fill-box; transform-origin: 50% 100%; }
.cover-front .mother { animation: cvBreathe 11.90s ease-in-out 0.00s infinite; }
@keyframes cvBreathe { 0%,100% { transform: rotate(-.55deg); } 50% { transform: rotate(.55deg); } }
.cover-front .sheen { animation: cvSheen 8.10s ease-in-out 0.00s infinite; }
@keyframes cvSheen { 0%,100% { stroke-opacity:.2; } 50% { stroke-opacity:.6; } }
.cover-front .haze { animation: cvHaze 14.30s ease-in-out 0.00s infinite; }
@keyframes cvHaze { 0%,100% { opacity:.62; } 50% { opacity:1; } }
.cover-front .c0 { animation: cvCrest0 4.10s ease-in-out 0.00s infinite; }
@keyframes cvCrest0 { 0%,100% { stroke-opacity:.5; } 50% { stroke-opacity:1; } }
.cover-front .c1 { animation: cvCrest1 4.93s ease-in-out 0.47s infinite; }
@keyframes cvCrest1 { 0%,100% { stroke-opacity:.5; } 50% { stroke-opacity:1; } }
.cover-front .c2 { animation: cvCrest2 5.76s ease-in-out 0.94s infinite; }
@keyframes cvCrest2 { 0%,100% { stroke-opacity:.5; } 50% { stroke-opacity:1; } }
.cover-front .c3 { animation: cvCrest3 6.59s ease-in-out 1.41s infinite; }
@keyframes cvCrest3 { 0%,100% { stroke-opacity:.5; } 50% { stroke-opacity:1; } }
.cover-front .c4 { animation: cvCrest4 7.42s ease-in-out 1.88s infinite; }
@keyframes cvCrest4 { 0%,100% { stroke-opacity:.5; } 50% { stroke-opacity:1; } }
.cover-front .c5 { animation: cvCrest5 8.25s ease-in-out 2.35s infinite; }
@keyframes cvCrest5 { 0%,100% { stroke-opacity:.5; } 50% { stroke-opacity:1; } }
.cover-front .c6 { animation: cvCrest6 9.08s ease-in-out 2.82s infinite; }
@keyframes cvCrest6 { 0%,100% { stroke-opacity:.5; } 50% { stroke-opacity:1; } }
.cover-front .c7 { animation: cvCrest7 9.91s ease-in-out 3.29s infinite; }
@keyframes cvCrest7 { 0%,100% { stroke-opacity:.5; } 50% { stroke-opacity:1; } }
.cover-front .c8 { animation: cvCrest8 10.74s ease-in-out 3.76s infinite; }
@keyframes cvCrest8 { 0%,100% { stroke-opacity:.5; } 50% { stroke-opacity:1; } }
.cover-front .c9 { animation: cvCrest9 11.57s ease-in-out 4.23s infinite; }
@keyframes cvCrest9 { 0%,100% { stroke-opacity:.5; } 50% { stroke-opacity:1; } }
.cover-front .c10 { animation: cvCrest10 12.40s ease-in-out 4.70s infinite; }
@keyframes cvCrest10 { 0%,100% { stroke-opacity:.5; } 50% { stroke-opacity:1; } }
.cover-front .c11 { animation: cvCrest11 13.23s ease-in-out 5.17s infinite; }
@keyframes cvCrest11 { 0%,100% { stroke-opacity:.5; } 50% { stroke-opacity:1; } }
.cover-front .b0 { animation: cvBand0 21.10s linear 0.00s infinite; }
@keyframes cvBand0 { 0%   { transform: translateX(-22px); } 100% { transform: translateX(22px); } }
.cover-front .b1 { animation: cvBand1 23.00s linear 1.30s infinite; }
@keyframes cvBand1 { 0%   { transform: translateX(-25px); } 100% { transform: translateX(25px); } }
.cover-front .b2 { animation: cvBand2 24.90s linear 2.60s infinite; }
@keyframes cvBand2 { 0%   { transform: translateX(-28px); } 100% { transform: translateX(28px); } }
.cover-front .b3 { animation: cvBand3 26.80s linear 3.90s infinite; }
@keyframes cvBand3 { 0%   { transform: translateX(-31px); } 100% { transform: translateX(31px); } }
.cover-front .b4 { animation: cvBand4 28.70s linear 5.20s infinite; }
@keyframes cvBand4 { 0%   { transform: translateX(-34px); } 100% { transform: translateX(34px); } }
.cover-front .b5 { animation: cvBand5 30.60s linear 6.50s infinite; }
@keyframes cvBand5 { 0%   { transform: translateX(-37px); } 100% { transform: translateX(37px); } }
.cover-front .b6 { animation: cvBand6 32.50s linear 7.80s infinite; }
@keyframes cvBand6 { 0%   { transform: translateX(-40px); } 100% { transform: translateX(40px); } }
.cover-front .vn0 { animation: cvVeinN0 9.10s ease-in-out 0.00s infinite; }
@keyframes cvVeinN0 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .vn1 { animation: cvVeinN1 9.47s ease-in-out 0.31s infinite; }
@keyframes cvVeinN1 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .vn2 { animation: cvVeinN2 9.84s ease-in-out 0.62s infinite; }
@keyframes cvVeinN2 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .vn3 { animation: cvVeinN3 10.21s ease-in-out 0.93s infinite; }
@keyframes cvVeinN3 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .vn4 { animation: cvVeinN4 10.58s ease-in-out 1.24s infinite; }
@keyframes cvVeinN4 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .vn5 { animation: cvVeinN5 10.95s ease-in-out 1.55s infinite; }
@keyframes cvVeinN5 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .vn6 { animation: cvVeinN6 11.32s ease-in-out 1.86s infinite; }
@keyframes cvVeinN6 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .vn7 { animation: cvVeinN7 11.69s ease-in-out 2.17s infinite; }
@keyframes cvVeinN7 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .vn8 { animation: cvVeinN8 12.06s ease-in-out 2.48s infinite; }
@keyframes cvVeinN8 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .vf0 { animation: cvVeinF0 13.30s ease-in-out 0.00s infinite; }
@keyframes cvVeinF0 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .vf1 { animation: cvVeinF1 13.67s ease-in-out 0.31s infinite; }
@keyframes cvVeinF1 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .vf2 { animation: cvVeinF2 14.04s ease-in-out 0.62s infinite; }
@keyframes cvVeinF2 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .vf3 { animation: cvVeinF3 14.41s ease-in-out 0.93s infinite; }
@keyframes cvVeinF3 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .vf4 { animation: cvVeinF4 14.78s ease-in-out 1.24s infinite; }
@keyframes cvVeinF4 { 0%,100% { stroke-opacity:.32; } 50% { stroke-opacity:.7; } }
.cover-front .m0 { animation: cvMot0 10.70s linear 0.00s infinite; }
@keyframes cvMot0 { 0% { opacity:0; transform: translate(0,0); } 20% { opacity:.5; } 76% { opacity:.28; } 100% { opacity:0; transform: translate(7.1px,-152.9px); } }
.cover-front .m1 { animation: cvMot1 11.31s linear 0.79s infinite; }
@keyframes cvMot1 { 0% { opacity:0; transform: translate(0,0); } 20% { opacity:.5; } 76% { opacity:.28; } 100% { opacity:0; transform: translate(11.1px,-94.0px); } }
.cover-front .m2 { animation: cvMot2 11.92s linear 1.58s infinite; }
@keyframes cvMot2 { 0% { opacity:0; transform: translate(0,0); } 20% { opacity:.5; } 76% { opacity:.28; } 100% { opacity:0; transform: translate(-16.5px,-120.9px); } }
.cover-front .m3 { animation: cvMot3 12.53s linear 2.37s infinite; }
@keyframes cvMot3 { 0% { opacity:0; transform: translate(0,0); } 20% { opacity:.5; } 76% { opacity:.28; } 100% { opacity:0; transform: translate(21.0px,-120.8px); } }
.cover-front .m4 { animation: cvMot4 13.14s linear 3.16s infinite; }
@keyframes cvMot4 { 0% { opacity:0; transform: translate(0,0); } 20% { opacity:.5; } 76% { opacity:.28; } 100% { opacity:0; transform: translate(-20.7px,-105.4px); } }
.cover-front .m5 { animation: cvMot5 13.75s linear 3.95s infinite; }
@keyframes cvMot5 { 0% { opacity:0; transform: translate(0,0); } 20% { opacity:.5; } 76% { opacity:.28; } 100% { opacity:0; transform: translate(9.8px,-139.8px); } }
.cover-front .m6 { animation: cvMot6 14.36s linear 4.74s infinite; }
@keyframes cvMot6 { 0% { opacity:0; transform: translate(0,0); } 20% { opacity:.5; } 76% { opacity:.28; } 100% { opacity:0; transform: translate(-9.3px,-154.8px); } }
.cover-front .m7 { animation: cvMot7 14.97s linear 0.00s infinite; }
@keyframes cvMot7 { 0% { opacity:0; transform: translate(0,0); } 20% { opacity:.5; } 76% { opacity:.28; } 100% { opacity:0; transform: translate(-16.2px,-102.7px); } }
.cover-front .m8 { animation: cvMot8 15.58s linear 0.79s infinite; }
@keyframes cvMot8 { 0% { opacity:0; transform: translate(0,0); } 20% { opacity:.5; } 76% { opacity:.28; } 100% { opacity:0; transform: translate(-2.4px,-117.3px); } }
.cover-front .m9 { animation: cvMot9 16.19s linear 1.58s infinite; }
@keyframes cvMot9 { 0% { opacity:0; transform: translate(0,0); } 20% { opacity:.5; } 76% { opacity:.28; } 100% { opacity:0; transform: translate(-4.6px,-76.1px); } }
.cover-front .m10 { animation: cvMot10 16.80s linear 2.37s infinite; }
@keyframes cvMot10 { 0% { opacity:0; transform: translate(0,0); } 20% { opacity:.5; } 76% { opacity:.28; } 100% { opacity:0; transform: translate(17.6px,-100.4px); } }
.cover-front .m11 { animation: cvMot11 17.41s linear 3.16s infinite; }
@keyframes cvMot11 { 0% { opacity:0; transform: translate(0,0); } 20% { opacity:.5; } 76% { opacity:.28; } 100% { opacity:0; transform: translate(-4.7px,-141.8px); } }
.cover-front .m12 { animation: cvMot12 18.02s linear 3.95s infinite; }
@keyframes cvMot12 { 0% { opacity:0; transform: translate(0,0); } 20% { opacity:.5; } 76% { opacity:.28; } 100% { opacity:0; transform: translate(9.0px,-143.8px); } }
.cover-front .t0 { opacity:0; animation: cvT0 1.00s cubic-bezier(.22,.9,.3,1) 0.28s both; }
@keyframes cvT0 { from { opacity:0; transform:translateY(-14px); } to { opacity:1; transform:none; } }
.cover-front .byl { opacity:0; animation: cvByl 1.20s ease-out 1.08s both; }
@keyframes cvByl { from { opacity:0; } to { opacity:1; } }
.cover-front .ftr { opacity:0; animation: cvFtr 1.20s ease-out 3.00s both; }
@keyframes cvFtr { from { opacity:0; } to { opacity:1; } }
