
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(62,44,16,.30), rgba(62,44,16,.10) 52%, rgba(62,44,16,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(62,44,16,.26), rgba(62,44,16,.09) 52%, rgba(62,44,16,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(62,44,16,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;
}
.nav:hover { color: rgba(255,255,255,.75); }
#nav-prev { left: 4px; }
#nav-next { right: 4px; }

#hint {
  position: fixed; left: 50%; bottom: 12px; 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;
}

/* ---- The Wind in the Willows: river-green binding, gilt willow and boat ---- */
.cover {
  background:
    radial-gradient(ellipse at 32% 20%, rgba(255,225,215,.09), rgba(0,0,0,0) 55%),
    linear-gradient(135deg, #2b0d10 0%, #6b1f21 46%, #2b0d10 100%);
  box-shadow: inset 0 0 46px rgba(0,0,0,.5);
}
.cover-frame { border-color: #c2a75c; color: #f0e0a4; overflow: hidden; }
.cover-orn { color: #8f7f42; } .cover-sub { color: #bda869; } .cover-author { color: #ddcb8c; }
.endpaper {
  background:
    repeating-linear-gradient(45deg, rgba(120,70,65,.06) 0 3px, rgba(0,0,0,0) 3px 6px),
    linear-gradient(#e2d9d2, #d0c5bd);
  box-shadow: inset 0 0 55px rgba(80,30,30,.28);
}
.cover-front .cover-title { display: flex; flex-direction: column; line-height: 1.1; }
.t-the { font-size: .3em; letter-spacing: .42em; text-indent: .42em; color: #b3a066; margin-bottom: .9em; }
.t-word { display: block; letter-spacing: .07em; }
.cover-front .cover-title i {
  font-style: normal; display: inline-block;
  background: linear-gradient(105deg, #85702f 22%, #e2c979 38%, #fff4c8 48%, #a8cdb0 58%, #85702f 78%);
  background-size: 260% 100%;
  -webkit-background-clip: text; background-clip: text; color: transparent;
  animation: ww-shimmer 6.5s linear infinite; animation-delay: calc(var(--d) * .24s);
}
@keyframes ww-shimmer { 0% { background-position: 150% 0; } 100% { background-position: -150% 0; } }

.ww-art { display: block; width: 100%; height: 6em; margin-top: .55em; position: relative; }
.ww-art svg { width: 100%; height: 100%; overflow: visible; }
.ww-tree, .ww-boat { filter: drop-shadow(0 0 3px rgba(225,200,120,.22)); }
/* fronds and reeds sway on the breeze */
.fr { transform-box: fill-box; transform-origin: top center;
      animation: ww-sway 5.5s ease-in-out infinite; animation-delay: var(--o); }
@keyframes ww-sway {
  0%,100% { transform: rotate(-2.4deg); }
  50% { transform: rotate(2.4deg); }
}
/* the river slides quietly past */
.rp { animation: ww-drift 9s linear infinite; animation-delay: var(--o); opacity: .75; }
@keyframes ww-drift { from { transform: translateX(0); } to { transform: translateX(-40px); } }
/* and the boat rocks on it */
.ww-boat { transform-box: fill-box; transform-origin: center bottom;
           animation: ww-bob 5.5s ease-in-out infinite; }
@keyframes ww-bob {
  0%,100% { transform: translateY(0) rotate(-1.4deg); }
  50% { transform: translateY(-1.6px) rotate(1.4deg); }
}
