/* ========================================================================== Setup wizard (features/setup.tsx) — v4. Full-bleed page: top bar (brand · stepper · skip), scrolling body with the step on the left and a browser-framed live preview on the right; finish screen with confetti. Everything uses the admin tokens, so light and dark both work. Element resets are scoped to .ss-wiz so WordPress' button/input styles don't leak in. ========================================================================== */ @keyframes ss-wiz-spin { to { transform: rotate(360deg); } } @keyframes ss-wiz-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } } @keyframes ss-wiz-confetti { 0% { transform: translate3d(0, 0, 0) rotate(0deg); opacity: 1; } 85% { opacity: 1; } 100% { transform: translate3d(var(--ss-drift, 0), 90vh, 0) rotate(var(--ss-rot, 360deg)); opacity: 0; } } .ss-admin .ss-wiz { --wiz-radius: 16px; --wiz-ctl: 44px; box-sizing: border-box; display: flex; flex-direction: column; height: calc(100vh - var(--wp-admin--admin-bar--height, 32px)); min-height: 0; margin: 0; background: var(--canvas); color: var(--ink); font-size: 15px; line-height: 1.45; *, *::before, *::after { box-sizing: border-box; } h1, p { margin: 0; } button { font: inherit; cursor: pointer; margin: 0; } button:disabled { cursor: not-allowed; } button:focus-visible, a:focus-visible, input:focus-visible, select:focus-visible, label:focus-within { outline: 2px solid var(--brand); outline-offset: 2px; } .ss-i { flex: none; fill: currentColor; } /* ---- top bar ---- */ &__bar { flex: none; display: flex; align-items: center; flex-wrap: wrap; gap: 12px 16px; padding: 10px 24px; background: var(--surface); border-bottom: 1px solid var(--line); } &__brand { flex: 1 1 180px; display: flex; align-items: center; gap: 10px; strong { font-size: 16px; font-weight: 700; letter-spacing: -0.01em; } } &__mark { width: 32px; height: 32px; border-radius: 9px; background: var(--brand); color: #fff; display: inline-flex; align-items: center; justify-content: center; flex: none; } &__divider { width: 1px; height: 18px; background: var(--line-strong); } &__brand-sub { color: var(--ink-3); font-size: 14px; } &__stepper { flex: 0 1 auto; ol { display: flex; align-items: center; gap: 6px; margin: 0; padding: 0; list-style: none; } li { display: flex; align-items: center; gap: 6px; margin: 0; } button { display: flex; align-items: center; gap: 8px; height: 36px; padding: 0 10px 0 6px; border: 0; border-radius: 999px; background: transparent; color: var(--ink-3); font-size: 13.5px; font-weight: 600; } button:disabled { cursor: default; } .is-done button { color: var(--ink-2); cursor: pointer; } .is-done button:hover { background: var(--surface-2); } .is-current button { color: var(--ink); } } &__dot { width: 24px; height: 24px; border-radius: 50%; border: 1.5px solid var(--line-strong); display: inline-flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700; } &__stepper .is-current .ss-wiz__dot { border-color: var(--brand); background: var(--brand-soft); color: var(--brand-ink); } &__stepper .is-done .ss-wiz__dot { border-color: var(--brand); background: var(--brand); color: #fff; } &__line { width: 28px; height: 2px; border-radius: 2px; background: var(--line-strong); } &__stepper .is-done .ss-wiz__line { background: var(--brand); } &__bar-end { flex: 1 1 180px; display: flex; justify-content: flex-end; } &__skip { display: inline-flex; align-items: center; gap: 6px; height: 36px; padding: 0 12px; border: 0; border-radius: 8px; background: transparent; color: var(--ink-2); font-size: 14px; font-weight: 600; &:hover { background: var(--surface-2); color: var(--ink); } } /* ---- body ---- */ &__scroll { flex: 1 1 auto; min-height: 0; overflow: auto; overscroll-behavior: contain; position: relative; } &__layout { width: 100%; max-width: 1180px; margin: 0 auto; padding: 40px 24px 56px; display: flex; flex-wrap: wrap; gap: 32px; align-items: flex-start; } &__main { flex: 999 1 440px; min-width: 0; max-width: 620px; display: flex; flex-direction: column; gap: 22px; } &__aside { flex: 1 1 360px; min-width: 0; position: sticky; top: 24px; } &__eyebrow { font-size: 13px; font-weight: 600; letter-spacing: 0.02em; color: var(--brand-ink); } &__title { margin: 6px 0 8px; font-size: 30px; line-height: 1.2; font-weight: 700; letter-spacing: -0.02em; color: var(--ink); &--done { margin-top: 0; font-size: 34px; } } &__lede { font-size: 15.5px; line-height: 1.55; color: var(--ink-2); } /* ---- cards & fields ---- */ &__card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--wiz-radius); padding: 22px; display: flex; flex-direction: column; gap: 18px; box-shadow: var(--shadow-sm); &--roomy { gap: 24px; } } &__field { display: flex; flex-direction: column; gap: 8px; min-width: 0; } &__label { display: flex; align-items: center; gap: 8px; margin: 0; font-size: 14px; font-weight: 600; color: var(--ink); } &__label-icon { width: 24px; height: 24px; border-radius: 7px; background: var(--brand-soft); color: var(--brand-ink); display: inline-flex; align-items: center; justify-content: center; flex: none; } &__optional { font-weight: 500; color: var(--ink-3); } &__row { display: flex; gap: 8px; flex-wrap: wrap; } &__input-wrap { flex: 1 1 260px; position: relative; display: flex; align-items: center; } &__input-icon { position: absolute; left: 12px; color: var(--ink-3); pointer-events: none; } &__input.ss-wiz__input, &__affix input { width: 100%; height: var(--wiz-ctl); min-height: 0; margin: 0; padding: 0 12px; border: 1px solid var(--line-strong); border-radius: 10px; background: var(--surface); color: var(--ink); font-size: 15px; line-height: normal; box-shadow: none; &::placeholder { color: var(--ink-3); } &:focus { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-soft); outline: none; } } &__input--icon.ss-wiz__input { padding-left: 40px; } &__select.ss-wiz__input { max-width: none; padding-right: 32px; } &__hint { font-size: 13px; line-height: 1.5; color: var(--ink-3); } &__sep { height: 1px; background: var(--line); } &__grid2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 14px 16px; &--end { align-items: end; } } &__affix { display: flex; align-items: center; height: var(--wiz-ctl); border: 1px solid var(--line-strong); border-radius: 10px; background: var(--surface); overflow: hidden; &:focus-within { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-soft); } input.ss-wiz__affix-input, input { flex: 1; min-width: 0; height: 100%; border: 0; border-radius: 0; padding-left: 0; &:focus { box-shadow: none; } } } &__affix-pre { padding: 0 2px 0 12px; color: var(--ink-3); white-space: nowrap; } &__code { display: block; padding: 10px 12px; border-radius: 10px; background: var(--surface-2); border: 1px solid var(--line); font-size: 13.5px; overflow-wrap: anywhere; } /* ---- buttons ---- */ &__btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; height: var(--wiz-ctl); padding: 0 16px; border: 1px solid var(--line-strong); border-radius: 10px; background: var(--surface); color: var(--ink); font-size: 14.5px; font-weight: 600; line-height: 1; text-decoration: none; white-space: nowrap; box-shadow: none; &:hover:not(:disabled) { background: var(--surface-2); color: var(--ink); } &:disabled { opacity: 0.5; } &--primary { border-color: var(--brand); background: var(--brand); color: #fff; padding: 0 20px; &:hover:not(:disabled) { background: var(--brand-ink); border-color: var(--brand-ink); color: #fff; } } &--dark { border-color: var(--ink); background: var(--ink); color: var(--surface); &:hover:not(:disabled) { background: var(--ink-2); border-color: var(--ink-2); color: var(--surface); } } &--ghost { border-color: transparent; background: transparent; color: var(--ink-2); padding: 0 12px; } &--muted { color: var(--ink-3); } } &__icon-btn { width: 36px; height: 36px; border: 0; border-radius: 8px; background: transparent; color: var(--ink-2); display: inline-flex; align-items: center; justify-content: center; flex: none; &:hover { background: var(--surface-2); color: var(--ink); } &.is-danger:hover { background: var(--live-soft); color: var(--live); } } &__link-btn { display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 10px; border: 0; border-radius: 8px; background: transparent; color: var(--brand-ink); font-size: 13.5px; font-weight: 600; &:hover { background: var(--brand-soft); } } &__spinner { width: 15px; height: 15px; border-radius: 50%; border: 2px solid currentColor; border-right-color: transparent; animation: ss-wiz-spin 0.8s linear infinite; flex: none; } /* ---- detect status: one row (tick · title · format chips), then "Now playing:" ---- */ &__status { display: flex; flex-direction: column; gap: 6px; padding: 12px 16px; border-radius: 12px; background: var(--ok-soft); &.is-unknown { background: var(--warn-soft); } } &__status-row { display: flex; align-items: center; flex-wrap: wrap; gap: 6px 10px; strong { font-size: 14.5px; } } &__status-icon { width: 22px; height: 22px; border-radius: 50%; background: var(--ok); color: #fff; display: inline-flex; align-items: center; justify-content: center; flex: none; } &__status.is-unknown .ss-wiz__status-icon { background: var(--warn); } &__status-text { padding-left: 32px; font-size: 13.5px; line-height: 1.5; color: var(--ink-2); overflow-wrap: anywhere; strong { font-weight: 600; color: var(--ink); } } &__chips { display: flex; flex-wrap: wrap; gap: 6px; } &__chip { padding: 3px 9px; border-radius: 999px; background: var(--surface); border: 1px solid var(--line); font-size: 12.5px; font-weight: 600; color: var(--ink-2); } /* ---- logo ---- */ &__logo { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; padding: 4px; margin: -4px; border-radius: 14px; &.is-over { background: var(--brand-soft); } } &__logo-thumb { width: 56px; height: 56px; border-radius: 12px; border: 1px solid var(--line-strong); background: var(--surface-2); color: var(--ink-3); display: inline-flex; align-items: center; justify-content: center; overflow: hidden; flex: none; img { width: 100%; height: 100%; object-fit: cover; } } &__logo-meta { flex: 1 1 180px; display: flex; flex-direction: column; gap: 2px; min-width: 0; strong { font-size: 14px; } span { font-size: 13px; color: var(--ink-3); overflow-wrap: anywhere; } } &__logo-actions { display: flex; gap: 6px; align-items: center; .ss-wiz__btn { height: 38px; } } &__note { display: flex; gap: 8px; align-items: flex-start; font-size: 13px; color: var(--ink-3); .ss-i { margin-top: 2px; } } /* ---- look step ---- */ &__tiles { display: grid; grid-template-columns: repeat(auto-fill, minmax(124px, 1fr)); gap: 10px; } &__tile { display: flex; flex-direction: column; gap: 8px; padding: 10px; text-align: left; border: 1.5px solid var(--line); border-radius: 12px; background: var(--surface); color: var(--ink); &:hover { border-color: var(--line-strong); } &.is-active { border-color: var(--brand); background: var(--brand-soft); } } &__tile-art { height: 64px; border-radius: 8px; background: var(--surface-2); display: flex; align-items: center; justify-content: center; padding: 6px; .ss-lthumb { width: 84px; height: 56px; } } &__tile-label { font-size: 14px; font-weight: 600; } &__tile-desc { font-size: 12.5px; line-height: 1.35; color: var(--ink-3); } &__pills { display: flex; flex-wrap: wrap; gap: 8px; } &__pill { display: inline-flex; align-items: center; gap: 8px; height: 40px; padding: 0 14px 0 8px; border: 1.5px solid var(--line); border-radius: 999px; background: var(--surface); color: var(--ink); font-size: 14px; font-weight: 600; &:hover { border-color: var(--line-strong); } &.is-active { border-color: var(--brand); background: var(--brand-soft); } &--more { padding: 0 14px 0 10px; color: var(--ink-2); border-style: dashed; } } &__swatch { width: 24px; height: 24px; border-radius: 50%; border: 1px solid var(--line-strong); flex: none; } &__colors { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; } &__color { position: relative; width: 32px; height: 32px; padding: 0; border: 0; border-radius: 50%; box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); flex: none; &.is-active { box-shadow: 0 0 0 2px var(--surface), 0 0 0 4px currentColor; } &--custom { display: inline-flex; align-items: center; justify-content: center; cursor: pointer; background: conic-gradient(#ef4444, #f59e0b, #22c55e, #06b6d4, #6366f1, #d946ef, #ef4444); color: var(--ink); .ss-i { background: var(--surface); border-radius: 50%; padding: 3px; width: 22px; height: 22px; } input { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; border: 0; padding: 0; } } } /* ---- publish step ---- */ &__options { display: flex; flex-direction: column; gap: 10px; } &__option { display: flex; align-items: center; gap: 14px; width: 100%; padding: 14px 16px; text-align: left; border: 1.5px solid var(--line); border-radius: 14px; background: var(--surface); color: var(--ink); &:hover { border-color: var(--line-strong); } &.is-active { border-color: var(--brand); background: var(--brand-soft); } } &__option-icon { width: 40px; height: 40px; border-radius: 10px; background: var(--surface-2); color: var(--ink-2); display: inline-flex; align-items: center; justify-content: center; flex: none; } &__option.is-active .ss-wiz__option-icon { background: var(--brand); color: #fff; } &__option-text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; strong { font-size: 15px; } span { font-size: 13.5px; color: var(--ink-3); } } &__radio { width: 20px; height: 20px; border-radius: 50%; border: 2px solid var(--line-strong); flex: none; display: inline-flex; align-items: center; justify-content: center; } &__option.is-active .ss-wiz__radio { border-color: var(--brand); &::after { content: ''; width: 10px; height: 10px; border-radius: 50%; background: var(--brand); } } &__seg { display: flex; padding: 3px; border-radius: 10px; background: var(--surface-2); border: 1px solid var(--line); button { flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 6px; height: 36px; padding: 0 12px; border: 0; border-radius: 8px; background: transparent; color: var(--ink-2); font-size: 14px; font-weight: 600; &.is-active { background: var(--surface); color: var(--ink); box-shadow: var(--shadow-sm), 0 0 0 1px var(--line); } } &--icons { flex: none; border-radius: 9px; button { width: 32px; height: 28px; padding: 0; border-radius: 7px; } } } &__manual { display: flex; flex-direction: column; gap: 14px; } &__manual-item { display: flex; gap: 10px; align-items: flex-start; font-size: 13.5px; color: var(--ink-3); strong { display: block; font-size: 14px; color: var(--ink); } } /* ---- alerts & footer ---- */ &__alert { display: flex; gap: 10px; align-items: center; padding: 10px 10px 10px 14px; border-radius: 12px; background: var(--live-soft); color: var(--ink); font-size: 14px; > .ss-i { color: var(--live); } span { flex: 1; } &--warn { background: var(--warn-soft); text-align: left; > .ss-i { color: var(--warn); } } } &__foot { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding-top: 4px; } &__foot-hint { flex: 1; font-size: 13px; color: var(--ink-3); text-align: right; } /* ---- preview ---- */ &__browser { background: var(--surface); border: 1px solid var(--line); border-radius: 18px; overflow: hidden; box-shadow: var(--shadow-md); } &__chrome { display: flex; align-items: center; gap: 12px; padding: 10px 12px 10px 14px; background: var(--surface-2); border-bottom: 1px solid var(--line); } &__lights { display: flex; gap: 6px; flex: none; i { width: 11px; height: 11px; border-radius: 50%; background: #ff5f57; &:nth-child(2) { background: #febc2e; } &:nth-child(3) { background: #28c840; } } } &__address { flex: 1; min-width: 0; height: 30px; padding: 0 10px; border-radius: 8px; background: var(--surface); border: 1px solid var(--line); display: flex; align-items: center; gap: 7px; font-size: 13px; color: var(--ink-2); > .ss-i { color: var(--ink-3); } } &__address-text { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } &__live { display: inline-flex; align-items: center; gap: 5px; flex: none; font-size: 12px; font-weight: 600; color: var(--ink-3); i { width: 7px; height: 7px; border-radius: 50%; background: var(--line-strong); &.is-on { background: var(--ok); animation: ss-wiz-pulse 1.6s ease-in-out infinite; } } } &__stage { min-height: 340px; padding: 40px 20px; display: flex; align-items: center; justify-content: center; background: #eceef3; background-image: radial-gradient(rgba(22, 24, 31, 0.07) 1px, transparent 1px); background-size: 16px 16px; color-scheme: light; } &__frame { width: 100%; margin: 0 auto; transition: max-width 0.2s ease; &.is-phone { max-width: 340px; } } &__stage-note { display: flex; gap: 10px; align-items: flex-start; padding: 14px 18px; border-top: 1px solid var(--line); font-size: 13px; line-height: 1.5; color: var(--ink-3); .ss-i { margin-top: 1px; } } /* ---- finish ---- */ &__done { width: 100%; max-width: 780px; margin: 0 auto; padding: 56px 24px 64px; display: flex; flex-direction: column; align-items: center; gap: 26px; text-align: center; } &__done-badge { width: 64px; height: 64px; border-radius: 50%; background: var(--ok-soft); color: var(--ok); display: inline-flex; align-items: center; justify-content: center; } &__done-stage { width: 100%; padding: 36px 20px; border-radius: 18px; border: 1px solid var(--line); background: #eceef3; background-image: radial-gradient(rgba(22, 24, 31, 0.07) 1px, transparent 1px); background-size: 16px 16px; color-scheme: light; .ss-wiz__frame { max-width: 480px; } } &__shortcode { width: 100%; max-width: 480px; display: flex; flex-direction: column; gap: 8px; text-align: left; } &__done-actions { display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; } &__next { width: 100%; display: flex; flex-direction: column; gap: 12px; text-align: left; } &__next-title { font-size: 14px; font-weight: 600; color: var(--ink-2); } &__next-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 12px; } &__next-card { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; padding: 16px; text-align: left; border: 1px solid var(--line); border-radius: 14px; background: var(--surface); color: var(--ink); .ss-wiz__label-icon { width: 36px; height: 36px; border-radius: 10px; margin-bottom: 2px; } strong { font-size: 14.5px; } span:last-child { font-size: 13px; line-height: 1.45; color: var(--ink-3); } &:hover { border-color: var(--brand); } } &__confetti { position: fixed; inset: 0; overflow: hidden; pointer-events: none; z-index: 100000; i { position: absolute; top: -20px; opacity: 0; animation-name: ss-wiz-confetti; animation-timing-function: cubic-bezier(0.25, 0.6, 0.45, 1); animation-fill-mode: both; } } /* ---- narrow screens ---- */ @media (max-width: 960px) { &__aside { position: static; } &__main { max-width: none; } } @media (max-width: 782px) { &__bar { padding: 10px 16px; } &__brand { flex-basis: auto; } &__stepper { order: 3; flex: 1 1 100%; ol { justify-content: center; } } &__step-label { display: none; } .is-current .ss-wiz__step-label { display: inline; } &__layout { padding: 24px 16px 40px; } &__done { padding: 40px 16px 48px; } &__title { font-size: 26px; } &__foot-hint { flex-basis: 100%; order: -1; text-align: left; } &__foot .ss-wiz__btn--primary { margin-left: auto; } } @media (prefers-reduced-motion: reduce) { &__confetti { display: none; } &__live i.is-on, &__spinner { animation: none; } } }