Files
yangyixuan 71fa43ac7b feat: add PICO virtual pet
A dependency-free browser companion with live needs, a star-catching
mini game, daily goals, collectible accessories, local saving,
day/night scenery and a responsive layout.
2026-11-04 18:51:30 +08:00

4041 lines
69 KiB
CSS

/* ---------------------------------------------
pico · a tiny digital companion
--------------------------------------------- */
:root {
--bg: #ece7dc;
--surface: #fbf8f1;
--surface-strong: #fffdf8;
--surface-soft: #f3efe4;
--ink: #293b2f;
--ink-soft: #667368;
--ink-faint: #929a90;
--line: rgba(44, 64, 49, .11);
--line-strong: rgba(44, 64, 49, .19);
--moss: #708a68;
--moss-deep: #385240;
--sage: #cbd9bd;
--sage-soft: #e8eddb;
--peach: #e4a184;
--terracotta: #d17a5c;
--butter: #edcc80;
--blue-soft: #d7e3df;
--radius: 26px;
--shadow: 0 24px 60px rgba(48, 62, 46, .09);
--font: "Segoe UI Variable Text", "Aptos", "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", sans-serif;
--serif: "Iowan Old Style", "Palatino Linotype", "Book Antiqua", Georgia, "Songti SC", serif;
}
* {
box-sizing: border-box;
}
html {
color-scheme: light;
scrollbar-color: rgba(69, 86, 68, .28) transparent;
}
body {
margin: 0;
min-width: 300px;
min-height: 100vh;
min-height: 100dvh;
overflow-x: hidden;
background:
radial-gradient(ellipse at 0% -10%, rgba(203, 217, 189, .7), transparent 42%),
radial-gradient(ellipse at 102% 102%, rgba(231, 205, 182, .48), transparent 46%),
var(--bg);
color: var(--ink);
font-family: var(--font);
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
body.modal-open {
overflow: hidden;
}
button {
border: 0;
color: inherit;
font: inherit;
cursor: pointer;
-webkit-tap-highlight-color: transparent;
}
button:disabled {
cursor: not-allowed;
}
h1, h2, h3, p {
margin-top: 0;
}
::selection {
background: rgba(209, 122, 92, .23);
}
:focus-visible {
outline: 2px solid #587156;
outline-offset: 3px;
}
[hidden] {
display: none !important;
}
.svg-defs {
position: absolute;
width: 0;
height: 0;
overflow: hidden;
}
.icon {
width: 18px;
height: 18px;
flex: none;
fill: none;
stroke: currentColor;
stroke-width: 1.8;
stroke-linecap: round;
stroke-linejoin: round;
}
.paper-grain {
position: fixed;
z-index: 80;
inset: 0;
pointer-events: none;
opacity: .035;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.88' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.7'/%3E%3C/svg%3E");
mix-blend-mode: multiply;
}
.app {
width: min(1240px, calc(100% - 48px));
margin: 0 auto;
padding: 20px 0;
}
/* ---------------------------------------------
Header
--------------------------------------------- */
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20px;
padding-bottom: 16px;
}
.brand {
display: flex;
align-items: center;
gap: 11px;
min-width: max-content;
}
.brand-mark {
display: grid;
place-items: center;
width: 44px;
height: 44px;
border: 1px solid rgba(53, 77, 57, .13);
border-radius: 15px;
background:
radial-gradient(circle at 30% 20%, rgba(255, 255, 255, .9), transparent 45%),
linear-gradient(145deg, #edf0dc, #dce7ce);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .9), 0 6px 16px rgba(56, 74, 52, .06);
}
.brand-mark svg {
width: 35px;
height: 35px;
}
.brand-copy {
display: flex;
flex-direction: column;
gap: 1px;
}
.brand-name {
font-family: var(--serif);
font-size: 31px;
font-style: italic;
font-weight: 500;
letter-spacing: -.045em;
line-height: .85;
}
.brand-sub {
color: var(--ink-soft);
font-size: 9.5px;
letter-spacing: .12em;
}
.header-note {
display: flex;
align-items: center;
gap: 12px;
margin: 0;
color: #8a9389;
font-size: 8.5px;
letter-spacing: .19em;
white-space: nowrap;
}
.header-note span {
width: 27px;
height: 1px;
background: rgba(63, 78, 59, .24);
}
.header-actions {
display: flex;
align-items: center;
gap: 8px;
}
.coin-menu {
display: flex;
align-items: center;
gap: 6px;
height: 41px;
padding: 0 13px 0 8px;
border: 1px solid var(--line);
border-radius: 999px;
background: rgba(255, 253, 247, .6);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .7);
transition: background .2s ease, border-color .2s ease, transform .2s ease;
}
.coin-menu:hover {
transform: translateY(-1px);
border-color: rgba(62, 83, 64, .22);
background: rgba(255, 253, 247, .9);
}
.coin-star {
display: grid;
place-items: center;
width: 25px;
height: 25px;
border-radius: 50%;
color: #a87b32;
background: #f6e7b8;
}
.coin-star .icon {
width: 14px;
height: 14px;
fill: currentColor;
stroke-width: 1.2;
}
.coin-value {
font-family: var(--serif);
font-size: 19px;
font-weight: 600;
letter-spacing: -.03em;
}
.coin-unit {
color: var(--ink-soft);
font-size: 10px;
}
.icon-button {
display: grid;
place-items: center;
width: 41px;
height: 41px;
border: 1px solid var(--line);
border-radius: 50%;
background: rgba(255, 253, 247, .6);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .7);
transition: background .2s ease, transform .2s ease;
}
.icon-button:hover {
transform: translateY(-1px);
background: rgba(255, 253, 247, .92);
}
.icon-button .icon {
width: 18px;
height: 18px;
}
.sound-off-icon {
display: none;
}
#soundBtn.is-muted .sound-on-icon {
display: none;
}
#soundBtn.is-muted .sound-off-icon {
display: block;
color: var(--ink-faint);
}
/* ---------------------------------------------
Layout
--------------------------------------------- */
.layout {
display: grid;
grid-template-columns: minmax(0, 1.58fr) minmax(375px, .92fr);
gap: 18px;
height: calc(100vh - 108px);
height: calc(100dvh - 108px);
min-height: 715px;
max-height: 840px;
}
/* ---------------------------------------------
Garden habitat
--------------------------------------------- */
.habitat {
--sky-top: #cbe3dc;
--sky-middle: #dfead8;
--sky-bottom: #f3e7ce;
--hill-back: #b8cdb0;
--hill-middle: #96b28f;
--hill-front: #779576;
--hill-front-deep: #607f63;
--cloud: #fffbf0;
--scene-ink: #2f4938;
position: relative;
min-width: 0;
min-height: 0;
overflow: hidden;
isolation: isolate;
border: 1px solid rgba(255, 255, 255, .45);
border-radius: 32px;
background: linear-gradient(178deg, var(--sky-top) 0%, var(--sky-middle) 48%, var(--sky-bottom) 100%);
box-shadow: var(--shadow), inset 0 1px 0 rgba(255, 255, 255, .48);
transition: filter .6s ease;
}
.habitat[data-phase="morning"] {
--sky-top: #d2e7e2;
--sky-middle: #e7edda;
--sky-bottom: #f8e7ce;
--hill-back: #c3d5b9;
--hill-middle: #a0b997;
--hill-front: #7e9a7a;
--hill-front-deep: #668267;
}
.habitat[data-phase="day"] {
--sky-top: #cbe3dc;
--sky-middle: #dfead8;
--sky-bottom: #f3e7ce;
}
.habitat[data-phase="dusk"] {
--sky-top: #ddcfcf;
--sky-middle: #edd7bd;
--sky-bottom: #f5ddc1;
--hill-back: #c2bba0;
--hill-middle: #9eaa88;
--hill-front: #788f70;
--hill-front-deep: #627b61;
--cloud: #fff3dc;
}
.habitat[data-phase="night"] {
--sky-top: #22383f;
--sky-middle: #344d4c;
--sky-bottom: #55645a;
--hill-back: #536d5d;
--hill-middle: #3e5b4e;
--hill-front: #304b41;
--hill-front-deep: #263e38;
--cloud: #dce5dc;
--scene-ink: #f5f1dd;
background: linear-gradient(178deg, var(--sky-top) 0%, var(--sky-middle) 50%, var(--sky-bottom) 100%);
}
.sky,
.hills {
position: absolute;
inset: 0;
}
.sky {
z-index: 0;
pointer-events: none;
}
.hills {
z-index: 1;
pointer-events: none;
}
.habitat-grain {
position: absolute;
z-index: 10;
inset: 0;
pointer-events: none;
opacity: .06;
mix-blend-mode: soft-light;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 160 160' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.94' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.8'/%3E%3C/svg%3E");
}
.celestial {
position: absolute;
border-radius: 50%;
transition: opacity .9s ease, transform .9s ease;
}
.sun {
top: 12.5%;
right: 10%;
width: clamp(96px, 12vw, 148px);
aspect-ratio: 1;
background: radial-gradient(circle at 39% 34%, #fffce9 0 17%, #f6dfa6 56%, #eec97e 100%);
box-shadow:
0 0 0 18px rgba(247, 223, 166, .07),
0 0 70px 34px rgba(246, 214, 143, .24);
opacity: .96;
animation: sun-breathe 9s ease-in-out infinite;
}
.sun::after {
content: "";
position: absolute;
inset: -8%;
border: 1px solid rgba(255, 247, 218, .32);
border-radius: 50%;
}
.moon {
top: 13%;
right: 11.5%;
width: clamp(58px, 7.2vw, 82px);
aspect-ratio: 1;
background: #f5eccb;
filter: drop-shadow(0 0 28px rgba(246, 234, 192, .42));
-webkit-mask: radial-gradient(circle at 68% 28%, transparent 0 43%, #000 44%);
mask: radial-gradient(circle at 68% 28%, transparent 0 43%, #000 44%);
opacity: 0;
}
.habitat[data-phase="night"] .sun {
visibility: hidden;
opacity: 0;
transform: translateY(30px);
animation: none;
}
.habitat[data-phase="night"] .moon {
opacity: .95;
}
.stars {
position: absolute;
inset: 0;
opacity: 0;
transition: opacity 1.2s ease;
}
.habitat[data-phase="night"] .stars {
opacity: 1;
}
.habitat[data-phase="dusk"] .stars {
opacity: .2;
}
.stars i {
position: absolute;
left: var(--x);
top: var(--y);
width: 3px;
height: 3px;
border-radius: 50%;
background: #f8f0d3;
box-shadow: 0 0 8px rgba(249, 239, 202, .8);
animation: star-twinkle 3.2s ease-in-out infinite;
animation-delay: var(--d);
}
.stars i:nth-child(3n) {
width: 2px;
height: 2px;
opacity: .6;
}
.stars i:nth-child(4n) {
width: 4px;
height: 4px;
}
.cloud {
position: absolute;
height: 36px;
border-radius: 999px;
background: var(--cloud);
opacity: .55;
filter: blur(.15px);
transition: opacity 1s ease;
animation: cloud-drift 18s ease-in-out infinite alternate;
}
.cloud::before,
.cloud::after {
content: "";
position: absolute;
border-radius: 50%;
background: inherit;
}
.cloud::before {
width: 48%;
aspect-ratio: 1;
left: 14%;
bottom: 4px;
}
.cloud::after {
width: 62%;
aspect-ratio: 1;
right: 9%;
bottom: 1px;
}
.cloud--one {
top: 22%;
left: -4%;
width: clamp(115px, 15vw, 180px);
}
.cloud--two {
top: 34%;
right: 2%;
width: clamp(90px, 11vw, 135px);
height: 29px;
opacity: .38;
animation-delay: -7s;
animation-duration: 23s;
}
.cloud--three {
top: 45%;
left: 25%;
width: clamp(62px, 8vw, 100px);
height: 22px;
opacity: .28;
animation-delay: -11s;
animation-duration: 27s;
}
.habitat[data-phase="night"] .cloud {
opacity: .075;
}
.habitat[data-phase="dusk"] .cloud {
opacity: .4;
}
.birds {
position: absolute;
left: 41%;
top: 17%;
display: flex;
gap: 22px;
opacity: .48;
transition: opacity .8s ease;
}
.birds i {
width: 15px;
height: 6px;
border-top: 1.4px solid rgba(59, 78, 62, .8);
border-radius: 50%;
transform: rotate(-8deg);
}
.birds i:nth-child(2) {
transform: translateY(-11px) scale(.75) rotate(-8deg);
}
.habitat[data-phase="night"] .birds {
opacity: 0;
}
.motes {
position: absolute;
inset: 0;
}
.motes i {
position: absolute;
left: var(--mx);
top: var(--my);
width: 3px;
height: 3px;
border-radius: 50%;
background: rgba(255, 251, 229, .75);
box-shadow: 0 0 7px rgba(255, 248, 217, .44);
animation: mote-drift 8s ease-in-out infinite alternate;
animation-delay: var(--md);
}
.habitat[data-phase="night"] .motes {
opacity: .1;
}
.hill {
position: absolute;
border-radius: 55% 55% 0 0 / 100% 100% 0 0;
transition: background 1.1s ease;
}
.hill--back {
left: -19%;
bottom: 24%;
width: 79%;
height: 48%;
background: var(--hill-back);
opacity: .56;
transform: rotate(-2deg);
}
.hill--middle {
right: -22%;
bottom: 17%;
width: 86%;
height: 44%;
background: var(--hill-middle);
opacity: .58;
transform: rotate(2.5deg);
}
.hill--front {
left: -14%;
bottom: -24%;
width: 128%;
height: 69%;
background: linear-gradient(180deg, var(--hill-front) 0%, var(--hill-front-deep) 100%);
border-radius: 52% 48% 0 0 / 86% 88% 0 0;
}
.hill--front::after {
content: "";
position: absolute;
inset: 15% 8% auto;
height: 28%;
border-radius: 50%;
background: rgba(255, 255, 255, .045);
transform: rotate(-2deg);
}
.garden-plant {
position: absolute;
bottom: -2%;
opacity: .9;
filter: drop-shadow(0 8px 14px rgba(53, 77, 52, .06));
transition: filter 1s ease;
}
.garden-plant--left {
left: -1.5%;
width: clamp(145px, 19vw, 218px);
transform-origin: left bottom;
animation: plant-sway 8s ease-in-out infinite;
}
.garden-plant--right {
right: -1%;
width: clamp(125px, 16vw, 188px);
}
.habitat[data-phase="night"] .garden-plant {
filter: brightness(.52) saturate(.75);
}
.meadow-flowers {
position: absolute;
left: 42%;
bottom: 7%;
width: clamp(150px, 20vw, 230px);
opacity: .86;
}
.fireflies {
position: absolute;
inset: 0;
opacity: 0;
transition: opacity 1.2s ease;
}
.habitat[data-phase="night"] .fireflies,
.habitat[data-phase="dusk"] .fireflies {
opacity: 1;
}
.fireflies i {
position: absolute;
left: var(--fx);
top: var(--fy);
width: 4px;
height: 4px;
border-radius: 50%;
background: #f5e8a8;
box-shadow: 0 0 13px 4px rgba(246, 226, 139, .34);
animation: firefly 4.5s ease-in-out infinite;
animation-delay: var(--fd);
}
.sleep-veil {
position: absolute;
z-index: 2;
inset: 0;
pointer-events: none;
opacity: 0;
background: linear-gradient(180deg, rgba(27, 48, 40, .45), rgba(27, 48, 40, .07) 62%, rgba(27, 48, 40, .1));
transition: opacity .7s ease;
}
.habitat.is-sleeping .sleep-veil {
opacity: .7;
}
.habitat.is-sleeping .garden-plant,
.habitat.is-sleeping .meadow-flowers {
filter: brightness(.72) saturate(.8);
}
.scene {
position: absolute;
z-index: 3;
inset: 0;
pointer-events: none;
}
.scene-meta {
position: absolute;
z-index: 5;
top: 22px;
left: 22px;
right: 22px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
pointer-events: none;
}
.scene-badge,
.date-badge {
display: inline-flex;
align-items: center;
gap: 8px;
height: 31px;
border: 1px solid rgba(255, 252, 240, .31);
border-radius: 999px;
background: rgba(255, 251, 240, .36);
color: var(--scene-ink);
font-size: 8.5px;
font-weight: 650;
letter-spacing: .14em;
padding: 0 12px;
-webkit-backdrop-filter: blur(12px);
backdrop-filter: blur(12px);
}
.scene-badge-dot {
width: 5px;
height: 5px;
border-radius: 50%;
background: #718c66;
box-shadow: 0 0 0 3px rgba(113, 140, 102, .12);
}
.date-badge {
gap: 6px;
letter-spacing: .035em;
font-size: 10px;
font-weight: 500;
}
.date-badge .icon {
width: 14px;
height: 14px;
stroke-width: 1.7;
}
.habitat[data-phase="night"] .scene-badge,
.habitat[data-phase="night"] .date-badge {
border-color: rgba(255, 252, 240, .12);
background: rgba(24, 43, 38, .26);
color: #eae7d3;
}
.habitat[data-phase="night"] .scene-badge-dot {
background: #e6d795;
box-shadow: 0 0 0 3px rgba(230, 215, 149, .12);
}
.speech-bubble {
position: absolute;
z-index: 5;
top: 22%;
left: 5.2%;
width: min(236px, 32%);
min-width: 190px;
padding: 13px 15px 14px;
border: 1px solid rgba(76, 93, 72, .12);
border-radius: 17px 17px 17px 5px;
background: rgba(255, 251, 242, .93);
box-shadow: 0 14px 34px rgba(45, 65, 46, .11), inset 0 1px 0 rgba(255, 255, 255, .8);
color: var(--ink);
-webkit-backdrop-filter: blur(12px);
backdrop-filter: blur(12px);
pointer-events: none;
}
.speech-bubble::after {
content: "";
position: absolute;
right: 27px;
bottom: -7px;
width: 13px;
height: 13px;
border-right: 1px solid rgba(76, 93, 72, .12);
border-bottom: 1px solid rgba(76, 93, 72, .12);
border-radius: 0 0 3px 0;
background: rgba(255, 251, 242, .95);
transform: rotate(45deg);
}
.speech-bubble.is-speaking {
animation: speech-pop .4s cubic-bezier(.2, .8, .2, 1);
}
.speech-label {
display: block;
color: #9a6b54;
font-size: 8px;
font-weight: 700;
letter-spacing: .15em;
}
.speech-bubble p {
margin: 4px 0 0;
font-size: 13px;
line-height: 1.68;
letter-spacing: .01em;
}
.pet-area {
position: absolute;
z-index: 4;
left: 51%;
bottom: 3.2%;
width: clamp(285px, 43%, 415px);
transform: translateX(-50%);
pointer-events: none;
}
.pet-button {
position: relative;
z-index: 2;
display: block;
width: 100%;
padding: 0;
background: transparent;
border: 0;
border-radius: 42%;
pointer-events: auto;
}
.pet-art {
width: 100%;
transform-origin: center 88%;
transition: transform .28s cubic-bezier(.2, .8, .2, 1);
}
.pet-button:hover .pet-art {
transform: translateY(-4px);
}
.pet-button:active .pet-art {
transform: translateY(-1px) scale(.985);
}
.pet-svg {
display: block;
width: 100%;
height: auto;
overflow: visible;
animation: pet-float 5.8s ease-in-out infinite;
transform-origin: center 88%;
}
.pet-art-inner {
transform-box: fill-box;
transform-origin: 50% 85%;
transition: transform .6s ease, opacity .4s ease;
}
.pet-button .eye {
transform-box: fill-box;
transform-origin: center center;
animation: eye-blink 6.4s infinite;
}
.pet-button .eye:nth-child(2) {
animation-delay: .05s;
}
.eyes-closed {
opacity: 0;
transition: opacity .2s ease;
}
.mouth {
opacity: 0;
transition: opacity .18s ease;
}
.mouth--happy {
opacity: 1;
}
.pet-button[data-mood="hungry"] .mouth--happy,
.pet-button[data-mood="sleepy"] .mouth--happy,
.pet-button[data-mood="neutral"] .mouth--happy {
opacity: 0;
}
.pet-button[data-mood="hungry"] .mouth--neutral,
.pet-button[data-mood="sleepy"] .mouth--neutral,
.pet-button[data-mood="neutral"] .mouth--neutral {
opacity: 1;
}
.pet-button[data-mood="sad"] .mouth--happy {
opacity: 0;
}
.pet-button[data-mood="sad"] .mouth--sad {
opacity: 1;
}
.pet-button[data-mood="sad"] .pet-art-inner {
transform: rotate(-1.7deg) translateY(4px);
}
.pet-button[data-mood="sad"] .ears {
transform: translateY(4px) rotate(-1.5deg);
transform-box: fill-box;
transform-origin: center top;
}
.tail {
transform-box: fill-box;
transform-origin: left center;
animation: tail-sway 4.6s ease-in-out infinite;
}
.ears {
transform-box: fill-box;
transform-origin: center bottom;
animation: ears-listen 9s ease-in-out infinite;
}
.sprout {
transform-box: fill-box;
transform-origin: center bottom;
animation: sprout-sway 6.4s ease-in-out infinite;
transition: opacity .3s ease;
}
.accessory {
opacity: 0;
visibility: hidden;
transform-box: fill-box;
transform-origin: center;
transition: opacity .28s ease, visibility .28s ease;
}
.accessory.is-on {
opacity: 1;
visibility: visible;
}
.pet-button.look--beret .sprout {
opacity: 0;
}
.pet-button.is-sleeping .pet-svg {
animation-duration: 8s;
}
.pet-button.is-sleeping .pet-art-inner {
transform: translateY(5px) rotate(1.4deg);
}
.pet-button.is-sleeping .eyes-open {
opacity: 0;
}
.pet-button.is-sleeping .eyes-closed {
opacity: 1;
}
.pet-button.is-sleeping .eye {
animation: none;
}
.pet-button.is-sleeping .tail {
animation-duration: 7s;
}
.pet-button.is-sleeping .mouth--happy,
.pet-button.is-sleeping .mouth--sad {
opacity: 0;
}
.pet-button.is-sleeping .mouth--neutral {
opacity: 1;
}
.pet-button.is-eating .pet-art {
animation: munch .22s ease-in-out 5;
}
.pet-button.is-cleaning .pet-art {
animation: clean-wiggle .2s ease-in-out 7;
}
.pet-button.is-petting .pet-art {
animation: pet-squish .42s cubic-bezier(.2, .8, .2, 1);
}
.zzz {
position: absolute;
z-index: 5;
top: 17%;
right: 8%;
display: flex;
flex-direction: column;
align-items: center;
gap: 1px;
color: #f9f1db;
opacity: 0;
pointer-events: none;
text-shadow: 0 2px 10px rgba(44, 62, 45, .2);
transition: opacity .4s ease;
}
.zzz i {
display: block;
font-family: var(--serif);
font-size: 21px;
font-style: italic;
font-weight: 600;
line-height: .9;
opacity: 0;
animation: zzz-rise 3s ease-in-out infinite;
}
.zzz i:nth-child(2) {
font-size: 27px;
animation-delay: .7s;
}
.zzz i:nth-child(3) {
font-size: 34px;
animation-delay: 1.4s;
}
.habitat.is-sleeping .zzz {
opacity: 1;
}
.nameplate {
position: absolute;
z-index: 6;
left: 22px;
bottom: 21px;
display: flex;
align-items: center;
gap: 10px;
padding: 9px 13px 9px 9px;
border: 1px solid rgba(255, 255, 255, .45);
border-radius: 16px;
background: rgba(255, 252, 244, .74);
box-shadow: 0 10px 26px rgba(48, 65, 48, .08), inset 0 1px 0 rgba(255, 255, 255, .65);
color: var(--ink);
-webkit-backdrop-filter: blur(14px);
backdrop-filter: blur(14px);
pointer-events: none;
}
.nameplate-mark {
display: grid;
place-items: center;
width: 33px;
height: 33px;
border-radius: 50%;
background: #eaf0dd;
}
.nameplate-mark svg {
width: 26px;
height: 26px;
}
.nameplate-copy {
min-width: 0;
}
.nameplate-title {
display: flex;
align-items: center;
gap: 7px;
}
.nameplate-title h1 {
margin: 0;
font-family: var(--serif);
font-size: 13px;
font-weight: 700;
letter-spacing: .05em;
line-height: 1.1;
}
.nameplate-title span {
padding: 2px 5px;
border-radius: 5px;
background: #e4ead7;
color: #61785c;
font-size: 7px;
font-weight: 700;
letter-spacing: .08em;
}
.nameplate-copy p {
margin: 3px 0 0;
color: var(--ink-soft);
font-size: 9px;
white-space: nowrap;
}
.pet-hint {
position: absolute;
z-index: 6;
right: 21px;
bottom: 21px;
display: flex;
align-items: center;
gap: 6px;
height: 36px;
padding: 0 14px 0 11px;
border: 1px solid rgba(255, 255, 255, .45);
border-radius: 999px;
background: rgba(255, 252, 244, .67);
box-shadow: 0 8px 20px rgba(48, 65, 48, .06);
color: var(--ink);
font-size: 10px;
font-weight: 600;
letter-spacing: .04em;
-webkit-backdrop-filter: blur(12px);
backdrop-filter: blur(12px);
transition: background .2s ease, transform .2s ease;
pointer-events: auto;
}
.pet-hint:hover {
transform: translateY(-2px);
background: rgba(255, 252, 244, .94);
}
.pet-hint .icon {
width: 14px;
height: 14px;
color: #8c6d4a;
}
.fx-layer,
.bubble-layer {
position: absolute;
z-index: 7;
inset: 0;
overflow: hidden;
pointer-events: none;
}
.fx {
position: absolute;
opacity: 0;
transform: translate(-50%, -50%);
font-family: var(--serif);
font-weight: 600;
animation: fx-rise 1.5s cubic-bezier(.2, .7, .3, 1) forwards;
animation-delay: var(--delay, 0s);
text-shadow: 0 2px 8px rgba(75, 57, 42, .12);
}
.fx--heart {
color: #d97d67;
font-size: var(--size, 16px);
}
.fx--sparkle {
color: #f3d586;
font-size: var(--size, 18px);
}
.fx--crumb {
width: var(--size, 6px);
height: var(--size, 6px);
border-radius: 50%;
background: var(--crumb, #deb17d);
}
.soap-bubble {
position: absolute;
width: var(--size, 24px);
height: var(--size, 24px);
border: 1px solid rgba(255, 255, 255, .76);
border-radius: 50%;
background:
radial-gradient(circle at 30% 27%, rgba(255, 255, 255, .95) 0 10%, rgba(255, 255, 255, .08) 30%, transparent 60%),
rgba(210, 237, 230, .15);
box-shadow: inset -3px -4px 7px rgba(133, 183, 172, .15), 0 0 12px rgba(255, 255, 255, .25);
animation: bubble-rise 2.2s ease-in forwards;
animation-delay: var(--delay, 0s);
}
/* ---------------------------------------------
Dashboard
--------------------------------------------- */
.dashboard {
display: flex;
flex-direction: column;
gap: 16px;
min-width: 0;
min-height: 0;
}
.panel {
position: relative;
border: 1px solid rgba(54, 72, 55, .1);
border-radius: var(--radius);
background:
linear-gradient(180deg, rgba(255, 253, 248, .96), rgba(249, 246, 237, .94));
box-shadow:
0 16px 42px rgba(55, 68, 54, .055),
inset 0 1px 0 rgba(255, 255, 255, .9);
}
.care-panel {
display: flex;
flex-direction: column;
padding: 22px;
}
.care-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 14px;
}
.eyebrow {
display: flex;
align-items: center;
gap: 6px;
margin: 0;
color: #7d897d;
font-size: 8.5px;
font-weight: 700;
letter-spacing: .13em;
line-height: 1.4;
text-transform: uppercase;
}
#moodLabel {
font-size: 10px;
font-weight: 600;
letter-spacing: .055em;
text-transform: none;
}
.live-dot {
width: 5px;
height: 5px;
border-radius: 50%;
background: #78956b;
box-shadow: 0 0 0 3px rgba(120, 149, 107, .12);
animation: live-pulse 3s ease-in-out infinite;
}
.care-heading {
min-width: 0;
}
.care-heading h2 {
margin: 6px 0 0;
font-size: clamp(20px, 1.8vw, 24px);
font-weight: 680;
letter-spacing: -.035em;
line-height: 1.32;
}
.level-badge {
--progress: 26%;
position: relative;
display: flex;
flex: none;
flex-direction: column;
align-items: center;
justify-content: center;
width: 68px;
height: 64px;
overflow: hidden;
border: 1px solid rgba(56, 77, 55, .1);
border-radius: 16px;
background:
radial-gradient(circle at 50% 0%, rgba(255, 255, 255, .7), transparent 60%),
#f0f1e3;
color: #435b44;
}
.level-word {
color: #899484;
font-size: 7px;
font-weight: 700;
letter-spacing: .18em;
line-height: 1;
}
.level-badge strong {
margin-top: 2px;
font-family: var(--serif);
font-size: 24px;
font-weight: 600;
letter-spacing: -.04em;
line-height: .95;
}
.level-xp {
margin-top: 4px;
color: #8a9487;
font-size: 8px;
letter-spacing: .015em;
}
.level-badge::after {
content: "";
position: absolute;
left: 0;
bottom: 0;
width: var(--progress);
height: 3px;
border-radius: 0 3px 3px 0;
background: var(--moss);
transition: width .55s cubic-bezier(.2, .8, .2, 1);
}
.care-copy {
min-height: 36px;
margin: 9px 0 15px;
color: var(--ink-soft);
font-size: 12px;
line-height: 1.68;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
margin-bottom: 13px;
}
.stat {
--stat-color: #d58a6a;
min-width: 0;
padding: 8px 10px 9px;
border: 1px solid transparent;
border-radius: 13px;
background: rgba(243, 240, 230, .64);
transition: background .2s ease, border-color .2s ease;
}
.stat:hover {
border-color: rgba(59, 78, 57, .08);
background: rgba(246, 243, 234, .92);
}
.stat[data-stat="hunger"] {
--stat-color: #de9a75;
}
.stat[data-stat="happiness"] {
--stat-color: #d9b55c;
}
.stat[data-stat="energy"] {
--stat-color: #829f76;
}
.stat[data-stat="cleanliness"] {
--stat-color: #82a9ad;
}
.stat-head {
display: flex;
align-items: center;
gap: 6px;
}
.stat-icon {
display: grid;
place-items: center;
width: 18px;
height: 18px;
border-radius: 6px;
color: var(--stat-color);
background: rgba(255, 255, 255, .56);
}
.stat-icon .icon {
width: 12px;
height: 12px;
stroke-width: 1.9;
}
.stat-name {
color: #697569;
font-size: 10.5px;
}
.stat-value {
display: flex;
align-items: baseline;
gap: 1px;
margin-left: auto;
color: var(--ink);
}
.stat-value b {
font-size: 13px;
font-weight: 700;
font-variant-numeric: tabular-nums;
}
.stat-value small {
color: #98a095;
font-size: 7px;
}
.stat-track {
position: relative;
height: 3.5px;
margin-top: 7px;
overflow: hidden;
border-radius: 999px;
background: rgba(70, 89, 66, .095);
}
.stat-track i {
display: block;
width: 0;
height: 100%;
border-radius: inherit;
background: var(--stat-color);
transition: width .5s linear, background .3s ease;
}
.stat.is-low .stat-value b {
color: #b95f48;
}
.stat.is-low .stat-track i {
animation: low-pulse 2.5s ease-in-out infinite;
}
.actions-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
margin-bottom: 13px;
}
.care-action {
--action-tint: #f8e8dc;
--action-color: #b96348;
position: relative;
display: flex;
align-items: center;
gap: 9px;
min-width: 0;
min-height: 56px;
padding: 9px 10px;
overflow: hidden;
border: 1px solid rgba(54, 72, 55, .1);
border-radius: 14px;
background: rgba(255, 253, 247, .55);
text-align: left;
transition: transform .18s ease, border-color .18s ease, background .18s ease, box-shadow .18s ease;
}
.care-action--play {
--action-tint: #f7eeca;
--action-color: #a7802f;
}
.care-action--clean {
--action-tint: #e3eeed;
--action-color: #638f90;
}
.care-action--sleep {
--action-tint: #e8e9df;
--action-color: #617d5d;
}
.care-action:hover:not(:disabled) {
transform: translateY(-2px);
border-color: rgba(53, 79, 57, .17);
background: #fffdf8;
box-shadow: 0 8px 18px rgba(54, 68, 52, .06);
}
.care-action:active:not(:disabled) {
transform: translateY(0);
}
.care-action:disabled {
opacity: .48;
filter: grayscale(.2);
}
.care-action.is-resting {
border-color: transparent;
background: #3c5543;
color: #f8f4e7;
}
.care-action.is-resting .action-icon {
background: rgba(255, 255, 255, .13);
color: #f1d8a2;
}
.care-action.is-resting .action-copy small {
color: rgba(248, 244, 231, .64);
}
.care-action.is-resting .action-arrow {
color: rgba(255, 255, 255, .7);
opacity: .6;
}
.action-icon {
display: grid;
flex: none;
place-items: center;
width: 32px;
height: 32px;
border-radius: 10px;
background: var(--action-tint);
color: var(--action-color);
}
.action-icon .icon {
width: 16px;
height: 16px;
}
.action-copy {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.action-copy strong {
overflow: hidden;
font-size: 12.5px;
font-weight: 650;
letter-spacing: -.01em;
white-space: nowrap;
text-overflow: ellipsis;
}
.action-copy small {
overflow: hidden;
color: #919a8f;
font-size: 9.5px;
line-height: 1.3;
white-space: nowrap;
text-overflow: ellipsis;
}
.action-arrow {
position: absolute;
top: 7px;
right: 8px;
color: #8b9688;
font-size: 9px;
opacity: .35;
transition: opacity .2s ease, transform .2s ease;
}
.care-action:hover .action-arrow {
opacity: .7;
transform: translate(1px, -1px);
}
.care-foot {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
padding-top: 12px;
border-top: 1px solid var(--line);
}
.care-count {
overflow: hidden;
color: #8a9487;
font-size: 10px;
line-height: 1.4;
white-space: nowrap;
text-overflow: ellipsis;
}
.text-button {
display: inline-flex;
flex: none;
align-items: center;
gap: 4px;
padding: 0;
background: transparent;
color: #5f745b;
font-size: 10.5px;
font-weight: 650;
letter-spacing: .005em;
}
.text-button .icon {
width: 13px;
height: 13px;
transition: transform .2s ease;
}
.text-button:hover .icon {
transform: translateX(2px);
}
.quest-panel {
display: flex;
flex: 1;
flex-direction: column;
min-height: 0;
padding: 17px 20px 15px;
overflow: hidden;
}
.quest-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
}
.quest-head .eyebrow {
margin-bottom: 4px;
font-size: 8.2px;
}
.quest-head h2 {
margin: 0;
font-size: 17px;
font-weight: 680;
letter-spacing: -.025em;
}
.refresh-note {
flex: none;
margin-top: 3px;
padding: 4px 7px;
border-radius: 999px;
background: rgba(230, 234, 218, .7);
color: #83907f;
font-size: 8px;
letter-spacing: .02em;
}
.quest-list {
display: flex;
flex-direction: column;
margin: 12px 0 0;
padding: 0;
list-style: none;
}
.quest {
--quest-color: #d88266;
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
align-items: center;
gap: 9px;
padding: 9px 0;
border-top: 1px solid rgba(55, 72, 54, .08);
}
.quest:first-child {
border-top: 0;
padding-top: 3px;
}
.quest--feeds {
--quest-color: #c29b4c;
}
.quest--plays {
--quest-color: #789271;
}
.quest-icon {
display: grid;
place-items: center;
width: 28px;
height: 28px;
border-radius: 9px;
background: #f5e9df;
color: var(--quest-color);
transition: background .2s ease, color .2s ease;
}
.quest--feeds .quest-icon {
background: #f6efda;
}
.quest--plays .quest-icon {
background: #eaf0e2;
}
.quest-icon .icon {
width: 14px;
height: 14px;
}
.quest-main {
min-width: 0;
}
.quest-title {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 8px;
color: #455246;
font-size: 11px;
}
.quest-count {
flex: none;
color: #9aa296;
font-size: 9px;
font-variant-numeric: tabular-nums;
}
.quest-track {
height: 3px;
margin-top: 5px;
overflow: hidden;
border-radius: 99px;
background: rgba(69, 88, 65, .08);
}
.quest-track i {
display: block;
height: 100%;
border-radius: inherit;
background: var(--quest-color);
transition: width .4s ease;
}
.quest-reward {
display: inline-flex;
align-items: center;
gap: 2px;
min-width: 36px;
justify-content: flex-end;
color: #9b834f;
font-size: 9px;
font-variant-numeric: tabular-nums;
}
.quest-reward .icon {
width: 11px;
height: 11px;
fill: currentColor;
stroke-width: 1;
}
.quest.is-done .quest-icon {
background: #e4ecd9;
color: #5e7b55;
}
.quest.is-done .quest-title {
color: #788777;
}
.quest.is-done .quest-track i {
background: #93a986;
}
.quest.is-done .quest-reward {
color: #65805b;
}
.quest.is-claimed .quest-reward {
color: #93a08b;
}
.quest-whisper {
position: relative;
display: flex;
flex: none;
align-items: center;
gap: 10px;
min-height: 62px;
margin-top: auto;
padding: 10px 12px;
overflow: hidden;
border: 1px solid rgba(87, 108, 76, .09);
border-radius: 14px;
background:
radial-gradient(circle at 93% 10%, rgba(245, 230, 186, .5), transparent 38%),
linear-gradient(135deg, rgba(242, 244, 232, .9), rgba(249, 246, 236, .75));
}
.whisper-mark {
display: grid;
flex: none;
place-items: center;
width: 35px;
height: 35px;
border-radius: 50%;
background: rgba(255, 255, 255, .62);
}
.whisper-mark svg {
width: 25px;
height: 25px;
}
.whisper-copy {
display: flex;
min-width: 0;
flex-direction: column;
gap: 2px;
}
.whisper-label {
color: #98a18f;
font-size: 6.8px;
font-weight: 700;
letter-spacing: .11em;
}
.whisper-text {
color: #687766;
font-family: var(--serif);
font-size: 10.5px;
letter-spacing: .01em;
line-height: 1.45;
}
.whisper-spark {
position: absolute;
top: 9px;
right: 12px;
color: #c8ab68;
font-family: var(--serif);
font-size: 12px;
opacity: .7;
}
.quest-foot {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 4px 10px;
margin-top: 10px;
padding-top: 10px;
border-top: 1px solid var(--line);
}
.quest-foot p {
display: flex;
align-items: center;
gap: 4px;
margin: 0;
color: #8b9487;
font-size: 8.8px;
line-height: 1.5;
}
.quest-foot .icon {
width: 10px;
height: 10px;
color: #b39a61;
}
.save-note {
color: #a3aaa0;
font-size: 8px;
white-space: nowrap;
}
@media (max-height: 899px) and (min-width: 1025px) {
.quest-whisper {
display: none;
}
}
/* ---------------------------------------------
Dialogs, general
--------------------------------------------- */
.pico-dialog {
width: min(700px, calc(100vw - 32px));
max-width: none;
max-height: calc(100vh - 32px);
max-height: calc(100dvh - 32px);
margin: auto;
padding: 0;
overflow: visible;
border: 0;
border-radius: 28px;
background: transparent;
color: var(--ink);
}
.pico-dialog::backdrop {
background: rgba(26, 39, 31, .46);
-webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(8px);
animation: backdrop-in .3s ease;
}
.pico-dialog[open] {
animation: dialog-in .34s cubic-bezier(.16, .86, .28, 1);
}
.dialog-shell {
max-height: calc(100vh - 32px);
max-height: calc(100dvh - 32px);
padding: 25px;
overflow: auto;
overscroll-behavior: contain;
border: 1px solid rgba(255, 255, 255, .65);
border-radius: 28px;
background:
radial-gradient(ellipse at 100% 0%, rgba(228, 236, 214, .46), transparent 38%),
var(--surface-strong);
box-shadow: 0 34px 90px rgba(25, 40, 27, .28), inset 0 1px 0 rgba(255, 255, 255, .9);
}
.dialog-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 18px;
margin-bottom: 20px;
}
.dialog-head h2 {
margin: 5px 0 0;
font-size: 25px;
font-weight: 680;
letter-spacing: -.04em;
line-height: 1.3;
}
.dialog-close {
display: grid;
flex: none;
place-items: center;
width: 35px;
height: 35px;
border: 1px solid var(--line);
border-radius: 50%;
background: rgba(255, 255, 255, .55);
color: #6b786b;
transition: transform .2s ease, background .2s ease;
}
.dialog-close:hover {
transform: rotate(6deg);
background: #fff;
}
.dialog-close .icon {
width: 15px;
height: 15px;
}
.dialog-note {
display: flex;
align-items: center;
justify-content: center;
gap: 5px;
margin: 17px 0 1px;
color: #929b8f;
font-size: 10px;
}
.dialog-note .icon {
width: 12px;
height: 12px;
color: #b9a26e;
}
.primary-button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
min-height: 45px;
padding: 0 20px;
border-radius: 999px;
background: var(--moss-deep);
color: #fbf7eb;
font-size: 12px;
font-weight: 650;
box-shadow: 0 10px 22px rgba(44, 70, 48, .16);
transition: transform .2s ease, background .2s ease, box-shadow .2s ease;
}
.primary-button:hover {
transform: translateY(-2px);
background: #2c4635;
box-shadow: 0 14px 28px rgba(44, 70, 48, .22);
}
.primary-button:active {
transform: translateY(0);
}
.primary-button .icon {
width: 15px;
height: 15px;
}
/* ---------------------------------------------
Food dialog
--------------------------------------------- */
.food-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 11px;
}
.food-card {
display: flex;
align-items: center;
flex-direction: column;
min-width: 0;
padding: 14px 12px 13px;
border: 1px solid rgba(55, 74, 55, .1);
border-radius: 20px;
background: rgba(252, 249, 242, .74);
text-align: center;
transition: transform .2s ease, border-color .2s ease, background .2s ease, box-shadow .2s ease;
}
.food-card:hover {
transform: translateY(-4px);
border-color: rgba(55, 78, 55, .18);
background: #fffdf7;
box-shadow: 0 14px 26px rgba(57, 71, 54, .07);
}
.food-card:active {
transform: translateY(-1px);
}
.food-art {
display: grid;
place-items: center;
width: 94px;
height: 94px;
margin-bottom: 10px;
border-radius: 50%;
}
.food-art--pudding {
background: #f8e7de;
}
.food-art--cookie {
background: #f7efd9;
}
.food-art--onigiri {
background: #e9f0df;
}
.food-art svg {
width: 83px;
height: 83px;
overflow: visible;
}
.food-copy {
display: flex;
align-items: center;
flex-direction: column;
gap: 4px;
}
.food-copy strong {
font-size: 13px;
font-weight: 680;
letter-spacing: -.01em;
}
.food-copy span {
color: #8b9589;
font-size: 9.5px;
line-height: 1.4;
}
.food-effects {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 4px;
margin-top: 9px;
}
.food-effects i {
padding: 3px 6px;
border-radius: 999px;
background: #edf0e3;
color: #758470;
font-size: 8px;
font-style: normal;
white-space: nowrap;
}
/* ---------------------------------------------
Game dialog
--------------------------------------------- */
.game-dialog {
width: min(660px, calc(100vw - 32px));
}
.game-shell {
padding: 23px;
}
.dialog-head--game {
margin-bottom: 8px;
}
.game-intro {
padding: 3px 24px 9px;
text-align: center;
}
.game-hero {
position: relative;
display: grid;
place-items: center;
width: 100%;
height: 145px;
margin: 0 auto 4px;
}
.game-hero::after {
content: "";
position: absolute;
left: 50%;
bottom: 19px;
width: 110px;
height: 16px;
border-radius: 50%;
background: rgba(73, 91, 65, .09);
filter: blur(5px);
transform: translateX(-50%);
}
.hero-orbit {
position: absolute;
top: 50%;
left: 50%;
border: 1px dashed rgba(114, 132, 103, .25);
border-radius: 50%;
transform: translate(-50%, -50%) rotate(-12deg);
}
.hero-orbit--one {
width: 245px;
height: 112px;
}
.hero-orbit--two {
width: 180px;
height: 82px;
transform: translate(-50%, -50%) rotate(31deg);
opacity: .7;
}
.hero-star {
position: relative;
z-index: 2;
display: grid;
place-items: center;
width: 82px;
height: 82px;
border: 1px solid rgba(255, 252, 224, .8);
border-radius: 26px;
background: linear-gradient(145deg, #f8e8b4, #e6bd74);
box-shadow: 0 18px 38px rgba(159, 123, 56, .18), inset 0 1px 0 rgba(255, 255, 255, .6);
transform: rotate(-8deg);
animation: hero-float 4.2s ease-in-out infinite;
}
.hero-star svg {
width: 39px;
height: 39px;
fill: #fff9e6;
stroke: #665334;
stroke-width: 1.1;
stroke-linejoin: round;
}
.hero-dot {
position: absolute;
display: block;
border-radius: 50%;
background: #e4d28e;
box-shadow: 0 0 0 4px rgba(228, 210, 142, .13);
}
.hero-dot--one {
top: 27px;
left: 25%;
width: 7px;
height: 7px;
}
.hero-dot--two {
right: 23%;
top: 47px;
width: 4px;
height: 4px;
background: #d8a88f;
box-shadow: 0 0 0 3px rgba(216, 168, 143, .12);
}
.hero-dot--three {
left: 33%;
bottom: 31px;
width: 4px;
height: 4px;
background: #95ab81;
box-shadow: 0 0 0 3px rgba(149, 171, 129, .13);
}
.game-intro h3 {
margin: 1px 0 8px;
font-size: 21px;
font-weight: 680;
letter-spacing: -.035em;
}
.game-intro > p {
max-width: 390px;
margin: 0 auto 14px;
color: #7e897e;
font-size: 12px;
line-height: 1.7;
}
.game-rewards {
display: flex;
justify-content: center;
gap: 7px;
margin-bottom: 17px;
}
.game-rewards span {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 5px 9px;
border: 1px solid rgba(62, 81, 58, .08);
border-radius: 999px;
background: #f2f2e6;
color: #768270;
font-size: 9px;
}
.game-rewards .icon {
width: 11px;
height: 11px;
}
.game-play {
padding-top: 2px;
}
.game-hud {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 9px;
padding: 0 3px;
}
.game-score {
color: #667467;
font-size: 10px;
}
.game-score strong {
color: var(--ink);
font-family: var(--serif);
font-size: 20px;
font-weight: 600;
}
.game-score span {
color: #9aa298;
}
.game-time {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 5px 9px;
border-radius: 999px;
background: #f2efe4;
color: #7c897b;
font-size: 10px;
font-variant-numeric: tabular-nums;
}
.game-time .icon {
width: 12px;
height: 12px;
}
.game-stage {
position: relative;
height: clamp(305px, 40vh, 375px);
overflow: hidden;
isolation: isolate;
border-radius: 20px;
background:
radial-gradient(ellipse at 50% 25%, rgba(139, 170, 121, .2), transparent 58%),
linear-gradient(155deg, #203a36 0%, #3a5548 48%, #7d8b64 100%);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .12);
cursor: crosshair;
}
.game-stage::before {
content: "";
position: absolute;
inset: 0;
background-image: radial-gradient(rgba(249, 241, 208, .7) .75px, transparent .75px);
background-size: 43px 41px;
opacity: .25;
mask-image: linear-gradient(to bottom, #000, transparent 78%);
-webkit-mask-image: linear-gradient(to bottom, #000, transparent 78%);
}
.stage-glow {
position: absolute;
border-radius: 50%;
filter: blur(32px);
opacity: .28;
}
.stage-glow--one {
top: 9%;
left: 13%;
width: 42%;
aspect-ratio: 1;
background: #d6c78f;
}
.stage-glow--two {
right: 4%;
bottom: 18%;
width: 42%;
aspect-ratio: 1;
background: #8fa878;
opacity: .25;
}
.stage-hill {
position: absolute;
border-radius: 50% 50% 0 0 / 100% 100% 0 0;
}
.stage-hill--one {
right: -18%;
bottom: -22%;
width: 93%;
height: 62%;
background: #4b654c;
}
.stage-hill--two {
left: -23%;
bottom: -26%;
width: 91%;
height: 53%;
background: #344d3f;
}
.game-stage-tip {
position: absolute;
right: 0;
bottom: 13px;
left: 0;
z-index: 2;
margin: 0;
color: rgba(244, 240, 221, .62);
font-size: 8.5px;
letter-spacing: .08em;
text-align: center;
pointer-events: none;
}
.game-star {
position: absolute;
z-index: 4;
display: grid;
place-items: center;
width: 62px;
height: 62px;
padding: 0;
border: 0;
border-radius: 50%;
background: transparent;
transform: translate(-50%, -50%);
animation: game-star-in .24s cubic-bezier(.2, .8, .2, 1) both;
-webkit-tap-highlight-color: transparent;
}
.game-star svg {
width: 40px;
height: 40px;
overflow: visible;
fill: #f6e3a5;
stroke: #fffbdc;
stroke-width: .9;
filter: drop-shadow(0 0 12px rgba(249, 225, 142, .9));
transition: transform .16s ease;
}
.game-star::before {
content: "";
position: absolute;
inset: 1px;
border: 1px solid rgba(249, 235, 178, .22);
border-radius: 50%;
animation: game-star-pulse 1.4s ease-out infinite;
}
.game-star:hover svg,
.game-star:focus-visible svg {
transform: scale(1.14);
}
.game-star.is-caught {
pointer-events: none;
animation: game-star-caught .35s ease forwards;
}
.game-star.is-gone {
pointer-events: none;
animation: game-star-gone .3s ease forwards;
}
.game-result {
padding: 7px 20px 4px;
text-align: center;
}
.result-stars {
display: flex;
justify-content: center;
gap: 4px;
height: 35px;
margin-bottom: 5px;
}
.result-stars span {
display: inline-flex;
transform: translateY(var(--offset, 0)) rotate(var(--rotate, 0deg));
}
.result-stars .icon {
width: 24px;
height: 24px;
color: #e3c477;
fill: #f2dda1;
stroke: #ad8e4d;
stroke-width: 1.1;
}
.result-stars span.is-empty .icon {
fill: transparent;
stroke: #d4d5c9;
opacity: .55;
}
.result-stars span.is-earned {
animation: result-star-pop .4s cubic-bezier(.2, .8, .2, 1) both;
animation-delay: var(--delay, 0s);
}
.game-result h3 {
margin: 3px 0 7px;
font-size: 22px;
font-weight: 680;
letter-spacing: -.035em;
}
.game-result > p:not(.eyebrow):not(.result-extra) {
max-width: 400px;
margin: 0 auto 13px;
color: #7d887c;
font-size: 12px;
line-height: 1.7;
}
.result-rewards {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 6px;
margin-bottom: 11px;
}
.result-rewards span {
display: inline-flex;
align-items: center;
gap: 4px;
padding: 5px 9px;
border-radius: 999px;
background: #eef1e2;
color: #667961;
font-size: 9.5px;
}
.result-rewards .icon {
width: 11px;
height: 11px;
}
.result-extra {
min-height: 16px;
margin: 0 0 12px;
color: #9a7b4d;
font-size: 10px;
line-height: 1.5;
}
/* ---------------------------------------------
Wardrobe dialog
--------------------------------------------- */
.wardrobe-dialog {
width: min(720px, calc(100vw - 32px));
}
.wallet-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 22px;
margin-bottom: 14px;
padding: 13px 16px;
border: 1px solid rgba(70, 88, 59, .08);
border-radius: 16px;
background:
radial-gradient(circle at 0% 0%, rgba(255, 255, 255, .75), transparent 55%),
#eef1e3;
}
.wallet-copy {
display: flex;
flex: none;
align-items: center;
gap: 9px;
}
.wallet-copy > span {
color: #7b8878;
font-size: 9px;
}
.wallet-copy strong {
display: inline-flex;
align-items: center;
gap: 3px;
font-family: var(--serif);
font-size: 22px;
font-weight: 600;
letter-spacing: -.03em;
}
.coin-inline {
width: 15px;
height: 15px;
fill: #d3ab58;
stroke: #a27b36;
stroke-width: 1.2;
}
.wallet-row p {
max-width: 300px;
margin: 0;
color: #8b9587;
font-size: 9.5px;
line-height: 1.55;
text-align: right;
}
.shop-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
}
.shop-item {
--item-tint: #f5ead0;
position: relative;
display: flex;
flex-direction: column;
min-width: 0;
overflow: hidden;
border: 1px solid rgba(52, 72, 52, .1);
border-radius: 19px;
background: rgba(252, 250, 243, .8);
transition: border-color .2s ease, transform .2s ease, box-shadow .2s ease;
}
.shop-item--scarf {
--item-tint: #f4dfd6;
}
.shop-item--beret {
--item-tint: #e6e7d3;
}
.shop-item:hover {
transform: translateY(-2px);
border-color: rgba(52, 74, 52, .17);
box-shadow: 0 10px 24px rgba(54, 68, 51, .06);
}
.shop-item.is-equipped {
border-color: rgba(82, 111, 74, .44);
box-shadow: 0 0 0 2px rgba(120, 145, 103, .09);
}
.shop-art {
position: relative;
display: grid;
place-items: center;
height: 122px;
background:
radial-gradient(circle at 35% 24%, rgba(255, 255, 255, .9), transparent 46%),
var(--item-tint);
}
.shop-art::after {
content: "";
position: absolute;
left: 50%;
bottom: 15px;
width: 66px;
height: 10px;
border-radius: 50%;
background: rgba(55, 71, 45, .08);
filter: blur(4px);
transform: translateX(-50%);
}
.shop-art svg {
position: relative;
z-index: 1;
width: 76px;
height: 76px;
filter: drop-shadow(0 7px 9px rgba(49, 64, 43, .1));
}
.equip-check {
position: absolute;
z-index: 2;
top: 9px;
right: 9px;
display: grid;
place-items: center;
width: 22px;
height: 22px;
border-radius: 50%;
background: #55714f;
color: #fffdf5;
box-shadow: 0 4px 10px rgba(49, 72, 45, .18);
}
.equip-check .icon {
width: 11px;
height: 11px;
stroke-width: 2.4;
}
.shop-info {
display: flex;
flex: 1;
flex-direction: column;
padding: 11px 12px 12px;
}
.shop-info h3 {
margin: 0;
font-size: 12.5px;
font-weight: 680;
}
.shop-info p {
min-height: 27px;
margin: 3px 0 10px;
color: #8c9589;
font-size: 9px;
line-height: 1.55;
}
.shop-actions {
display: flex;
align-items: center;
justify-content: space-between;
gap: 7px;
margin-top: auto;
}
.shop-price {
display: inline-flex;
align-items: center;
gap: 2px;
color: #9b814a;
font-size: 9.5px;
}
.shop-price.is-owned {
color: #7f8d7a;
}
.shop-price .icon {
width: 10px;
height: 10px;
fill: currentColor;
stroke-width: 1;
}
.shop-button {
min-height: 28px;
padding: 0 10px;
border: 1px solid rgba(61, 83, 59, .12);
border-radius: 999px;
background: #f1f1e4;
color: #5f735a;
font-size: 9.5px;
font-weight: 650;
white-space: nowrap;
transition: background .18s ease, transform .18s ease;
}
.shop-button:hover {
transform: translateY(-1px);
background: #e8ecdb;
}
.shop-button.is-equip {
background: #54704f;
color: #fdfaef;
}
.shop-button.is-equip:hover {
background: #435e40;
}
.shop-button:disabled {
opacity: .52;
transform: none;
}
.shop-foot {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
margin-top: 16px;
padding-top: 13px;
border-top: 1px solid var(--line);
}
.text-button--plain {
color: #7b8876;
font-weight: 500;
}
.text-button--plain .icon {
width: 15px;
height: 15px;
}
#shopMessage {
margin: 0;
color: #959d92;
font-size: 8.5px;
line-height: 1.5;
text-align: right;
}
#shopMessage.is-warm {
color: #ae724f;
}
#shopMessage.is-good {
color: #5d7c54;
}
.shop-item.is-shaking {
animation: item-shake .35s ease;
}
/* ---------------------------------------------
Toasts & confetti
--------------------------------------------- */
.toast-stack {
position: fixed;
z-index: 100;
right: 24px;
bottom: 22px;
display: flex;
flex-direction: column;
gap: 8px;
width: min(310px, calc(100vw - 32px));
pointer-events: none;
}
body.modal-open .toast-stack {
visibility: hidden;
opacity: 0;
}
.toast {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
align-items: start;
gap: 9px;
padding: 12px 13px;
border: 1px solid rgba(255, 255, 255, .1);
border-radius: 14px;
background: rgba(45, 65, 51, .96);
color: #f9f5e8;
box-shadow: 0 16px 36px rgba(26, 39, 28, .2);
-webkit-backdrop-filter: blur(10px);
backdrop-filter: blur(10px);
animation: toast-in .34s cubic-bezier(.2, .8, .2, 1);
}
.toast.is-leaving {
animation: toast-out .25s ease forwards;
}
.toast-icon {
display: grid;
place-items: center;
width: 23px;
height: 23px;
border-radius: 8px;
background: rgba(247, 231, 177, .14);
color: #eedb9d;
}
.toast-icon .icon {
width: 12px;
height: 12px;
fill: currentColor;
stroke-width: 1.3;
}
.toast-copy strong {
display: block;
margin-bottom: 2px;
font-size: 11.5px;
font-weight: 650;
line-height: 1.45;
}
.toast-copy span {
display: block;
color: rgba(249, 245, 232, .68);
font-size: 9.5px;
line-height: 1.55;
}
.toast--level .toast-icon {
background: rgba(241, 207, 119, .18);
color: #f4d98f;
}
.celebration-layer {
position: fixed;
z-index: 101;
inset: 0;
overflow: hidden;
pointer-events: none;
}
.confetti {
position: absolute;
top: -18px;
width: 7px;
height: 12px;
border-radius: 2px;
background: var(--confetti-color);
opacity: 0;
animation: confetti-fall var(--fall-time, 2.4s) cubic-bezier(.2, .6, .4, 1) forwards;
animation-delay: var(--fall-delay, 0s);
}
.confetti.is-round {
width: 6px;
height: 6px;
border-radius: 50%;
}
/* ---------------------------------------------
Responsive
--------------------------------------------- */
@media (max-width: 1180px) {
.header-note {
display: none;
}
.layout {
grid-template-columns: minmax(0, 1.45fr) minmax(360px, .95fr);
}
.speech-bubble {
width: min(220px, 34%);
}
.action-copy small {
font-size: 8px;
}
}
@media (max-width: 1024px) {
.app {
width: min(900px, calc(100% - 32px));
padding: 17px 0 24px;
}
.layout {
grid-template-columns: minmax(0, 1fr);
height: auto;
max-height: none;
min-height: 0;
gap: 14px;
}
.habitat {
height: clamp(520px, 63vw, 650px);
min-height: 520px;
}
.pet-area {
width: clamp(290px, 44%, 390px);
}
.speech-bubble {
width: min(240px, 34%);
}
.dashboard {
display: grid;
grid-template-columns: minmax(0, 1.1fr) minmax(0, .9fr);
align-items: stretch;
gap: 14px;
}
.quest-panel {
min-height: 100%;
}
.care-copy {
min-height: 0;
}
.quest-list {
flex: 1;
}
.quest {
padding: 11px 0;
}
}
@media (max-width: 760px) {
.app {
width: calc(100% - 24px);
padding: 12px 0 22px;
}
.topbar {
padding-bottom: 11px;
gap: 10px;
}
.brand-mark {
width: 39px;
height: 39px;
border-radius: 13px;
}
.brand-mark svg {
width: 31px;
height: 31px;
}
.brand {
gap: 8px;
}
.brand-name {
font-size: 27px;
}
.brand-sub {
font-size: 8px;
letter-spacing: .08em;
}
.coin-menu {
height: 37px;
padding-right: 10px;
}
.coin-star {
width: 22px;
height: 22px;
}
.coin-value {
font-size: 17px;
}
.coin-unit {
display: none;
}
.icon-button {
width: 37px;
height: 37px;
}
.layout {
gap: 12px;
}
.habitat {
height: clamp(470px, 128vw, 570px);
min-height: 470px;
border-radius: 25px;
}
.scene-meta {
top: 15px;
left: 15px;
right: 15px;
gap: 8px;
}
.scene-badge,
.date-badge {
height: 27px;
padding: 0 9px;
font-size: 7px;
letter-spacing: .1em;
}
.date-badge {
font-size: 8.5px;
letter-spacing: 0;
}
.date-badge .icon {
width: 12px;
height: 12px;
}
.speech-bubble {
top: 17.5%;
left: 5.5%;
width: 54%;
min-width: 0;
padding: 10px 12px 11px;
border-radius: 14px 14px 14px 4px;
}
.speech-bubble::after {
right: 22px;
}
.speech-bubble p {
margin-top: 3px;
font-size: 11px;
line-height: 1.6;
}
.speech-label {
font-size: 7px;
}
.sun {
top: 12%;
right: 7%;
width: 95px;
}
.moon {
top: 12.5%;
right: 8%;
width: 58px;
}
.cloud--one {
top: 27%;
left: -9%;
width: 125px;
opacity: .4;
}
.cloud--two {
top: 42%;
right: -7%;
width: 92px;
opacity: .3;
}
.cloud--three {
display: none;
}
.birds {
left: 43%;
top: 20%;
opacity: .35;
}
.bird:nth-child(2) {
display: none;
}
.pet-area {
left: 52%;
bottom: 3%;
width: clamp(255px, 66vw, 340px);
}
.nameplate {
left: 13px;
bottom: 14px;
gap: 7px;
padding: 7px 10px 7px 7px;
border-radius: 13px;
}
.nameplate-mark {
width: 29px;
height: 29px;
}
.nameplate-mark svg {
width: 23px;
height: 23px;
}
.nameplate-title h1 {
font-size: 11px;
}
.nameplate-copy p {
font-size: 8px;
}
.nameplate-title span {
font-size: 6.5px;
}
.pet-hint {
right: 13px;
bottom: 14px;
height: 32px;
padding: 0 11px 0 9px;
font-size: 9px;
}
.garden-plant--left {
left: -9%;
width: clamp(130px, 37vw, 190px);
opacity: .75;
}
.garden-plant--right {
right: -9%;
width: clamp(112px, 31vw, 165px);
opacity: .8;
}
.meadow-flowers {
left: 41%;
bottom: 4%;
width: 160px;
opacity: .65;
}
.hill--back {
bottom: 26%;
}
.hill--middle {
bottom: 19%;
}
.hill--front {
bottom: -32%;
height: 75%;
}
.dashboard {
display: flex;
flex-direction: column;
gap: 12px;
}
.care-panel {
padding: 18px;
border-radius: 23px;
}
.care-heading h2 {
margin-top: 5px;
font-size: 21px;
}
.level-badge {
width: 62px;
height: 59px;
border-radius: 14px;
}
.level-badge strong {
font-size: 22px;
}
.care-copy {
margin: 8px 0 13px;
font-size: 11px;
}
.stats-grid {
gap: 7px;
margin-bottom: 11px;
}
.stat {
padding: 8px 9px;
}
.stat-name {
font-size: 9.5px;
}
.stat-value b {
font-size: 12px;
}
.actions-grid {
gap: 7px;
margin-bottom: 11px;
}
.care-action {
min-height: 55px;
padding: 8px;
gap: 8px;
}
.action-icon {
width: 31px;
height: 31px;
}
.action-copy strong {
font-size: 11.5px;
}
.action-copy small {
font-size: 8.5px;
}
.care-foot {
padding-top: 10px;
}
.care-count {
font-size: 9px;
}
.text-button {
font-size: 10px;
}
.quest-panel {
min-height: 0;
padding: 16px 17px 14px;
border-radius: 23px;
}
.quest-head h2 {
font-size: 16px;
}
.quest-title {
font-size: 10.5px;
}
.quest-whisper {
margin-top: 12px;
}
.quest {
padding: 9px 0;
}
.quest-foot {
padding-top: 9px;
}
.save-note {
white-space: normal;
}
.dialog-shell {
padding: 19px;
border-radius: 23px;
}
.dialog-head {
margin-bottom: 16px;
}
.dialog-head h2 {
font-size: 21px;
}
.food-grid {
gap: 8px;
}
.food-card {
padding: 10px 7px 11px;
border-radius: 16px;
}
.food-art {
width: 72px;
height: 72px;
margin-bottom: 7px;
}
.food-art svg {
width: 66px;
height: 66px;
}
.food-copy strong {
font-size: 12px;
}
.food-copy span {
font-size: 8.5px;
}
.food-effects {
gap: 3px;
margin-top: 6px;
}
.food-effects i {
padding: 2px 4px;
font-size: 7.5px;
}
.dialog-note {
margin-top: 13px;
font-size: 9.5px;
}
.game-shell {
padding: 17px;
}
.game-intro {
padding: 0 2px 5px;
}
.game-hero {
height: 120px;
}
.game-intro h3 {
font-size: 19px;
}
.game-intro > p {
font-size: 11.5px;
}
.game-stage {
height: clamp(290px, 48vh, 340px);
}
.game-result {
padding: 4px 2px;
}
.game-result h3 {
font-size: 20px;
}
.wallet-row {
align-items: flex-start;
flex-direction: column;
gap: 7px;
padding: 11px 13px;
}
.wallet-row p {
max-width: none;
text-align: left;
}
.shop-grid {
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 7px;
}
.shop-art {
height: 94px;
}
.shop-art svg {
width: 60px;
height: 60px;
}
.shop-info {
padding: 9px;
}
.shop-info h3 {
font-size: 11px;
}
.shop-info p {
min-height: 33px;
font-size: 8.5px;
}
.shop-button {
padding: 0 7px;
font-size: 8.5px;
}
.shop-price {
font-size: 9px;
}
.shop-actions {
gap: 3px;
}
.shop-foot {
align-items: flex-start;
flex-direction: column;
gap: 7px;
}
#shopMessage {
min-height: 12px;
text-align: left;
}
.toast-stack {
right: 14px;
bottom: 14px;
}
}
@media (max-width: 560px) {
.brand-sub {
display: none;
}
.brand-name {
font-size: 28px;
}
.habitat {
height: clamp(445px, 124vw, 540px);
min-height: 445px;
}
.speech-bubble {
width: 57%;
top: 16.5%;
}
.sun {
width: 81px;
top: 13.5%;
}
.moon {
width: 49px;
top: 14%;
}
.scene-badge {
letter-spacing: .08em;
}
.pet-area {
bottom: 2.5%;
width: clamp(245px, 68vw, 315px);
}
.nameplate {
left: 10px;
bottom: 11px;
}
.pet-hint {
right: 10px;
bottom: 11px;
}
.garden-plant--left {
width: 125px;
}
.garden-plant--right {
width: 108px;
}
.meadow-flowers {
width: 130px;
left: 38%;
}
.stats-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 6px;
}
.stat {
padding: 7px 8px 8px;
}
.actions-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.care-action {
min-height: 53px;
padding: 8px;
}
.action-copy strong {
font-size: 11.5px;
}
.action-copy small {
font-size: 8px;
}
.food-grid {
grid-template-columns: 1fr;
gap: 7px;
}
.food-card {
display: grid;
grid-template-columns: 62px minmax(0, 1fr);
grid-template-rows: auto auto;
column-gap: 10px;
padding: 9px 11px;
text-align: left;
}
.food-art {
grid-row: 1 / 3;
width: 58px;
height: 58px;
margin: 0;
}
.food-art svg {
width: 53px;
height: 53px;
}
.food-copy {
align-items: flex-start;
gap: 1px;
}
.food-effects {
justify-content: flex-start;
margin-top: 4px;
}
.dialog-note {
align-items: flex-start;
text-align: center;
}
.game-hero {
height: 105px;
}
.hero-star {
width: 66px;
height: 66px;
border-radius: 21px;
}
.hero-star svg {
width: 31px;
height: 31px;
}
.hero-orbit--one {
width: 205px;
height: 96px;
}
.hero-orbit--two {
width: 150px;
height: 69px;
}
.game-hero::after {
bottom: 8px;
}
.game-stage {
height: 55vw;
min-height: 275px;
}
.game-rewards {
margin-bottom: 14px;
}
.game-star {
width: 56px;
height: 56px;
}
.game-star svg {
width: 35px;
height: 35px;
}
.wallet-copy > span {
font-size: 8.5px;
}
.shop-grid {
grid-template-columns: 1fr;
gap: 7px;
}
.shop-item {
display: grid;
grid-template-columns: 90px minmax(0, 1fr);
align-items: stretch;
}
.shop-art {
height: 100%;
min-height: 96px;
}
.shop-art::after {
bottom: 13px;
width: 50px;
}
.shop-art svg {
width: 59px;
height: 59px;
}
.shop-info {
padding: 10px 12px;
}
.shop-info p {
min-height: 0;
margin-bottom: 7px;
}
.equip-check {
top: 7px;
right: 7px;
}
.result-stars .icon {
width: 21px;
height: 21px;
}
.game-result h3 {
font-size: 19px;
}
}
@media (max-width: 380px) {
.app {
width: calc(100% - 18px);
}
.brand-mark {
width: 35px;
height: 35px;
}
.brand-mark svg {
width: 28px;
height: 28px;
}
.coin-menu {
padding-left: 6px;
padding-right: 8px;
}
.care-panel {
padding: 15px;
}
.care-heading h2 {
font-size: 19px;
}
.level-badge {
width: 56px;
height: 55px;
}
.level-badge strong {
font-size: 20px;
}
.scene-badge {
padding: 0 8px;
font-size: 6.5px;
}
.date-badge {
padding: 0 8px;
font-size: 7.5px;
}
.speech-bubble {
top: 16%;
left: 4.5%;
width: 60%;
padding: 9px 10px;
}
.speech-bubble p {
font-size: 10px;
}
.nameplate-copy p {
max-width: 105px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.quest-head .eyebrow {
letter-spacing: .08em;
}
.refresh-note {
font-size: 8px;
}
.quest-title {
font-size: 10px;
}
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
scroll-behavior: auto !important;
animation-duration: .01ms !important;
animation-iteration-count: 1 !important;
transition-duration: .01ms !important;
}
.pet-svg,
.sun,
.stars i,
.fireflies i,
.motes i,
.hero-star,
.pet-button .eye {
animation: none !important;
}
}
/* ---------------------------------------------
Keyframes
--------------------------------------------- */
@keyframes pet-float {
0%, 100% { transform: translateY(0) rotate(-.25deg); }
50% { transform: translateY(-7px) rotate(.3deg); }
}
@keyframes eye-blink {
0%, 91%, 97%, 100% { transform: scaleY(1); }
93%, 95% { transform: scaleY(.08); }
}
@keyframes tail-sway {
0%, 100% { transform: rotate(-1.8deg); }
50% { transform: rotate(2.8deg); }
}
@keyframes ears-listen {
0%, 88%, 96%, 100% { transform: rotate(0); }
91% { transform: rotate(-2deg); }
93% { transform: rotate(1.2deg); }
}
@keyframes sprout-sway {
0%, 100% { transform: rotate(-1.2deg); }
50% { transform: rotate(2deg); }
}
@keyframes munch {
0%, 100% { transform: translateY(0) scale(1, 1); }
35% { transform: translateY(3px) scale(1.015, .97); }
65% { transform: translateY(-2px) scale(.99, 1.012); }
}
@keyframes clean-wiggle {
0%, 100% { transform: rotate(0); }
30% { transform: rotate(-1.5deg); }
70% { transform: rotate(1.5deg); }
}
@keyframes pet-squish {
0% { transform: translateY(0) scale(1); }
35% { transform: translateY(5px) scale(1.025, .965); }
65% { transform: translateY(-3px) scale(.99, 1.015); }
100% { transform: translateY(0) scale(1); }
}
@keyframes zzz-rise {
0% { opacity: 0; transform: translate(-6px, 10px) rotate(-10deg) scale(.7); }
22% { opacity: .9; }
70% { opacity: .5; }
100% { opacity: 0; transform: translate(13px, -28px) rotate(12deg) scale(1.08); }
}
@keyframes sun-breathe {
0%, 100% { transform: scale(1); opacity: .94; }
50% { transform: scale(1.025); opacity: 1; }
}
@keyframes cloud-drift {
from { transform: translateX(-8px); }
to { transform: translateX(16px); }
}
@keyframes star-twinkle {
0%, 100% { opacity: .3; transform: scale(.85); }
45% { opacity: 1; transform: scale(1.15); }
}
@keyframes mote-drift {
from { transform: translate(-5px, 4px); opacity: .25; }
to { transform: translate(10px, -13px); opacity: .75; }
}
@keyframes firefly {
0%, 100% { transform: translate(0, 0); opacity: .15; }
35% { opacity: 1; }
60% { transform: translate(8px, -12px); opacity: .35; }
80% { transform: translate(-4px, -5px); opacity: .9; }
}
@keyframes plant-sway {
0%, 100% { transform: rotate(-.7deg); }
50% { transform: rotate(1.2deg); }
}
@keyframes speech-pop {
0% { transform: translateY(4px) scale(.975); opacity: .7; }
100% { transform: translateY(0) scale(1); opacity: 1; }
}
@keyframes fx-rise {
0% {
opacity: 0;
transform: translate(-50%, -50%) scale(.4) rotate(0deg);
}
14% { opacity: 1; }
100% {
opacity: 0;
transform: translate(calc(-50% + var(--dx, 10px)), calc(-50% - 86px)) scale(var(--scale, 1)) rotate(var(--rot, 8deg));
}
}
@keyframes bubble-rise {
0% {
opacity: 0;
transform: translate(-50%, 0) scale(.5);
}
18% { opacity: .85; }
100% {
opacity: 0;
transform: translate(calc(-50% + var(--drift, 14px)), -125px) scale(1.08);
}
}
@keyframes live-pulse {
0%, 100% { box-shadow: 0 0 0 3px rgba(120, 149, 107, .1); }
50% { box-shadow: 0 0 0 5px rgba(120, 149, 107, .03); }
}
@keyframes low-pulse {
0%, 100% { opacity: .62; }
50% { opacity: 1; }
}
@keyframes dialog-in {
from { opacity: 0; transform: translateY(14px) scale(.975); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes backdrop-in {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes hero-float {
0%, 100% { transform: translateY(0) rotate(-8deg); }
50% { transform: translateY(-8px) rotate(-3deg); }
}
@keyframes game-star-in {
0% { opacity: 0; transform: translate(-50%, -50%) scale(.25) rotate(-25deg); }
70% { opacity: 1; transform: translate(-50%, -50%) scale(1.1) rotate(5deg); }
100% { opacity: 1; transform: translate(-50%, -50%) scale(1) rotate(0); }
}
@keyframes game-star-pulse {
0% { transform: scale(.75); opacity: .5; }
80%, 100% { transform: scale(1.45); opacity: 0; }
}
@keyframes game-star-caught {
0% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
50% { opacity: 1; transform: translate(-50%, -65%) scale(1.35); }
100% { opacity: 0; transform: translate(-50%, -85%) scale(.3); }
}
@keyframes game-star-gone {
0% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
100% { opacity: 0; transform: translate(-50%, -60%) scale(.65); }
}
@keyframes result-star-pop {
0% { opacity: 0; transform: translateY(9px) scale(.4) rotate(-10deg); }
100% { opacity: 1; transform: translateY(var(--offset, 0)) scale(1) rotate(var(--rotate, 0deg)); }
}
@keyframes toast-in {
from { opacity: 0; transform: translateY(10px) scale(.97); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes toast-out {
to { opacity: 0; transform: translateY(6px) scale(.98); }
}
@keyframes item-shake {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-3px); }
55% { transform: translateX(3px); }
78% { transform: translateX(-2px); }
}
@keyframes confetti-fall {
0% {
opacity: 0;
transform: translate3d(0, -20px, 0) rotate(0);
}
8% { opacity: 1; }
100% {
opacity: 0;
transform: translate3d(var(--drift, 30px), 105vh, 0) rotate(var(--spin, 480deg));
}
}