settings-stack.css

17.3 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  padding: 10px 12px 28px;9}1011.stk-mast {12  display: flex;13  align-items: center;14  justify-content: space-between;15  gap: 10px;16  padding: 0 0 8px;17}1819.stk-back {20  width: 28px;21  height: 28px;22  display: inline-flex;23  align-items: center;24  justify-content: center;25  flex: 0 0 auto;26  border: 1px solid var(--peach-border);27  border-radius: 999px;28  background: color-mix(in srgb, var(--peach-t0) 4%, transparent);29  color: var(--peach-t1);30  cursor: pointer;31}3233.stk-back:hover {34  color: var(--peach-t0);35  border-color: color-mix(in srgb, var(--peach-accent) 34%, transparent);36  background: color-mix(in srgb, var(--peach-accent) 10%, transparent);37}3839.stk-mast-title {40  flex: 1;41  font-family: var(--font-display);42  font-style: italic;43  font-weight: 400;44  font-size: 22px;45  line-height: 1;46  color: var(--peach-t0);47}4849.stk-mast-meta {50  display: flex;51  align-items: baseline;52  gap: 6px;53  font-family: var(--font-mono);54  font-size: 9px;55  letter-spacing: 0.22em;56  text-transform: uppercase;57  color: var(--peach-t2);58}5960.stk-version-corner {61  position: absolute;62  bottom: 7px;63  left: 0;64  right: 0;65  font-family: var(--font-mono);66  font-size: 7px;67  letter-spacing: 0;68  text-align: center;69  color: color-mix(in srgb, var(--peach-t2) 50%, transparent);70  pointer-events: none;71  white-space: nowrap;72  z-index: 1;73}7475.stk-deck {76  position: relative;77  height: min(462px, calc(100% - 36px));78  min-height: 462px;79  margin-top: 0;80}8182.stk-card {83  position: absolute;84  left: 0;85  right: 0;86  border-radius: var(--stack-card-radius);87  padding: 18px 18px 16px;88  overflow: hidden;89  cursor: pointer;90  transition:91    transform 380ms var(--stack-spring),92    height 380ms var(--stack-spring),93    box-shadow 280ms ease,94    opacity 220ms ease;95  box-shadow:96    0 1px 0 color-mix(in srgb, var(--peach-t0) 5%, transparent) inset,97    0 8px 20px rgba(0, 0, 0, 0.25);98  border: 1px solid color-mix(in srgb, var(--peach-t0) 6%, transparent);99  will-change: transform;100}101102.stk-card::after {103  content: "";104  position: absolute;105  inset: 0;106  border-radius: inherit;107  pointer-events: none;108  background:109    radial-gradient(110      120% 80% at 0% 0%,111      color-mix(in srgb, #fff 12%, transparent),112      transparent 50%113    );114}115116.stk-card.is-active {117  box-shadow:118    0 1px 0 color-mix(in srgb, var(--peach-t0) 8%, transparent) inset,119    0 18px 36px rgba(0, 0, 0, 0.42);120  cursor: default;121}122123.stk-card.is-focused {124  cursor: default;125}126127.stk-card.is-tab:hover {128  transform: translateY(calc(var(--stk-card-top) - 7px));129  box-shadow:130    0 1px 0 color-mix(in srgb, #fff 9%, transparent) inset,131    0 16px 32px rgba(0, 0, 0, 0.36),132    0 0 0 1px color-mix(in srgb, #fff 10%, transparent);133  transition:134    transform 90ms ease-out,135    box-shadow 90ms ease-out;136}137138.stk-card.is-concealed {139  opacity: 0;140  pointer-events: none;141}142143.stk-card-top {144  display: flex;145  justify-content: space-between;146  align-items: center;147  margin-bottom: 12px;148  position: relative;149  z-index: 1;150}151152.stk-card-num {153  font-family: var(--font-mono);154  font-size: 8.5px;155  letter-spacing: 0.26em;156  text-transform: uppercase;157  opacity: 0.7;158}159160.stk-card-icon {161  opacity: 0.85;162}163164.stk-card-title {165  position: relative;166  z-index: 1;167  margin: 6px 0 0;168  font-family: var(--font-display);169  font-style: italic;170  font-weight: 400;171  font-size: 26px;172  line-height: 1.2;173}174175.stk-card-lede {176  position: relative;177  z-index: 1;178  margin: 4px 0 0;179  font-family: var(--font-display);180  font-style: italic;181  font-size: 12.5px;182  line-height: 1.4;183  opacity: 0.72;184}185186.stk-card-body {187  position: relative;188  z-index: 1;189  height: calc(100% - 76px);190  margin-top: 14px;191  overflow-y: auto;192  overflow-x: hidden;193  padding-bottom: 16px;194  opacity: 0;195  scrollbar-width: thin;196  scrollbar-color: color-mix(in srgb, currentColor 28%, transparent) transparent;197  transition: opacity 200ms 100ms ease;198}199200.stk-card.is-active .stk-card-body {201  opacity: 1;202}203204.stk-card.is-tab .stk-card-top {205  display: none;206}207208.stk-card.is-tab {209  padding: 10px 16px 8px;210}211212.stk-card.is-tab .stk-card-title {213  font-size: 19px;214  line-height: 1;215  white-space: nowrap;216  overflow: hidden;217  text-overflow: ellipsis;218}219220.stk-card.is-tab .stk-card-lede,221.stk-card.is-tab .stk-card-body {222  display: none;223}224225.stk-card *:focus-visible {226  outline: 1px solid currentColor;227  outline-offset: 2px;228}229230.stk-row {231  display: flex;232  align-items: center;233  justify-content: space-between;234  gap: 12px;235  padding: 10px 0;236  border-bottom: 1px solid color-mix(in srgb, currentColor 12%, transparent);237}238239.stk-row:last-child {240  border-bottom: none;241}242243.stk-row-name {244  font-size: 13px;245}246247.stk-row-sub {248  margin-top: 2px;249  font-family: var(--font-display);250  font-style: italic;251  font-size: 11px;252  opacity: 0.7;253}254255.stk-pill {256  display: inline-flex;257  align-items: center;258  justify-content: center;259  min-height: 24px;260  padding: 3px 10px;261  font-family: var(--font-mono);262  font-size: 10px;263  letter-spacing: 0.08em;264  text-transform: lowercase;265  background: transparent;266  color: currentColor;267  border: 1px solid color-mix(in srgb, currentColor 35%, transparent);268  border-radius: 999px;269  cursor: pointer;270  transition: background 140ms ease, border-color 140ms ease;271}272273.stk-pill:hover,274.stk-pill.is-accent {275  background: color-mix(in srgb, currentColor 18%, transparent);276  border-color: color-mix(in srgb, currentColor 55%, transparent);277}278279.stk-pip {280  display: inline-block;281  width: 18px;282  height: 18px;283  border-radius: 50%;284  background: rgba(0, 0, 0, 0.18);285  border: 1px solid color-mix(in srgb, currentColor 24%, transparent);286}287288.stk-pip.is-on {289  background: var(--peach-health-ok);290  box-shadow: 0 0 6px color-mix(in srgb, var(--peach-health-ok) 55%, transparent);291}292293/* Sync indicator light. Solid green = healthy pair, pulsing green = a sync is294   running, red = sync is not working. `is-idle` deliberately stays unlit295   rather than green: nothing has happened yet is not the same as fine. */296.stk-pip--sync { width: 10px; height: 10px; flex-shrink: 0; }297298.stk-pip--sync.is-busy {299  background: var(--peach-health-ok);300  box-shadow: 0 0 6px color-mix(in srgb, var(--peach-health-ok) 55%, transparent);301  animation: stk-pip-pulse 1600ms ease-in-out infinite;302}303304.stk-pip--sync.is-error {305  background: var(--peach-breach);306  box-shadow: 0 0 6px color-mix(in srgb, var(--peach-breach) 55%, transparent);307}308309@keyframes stk-pip-pulse {310  0%, 100% { opacity: 1; }311  50% { opacity: 0.35; }312}313314@media (prefers-reduced-motion: reduce) {315  .stk-pip--sync.is-busy { animation: none; }316}317318.stk-sync-actions,319.stk-fb-chips,320.stk-inline-actions {321  display: flex;322  flex-wrap: wrap;323  gap: 6px;324}325326.stk-key {327  font-family: var(--font-mono);328  font-size: 10px;329  letter-spacing: 0.06em;330  padding: 2px 7px;331  border: 1px solid color-mix(in srgb, currentColor 32%, transparent);332  border-radius: 4px;333  background: color-mix(in srgb, currentColor 6%, transparent);334}335336.stk-pro-headline {337  padding: 6px 0 14px;338  border-bottom: 1px solid color-mix(in srgb, currentColor 14%, transparent);339}340341.stk-pro-title,342.stk-pro-price {343  font-family: var(--font-display);344  font-style: italic;345  line-height: 1;346}347348.stk-pro-title {349  font-size: 22px;350}351352.stk-pro-price {353  font-size: 28px;354}355356.stk-pro-meta {357  margin-top: 4px;358  font-family: var(--font-mono);359  font-size: 9.5px;360  letter-spacing: 0.18em;361  text-transform: uppercase;362  opacity: 0.7;363}364365.stk-card .peach-settings-body {366  display: block;367  flex: none;368  min-height: 0;369  overflow: visible;370  padding: 0;371  background: transparent;372}373374.stk-card .peach-settings-group {375  margin: 0;376  padding: 0;377  border: 0;378  border-radius: 0;379  background: transparent;380  box-shadow: none;381  backdrop-filter: none;382  -webkit-backdrop-filter: none;383}384385.stk-card .peach-settings-group + .peach-settings-group {386  margin-top: 0;387}388389.stk-card .peach-settings-sub-label,390.stk-card .peach-settings-label {391  margin: 12px 0 4px;392  color: color-mix(in srgb, currentColor 58%, transparent);393}394395.stk-card .peach-settings-sub-label:first-child,396.stk-card .peach-settings-label:first-child {397  margin-top: 0;398}399400.stk-card .peach-settings-row,401.stk-card .peach-shortcut-row,402.stk-card .peach-history-row {403  border-bottom: 1px solid color-mix(in srgb, currentColor 12%, transparent);404  color: currentColor;405}406407.stk-card .peach-settings-row--meta,408.stk-card .peach-settings-value,409.stk-card .peach-hint,410.stk-card .peach-settings-hint,411.stk-card .peach-feedback-meta,412.stk-card .peach-feedback-anon,413.stk-card .peach-feedback-intro,414.stk-card .peach-history-sub,415.stk-card .peach-history-footer,416.stk-card .peach-danger-card-copy {417  color: color-mix(in srgb, currentColor 70%, transparent);418}419420.stk-card .peach-toggle {421  --peach-accent: currentColor;422  border-color: color-mix(in srgb, currentColor 32%, transparent);423  background: color-mix(in srgb, currentColor 8%, transparent);424}425426.stk-card .peach-toggle.is-on {427  background: color-mix(in srgb, currentColor 28%, transparent);428  border-color: color-mix(in srgb, currentColor 50%, transparent);429}430431.stk-card .peach-toggle-knob {432  background: color-mix(in srgb, currentColor 58%, transparent);433}434435.stk-card .peach-toggle.is-on .peach-toggle-knob {436  background: currentColor;437}438439.stk-card .peach-btn--subtle,440.stk-card .peach-btn--ghost,441.stk-card .peach-btn--accent,442.stk-card .peach-shortcut-chip,443.stk-card .peach-shortcut-reset,444.stk-card .peach-feedback-chip,445.stk-card .peach-settings-license-copy,446.stk-card .peach-settings-license-toggle {447  color: currentColor;448  border-color: color-mix(in srgb, currentColor 28%, transparent);449  background: color-mix(in srgb, currentColor 8%, transparent);450}451452.stk-card .peach-btn--subtle:hover,453.stk-card .peach-btn--ghost:hover,454.stk-card .peach-btn--accent:hover,455.stk-card .peach-shortcut-chip:hover,456.stk-card .peach-feedback-chip:hover,457.stk-card .peach-feedback-chip.is-active {458  background: color-mix(in srgb, currentColor 16%, transparent);459}460461.stk-card .peach-feedback-chip.is-active {462  color: #221427;463  border-color: #f0daf8;464  background: #e8d4f0;465  box-shadow:466    0 0 0 1px color-mix(in srgb, #f0daf8 64%, transparent),467    0 0 16px color-mix(in srgb, #f0daf8 24%, transparent);468  font-weight: 700;469}470471.stk-card .peach-feedback-thanks {472  color: currentColor;473  border-color: color-mix(in srgb, currentColor 32%, transparent);474  background:475    linear-gradient(180deg, color-mix(in srgb, currentColor 12%, transparent), transparent),476    rgba(0, 0, 0, 0.18);477}478479.stk-card .peach-feedback-thanks-title {480  color: currentColor;481}482483.stk-card .peach-settings-input,484.stk-card .peach-settings-select,485.stk-card .peach-pro-key-inline-input,486.stk-card .peach-feedback-textarea {487  color: currentColor;488  border-color: color-mix(in srgb, currentColor 22%, transparent);489  background: rgba(0, 0, 0, 0.18);490}491492.stk-card .peach-settings-input::placeholder,493.stk-card .peach-pro-key-inline-input::placeholder,494.stk-card .peach-feedback-textarea::placeholder {495  color: color-mix(in srgb, currentColor 42%, transparent);496}497498.stk-card .peach-accent-picker {499  justify-content: flex-end;500  max-width: 160px;501}502503.stk-card .peach-accent-swatch {504  width: 20px;505  height: 20px;506}507508.stk-card .peach-accent-swatch.is-active {509  border-color: currentColor;510}511512.stk-card .peach-history-list {513  border-color: color-mix(in srgb, currentColor 18%, transparent);514}515516.stk-card .peach-danger-card {517  background: rgba(0, 0, 0, 0.18);518  border-color: color-mix(in srgb, currentColor 20%, transparent);519}520521.stk-card .peach-pro-upgrade,522.stk-card .peach-pro-active,523.stk-card .peach-pro-active-hero,524.stk-card .peach-pro-grid-item {525  background: transparent;526  border-color: color-mix(in srgb, currentColor 14%, transparent);527  box-shadow: none;528}529530.stk-card .peach-pro-grid {531  gap: 6px;532}533534.stk-card .peach-pro-grid-item {535  padding: 7px 0;536}537538.stk-card .peach-pro-headline,539.stk-card .peach-pro-active-title {540  color: currentColor;541}542543.stk-deck.is-open .stk-card.is-active .peach-pro-active {544  min-height: 0;545  padding: 0 4px 10px;546}547548.stk-deck.is-open .stk-card.is-active .peach-pro-active-hero {549  gap: 4px;550  padding: 8px 0 12px;551}552553.stk-deck.is-open .stk-card.is-active .peach-pro-active-mark-wrap {554  margin-bottom: 0;555  overflow: visible;556}557558.stk-deck.is-open .stk-card.is-active .peach-pro-active-mark {559  width: 50px;560  height: 50px;561}562563.stk-deck.is-open .stk-card.is-active .peach-pro-active-title {564  font-size: 25px;565  line-height: 1;566}567568.stk-deck.is-open .stk-card.is-active .peach-pro-active-since {569  line-height: 1.2;570}571572.stk-deck.is-open .stk-card.is-active .peach-settings-license,573.stk-deck.is-open .stk-card.is-active .peach-pro-active-features,574.stk-deck.is-open .stk-card.is-active .peach-pro-deactivate {575  display: none;576}577578.stk-card .peach-feedback-textarea {579  min-height: 116px;580}581582.peach-settings-overlay {583  --bg: #0C0A06;584  --s1: #131109;585  --s2: #1A1710;586  --s3: #221F14;587  --t0: #F0E8D8;588  --t1: rgba(240, 232, 216, 0.50);589  --t2: rgba(240, 232, 216, 0.20);590  --t3: rgba(240, 232, 216, 0.07);591  --t4: rgba(240, 232, 216, 0.04);592  --surface-card: rgba(240, 232, 216, 0.02);593  --surface-elevated: rgba(19, 17, 9, 0.88);594  --shell-accent-a: color-mix(in srgb, var(--peach-accent) 8%, transparent);595  --shell-accent-b: color-mix(in srgb, var(--peach-accent) 6%, transparent);596  --peach-bg: var(--bg);597  --peach-s1: var(--s1);598  --peach-s2: var(--s2);599  --peach-s3: var(--s3);600  --peach-t0: var(--t0);601  --peach-t1: var(--t1);602  --peach-t2: var(--t2);603  --peach-t3: var(--t3);604  --peach-t4: var(--t4);605  --peach-bg-card: var(--surface-card);606  --peach-border: var(--peach-t3);607  --peach-text-dim: var(--peach-t1);608  background: var(--peach-bg);609  color: var(--peach-t0);610}611612/* Force html/body backgrounds dark when Settings is mounted so the popup613   frame chrome doesn't go white in light theme. */614html:has(.peach-settings-overlay),615html:has(.peach-settings-overlay) body {616  background: #0C0A06;617}618619/* Beat the .light .peach-btn--ghost rule in popup.css which would otherwise620   paint Settings buttons with the light-theme surface color. */621.peach-settings-overlay .stk-card .peach-btn--ghost:not(.peach-icon-btn) {622  background: color-mix(in srgb, var(--peach-t0) 8%, transparent);623  border-color: color-mix(in srgb, var(--peach-t0) 22%, transparent);624  color: var(--peach-t0);625}626.peach-settings-overlay .stk-card .peach-btn--ghost:not(.peach-icon-btn):hover {627  background: color-mix(in srgb, var(--peach-t0) 16%, transparent);628}629630.peach-settings-overlay .stk-shell {631  background: var(--peach-bg);632}633634.peach-settings-overlay .stk-card {635  box-shadow:636    0 1px 0 color-mix(in srgb, var(--peach-t0) 5%, transparent) inset,637    0 8px 20px rgba(0, 0, 0, 0.25);638}639640.peach-settings-overlay .stk-card.is-active {641  box-shadow:642    0 1px 0 color-mix(in srgb, var(--peach-t0) 8%, transparent) inset,643    0 18px 36px rgba(0, 0, 0, 0.42);644}645646:root[data-native="true"] {647  --stack-tab-h: 64px;648  --stack-tab-overlap: 16px;649}650651:root[data-native="true"] .stk-deck {652  height: calc(100dvh - 126px);653  min-height: 520px;654}655656[data-motion="reduce"] .stk-card,657[data-motion="reduce"] .stk-card-body {658  transition: none !important;659}660661/* ── Fan animation: measured card transitions during the Pro replay cycle ── */662.stk-deck.is-fanning .stk-card {663  transition:664    transform 140ms cubic-bezier(0.22, 1, 0.36, 1),665    height 140ms cubic-bezier(0.22, 1, 0.36, 1),666    box-shadow 140ms ease,667    opacity 140ms ease;668}669670/* ── Card shake when the pro card lands after the fan ── */671.stk-card.is-celebrating {672  transition: none !important;673  animation: stk-card-celebrate 880ms cubic-bezier(0.22, 1, 0.36, 1) both;674}675676@keyframes stk-card-celebrate {677  0%   { transform: translateY(var(--stk-card-top)); }678  24%  { transform: translateY(calc(var(--stk-card-top) - 10px)) rotate(-1.3deg); }679  48%  { transform: translateY(calc(var(--stk-card-top) + 5px)) rotate(0.9deg); }680  70%  { transform: translateY(calc(var(--stk-card-top) - 4px)) rotate(-0.45deg); }681  86%  { transform: translateY(calc(var(--stk-card-top) + 2px)); }682  100% { transform: translateY(var(--stk-card-top)); }683}684685/* ── Ambient sparkle dust on the Pro card when user is Pro ── */686.stk-deck.is-pro .stk-card[data-settings-card-id="pro"]::before {687  content: "";688  position: absolute;689  inset: 0;690  border-radius: inherit;691  pointer-events: none;692  background-image:693    radial-gradient(circle, rgba(255, 248, 220, 0.9) 0.5px, transparent 0.5px),694    radial-gradient(circle, rgba(255, 255, 255, 0.7) 0.5px, transparent 0.5px),695    radial-gradient(circle, rgba(255, 238, 170, 0.6) 1px, transparent 1px);696  background-size: 38px 38px, 53px 47px, 71px 63px;697  background-position: 0 0, 19px 15px, 9px 30px;698  animation: stk-pro-dust 14s linear infinite;699  opacity: 0.11;700  z-index: 0;701  mix-blend-mode: screen;702}703704@keyframes stk-pro-dust {705  0%   { transform: translate(0, 0); }706  100% { transform: translate(53px, 47px); }707}708709[data-motion="reduce"] .stk-deck.is-pro .stk-card[data-settings-card-id="pro"]::before,710[data-motion="reduce"] .stk-card.is-celebrating {711  animation: none;712}713714/* ── Clickable card icon (easter egg trigger) ── */715.stk-card-icon--btn {716  background: transparent;717  border: 0;718  color: inherit;719  padding: 0;720  cursor: pointer;721  opacity: 0.85;722  display: inline-flex;723  align-items: center;724  justify-content: center;725}726727.stk-card-icon--btn:hover {728  opacity: 1;729}730731/* ── Chip highlight clipping fix ── */732/* .stk-card-body has overflow-x: hidden which clips the active chip's glow */733.stk-card .peach-feedback-chips {734  padding-left: 3px;735}