/* Keyword effects for the on-screen lyric (see words.js → EFFECT_WORDS).
   GENERATED by build/make-fx.cjs — edit that script, not this file.

   A word that matches gets `fx fx-<name>` when its line is mounted. Everything below
   plays only while the word is being sung (`.on`) and fades out after (`.done`). */

.w.fx { position: relative; }
.w.fx::before,
.w.fx::after {
  content: "";
  position: absolute;
  pointer-events: none;
  opacity: 0;
  background-position: center;
  background-size: contain;
  background-repeat: no-repeat;
  transition: opacity 0.3s ease-out, transform 0.45s cubic-bezier(0.23, 1, 0.32, 1);
}
.w.fx.on::before,
.w.fx.on::after { opacity: 1; }

/* ---- wings (blue): unfold, flap while sung, fold away after ---- */
.w.fx-wings { --ink: #d6e8ff; --accent: #3b82f6; margin: 0 0.8em; }
.w.fx-wings::before,
.w.fx-wings::after { top: 0.1em; width: 1.1em; height: 0.825em; }
.w.fx-wings::before {
  right: calc(100% - 0.12em);
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjAgOTAiPgogIDxkZWZzPgogICAgPGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iMSIgeTE9IjAuMiIgeDI9IjAiIHkyPSIwLjkiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2U5ZjRmZiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzZmYThmZiIvPjwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImIiIHgxPSIxIiB5MT0iMCIgeDI9IjAiIHkyPSIxIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmZmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNiOWQ2ZmYiLz48L2xpbmVhckdyYWRpZW50PgogIDwvZGVmcz4KICA8ZyBmaWxsPSJ1cmwoI2EpIiBzdHJva2U9IiMyZjZmZTAiIHN0cm9rZS13aWR0aD0iMS4xIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIwLjk2Ij48cGF0aCBkPSJNMTEyLjAgNjAuMCBRMTE5LjAgMzAuNCAxMDEuNiAxMS4xIFE5My42IDM1LjggMTEyLjAgNjAuMFoiLz48cGF0aCBkPSJNMTEyLjAgNjAuMCBRMTA4LjcgMjMuNyA4NC44IDQuMyBRODUuNCAzNS4wIDExMi4wIDYwLjBaIi8+PHBhdGggZD0iTTExMi4wIDYwLjAgUTk1LjggMjAuNSA2NC40IDMuMyBRNzUuOSAzNy4yIDExMi4wIDYwLjBaIi8+PHBhdGggZD0iTTExMi4wIDYwLjAgUTgyLjMgMjIuMyA0NC4wIDEwLjYgUTY3LjAgNDMuNCAxMTIuMCA2MC4wWiIvPjxwYXRoIGQ9Ik0xMTIuMCA2MC4wIFE3MS4wIDI5LjQgMjguNiAyNi4zIFE2MS4yIDUzLjUgMTEyLjAgNjAuMFoiLz48cGF0aCBkPSJNMTEyLjAgNjAuMCBRNjMuNyA0MC4xIDIwLjkgNDcuMiBRNjAuMSA2NS44IDExMi4wIDYwLjBaIi8+PHBhdGggZD0iTTExMi4wIDYwLjAgUTY0LjcgNTEuOSAyOC41IDY4LjggUTY3LjQgNzcuOCAxMTIuMCA2MC4wWiIvPjwvZz4KICA8ZyBmaWxsPSJ1cmwoI2IpIiBzdHJva2U9IiM1YjkyZWUiIHN0cm9rZS13aWR0aD0iMC45IiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMTEyLjAgNjAuMCBRMTE1LjQgNDAuMCAxMDEuMSAyOS45IFE5Ni42IDQ2LjkgMTEyLjAgNjAuMFoiLz48cGF0aCBkPSJNMTEyLjAgNjAuMCBRMTA4LjAgMzYuMiA4OS42IDI2LjggUTkxLjQgNDcuNCAxMTIuMCA2MC4wWiIvPjxwYXRoIGQ9Ik0xMTIuMCA2MC4wIFE5OS4xIDM0LjkgNzYuMyAyNy45IFE4NS43IDQ5LjggMTEyLjAgNjAuMFoiLz48cGF0aCBkPSJNMTEyLjAgNjAuMCBROTAuNSAzNy4yIDY0LjMgMzQuNiBRODEuMSA1NC45IDExMi4wIDYwLjBaIi8+PHBhdGggZD0iTTExMi4wIDYwLjAgUTg0LjUgNDIuOCA1Ny43IDQ2LjUgUTc5LjcgNjIuMyAxMTIuMCA2MC4wWiIvPjxwYXRoIGQ9Ik0xMTIuMCA2MC4wIFE4My40IDUwLjAgNjAuMCA2MC4wIFE4My40IDcwLjAgMTEyLjAgNjAuMFoiLz48L2c+CiAgPGVsbGlwc2UgY3g9IjEwOCIgY3k9IjU4IiByeD0iOSIgcnk9IjciIGZpbGw9IiNmZmZmZmYiIG9wYWNpdHk9IjAuOTUiLz4KPC9zdmc+");
  transform-origin: 88% 66%;
  transform: scale(0.35) rotate(-30deg);
}
.w.fx-wings::after {
  left: calc(100% - 0.12em);
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjAgOTAiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEyMCAwKSBzY2FsZSgtMSAxKSI+CiAgPGRlZnM+CiAgICA8bGluZWFyR3JhZGllbnQgaWQ9ImEiIHgxPSIxIiB5MT0iMC4yIiB4Mj0iMCIgeTI9IjAuOSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZTlmNGZmIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNmZhOGZmIi8+PC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjEiIHkxPSIwIiB4Mj0iMCIgeTI9IjEiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2I5ZDZmZiIvPjwvbGluZWFyR3JhZGllbnQ+CiAgPC9kZWZzPgogIDxnIGZpbGw9InVybCgjYSkiIHN0cm9rZT0iIzJmNmZlMCIgc3Ryb2tlLXdpZHRoPSIxLjEiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIG9wYWNpdHk9IjAuOTYiPjxwYXRoIGQ9Ik0xMTIuMCA2MC4wIFExMTkuMCAzMC40IDEwMS42IDExLjEgUTkzLjYgMzUuOCAxMTIuMCA2MC4wWiIvPjxwYXRoIGQ9Ik0xMTIuMCA2MC4wIFExMDguNyAyMy43IDg0LjggNC4zIFE4NS40IDM1LjAgMTEyLjAgNjAuMFoiLz48cGF0aCBkPSJNMTEyLjAgNjAuMCBROTUuOCAyMC41IDY0LjQgMy4zIFE3NS45IDM3LjIgMTEyLjAgNjAuMFoiLz48cGF0aCBkPSJNMTEyLjAgNjAuMCBRODIuMyAyMi4zIDQ0LjAgMTAuNiBRNjcuMCA0My40IDExMi4wIDYwLjBaIi8+PHBhdGggZD0iTTExMi4wIDYwLjAgUTcxLjAgMjkuNCAyOC42IDI2LjMgUTYxLjIgNTMuNSAxMTIuMCA2MC4wWiIvPjxwYXRoIGQ9Ik0xMTIuMCA2MC4wIFE2My43IDQwLjEgMjAuOSA0Ny4yIFE2MC4xIDY1LjggMTEyLjAgNjAuMFoiLz48cGF0aCBkPSJNMTEyLjAgNjAuMCBRNjQuNyA1MS45IDI4LjUgNjguOCBRNjcuNCA3Ny44IDExMi4wIDYwLjBaIi8+PC9nPgogIDxnIGZpbGw9InVybCgjYikiIHN0cm9rZT0iIzViOTJlZSIgc3Ryb2tlLXdpZHRoPSIwLjkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0xMTIuMCA2MC4wIFExMTUuNCA0MC4wIDEwMS4xIDI5LjkgUTk2LjYgNDYuOSAxMTIuMCA2MC4wWiIvPjxwYXRoIGQ9Ik0xMTIuMCA2MC4wIFExMDguMCAzNi4yIDg5LjYgMjYuOCBROTEuNCA0Ny40IDExMi4wIDYwLjBaIi8+PHBhdGggZD0iTTExMi4wIDYwLjAgUTk5LjEgMzQuOSA3Ni4zIDI3LjkgUTg1LjcgNDkuOCAxMTIuMCA2MC4wWiIvPjxwYXRoIGQ9Ik0xMTIuMCA2MC4wIFE5MC41IDM3LjIgNjQuMyAzNC42IFE4MS4xIDU0LjkgMTEyLjAgNjAuMFoiLz48cGF0aCBkPSJNMTEyLjAgNjAuMCBRODQuNSA0Mi44IDU3LjcgNDYuNSBRNzkuNyA2Mi4zIDExMi4wIDYwLjBaIi8+PHBhdGggZD0iTTExMi4wIDYwLjAgUTgzLjQgNTAuMCA2MC4wIDYwLjAgUTgzLjQgNzAuMCAxMTIuMCA2MC4wWiIvPjwvZz4KICA8ZWxsaXBzZSBjeD0iMTA4IiBjeT0iNTgiIHJ4PSI5IiByeT0iNyIgZmlsbD0iI2ZmZmZmZiIgb3BhY2l0eT0iMC45NSIvPgo8L2c+PC9zdmc+");
  transform-origin: 12% 66%;
  transform: scale(0.35) rotate(30deg);
}
.w.fx-wings.on::before { transform: scale(1) rotate(0deg); animation: fxFlapL 0.42s ease-in-out 0.12s infinite alternate; }
.w.fx-wings.on::after  { transform: scale(1) rotate(0deg); animation: fxFlapR 0.42s ease-in-out 0.12s infinite alternate; }
@keyframes fxFlapL { from { transform: scale(1) rotate(0deg); } to { transform: scale(1.04) rotate(14deg); } }
@keyframes fxFlapR { from { transform: scale(1) rotate(0deg); } to { transform: scale(1.04) rotate(-14deg); } }

/* ---- fire: flames flicker up off the letters ---- */
.w.fx-fire { --ink: #ffe28f; --accent: #ff6a1a; }
.w.fx-fire::before { left: 6%;  top: -0.34em; width: 0.62em; height: 0.83em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MCA4MCI+CiAgICA8ZGVmcz4KICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJvIiB4MT0iMCIgeTE9IjEiIHgyPSIwIiB5Mj0iMCI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmYzYjAwIi8+PHN0b3Agb2Zmc2V0PSIwLjU1IiBzdG9wLWNvbG9yPSIjZmY4YTAwIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZkMjNhIi8+PC9saW5lYXJHcmFkaWVudD4KICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMCIgeTE9IjEiIHgyPSIwIiB5Mj0iMCI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZiMzAwIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmNmIwIi8+PC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxwYXRoIGZpbGw9InVybCgjbykiIGQ9Ik0zMSAyIEMzMyAxOCA1MiAzMCA1MyA1MiBDNTQgNjggNDMgNzggMzAgNzggQzE3IDc4IDYgNjggNyA1MiBDOCA0MSAxNSAzNSAxOSAyNCBDMjIgMzEgMjQgMzMgMjcgMzAgQzI5IDIyIDI5IDEyIDMxIDIgWiIvPgogICAgPHBhdGggZmlsbD0idXJsKCNpKSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzAgNzgpIHNjYWxlKDAuNTYpIHRyYW5zbGF0ZSgtMzAgLTc4KSIgZD0iTTMxIDIgQzMzIDE4IDUyIDMwIDUzIDUyIEM1NCA2OCA0MyA3OCAzMCA3OCBDMTcgNzggNiA2OCA3IDUyIEM4IDQxIDE1IDM1IDE5IDI0IEMyMiAzMSAyNCAzMyAyNyAzMCBDMjkgMjIgMjkgMTIgMzEgMiBaIi8+CiAgPC9zdmc+"); transform-origin: 50% 100%; }
.w.fx-fire::after  { right: 4%; top: -0.2em;  width: 0.46em; height: 0.62em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MCA4MCI+CiAgICA8ZGVmcz4KICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJvIiB4MT0iMCIgeTE9IjEiIHgyPSIwIiB5Mj0iMCI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmYzYjAwIi8+PHN0b3Agb2Zmc2V0PSIwLjU1IiBzdG9wLWNvbG9yPSIjZmY4YTAwIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZkMjNhIi8+PC9saW5lYXJHcmFkaWVudD4KICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJpIiB4MT0iMCIgeTE9IjEiIHgyPSIwIiB5Mj0iMCI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZiMzAwIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZmZmNmIwIi8+PC9saW5lYXJHcmFkaWVudD4KICAgIDwvZGVmcz4KICAgIDxwYXRoIGZpbGw9InVybCgjbykiIGQ9Ik0zMSAyIEMzMyAxOCA1MiAzMCA1MyA1MiBDNTQgNjggNDMgNzggMzAgNzggQzE3IDc4IDYgNjggNyA1MiBDOCA0MSAxNSAzNSAxOSAyNCBDMjIgMzEgMjQgMzMgMjcgMzAgQzI5IDIyIDI5IDEyIDMxIDIgWiIvPgogICAgPHBhdGggZmlsbD0idXJsKCNpKSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzAgNzgpIHNjYWxlKDAuNTYpIHRyYW5zbGF0ZSgtMzAgLTc4KSIgZD0iTTMxIDIgQzMzIDE4IDUyIDMwIDUzIDUyIEM1NCA2OCA0MyA3OCAzMCA3OCBDMTcgNzggNiA2OCA3IDUyIEM4IDQxIDE1IDM1IDE5IDI0IEMyMiAzMSAyNCAzMyAyNyAzMCBDMjkgMjIgMjkgMTIgMzEgMiBaIi8+CiAgPC9zdmc+"); transform-origin: 50% 100%; }
.w.fx-fire.on::before { animation: fxFlame 0.5s ease-in-out infinite alternate; }
.w.fx-fire.on::after  { animation: fxFlame 0.43s ease-in-out 0.1s infinite alternate; }
@keyframes fxFlame {
  from { transform: scale(0.92, 0.84) skewX(-6deg); opacity: 0.85; }
  to   { transform: scale(1.06, 1.16) skewX(7deg);  opacity: 1; }
}

/* ---- heart: the word beats, little hearts drift up ---- */
.w.fx-heart { --ink: #ffc6d8; --accent: #ff3d7f; }
.w.fx-heart::before { left: 12%;  top: -0.1em; width: 0.36em; height: 0.34em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMCI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIwIiB5MT0iMCIgeDI9IjAuNCIgeTI9IjEiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmOWFiOCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmMmQ2ZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPgogICAgPHBhdGggZmlsbD0idXJsKCNoKSIgZD0iTTE2IDI4LjUgQy01IDE0LjUgMyAtMSAxNiA4LjIgQzI5IC0xIDM3IDE0LjUgMTYgMjguNSBaIi8+CiAgPC9zdmc+"); }
.w.fx-heart::after  { right: 10%; top: 0;      width: 0.3em;  height: 0.28em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMCI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImgiIHgxPSIwIiB5MT0iMCIgeDI9IjAuNCIgeTI9IjEiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmOWFiOCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmMmQ2ZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPgogICAgPHBhdGggZmlsbD0idXJsKCNoKSIgZD0iTTE2IDI4LjUgQy01IDE0LjUgMyAtMSAxNiA4LjIgQzI5IC0xIDM3IDE0LjUgMTYgMjguNSBaIi8+CiAgPC9zdmc+"); }
.w.fx-heart.on { animation: fxBeat 0.64s ease-in-out infinite; }
.w.fx-heart.on::before { animation: fxFloat 1.5s ease-out infinite both; }
.w.fx-heart.on::after  { animation: fxFloat 1.5s ease-out 0.7s infinite both; }
@keyframes fxBeat {
  0%, 100% { transform: translateY(-0.05em) scale(1.07); }
  14%      { transform: translateY(-0.05em) scale(1.2); }
  28%      { transform: translateY(-0.05em) scale(1.09); }
  42%      { transform: translateY(-0.05em) scale(1.17); }
}
@keyframes fxFloat {
  from { opacity: 0; transform: translateY(0.1em) scale(0.5); }
  18%  { opacity: 1; }
  to   { opacity: 0; transform: translateY(-1.05em) scale(1.05); }
}

/* ---- rain / tears: drops fall from the word ---- */
.w.fx-rain { --ink: #d2e5ff; --accent: #4d8dff; }
.w.fx-rain::before { left: 26%; top: 0.85em; width: 0.2em; height: 0.3em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAzMCI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIxIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNkOWViZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzZjg2ZmYiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz4KICAgIDxwYXRoIGZpbGw9InVybCgjZCkiIGQ9Ik0xMCAxIEMxMCAxIDIgMTIgMiAxOS41IEE4IDggMCAwIDAgMTggMTkuNSBDMTggMTIgMTAgMSAxMCAxIFoiLz4KICA8L3N2Zz4="); }
.w.fx-rain::after  { left: 62%; top: 0.8em;  width: 0.17em; height: 0.26em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAzMCI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImQiIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIxIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNkOWViZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzZjg2ZmYiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz4KICAgIDxwYXRoIGZpbGw9InVybCgjZCkiIGQ9Ik0xMCAxIEMxMCAxIDIgMTIgMiAxOS41IEE4IDggMCAwIDAgMTggMTkuNSBDMTggMTIgMTAgMSAxMCAxIFoiLz4KICA8L3N2Zz4="); }
.w.fx-rain.on::before { animation: fxDrop 1s ease-in infinite both; }
.w.fx-rain.on::after  { animation: fxDrop 1s ease-in 0.45s infinite both; }
@keyframes fxDrop {
  from { opacity: 0; transform: translateY(-0.15em); }
  20%  { opacity: 1; }
  to   { opacity: 0; transform: translateY(1em); }
}

/* ---- stars / shine: sparkles twinkle around the word ---- */
.w.fx-stars { --ink: #fff3c2; --accent: #ffd54a; }
.w.fx-stars::before { right: -0.12em; top: -0.34em; width: 0.5em;  height: 0.5em;  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9InMiIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIxIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmZmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmNmM2YiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz4KICAgIDxwYXRoIGZpbGw9InVybCgjcykiIGQ9Ik0yMCAwIEMyMS41IDEzIDI3IDE4LjUgNDAgMjAgQzI3IDIxLjUgMjEuNSAyNyAyMCA0MCBDMTguNSAyNyAxMyAyMS41IDAgMjAgQzEzIDE4LjUgMTguNSAxMyAyMCAwIFoiLz4KICA8L3N2Zz4="); }
.w.fx-stars::after  { left: -0.14em;  top: 0.72em;  width: 0.36em; height: 0.36em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9InMiIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIxIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmZmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmNmM2YiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz4KICAgIDxwYXRoIGZpbGw9InVybCgjcykiIGQ9Ik0yMCAwIEMyMS41IDEzIDI3IDE4LjUgNDAgMjAgQzI3IDIxLjUgMjEuNSAyNyAyMCA0MCBDMTguNSAyNyAxMyAyMS41IDAgMjAgQzEzIDE4LjUgMTguNSAxMyAyMCAwIFoiLz4KICA8L3N2Zz4="); }
.w.fx-stars.on::before { animation: fxTwinkle 0.9s ease-in-out infinite both; }
.w.fx-stars.on::after  { animation: fxTwinkle 0.9s ease-in-out 0.35s infinite both; }
@keyframes fxTwinkle {
  0%, 100% { opacity: 0; transform: scale(0.2) rotate(0deg); }
  50%      { opacity: 1; transform: scale(1) rotate(45deg); }
}

/* ---- sun / gold: a little sun spins above, the word glows warm ---- */
.w.fx-sun { --ink: #fff0a8; --accent: #ffae1a; }
.w.fx-sun::before { right: -0.2em; top: -0.46em; width: 0.62em; height: 0.62em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+CiAgICA8ZGVmcz48cmFkaWFsR3JhZGllbnQgaWQ9ImciIGN4PSIwLjQiIGN5PSIwLjM1IiByPSIwLjgiPjxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvcj0iI2ZmZjdiMCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iI2ZmYTUxZiIvPjwvcmFkaWFsR3JhZGllbnQ+PC9kZWZzPgogICAgPGcgc3Ryb2tlPSIjZmZjMjMzIiBzdHJva2Utd2lkdGg9IjQiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+CiAgICAgIDxsaW5lIHgxPSIyNCIgeTE9IjMiIHgyPSIyNCIgeTI9IjkiLz48bGluZSB4MT0iMjQiIHkxPSIzOSIgeDI9IjI0IiB5Mj0iNDUiLz4KICAgICAgPGxpbmUgeDE9IjMiIHkxPSIyNCIgeDI9IjkiIHkyPSIyNCIvPjxsaW5lIHgxPSIzOSIgeTE9IjI0IiB4Mj0iNDUiIHkyPSIyNCIvPgogICAgICA8bGluZSB4MT0iOS4yIiB5MT0iOS4yIiB4Mj0iMTMuNCIgeTI9IjEzLjQiLz48bGluZSB4MT0iMzQuNiIgeTE9IjM0LjYiIHgyPSIzOC44IiB5Mj0iMzguOCIvPgogICAgICA8bGluZSB4MT0iMzguOCIgeTE9IjkuMiIgeDI9IjM0LjYiIHkyPSIxMy40Ii8+PGxpbmUgeDE9IjEzLjQiIHkxPSIzNC42IiB4Mj0iOS4yIiB5Mj0iMzguOCIvPgogICAgPC9nPgogICAgPGNpcmNsZSBjeD0iMjQiIGN5PSIyNCIgcj0iMTAuNSIgZmlsbD0idXJsKCNnKSIvPgogIDwvc3ZnPg=="); }
.w.fx-sun.on { animation: fxGlow 0.9s ease-in-out infinite alternate; }
.w.fx-sun.on::before { animation: fxSpin 5s linear infinite; }
@keyframes fxGlow {
  from { filter: drop-shadow(0 0 0.28em rgba(255, 174, 26, 0.55)); }
  to   { filter: drop-shadow(0 0 0.7em rgba(255, 174, 26, 0.95)); }
}
@keyframes fxSpin { to { transform: rotate(360deg); } }

/* ---- ice / snow / cold: snowflakes turn slowly ---- */
.w.fx-ice { --ink: #e4f6ff; --accent: #7fd4ff; }
.w.fx-ice::before { left: -0.16em; top: -0.46em; width: 0.56em; height: 0.56em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+CiAgICA8ZyBzdHJva2U9IiNkNmYxZmYiIHN0cm9rZS13aWR0aD0iMy4yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIGZpbGw9Im5vbmUiPgogICAgICA8ZyBpZD0iYXJtIj48bGluZSB4MT0iMjQiIHkxPSI0IiB4Mj0iMjQiIHkyPSI0NCIvPjxwb2x5bGluZSBwb2ludHM9IjE4LDEwIDI0LDE1IDMwLDEwIi8+PHBvbHlsaW5lIHBvaW50cz0iMTgsMzggMjQsMzMgMzAsMzgiLz48L2c+CiAgICAgIDx1c2UgaHJlZj0iI2FybSIgdHJhbnNmb3JtPSJyb3RhdGUoNjAgMjQgMjQpIi8+PHVzZSBocmVmPSIjYXJtIiB0cmFuc2Zvcm09InJvdGF0ZSgxMjAgMjQgMjQpIi8+CiAgICA8L2c+CiAgICA8Y2lyY2xlIGN4PSIyNCIgY3k9IjI0IiByPSIzIiBmaWxsPSIjZmZmZmZmIi8+CiAgPC9zdmc+"); }
.w.fx-ice::after  { right: -0.1em; top: 0.8em;   width: 0.36em; height: 0.36em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+CiAgICA8ZyBzdHJva2U9IiNkNmYxZmYiIHN0cm9rZS13aWR0aD0iMy4yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIGZpbGw9Im5vbmUiPgogICAgICA8ZyBpZD0iYXJtIj48bGluZSB4MT0iMjQiIHkxPSI0IiB4Mj0iMjQiIHkyPSI0NCIvPjxwb2x5bGluZSBwb2ludHM9IjE4LDEwIDI0LDE1IDMwLDEwIi8+PHBvbHlsaW5lIHBvaW50cz0iMTgsMzggMjQsMzMgMzAsMzgiLz48L2c+CiAgICAgIDx1c2UgaHJlZj0iI2FybSIgdHJhbnNmb3JtPSJyb3RhdGUoNjAgMjQgMjQpIi8+PHVzZSBocmVmPSIjYXJtIiB0cmFuc2Zvcm09InJvdGF0ZSgxMjAgMjQgMjQpIi8+CiAgICA8L2c+CiAgICA8Y2lyY2xlIGN4PSIyNCIgY3k9IjI0IiByPSIzIiBmaWxsPSIjZmZmZmZmIi8+CiAgPC9zdmc+"); }
.w.fx-ice.on::before { animation: fxSpin 7s linear infinite; }
.w.fx-ice.on::after  { animation: fxSpin 5s linear infinite reverse; }

/* ---- thunder / lightning: a bolt flickers (≤2 flashes a second, kept gentle) ---- */
.w.fx-thunder { --ink: #fff9cf; --accent: #ffe14d; }
.w.fx-thunder::before { left: 34%; top: -0.5em; width: 0.4em; height: 0.64em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzNiA1NiI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9InoiIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIxIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmZmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmQ0MDAiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz4KICAgIDxwYXRoIGZpbGw9InVybCgjeikiIHN0cm9rZT0iI2ZmZjNhMCIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Ik0yMyAxIEwzIDMxIEwxNS41IDMxIEwxMCA1NSBMMzMgMjEgTDIwIDIxIEwyNyAxIFoiLz4KICA8L3N2Zz4="); }
.w.fx-thunder.on { animation: fxFlash 1.6s ease-in-out infinite; }
.w.fx-thunder.on::before { animation: fxZap 1.6s linear infinite both; }
@keyframes fxZap {
  0%, 100% { opacity: 0; }
  4%, 12%  { opacity: 1; }
  14%      { opacity: 0.15; }
  22%, 46% { opacity: 1; }
  60%      { opacity: 0; }
}
@keyframes fxFlash {
  0%, 100% { filter: drop-shadow(0 0 0.35em rgba(255, 225, 77, 0.6)) brightness(1); }
  4%, 12%  { filter: drop-shadow(0 0 0.8em rgba(255, 240, 150, 1)) brightness(1.3); }
  22%, 46% { filter: drop-shadow(0 0 0.6em rgba(255, 225, 77, 0.9)) brightness(1.2); }
}

/* ---- music / sing: notes float up ---- */
.w.fx-music { --ink: #e6d9ff; --accent: #a46bf7; }
.w.fx-music::before,
.w.fx-music::after { font-size: 0.6em; line-height: 1; color: var(--accent); font-weight: 700; }
.w.fx-music::before { content: "\266A"; left: -0.1em; top: 0; }
.w.fx-music::after  { content: "\266B"; right: -0.06em; top: 0.1em; }
.w.fx-music.on::before { animation: fxNote 1.4s ease-out infinite both; }
.w.fx-music.on::after  { animation: fxNote 1.4s ease-out 0.6s infinite both; }
@keyframes fxNote {
  from { opacity: 0; transform: translate(0, 0.25em) scale(0.7); }
  20%  { opacity: 1; }
  to   { opacity: 0; transform: translate(0.18em, -1em) scale(1.05) rotate(10deg); }
}

/* ---- money / cash: green $ signs flip and rise ---- */
.w.fx-money { --ink: #c9ffd6; --accent: #2ecc71; }
.w.fx-money::before,
.w.fx-money::after { font-weight: 800; line-height: 1; color: var(--accent); }
.w.fx-money::before { content: "$"; left: 4%;  top: -0.05em; font-size: 0.62em; }
.w.fx-money::after  { content: "$"; right: 6%; top: 0.1em;   font-size: 0.5em; }
.w.fx-money.on::before { animation: fxCoin 1.5s ease-out infinite both; }
.w.fx-money.on::after  { animation: fxCoin 1.5s ease-out 0.7s infinite both; }
@keyframes fxCoin {
  from { opacity: 0; transform: translateY(0.2em) scaleX(1); }
  18%  { opacity: 1; }
  35%  { transform: translateY(-0.2em) scaleX(0.15); }
  55%  { transform: translateY(-0.45em) scaleX(1); }
  75%  { transform: translateY(-0.7em) scaleX(0.15); }
  to   { opacity: 0; transform: translateY(-1em) scaleX(1); }
}

/* ---- crown / king / queen: a crown drops onto the word ---- */
.w.fx-crown { --ink: #ffeaa8; --accent: #ffc83d; }
.w.fx-crown::before { left: calc(50% - 0.32em); top: -0.66em; width: 0.64em; height: 0.49em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MCA0NiI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImMiIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIxIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmYwYTYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmMGE1MDAiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz4KICAgIDxwYXRoIGQ9Ik02IDM2IEw5IDEzIEwyMSAyNSBMMzAgNyBMMzkgMjUgTDUxIDEzIEw1NCAzNiBaIiBmaWxsPSJ1cmwoI2MpIiBzdHJva2U9IiNiODg2MGIiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgogICAgPHJlY3QgeD0iNiIgeT0iMzQiIHdpZHRoPSI0OCIgaGVpZ2h0PSI5IiByeD0iMyIgZmlsbD0iI2U2OWEwMCIgc3Ryb2tlPSIjYjg4NjBiIiBzdHJva2Utd2lkdGg9IjIiLz4KICAgIDxjaXJjbGUgY3g9IjkiIGN5PSIxMiIgcj0iMy42IiBmaWxsPSIjZmZmZmZmIi8+PGNpcmNsZSBjeD0iMzAiIGN5PSI2IiByPSIzLjYiIGZpbGw9IiNmZmZmZmYiLz48Y2lyY2xlIGN4PSI1MSIgY3k9IjEyIiByPSIzLjYiIGZpbGw9IiNmZmZmZmYiLz4KICAgIDxjaXJjbGUgY3g9IjMwIiBjeT0iMzguNSIgcj0iMi41IiBmaWxsPSIjZmY0ZDZkIi8+PGNpcmNsZSBjeD0iMTciIGN5PSIzOC41IiByPSIxLjgiIGZpbGw9IiM1ZWUwZmYiLz48Y2lyY2xlIGN4PSI0MyIgY3k9IjM4LjUiIHI9IjEuOCIgZmlsbD0iIzVlZTBmZiIvPgogIDwvc3ZnPg=="); transform-origin: 50% 100%; }
.w.fx-crown::after  { left: calc(50% + 0.18em); top: -0.8em;  width: 0.26em; height: 0.26em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9InMiIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIxIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmZmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmNmM2YiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz4KICAgIDxwYXRoIGZpbGw9InVybCgjcykiIGQ9Ik0yMCAwIEMyMS41IDEzIDI3IDE4LjUgNDAgMjAgQzI3IDIxLjUgMjEuNSAyNyAyMCA0MCBDMTguNSAyNyAxMyAyMS41IDAgMjAgQzEzIDE4LjUgMTguNSAxMyAyMCAwIFoiLz4KICA8L3N2Zz4="); }
.w.fx-crown.on::before { animation: fxCrownDrop 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) both; }
.w.fx-crown.on::after  { animation: fxTwinkle 1s ease-in-out 0.5s infinite both; }
@keyframes fxCrownDrop {
  from { opacity: 0; transform: translateY(-0.7em) rotate(-26deg) scale(0.7); }
  to   { opacity: 1; transform: translateY(0) rotate(-7deg) scale(1); }
}

/* ---- moon / midnight: a crescent bobs above, one star twinkles ---- */
.w.fx-moon { --ink: #ebe8ff; --accent: #b8b0ff; }
.w.fx-moon::before { right: -0.14em; top: -0.5em; width: 0.54em; height: 0.54em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0OCA0OCI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9Im0iIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIxIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmZiZTMiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNjOWJkZmYiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz4KICAgIDxwYXRoIGZpbGw9InVybCgjbSkiIGQ9Ik0zMyA1IEMxOSA2IDggMTcgOCAzMCBDOCA0MSAxNyA0NiAyNyA0NiBDMzUgNDYgNDEgNDIgNDQgMzYgQzMxIDM4IDIxIDI5IDIyIDE3IEMyMiAxMiAyNiA4IDMzIDUgWiIvPgogIDwvc3ZnPg=="); }
.w.fx-moon::after  { left: -0.08em;  top: -0.32em; width: 0.26em; height: 0.26em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCA0MCI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9InMiIHgxPSIwIiB5MT0iMCIgeDI9IjEiIHkyPSIxIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiNmZmZmZmYiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmNmM2YiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz4KICAgIDxwYXRoIGZpbGw9InVybCgjcykiIGQ9Ik0yMCAwIEMyMS41IDEzIDI3IDE4LjUgNDAgMjAgQzI3IDIxLjUgMjEuNSAyNyAyMCA0MCBDMTguNSAyNyAxMyAyMS41IDAgMjAgQzEzIDE4LjUgMTguNSAxMyAyMCAwIFoiLz4KICA8L3N2Zz4="); }
.w.fx-moon.on::before { animation: fxBob 1.8s ease-in-out infinite alternate; }
.w.fx-moon.on::after  { animation: fxTwinkle 1.1s ease-in-out 0.3s infinite both; }
@keyframes fxBob { from { transform: translateY(0.05em) rotate(-6deg); } to { transform: translateY(-0.07em) rotate(6deg); } }

/* ---- angel / heaven: a halo hovers over the word ---- */
.w.fx-angel { --ink: #fff7d6; --accent: #ffe27a; }
.w.fx-angel::before { left: calc(50% - 0.4em); top: -0.5em; width: 0.8em; height: 0.32em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MCAyNCI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImhsIiB4MT0iMCIgeTE9IjAiIHgyPSIxIiB5Mj0iMCI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZkMjRhIi8+PHN0b3Agb2Zmc2V0PSIwLjUiIHN0b3AtY29sb3I9IiNmZmYzYTgiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiNmZmMyMWYiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz4KICAgIDxlbGxpcHNlIGN4PSIzMCIgY3k9IjEyIiByeD0iMjQiIHJ5PSI3IiBmaWxsPSJub25lIiBzdHJva2U9InVybCgjaGwpIiBzdHJva2Utd2lkdGg9IjUiLz4KICAgIDxwYXRoIGQ9Ik0xMCAxMCBDMTYgNCA0NCA0IDUwIDEwIiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS1vcGFjaXR5PSIwLjgiIHN0cm9rZS13aWR0aD0iMS42IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KICA8L3N2Zz4="); }
.w.fx-angel.on::before { animation: fxBob 1.6s ease-in-out infinite alternate; }

/* ---- dance: the word bounces and sways to the beat ---- */
.w.fx-dance { --ink: #ffd6f4; --accent: #ff4fd8; }
.w.fx-dance.on { animation: fxDance 0.46s ease-in-out infinite alternate; }
@keyframes fxDance {
  from { transform: translateY(0) rotate(-5deg) scale(1.07); }
  to   { transform: translateY(-0.16em) rotate(5deg) scale(1.1); }
}

/* ---- speed / run / fast: the word leans forward, speed lines trail it ---- */
.w.fx-speed { --ink: #d9f3ff; --accent: #38bdf8; margin-left: 0.6em; }
.w.fx-speed::before {
  right: calc(100% - 0.05em); top: 0.3em; width: 0.8em; height: 0.7em;
  background:
    linear-gradient(90deg, transparent, var(--accent)) 0 8% / 100% 0.07em no-repeat,
    linear-gradient(90deg, transparent, var(--accent)) 25% 38% / 75% 0.07em no-repeat,
    linear-gradient(90deg, transparent, var(--accent)) 0 68% / 90% 0.07em no-repeat,
    linear-gradient(90deg, transparent, var(--accent)) 40% 96% / 60% 0.07em no-repeat;
  transform-origin: 100% 50%;
}
.w.fx-speed.on { animation: fxRush 0.5s ease-in-out infinite alternate; }
.w.fx-speed.on::before { animation: fxStreak 0.4s ease-out infinite both; }
@keyframes fxRush {
  from { transform: translateY(-0.05em) translateX(-0.03em) scale(1.07) skewX(-10deg); }
  to   { transform: translateY(-0.05em) translateX(0.05em) scale(1.07) skewX(-10deg); }
}
@keyframes fxStreak {
  from { opacity: 0; transform: scaleX(0.3); }
  40%  { opacity: 1; }
  to   { opacity: 0; transform: scaleX(1.1); }
}

/* ---- sleep / dream: Zs drift up ---- */
.w.fx-sleep { --ink: #e1e8ff; --accent: #8aa4ff; }
.w.fx-sleep::before,
.w.fx-sleep::after { font-weight: 800; font-style: italic; line-height: 1; color: var(--accent); }
.w.fx-sleep::before { content: "z"; right: 14%; top: 0;     font-size: 0.5em; }
.w.fx-sleep::after  { content: "Z"; right: -0.1em; top: -0.2em; font-size: 0.72em; }
.w.fx-sleep.on::before { animation: fxNote 1.8s ease-out infinite both; }
.w.fx-sleep.on::after  { animation: fxNote 1.8s ease-out 0.8s infinite both; }

/* ---- rose / flower / bloom: petals tumble down ---- */
.w.fx-rose { --ink: #ffc9d4; --accent: #e11d48; }
.w.fx-rose::before { left: 12%; top: 0.4em;  width: 0.27em; height: 0.36em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAzMiI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9InAiIHgxPSIwLjIiIHkxPSIwIiB4Mj0iMC44IiB5Mj0iMSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZiM2M0Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZTExZDQ4Ii8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+CiAgICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNMTIgMSBDMjEgOSAyMyAyMSAxMiAzMSBDMSAyMSAzIDkgMTIgMSBaIi8+CiAgICA8cGF0aCBkPSJNMTIgNiBDMTIgMTQgMTIgMjIgMTIgMjgiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLW9wYWNpdHk9IjAuMzUiIHN0cm9rZS13aWR0aD0iMS4yIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KICA8L3N2Zz4="); }
.w.fx-rose::after  { left: 58%; top: 0.35em; width: 0.21em; height: 0.28em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAzMiI+CiAgICA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9InAiIHgxPSIwLjIiIHkxPSIwIiB4Mj0iMC44IiB5Mj0iMSI+PHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yPSIjZmZiM2M0Ii8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjZTExZDQ4Ii8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+CiAgICA8cGF0aCBmaWxsPSJ1cmwoI3ApIiBkPSJNMTIgMSBDMjEgOSAyMyAyMSAxMiAzMSBDMSAyMSAzIDkgMTIgMSBaIi8+CiAgICA8cGF0aCBkPSJNMTIgNiBDMTIgMTQgMTIgMjIgMTIgMjgiIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLW9wYWNpdHk9IjAuMzUiIHN0cm9rZS13aWR0aD0iMS4yIiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4KICA8L3N2Zz4="); }
.w.fx-rose.on::before { animation: fxPetal 2.2s ease-in infinite both; }
.w.fx-rose.on::after  { animation: fxPetal 2.2s ease-in 1s infinite both; }
@keyframes fxPetal {
  from { opacity: 0; transform: translate(0, -0.1em) rotate(0deg); }
  15%  { opacity: 1; }
  35%  { transform: translate(0.18em, 0.35em) rotate(70deg); }
  65%  { transform: translate(-0.14em, 0.8em) rotate(150deg); }
  to   { opacity: 0; transform: translate(0.1em, 1.25em) rotate(230deg); }
}

/* ---- broken / shatter: the word trembles and a crack runs through it ---- */
.w.fx-broken { --ink: #dde6f2; --accent: #8aa3c2; }
.w.fx-broken::before { left: -0.04em; right: -0.04em; top: 0.22em; bottom: 0.12em; background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgNDAiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPgogICAgPGcgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiPgogICAgICA8cG9seWxpbmUgcG9pbnRzPSIwLDIyIDE0LDEyIDI2LDI3IDQxLDYgNTUsMzEgNzEsMTMgODYsMjggMTAwLDE2IiBzdHJva2U9IiMwYTBhMTMiIHN0cm9rZS13aWR0aD0iNC41IiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz4KICAgICAgPHBvbHlsaW5lIHBvaW50cz0iMCwyMiAxNCwxMiAyNiwyNyA0MSw2IDU1LDMxIDcxLDEzIDg2LDI4IDEwMCwxNiIgc3Ryb2tlPSIjYmZlM2ZmIiBzdHJva2Utd2lkdGg9IjEuNiIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+CiAgICAgIDxwb2x5bGluZSBwb2ludHM9IjQxLDYgNDcsMCIgc3Ryb2tlPSIjYmZlM2ZmIiBzdHJva2Utd2lkdGg9IjEuNCIgdmVjdG9yLWVmZmVjdD0ibm9uLXNjYWxpbmctc3Ryb2tlIi8+CiAgICAgIDxwb2x5bGluZSBwb2ludHM9IjU1LDMxIDYwLDQwIiBzdHJva2U9IiNiZmUzZmYiIHN0cm9rZS13aWR0aD0iMS40IiB2ZWN0b3ItZWZmZWN0PSJub24tc2NhbGluZy1zdHJva2UiLz4KICAgIDwvZz4KICA8L3N2Zz4="); background-size: 100% 100%; }
.w.fx-broken.on { animation: fxShake 0.34s linear infinite; }
.w.fx-broken.on::before { animation: fxCrack 0.45s ease-out both; }
@keyframes fxShake {
  0%, 100% { transform: translate(0, -0.05em) scale(1.07) rotate(0deg); }
  20%      { transform: translate(-0.03em, -0.05em) scale(1.07) rotate(-1.2deg); }
  40%      { transform: translate(0.03em, -0.07em) scale(1.07) rotate(1deg); }
  60%      { transform: translate(-0.02em, -0.04em) scale(1.07) rotate(-0.8deg); }
  80%      { transform: translate(0.025em, -0.06em) scale(1.07) rotate(0.9deg); }
}
@keyframes fxCrack {
  from { opacity: 0; clip-path: inset(0 100% 0 0); }
  to   { opacity: 1; clip-path: inset(0 0 0 0); }
}

/* ---- wave / ocean / sea: two wavy lines slide under the word ---- */
.w.fx-wave { --ink: #c9f1ff; --accent: #22b8ff; }
.w.fx-wave::before,
.w.fx-wave::after {
  left: 0; right: 0; height: 0.2em;
  background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0MCAxMiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgICA8cGF0aCBkPSJNLTIwIDYgUS0xMCAwIDAgNiBUMjAgNiBUNDAgNiBUNjAgNiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNWNjOGZmIiBzdHJva2Utd2lkdGg9IjIuOCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+CiAgPC9zdmc+");
  background-size: 0.8em 100%;
  background-repeat: repeat-x;
  background-position: 0 50%;
}
.w.fx-wave::before { bottom: -0.1em; }
.w.fx-wave::after  { bottom: -0.3em; }
.w.fx-wave.on::after { opacity: 0.55; }
.w.fx-wave.on::before { animation: fxWaveL 1s linear infinite; }
.w.fx-wave.on::after  { animation: fxWaveR 1.5s linear infinite; }
@keyframes fxWaveL { to { background-position: -0.8em 50%; } }
@keyframes fxWaveR { to { background-position: 0.8em 50%; } }

/* ---- reduced motion: keep the colour + glow, drop the movement and decorations ---- */
@media (prefers-reduced-motion: reduce) {
  .w.fx, .w.fx::before, .w.fx::after { animation: none !important; transition: opacity 0.2s; }
  .w.fx:not(.fx-wings).on::before, .w.fx:not(.fx-wings).on::after { opacity: 0; }
  .w.fx-wings.on::before, .w.fx-wings.on::after { transform: scale(1); }
}
