settings-stack.css

15.6 KB · raw

1/* Settings Stack — layered category deck for the full settings surface. */23.stk-shell {4  flex: 1;5  min-height: 0;6  position: relative;7  overflow: hidden;8  user-select: none;9  -webkit-user-select: none;10  padding: 10px 12px 28px;11}1213.stk-mast {14  display: flex;15  align-items: center;16  justify-content: space-between;17  gap: 10px;18  padding: 0 0 8px;19}2021.stk-back {22  width: 28px;23  height: 28px;24  display: inline-flex;25  align-items: center;26  justify-content: center;27  flex: 0 0 auto;28  border: 1px solid var(--peach-border);29  border-radius: 999px;30  background: color-mix(in srgb, var(--peach-t0) 4%, transparent);31  color: var(--peach-t1);32  cursor: pointer;33}3435.stk-back:hover {36  color: var(--peach-t0);37  border-color: color-mix(in srgb, var(--peach-accent) 34%, transparent);38  background: color-mix(in srgb, var(--peach-accent) 10%, transparent);39}4041.stk-mast-title {42  flex: 1;43  font-family: var(--font-display);44  font-style: italic;45  font-weight: 400;46  font-size: 22px;47  line-height: 1;48  color: var(--peach-t0);49}5051.stk-mast-meta {52  display: flex;53  align-items: baseline;54  gap: 6px;55  font-family: var(--font-mono);56  font-size: 9px;57  letter-spacing: 0.22em;58  text-transform: uppercase;59  color: var(--peach-t2);60}6162.stk-version-corner {63  position: absolute;64  bottom: 7px;65  left: 0;66  right: 0;67  font-family: var(--font-mono);68  font-size: 7px;69  letter-spacing: 0;70  text-align: center;71  color: color-mix(in srgb, var(--peach-t0) 66%, transparent);72  pointer-events: none;73  white-space: nowrap;74  z-index: 1;75}7677.stk-deck {78  position: relative;79  height: min(462px, calc(100% - 36px));80  min-height: 462px;81  margin-top: 0;82}8384.stk-card {85  position: absolute;86  left: 0;87  right: 0;88  border-radius: var(--stack-card-radius);89  padding: 18px 18px 16px;90  overflow: hidden;91  cursor: pointer;92  transition:93    transform 380ms var(--stack-spring),94    height 380ms var(--stack-spring),95    box-shadow 280ms ease,96    opacity 220ms ease;97  box-shadow:98    0 1px 0 color-mix(in srgb, var(--peach-t0) 5%, transparent) inset,99    0 8px 20px rgba(0, 0, 0, 0.25);100  border: 1px solid color-mix(in srgb, var(--peach-t0) 6%, transparent);101  will-change: transform;102}103104.stk-card::after {105  content: "";106  position: absolute;107  inset: 0;108  border-radius: inherit;109  pointer-events: none;110  background:111    radial-gradient(112      120% 80% at 0% 0%,113      color-mix(in srgb, #fff 12%, transparent),114      transparent 50%115    );116}117118.stk-card.is-active {119  box-shadow:120    0 1px 0 color-mix(in srgb, var(--peach-t0) 8%, transparent) inset,121    0 18px 36px rgba(0, 0, 0, 0.42);122  cursor: default;123}124125.stk-card.is-focused {126  cursor: default;127}128129.stk-card.is-tab:hover {130  transform: translateY(calc(var(--stk-card-top) - 7px));131  box-shadow:132    0 1px 0 color-mix(in srgb, #fff 9%, transparent) inset,133    0 16px 32px rgba(0, 0, 0, 0.36),134    0 0 0 1px color-mix(in srgb, #fff 10%, transparent);135  transition:136    transform 90ms ease-out,137    box-shadow 90ms ease-out;138}139140.stk-card.is-concealed {141  opacity: 0;142  pointer-events: none;143}144145.stk-card-top {146  display: flex;147  justify-content: space-between;148  align-items: center;149  margin-bottom: 12px;150  position: relative;151  z-index: 1;152}153154.stk-card-num {155  font-family: var(--font-mono);156  font-size: 8.5px;157  letter-spacing: 0.26em;158  text-transform: uppercase;159  opacity: 0.7;160}161162.stk-card-icon {163  opacity: 0.85;164}165166.stk-card-title {167  position: relative;168  z-index: 1;169  margin: 6px 0 0;170  font-family: var(--font-display);171  font-style: italic;172  font-weight: 400;173  font-size: 26px;174  line-height: 1.2;175}176177.stk-card-lede {178  position: relative;179  z-index: 1;180  margin: 4px 0 0;181  font-family: var(--font-display);182  font-style: italic;183  font-size: 12.5px;184  line-height: 1.4;185  opacity: 0.72;186}187188.stk-card-body {189  position: relative;190  z-index: 1;191  height: calc(100% - 76px);192  margin-top: 14px;193  margin-right: -18px;194  padding-right: 18px;195  overflow-y: auto;196  overflow-x: hidden;197  padding-bottom: 16px;198  opacity: 0;199  scrollbar-width: thin;200  scrollbar-color: color-mix(in srgb, currentColor 28%, transparent) transparent;201  transition: opacity 200ms 100ms ease;202}203204.stk-card-body::-webkit-scrollbar {205  width: 3px;206}207208.stk-card-body::-webkit-scrollbar-thumb {209  background: color-mix(in srgb, currentColor 28%, transparent);210  border-radius: 2px;211}212213.stk-card-body::-webkit-scrollbar-track {214  background: transparent;215}216217.stk-card.is-active .stk-card-body {218  opacity: 1;219}220221.stk-card.is-tab .stk-card-top {222  display: none;223}224225.stk-card.is-tab {226  padding: 10px 16px 8px;227}228229.stk-card.is-tab .stk-card-title {230  font-size: 19px;231  line-height: 1;232  white-space: nowrap;233  overflow: hidden;234  text-overflow: ellipsis;235}236237.stk-card.is-tab .stk-card-lede,238.stk-card.is-tab .stk-card-body {239  display: none;240}241242.stk-card *:focus-visible {243  outline: 1px solid currentColor;244  outline-offset: 2px;245}246247.stk-pip {248  display: inline-block;249  width: 18px;250  height: 18px;251  border-radius: 50%;252  background: rgba(0, 0, 0, 0.18);253  border: 1px solid color-mix(in srgb, currentColor 24%, transparent);254}255256.stk-pip.is-on {257  background: var(--peach-health-ok);258  box-shadow: 0 0 6px color-mix(in srgb, var(--peach-health-ok) 55%, transparent);259}260261/* Sync indicator light. Solid green = healthy pair, pulsing green = a sync is262   running, red = sync is not working. `is-idle` deliberately stays unlit263   rather than green: nothing has happened yet is not the same as fine. */264.stk-pip--sync { width: 10px; height: 10px; flex-shrink: 0; }265266.stk-pip--sync.is-busy {267  background: var(--peach-health-ok);268  box-shadow: 0 0 6px color-mix(in srgb, var(--peach-health-ok) 55%, transparent);269  animation: stk-pip-pulse 1600ms ease-in-out infinite;270}271272.stk-pip--sync.is-error {273  background: var(--peach-breach);274  box-shadow: 0 0 6px color-mix(in srgb, var(--peach-breach) 55%, transparent);275}276277@keyframes stk-pip-pulse {278  0%, 100% { opacity: 1; }279  50% { opacity: 0.35; }280}281282@media (prefers-reduced-motion: reduce) {283  .stk-pip--sync.is-busy { animation: none; }284}285286.stk-card .peach-settings-body {287  display: block;288  flex: none;289  min-height: 0;290  overflow: visible;291  padding: 0;292  background: transparent;293}294295.stk-card .peach-settings-group {296  margin: 0;297  padding: 0;298  border: 0;299  border-radius: 0;300  background: transparent;301  box-shadow: none;302  backdrop-filter: none;303  -webkit-backdrop-filter: none;304}305306.stk-card .peach-settings-group + .peach-settings-group {307  margin-top: 0;308}309310.stk-card .peach-settings-sub-label,311.stk-card .peach-settings-label {312  margin: 12px 0 4px;313  color: color-mix(in srgb, currentColor 58%, transparent);314}315316.stk-card .peach-settings-sub-label:first-child,317.stk-card .peach-settings-label:first-child {318  margin-top: 0;319}320321.stk-card .peach-settings-row,322.stk-card .peach-shortcut-row,323.stk-card .peach-history-row {324  border-bottom: 1px solid color-mix(in srgb, currentColor 12%, transparent);325  color: currentColor;326}327328.stk-card .peach-settings-row--meta,329.stk-card .peach-settings-value,330.stk-card .peach-hint,331.stk-card .peach-settings-hint,332.stk-card .peach-feedback-meta,333.stk-card .peach-feedback-anon,334.stk-card .peach-feedback-intro,335.stk-card .peach-history-sub,336.stk-card .peach-history-footer,337.stk-card .peach-danger-card-copy {338  color: color-mix(in srgb, currentColor 70%, transparent);339}340341.stk-card .peach-toggle {342  --peach-accent: currentColor;343  border-color: color-mix(in srgb, currentColor 32%, transparent);344  background: color-mix(in srgb, currentColor 8%, transparent);345}346347.stk-card .peach-toggle.is-on {348  background: color-mix(in srgb, currentColor 28%, transparent);349  border-color: color-mix(in srgb, currentColor 50%, transparent);350}351352.stk-card .peach-toggle-knob {353  background: color-mix(in srgb, currentColor 58%, transparent);354}355356.stk-card .peach-toggle.is-on .peach-toggle-knob {357  background: currentColor;358}359360.stk-card .peach-btn--subtle,361.stk-card .peach-btn--ghost,362.stk-card .peach-btn--accent,363.stk-card .peach-shortcut-chip,364.stk-card .peach-shortcut-reset,365.stk-card .peach-feedback-chip,366.stk-card .peach-settings-license-copy,367.stk-card .peach-settings-license-toggle {368  color: currentColor;369  border-color: color-mix(in srgb, currentColor 28%, transparent);370  background: color-mix(in srgb, currentColor 8%, transparent);371}372373.stk-card .peach-btn--subtle:hover,374.stk-card .peach-btn--ghost:hover,375.stk-card .peach-btn--accent:hover,376.stk-card .peach-shortcut-chip:hover,377.stk-card .peach-feedback-chip:hover,378.stk-card .peach-feedback-chip.is-active {379  background: color-mix(in srgb, currentColor 16%, transparent);380}381382.stk-card .peach-feedback-chip.is-active {383  color: #221427;384  border-color: #f0daf8;385  background: #e8d4f0;386  box-shadow:387    0 0 0 1px color-mix(in srgb, #f0daf8 64%, transparent),388    0 0 16px color-mix(in srgb, #f0daf8 24%, transparent);389  font-weight: 700;390}391392.stk-card .peach-feedback-thanks {393  color: currentColor;394  border-color: color-mix(in srgb, currentColor 32%, transparent);395  background:396    linear-gradient(180deg, color-mix(in srgb, currentColor 12%, transparent), transparent),397    rgba(0, 0, 0, 0.18);398}399400.stk-card .peach-feedback-thanks-title {401  color: currentColor;402}403404.stk-card .peach-settings-input,405.stk-card .peach-settings-select,406.stk-card .peach-pro-key-inline-input,407.stk-card .peach-feedback-textarea {408  color: currentColor;409  border-color: color-mix(in srgb, currentColor 22%, transparent);410  background: rgba(0, 0, 0, 0.18);411}412413.stk-card .peach-settings-input::placeholder,414.stk-card .peach-pro-key-inline-input::placeholder,415.stk-card .peach-feedback-textarea::placeholder {416  color: color-mix(in srgb, currentColor 42%, transparent);417}418419.stk-card .peach-accent-picker {420  justify-content: flex-end;421  max-width: 160px;422}423424.stk-card .peach-accent-swatch {425  width: 20px;426  height: 20px;427}428429.stk-card .peach-accent-swatch.is-active {430  border-color: currentColor;431}432433.stk-card .peach-history-list {434  border-color: color-mix(in srgb, currentColor 18%, transparent);435}436437.stk-card .peach-danger-card {438  background: rgba(0, 0, 0, 0.18);439  border-color: color-mix(in srgb, currentColor 20%, transparent);440}441442.stk-card .peach-pro-upgrade,443.stk-card .peach-pro-active,444.stk-card .peach-pro-active-hero,445.stk-card .peach-pro-grid-item {446  background: transparent;447  border-color: color-mix(in srgb, currentColor 14%, transparent);448  box-shadow: none;449}450451.stk-card .peach-pro-grid {452  gap: 6px;453}454455.stk-card .peach-pro-grid-item {456  padding: 7px 0;457}458459.stk-card .peach-pro-headline,460.stk-card .peach-pro-active-title {461  color: currentColor;462}463464.stk-deck.is-open .stk-card.is-active .peach-pro-active {465  min-height: 0;466  padding: 0 4px 10px;467}468469.stk-deck.is-open .stk-card.is-active .peach-pro-active-hero {470  gap: 4px;471  padding: 8px 0 12px;472}473474.stk-deck.is-open .stk-card.is-active .peach-pro-active-mark-wrap {475  margin-bottom: 0;476  overflow: visible;477}478479.stk-deck.is-open .stk-card.is-active .peach-pro-active-mark {480  width: 50px;481  height: 50px;482}483484.stk-deck.is-open .stk-card.is-active .peach-pro-active-title {485  font-size: 25px;486  line-height: 1;487}488489.stk-deck.is-open .stk-card.is-active .peach-pro-active-since {490  line-height: 1.2;491}492493.stk-deck.is-open .stk-card.is-active .peach-settings-license,494.stk-deck.is-open .stk-card.is-active .peach-pro-active-features,495.stk-deck.is-open .stk-card.is-active .peach-pro-deactivate {496  display: none;497}498499.stk-card .peach-feedback-textarea {500  min-height: 116px;501}502503.peach-settings-overlay {504  --bg: #0C0A06;505  --s1: #131109;506  --s2: #1A1710;507  --t0: #F0E8D8;508  --t1: rgba(240, 232, 216, 0.50);509  --t2: rgba(240, 232, 216, 0.20);510  --t3: rgba(240, 232, 216, 0.07);511  --t4: rgba(240, 232, 216, 0.04);512  --surface-card: rgba(240, 232, 216, 0.02);513  --shell-accent-a: color-mix(in srgb, var(--peach-accent) 8%, transparent);514  --shell-accent-b: color-mix(in srgb, var(--peach-accent) 6%, transparent);515  --peach-bg: var(--bg);516  --peach-s1: var(--s1);517  --peach-s2: var(--s2);518  --peach-t0: var(--t0);519  --peach-t1: var(--t1);520  --peach-t2: var(--t2);521  --peach-t3: var(--t3);522  --peach-t4: var(--t4);523  --peach-bg-card: var(--surface-card);524  --peach-border: var(--peach-t3);525  --peach-text-dim: var(--peach-t1);526  background: var(--peach-bg);527  color: var(--peach-t0);528}529530/* Force html/body backgrounds dark when Settings is mounted so the popup531   frame chrome doesn't go white in light theme. */532html:has(.peach-settings-overlay),533html:has(.peach-settings-overlay) body {534  background: #0C0A06;535}536537/* Beat the .light .peach-btn--ghost rule in popup.css which would otherwise538   paint Settings buttons with the light-theme surface color. */539.peach-settings-overlay .stk-card .peach-btn--ghost:not(.peach-icon-btn) {540  background: color-mix(in srgb, var(--peach-t0) 8%, transparent);541  border-color: color-mix(in srgb, var(--peach-t0) 22%, transparent);542  color: var(--peach-t0);543}544.peach-settings-overlay .stk-card .peach-btn--ghost:not(.peach-icon-btn):hover {545  background: color-mix(in srgb, var(--peach-t0) 16%, transparent);546}547548.peach-settings-overlay .stk-shell {549  background: var(--peach-bg);550}551552.peach-settings-overlay .stk-card {553  box-shadow:554    0 1px 0 color-mix(in srgb, var(--peach-t0) 5%, transparent) inset,555    0 8px 20px rgba(0, 0, 0, 0.25);556}557558.peach-settings-overlay .stk-card.is-active {559  box-shadow:560    0 1px 0 color-mix(in srgb, var(--peach-t0) 8%, transparent) inset,561    0 18px 36px rgba(0, 0, 0, 0.42);562}563564[data-motion="reduce"] .stk-card,565[data-motion="reduce"] .stk-card-body {566  transition: none !important;567}568569/* ── Fan animation: measured card transitions during the Pro replay cycle ── */570.stk-deck.is-fanning .stk-card {571  transition:572    transform 140ms cubic-bezier(0.22, 1, 0.36, 1),573    height 140ms cubic-bezier(0.22, 1, 0.36, 1),574    box-shadow 140ms ease,575    opacity 140ms ease;576}577578/* ── Card shake when the pro card lands after the fan ── */579.stk-card.is-celebrating {580  transition: none !important;581  animation: stk-card-celebrate 880ms cubic-bezier(0.22, 1, 0.36, 1) both;582}583584@keyframes stk-card-celebrate {585  0%   { transform: translateY(var(--stk-card-top)); }586  24%  { transform: translateY(calc(var(--stk-card-top) - 10px)) rotate(-1.3deg); }587  48%  { transform: translateY(calc(var(--stk-card-top) + 5px)) rotate(0.9deg); }588  70%  { transform: translateY(calc(var(--stk-card-top) - 4px)) rotate(-0.45deg); }589  86%  { transform: translateY(calc(var(--stk-card-top) + 2px)); }590  100% { transform: translateY(var(--stk-card-top)); }591}592593/* ── Ambient sparkle dust on the Pro card when user is Pro ── */594.stk-deck.is-pro .stk-card[data-settings-card-id="pro"]::before {595  content: "";596  position: absolute;597  inset: 0;598  border-radius: inherit;599  pointer-events: none;600  background-image:601    radial-gradient(circle, rgba(255, 248, 220, 0.9) 0.5px, transparent 0.5px),602    radial-gradient(circle, rgba(255, 255, 255, 0.7) 0.5px, transparent 0.5px),603    radial-gradient(circle, rgba(255, 238, 170, 0.6) 1px, transparent 1px);604  background-size: 38px 38px, 53px 47px, 71px 63px;605  background-position: 0 0, 19px 15px, 9px 30px;606  animation: stk-pro-dust 14s linear infinite;607  opacity: 0.11;608  z-index: 0;609  mix-blend-mode: screen;610}611612@keyframes stk-pro-dust {613  0%   { transform: translate(0, 0); }614  100% { transform: translate(53px, 47px); }615}616617[data-motion="reduce"] .stk-deck.is-pro .stk-card[data-settings-card-id="pro"]::before,618[data-motion="reduce"] .stk-card.is-celebrating {619  animation: none;620}621622/* ── Clickable card icon (easter egg trigger) ── */623.stk-card-icon--btn {624  background: transparent;625  border: 0;626  color: inherit;627  padding: 0;628  cursor: pointer;629  opacity: 0.85;630  display: inline-flex;631  align-items: center;632  justify-content: center;633}634635.stk-card-icon--btn:hover {636  opacity: 1;637}638639/* ── Chip highlight clipping fix ── */640/* .stk-card-body has overflow-x: hidden which clips the active chip's glow */641.stk-card .peach-feedback-chips {642  padding-left: 3px;643}