/* ---------- App shell ---------------------------------------------------- */ .app { min-height: 100dvh; } .view-host { /* Explicit width (not just max-width) so that as a grid item on desktop it fills the column instead of shrink-wrapping to its content. */ width: 100%; max-width: var(--maxw); margin-inline: auto; padding: var(--gap); padding-bottom: calc(var(--nav-size) + env(safe-area-inset-bottom) + var(--gap)); } /* ---------- Nav: bottom bar on phones, sidebar on wide screens ---------- */ .nav { position: fixed; inset: auto 0 0 0; height: calc(var(--nav-size) + env(safe-area-inset-bottom)); padding-bottom: env(safe-area-inset-bottom); display: flex; align-items: stretch; background: var(--surface); border-top: 1px solid var(--border); z-index: 20; } .nav__brand { display: none; } .nav__link { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; text-decoration: none; color: var(--text-dim); font-size: 0.72rem; border: none; background: none; } .nav__link.is-active { color: var(--accent); } .nav__icon { font-size: 1.25rem; line-height: 1; } @media (min-width: 1024px) { .app { display: grid; grid-template-columns: 220px 1fr; } .nav { position: sticky; top: 0; inset: 0 auto 0 0; height: 100dvh; flex-direction: column; align-items: stretch; padding: var(--gap) 12px; gap: 4px; border-top: none; border-right: 1px solid var(--border); } .nav__brand { display: block; font-weight: 800; font-size: 1.15rem; color: var(--accent); padding: 8px 12px 16px; } .nav__link { flex: 0 0 auto; flex-direction: row; justify-content: flex-start; gap: 12px; padding: 10px 12px; border-radius: var(--radius-sm); font-size: 0.95rem; } .nav__link.is-active { background: var(--surface-2); } .view-host { padding: calc(var(--gap) * 1.5); padding-bottom: calc(var(--gap) * 2); } } /* ---------- Generic bits ---------------------------------------------- */ .view--loading, .view--error { padding: 48px 8px; text-align: center; color: var(--text-dim); } .view__header h1 { margin: 0 0 4px; font-size: 1.4rem; } .view__header p { margin: 0 0 16px; color: var(--text-dim); } .link { color: var(--accent); text-decoration: none; font-weight: 600; } .link:hover { text-decoration: underline; } .button { appearance: none; border: 1px solid var(--border); background: var(--surface); color: var(--text); padding: 9px 14px; border-radius: var(--radius-sm); font: inherit; font-weight: 600; cursor: pointer; } .button:hover { border-color: var(--accent); } .button--ghost { background: transparent; } .button--danger { color: var(--danger); border-color: color-mix(in srgb, var(--danger) 40%, var(--border)); } .chips { display: flex; flex-wrap: wrap; gap: 8px; } .chip { appearance: none; border: 1px solid var(--border); background: var(--surface); color: var(--text-dim); padding: 6px 12px; border-radius: 999px; font: inherit; font-size: 0.85rem; cursor: pointer; } .chip.is-active { background: var(--accent); color: var(--accent-text); border-color: var(--accent); } /* ---------- Type chips ---------------------------------------------- */ .type-chip { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: 0.68rem; font-weight: 700; text-transform: capitalize; color: #fff; background: var(--type-normal); letter-spacing: 0.02em; } .type-chip[data-type="normal"] { background: var(--type-normal); } .type-chip[data-type="fire"] { background: var(--type-fire); } .type-chip[data-type="water"] { background: var(--type-water); } .type-chip[data-type="electric"] { background: var(--type-electric); color: #3a3a1a; } .type-chip[data-type="grass"] { background: var(--type-grass); } .type-chip[data-type="ice"] { background: var(--type-ice); color: #1c3b38; } .type-chip[data-type="fighting"] { background: var(--type-fighting); } .type-chip[data-type="poison"] { background: var(--type-poison); } .type-chip[data-type="ground"] { background: var(--type-ground); } .type-chip[data-type="flying"] { background: var(--type-flying); } .type-chip[data-type="psychic"] { background: var(--type-psychic); } .type-chip[data-type="bug"] { background: var(--type-bug); } .type-chip[data-type="rock"] { background: var(--type-rock); color: #2e2a1c; } .type-chip[data-type="ghost"] { background: var(--type-ghost); } .type-chip[data-type="dragon"] { background: var(--type-dragon); } .type-chip[data-type="dark"] { background: var(--type-dark); } .type-chip[data-type="steel"] { background: var(--type-steel); } .type-chip[data-type="fairy"] { background: var(--type-fairy); color: #3d1f3b; } /* ---------- Dex grid ---------------------------------------------- */ .progress-header { position: sticky; top: 0; z-index: 10; background: var(--bg); padding: 8px 0 12px; } .progress-header__titles h1 { margin: 0; font-size: 1.7rem; font-weight: 700; text-transform: capitalize; } .progress-header__sub, .progress-header__counts { margin: 2px 0 0; color: var(--text-dim); font-size: 0.9rem; } .progress-header__dot { margin: 0 6px; } .progress-header__track { margin-top: 12px; height: 8px; border-radius: 999px; background: var(--surface-2); overflow: hidden; } .progress-header__bar { height: 100%; width: 0; border-radius: 999px; background: linear-gradient(90deg, var(--good), color-mix(in srgb, var(--good) 60%, #74c0fc)); transition: width 0.4s var(--ease-spring); } .dexgrid__controls { display: flex; flex-direction: column; gap: 10px; margin: 8px 0 16px; } .dexgrid__search, .search__input { width: 100%; padding: 12px 16px; border: 1.5px solid var(--border); border-radius: 999px; background: var(--surface); color: var(--text); font: inherit; } .dexgrid__search:focus, .search__input:focus { outline: none; border-color: var(--accent); } .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(9.5rem, 1fr)); gap: var(--gap); } @media (min-width: 640px) { .grid { grid-template-columns: repeat(auto-fill, minmax(11rem, 1fr)); } } @media (min-width: 1200px) { .grid { grid-template-columns: repeat(auto-fill, minmax(12.5rem, 1fr)); } } .grid__empty { grid-column: 1 / -1; text-align: center; color: var(--text-dim); padding: 32px 0; } .card { position: relative; display: flex; flex-direction: column; align-items: center; gap: 5px; padding: 16px 12px 14px; border-radius: var(--radius); text-decoration: none; color: inherit; overflow: hidden; background: linear-gradient( 165deg, color-mix(in srgb, var(--type-main) 26%, var(--surface)) 0%, var(--surface) 60% ); border: 1px solid color-mix(in srgb, var(--type-main) 22%, var(--border)); box-shadow: var(--shadow); content-visibility: auto; contain-intrinsic-size: 232px; transition: transform 0.14s var(--ease-spring), box-shadow 0.14s ease; } .card > * { position: relative; z-index: 1; } .card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg); } .card__spot { position: absolute; top: 30px; left: 50%; width: 118px; height: 118px; transform: translateX(-50%); z-index: 0; pointer-events: none; background: radial-gradient( circle, color-mix(in srgb, var(--type-main) 42%, transparent) 0%, transparent 68% ); } .card__bignum { position: absolute; top: 74px; left: 50%; transform: translate(-50%, -50%); z-index: 0; font-size: 4.2rem; font-weight: 800; line-height: 1; font-variant-numeric: tabular-nums; color: color-mix(in srgb, var(--type-main) 24%, transparent); pointer-events: none; } .card .sprite { width: 112px; height: 112px; object-fit: contain; filter: drop-shadow(0 6px 10px rgba(0, 0, 0, 0.22)); } .card[data-sprite="default"] .sprite, .card[data-sprite="game"] .sprite { image-rendering: pixelated; } .card__num { font-size: 0.72rem; color: var(--text-dim); font-weight: 600; font-variant-numeric: tabular-nums; } .card__name { font-weight: 700; font-size: 0.95rem; text-transform: capitalize; text-align: center; } .card__types { display: flex; gap: 4px; flex-wrap: wrap; justify-content: center; } .card__caught { position: absolute; top: 10px; right: 10px; z-index: 2; width: 28px; height: 28px; border-radius: 50%; border: none; cursor: pointer; display: grid; place-items: center; font-size: 0.8rem; color: #333; background: rgba(255, 255, 255, 0.72); backdrop-filter: blur(3px); } .card__caught[aria-pressed="true"] { background: var(--good); color: #fff; } .card__caught[aria-pressed="true"]::before { content: "✓"; } .card__caught[aria-pressed="false"]::before { content: "+"; } .card.is-caught { border-color: color-mix(in srgb, var(--good) 45%, var(--border)); } /* ---------- Game picker ------------------------------------------- */ .gamepicker__subdex { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 18px; } .gamepicker__subdex-label { color: var(--text-dim); font-size: 0.85rem; } .gamepicker__gen { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: var(--text-dim); font-weight: 600; margin: 26px 0 12px; } .gamepicker__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr)); gap: 12px; } .gamecard { display: flex; flex-direction: column; gap: 3px; text-align: left; padding: 14px 16px; border: 1.5px solid var(--border); border-radius: var(--radius); background: var(--surface); color: inherit; cursor: pointer; font: inherit; box-shadow: var(--shadow); transition: transform 0.14s var(--ease-spring), border-color 0.14s ease; } .gamecard:hover { transform: translateY(-3px); border-color: var(--accent); } .gamecard.is-active { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 12%, var(--surface)); } .gamecard__name { font-weight: 700; } .gamecard__meta { font-size: 0.78rem; color: var(--text-dim); text-transform: capitalize; } /* ================= Detail: type-themed hero + tabbed sheet ========= */ .pdetail { --ink: #fff; max-width: 960px; margin: 0 auto; } .detail__muted { color: var(--text-dim); margin: 0; } /* ---- Hero -------------------------------------------------------- */ .phero { position: relative; overflow: hidden; border-radius: var(--radius-lg); padding: 16px 20px 96px; color: var(--ink); isolation: isolate; } .phero__bg { position: absolute; inset: 0; z-index: -2; background: radial-gradient(120% 80% at 80% 0%, color-mix(in srgb, var(--type-2) 55%, transparent), transparent 60%), linear-gradient(160deg, color-mix(in srgb, var(--type-main) 92%, #fff 8%) 0%, color-mix(in srgb, var(--type-main) 62%, #000 38%) 100%); } .phero__ball { position: absolute; top: -70px; right: -60px; width: 260px; height: 260px; z-index: -1; opacity: 0.1; border: 20px solid #fff; border-radius: 50%; } .phero__ball::before { content: ""; position: absolute; left: -20px; right: -20px; top: 50%; height: 20px; transform: translateY(-50%); background: #fff; } .phero__ball::after { content: ""; position: absolute; left: 50%; top: 50%; width: 84px; height: 84px; transform: translate(-50%, -50%); border: 20px solid #fff; border-radius: 50%; } .phero__bignum { position: absolute; right: 16px; bottom: 64px; z-index: -1; font-size: 5rem; font-weight: 800; letter-spacing: -0.02em; color: rgba(255, 255, 255, 0.16); font-variant-numeric: tabular-nums; } .phero__top { display: flex; align-items: center; justify-content: space-between; gap: 12px; font-weight: 600; } .phero__back, .phero__num { color: var(--ink); text-decoration: none; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); font-size: 0.9rem; } .phero__num { opacity: 0.85; text-transform: capitalize; } .phero__head { margin-top: 14px; } .phero__name { margin: 0; font-size: 2.2rem; font-weight: 700; text-transform: capitalize; text-shadow: 0 2px 8px rgba(0, 0, 0, 0.18); } .phero__types { display: flex; gap: 8px; margin-top: 8px; } .phero__types .type-chip { background: rgba(255, 255, 255, 0.25); backdrop-filter: blur(4px); color: var(--ink); padding: 4px 12px; font-size: 0.72rem; } .phero__stage { display: flex; align-items: center; justify-content: center; gap: 8px; margin-top: 4px; } .phero__art { width: min(300px, 64vw); height: min(300px, 64vw); display: grid; place-items: center; filter: drop-shadow(0 16px 24px rgba(0, 0, 0, 0.28)); animation: pop 0.5s var(--ease-spring); } .phero__art img { width: 100%; height: 100%; object-fit: contain; } @keyframes pop { from { transform: scale(0.8); opacity: 0; } to { transform: scale(1); opacity: 1; } } .phero__nav { width: 44px; height: 44px; flex: none; display: grid; place-items: center; border-radius: 50%; font-size: 1.4rem; color: var(--ink); text-decoration: none; background: rgba(255, 255, 255, 0.16); } .phero__nav:hover { background: rgba(255, 255, 255, 0.3); } .phero__shiny { position: absolute; right: 20px; bottom: 108px; border: none; border-radius: 999px; padding: 6px 14px; font: inherit; font-size: 0.75rem; font-weight: 600; cursor: pointer; color: var(--ink); background: rgba(255, 255, 255, 0.18); } .phero__shiny.is-on { background: #fff; color: var(--type-main); } /* ---- Sheet ----------------------------------------------------- */ .psheet { position: relative; margin-top: -72px; background: var(--surface); border-radius: var(--radius-lg) var(--radius-lg) var(--radius) var(--radius); box-shadow: var(--shadow-lg); padding: 18px clamp(16px, 4vw, 32px) 28px; } .ptrack { display: flex; justify-content: center; gap: 10px; margin-bottom: 6px; } .ptrack__btn { appearance: none; border: 1.5px solid var(--border); background: var(--surface); color: var(--text-dim); padding: 7px 20px; border-radius: 999px; font: inherit; font-weight: 600; font-size: 0.85rem; cursor: pointer; transition: transform 0.12s var(--ease-spring); } .ptrack__btn:active { transform: scale(0.94); } .ptrack__btn.is-on { background: var(--good); border-color: var(--good); color: #fff; } .ptrack__btn--favorite { flex: none; padding: 6px 12px; font-size: 1rem; line-height: 1; color: var(--ink); border-color: rgba(255, 255, 255, 0.4); background: rgba(255, 255, 255, 0.16); } .ptrack__btn--favorite.is-on { background: #fff; border-color: #fff; color: #ff4d6d; } .psheet__tabs { display: flex; gap: 4px; overflow-x: auto; scrollbar-width: none; border-bottom: 1px solid var(--border); margin: 10px 0 18px; } .psheet__tabs::-webkit-scrollbar { display: none; } .psheet__tab { appearance: none; border: none; background: none; font: inherit; font-weight: 600; font-size: 0.9rem; color: var(--text-dim); padding: 10px 14px; cursor: pointer; white-space: nowrap; border-bottom: 2.5px solid transparent; margin-bottom: -1px; } .psheet__tab.is-active { color: var(--type-main); border-bottom-color: var(--type-main); } .psheet__body { animation: fade 0.25s ease; } @keyframes fade { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } } .ppanel__flavor { font-size: 1rem; line-height: 1.6; margin: 0 0 18px; overflow-wrap: anywhere; } .ppanel__sub { font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-dim); margin: 24px 0 10px; } .pfacts { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 14px 18px; margin: 0; } .pstats { margin-bottom: 4px; } .statbar { display: grid; grid-template-columns: 46px 44px 1fr; align-items: center; gap: 12px; margin: 9px 0; font-size: 0.85rem; } .statbar__label { color: var(--text-dim); font-weight: 600; } .statbar__value { font-variant-numeric: tabular-nums; text-align: right; font-weight: 600; } .statbar__track { height: 10px; background: var(--surface-2); border-radius: 999px; overflow: hidden; } .statbar__fill { height: 100%; background: var(--type-main, var(--accent)); border-radius: 999px; transition: width 0.7s var(--ease-spring); } .statbar__fill[data-stat="hp"] { background: #ff6b6b; } .statbar__fill[data-stat="attack"] { background: #ffa94d; } .statbar__fill[data-stat="defense"] { background: #ffd43b; } .statbar__fill[data-stat="special-attack"] { background: #74c0fc; } .statbar__fill[data-stat="special-defense"] { background: #63e6be; } .statbar__fill[data-stat="speed"] { background: #da77f2; } .statbar--total { font-weight: 700; border-top: 1px solid var(--border); padding-top: 8px; margin-top: 8px; } .detail__facts { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 12px 16px; margin-top: 22px; } .fact dt { font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-dim); } .fact dd { margin: 2px 0 0; } /* ---------- Evolution chain ----------------------------------- */ .evo { display: flex; flex-direction: column; gap: 14px; } .evo__row { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; } .evo__node { display: flex; flex-direction: column; align-items: center; gap: 2px; text-decoration: none; color: inherit; padding: 6px 8px; border-radius: var(--radius-sm); } .evo__node:hover { background: var(--surface-2); } .evo__node .sprite { width: 72px; height: 72px; object-fit: contain; image-rendering: pixelated; } .evo__name { font-size: 0.8rem; font-weight: 600; text-transform: capitalize; } .evo__arrow { display: flex; flex-direction: column; align-items: center; color: var(--text-dim); font-size: 0.95rem; } .evo__via { font-size: 0.66rem; text-transform: capitalize; white-space: nowrap; } /* ---------- Type matchups ---------------------------------- */ .matchups { display: flex; flex-direction: column; gap: 8px; } .matchups__row { display: grid; grid-template-columns: 84px 1fr; align-items: center; gap: 12px; } .matchups__label { font-size: 0.78rem; font-weight: 700; color: var(--text-dim); } .matchups__row--x4 .matchups__label, .matchups__row--x2 .matchups__label { color: var(--danger); } .matchups__row--half .matchups__label, .matchups__row--quarter .matchups__label { color: var(--good); } .matchups__types { display: flex; flex-wrap: wrap; gap: 4px; } /* ---------- Moves ------------------------------------------- */ .moves { display: flex; flex-direction: column; gap: 8px; } .moves__group { border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 10px 14px; background: var(--bg); } .moves__group summary { cursor: pointer; font-weight: 600; font-size: 0.9rem; } .moves__count { color: var(--text-dim); font-weight: 400; } .moves__list { margin-top: 8px; } .movecard { border-top: 1px solid var(--border); } .moverow { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; width: 100%; padding: 8px 2px; background: none; border: none; color: inherit; font: inherit; font-size: 0.82rem; text-align: left; cursor: pointer; } .moverow:hover { color: var(--text); } .moverow__chev { color: var(--text-dim); transition: transform 0.15s ease; } .moverow[aria-expanded="true"] .moverow__chev { transform: rotate(180deg); } .movebody { padding: 0 2px 12px; font-size: 0.82rem; } .movebody__effect { margin: 0 0 6px; } .movebody__bits { margin: 0; color: var(--text-dim); font-size: 0.76rem; } .moverow__lv { flex: 0 0 3.2rem; color: var(--text-dim); font-variant-numeric: tabular-nums; } .moverow__name { flex: 1 1 7rem; min-width: 0; font-weight: 600; text-transform: capitalize; } .moverow__meta { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; color: var(--text-dim); } .moverow__pending { font-style: italic; } .moverow__cat { font-size: 0.66rem; font-weight: 700; letter-spacing: 0.03em; text-transform: uppercase; } .moverow__cat[data-cat="physical"] { color: #e0762f; } .moverow__cat[data-cat="special"] { color: #4b8fd6; } .moverow__cat[data-cat="status"] { color: #8a8f98; } .moverow__stat { font-variant-numeric: tabular-nums; white-space: nowrap; } .moverow__stat-k { font-size: 0.66rem; text-transform: uppercase; letter-spacing: 0.03em; opacity: 0.7; } /* ---------- Locations ------------------------------------- */ .locations { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; } .locations__item { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; padding: 7px 0; border-top: 1px solid var(--border); font-size: 0.85rem; } .locations__item:first-child { border-top: none; } .locations__area { font-weight: 600; flex: 1 1 10rem; } .locations__meta { color: var(--text-dim); font-size: 0.8rem; } .locations__cond { color: var(--text-dim); font-size: 0.72rem; font-style: italic; } .locations__rate { font-variant-numeric: tabular-nums; color: var(--good); font-size: 0.8rem; } /* ---------- Search --------------------------------------------- */ .search__results { list-style: none; margin: 16px 0 0; padding: 0; display: flex; flex-direction: column; gap: 6px; } .search__row { display: flex; align-items: center; gap: 14px; padding: 10px 14px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface); box-shadow: var(--shadow); text-decoration: none; color: inherit; transition: transform 0.12s var(--ease-spring), border-color 0.12s ease; } .search__row:hover { transform: translateX(3px); border-color: var(--accent); } .search__row.is-caught { border-color: color-mix(in srgb, var(--good) 55%, var(--border)); } .search__row .sprite { width: 52px; height: 52px; flex: none; object-fit: contain; } .search__num { color: var(--text-dim); font-size: 0.8rem; font-variant-numeric: tabular-nums; } .search__name { font-weight: 700; text-transform: capitalize; flex: 1; } .search__types { display: flex; gap: 4px; } .search__empty, .settings__note { color: var(--text-dim); } /* ---------- Settings ------------------------------------------ */ .settings__group, .settings__actions { display: flex; flex-direction: column; gap: 12px; margin: 12px 0 24px; } .settings__actions { flex-flow: row wrap; } .field { display: flex; flex-direction: column; gap: 4px; max-width: 320px; } .field--check { flex-direction: row; align-items: center; gap: 10px; max-width: none; } .field select { padding: 9px 12px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface); color: var(--text); font: inherit; } /* ---------- Toast ------------------------------------------- */ .toast { position: fixed; left: 50%; bottom: calc(var(--nav-size) + env(safe-area-inset-bottom) + 12px); transform: translateX(-50%); display: flex; align-items: center; gap: 14px; background: var(--text); color: var(--bg); padding: 10px 16px; border-radius: 999px; box-shadow: var(--shadow); z-index: 40; font-size: 0.9rem; } .toast__action { background: none; border: none; color: var(--accent); font: inherit; font-weight: 700; cursor: pointer; } @media (min-width: 1024px) { .toast { bottom: 20px; left: calc(50% + 110px); } }