/* ===================================================== 썰박스 — castad 통합용 신규 컴포넌트 스타일 ssulbox.css 는 원본에서 스크립트로 변환한 파일이라 직접 수정하지 않는다. castad 안에서 새로 만든 화면(SsulCreateForm 등)의 스타일은 여기에 둔다. 모든 규칙은 원본과 동일하게 `.ssul-scope` 안에 가둔다. ===================================================== */ /* ssulbox.css 의 `.ssul-scope` 는 원본에서 전체 화면 셸(`#app`)이었던 탓에 `overflow: hidden` 을 갖는다. castad 안에서는 셸이 아니라 폼·화면 컨테이너로 쓰므로 그 클리핑이 **요소 바깥으로 그려지는 것들을 잘라 먹는다** — 선택 카드의 링(테두리 바깥 1px)이 좌우에서 잘리고, 버튼 hover 글로우도 잘린다. 생성물 파일은 직접 고치지 않으므로 여기서 되돌린다(0,2,0 이라 이긴다). */ .ssul-scope.ssul-create, .ssul-scope.ssul-making { overflow: visible; } /* ── 생성 폼 ─────────────────────────────────────── */ .ssul-scope.ssul-create { width: 100%; display: flex; flex-direction: column; color: var(--color-text-white); } .ssul-create__step { align-self: flex-start; font-size: 12px; font-weight: 700; letter-spacing: 0.04em; color: var(--color-ssul-accent); margin-bottom: 10px; } /* 2단계 라벨. 강조를 1단계에만 두어 시선 순서를 만든다 */ .ssul-create__step.muted { font-weight: 600; color: var(--color-text-gray-400); } /* ── 시나리오 2x2 그리드 ─────────────────────────── */ .ssul-create__scenarios { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; width: 100%; margin-bottom: 22px; } .ssul-scn { position: relative; display: flex; flex-direction: column; align-items: flex-start; gap: 5px; padding: 14px 12px; /* 테두리 두께는 모든 상태에서 1px 로 고정한다. 선택 시 굵기를 바꾸면 border-box 안쪽 폭이 줄어 글자가 흔들린다 — 굵기는 box-shadow 링으로 더한다 */ border: 1px solid var(--color-border-white-10); border-radius: 14px; background: var(--color-bg-card); color: inherit; font-family: inherit; text-align: left; cursor: pointer; overflow: hidden; transition: border-color var(--transition-normal), transform var(--transition-normal); } /* 시나리오 표지 그라디언트를 옅게 깐다. --scn / --scn-a / --scn-b 는 컴포넌트가 인라인으로 넘긴다. */ .ssul-scn::before { content: ''; position: absolute; inset: 0; background: linear-gradient(150deg, var(--scn-a), var(--scn-b)); /* 비선택은 눌러 둔다 — 채도까지 낮춰야 선택 카드와 확실히 갈린다 */ opacity: 0.22; filter: saturate(0.75); pointer-events: none; transition: opacity var(--transition-normal), filter var(--transition-normal); } /* 선택한 카드는 채도·명도를 함께 올린다. 불투명도만 올리면 어두운 배경과 섞여 오히려 탁해지므로 filter 로 직접 올린다. */ .ssul-scn.active::before { opacity: 0.72; filter: saturate(1.55) brightness(1.18); } .ssul-scn:hover { border-color: rgba(255, 255, 255, 0.25); transform: translateY(-1px); } /* 선택 표시는 밝은 중립색 테두리로 둔다. 앰버(썰박스 강조색)를 쓰면 시나리오마다 다른 표지색과 부딪힌다 — 특히 삼국지(적)·오디세이(청) 위에서 탁해진다. */ .ssul-scn.active { border-color: var(--color-mint); /* 링을 **테두리와 같은 색**으로 둔다. 색이 다르면 안쪽 테두리와 바깥 링이 갈라져 두 줄로 보인다. 같은 색이면 1px 테두리 + 1px 링이 이어져 2px 한 줄로 읽히고, 테두리 두께를 바꾸지 않아 글자도 흔들리지 않는다. 마지막 그림자만 시나리오 대표색 글로우. */ box-shadow: 0 0 0 1px var(--color-mint), 0 0 20px -2px var(--scn); } /* 표지가 밝아진 만큼 설명 글자도 올려 대비를 지킨다 */ .ssul-scn.active .ssul-scn__desc { color: rgba(255, 255, 255, 0.92); } .ssul-scn__emoji { position: relative; font-size: 22px; } .ssul-scn__name { position: relative; font-size: 14px; font-weight: 700; } .ssul-scn__desc { position: relative; font-size: 12px; line-height: 1.4; color: var(--color-text-gray-400); } /* ── 업장 검색 (ADO2 식 자동완성) ─────────────────── */ /* position: relative 는 드롭다운(.ssul-places)의 기준점이다 */ .ssul-create__search { position: relative; display: flex; gap: 8px; width: 100%; margin-bottom: 10px; } .ssul-create__input { flex: 1; min-width: 0; min-height: 46px; padding: 8px 16px; border: none; border-radius: 999px; background: #fff; color: #1f2937; font-family: inherit; font-size: 14px; font-weight: 600; letter-spacing: -0.006em; } .ssul-create__input::placeholder { color: #9ca3af; font-weight: 500; } .ssul-create__search-btn { flex: none; padding: 0 18px; border: 1px solid var(--color-border-white-10); border-radius: 999px; background: var(--color-bg-card-inner); color: var(--color-text-white); font-family: inherit; font-size: 14px; font-weight: 600; cursor: pointer; transition: opacity var(--transition-normal); } .ssul-create__search-btn:disabled { opacity: 0.4; cursor: default; } /* ── 검색 결과 / 선택 / 안내 ─────────────────────── */ /* 입력창 아래로 겹쳐 뜨는 자동완성 드롭다운. 문서 흐름에 넣으면 타이핑할 때마다 아래 요소(비용·버튼)가 밀려 흔들린다. */ .ssul-places { position: absolute; top: calc(100% + 6px); left: 0; right: 0; z-index: 20; max-height: 260px; overflow-y: auto; margin: 0; padding: 0; list-style: none; border: 1px solid var(--color-border-white-10); border-radius: 12px; background: var(--color-bg-card); box-shadow: 0 12px 32px rgba(0, 0, 0, 0.45); } .ssul-places li + li { border-top: 1px solid var(--color-border-white-10); } .ssul-places button { display: flex; flex-direction: column; gap: 3px; width: 100%; padding: 11px 14px; border: none; background: var(--color-bg-card); color: inherit; font-family: inherit; text-align: left; cursor: pointer; } .ssul-places button:hover { background: var(--color-bg-card-inner); } .ssul-places b { font-size: 14px; font-weight: 700; } .ssul-places span { font-size: 12px; color: var(--color-text-gray-400); } .ssul-picked { display: flex; align-items: center; gap: 10px; width: 100%; padding: 11px 14px; margin-bottom: 14px; border: 1.5px solid var(--color-ssul-accent); border-radius: 12px; background: rgba(255, 184, 107, 0.08); } .ssul-picked__body { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1; } .ssul-picked__body b { font-size: 14px; font-weight: 700; } .ssul-picked__body span { font-size: 12px; color: var(--color-text-gray-400); } .ssul-picked__change { flex: none; padding: 6px 12px; border: 1px solid var(--color-border-white-10); border-radius: 999px; background: none; color: var(--color-text-gray-300); font-family: inherit; font-size: 12px; cursor: pointer; } .ssul-hint { width: 100%; padding: 10px 14px; margin-bottom: 14px; border-radius: 12px; background: var(--color-bg-card-inner); font-size: 12px; line-height: 1.5; color: var(--color-text-gray-300); } .ssul-hint.ok { color: var(--color-mint); } /* 시나리오 확인 안내 — 앞에 점을 찍어 상태 표시임을 드러낸다 */ .ssul-hint.dot { display: flex; align-items: center; gap: 8px; color: var(--color-text-gray-300); } .ssul-hint.dot::before { content: ''; flex: none; width: 5px; height: 5px; border-radius: 50%; background: var(--color-ssul-accent); } .ssul-hint.warn { color: #ffb4a8; } /* ── 비용 고지 + 제출 ────────────────────────────── */ .ssul-create__cost { display: flex; align-items: center; justify-content: space-between; width: 100%; padding: 10px 4px; font-size: 12px; color: var(--color-text-gray-400); } .ssul-create__cost-badge { display: inline-flex; align-items: center; gap: 5px; font-weight: 700; color: var(--color-ssul-accent); } .ssul-create__coin { font-size: 14px; line-height: 1; } .ssul-create__submit { display: flex; align-items: center; justify-content: center; width: 100%; height: 48px; border: none; border-radius: 999px; background: linear-gradient(90deg, #ff8a5c, var(--color-ssul-accent)); color: #1a1200; font-family: inherit; font-size: 16px; font-weight: 800; cursor: pointer; transition: filter var(--transition-normal), box-shadow var(--transition-normal); } .ssul-create__submit:hover:not(:disabled) { filter: brightness(1.08); box-shadow: 0 4px 28px rgba(255, 180, 90, 0.4); } .ssul-create__submit:disabled { opacity: 0.4; cursor: default; } /* ── 생성 진행 화면 ──────────────────────────────── */ .ssul-scope.ssul-making { display: flex; flex-direction: column; align-items: center; width: 100%; max-width: 420px; /* ssulbox.css 의 베이스 `.ssul-scope { height:100% }` (원본 전체화면 셸 규칙)가 여기까지 상속되어 이 박스 자체가 부모 높이를 꽉 채워버린다. 그러면 아래 margin:auto 가 나눠 가질 여유 공간이 0 이 되어 컨텐츠가 위로 쏠린다. height:auto 로 되돌려 컨텐츠 크기만큼만 차지하게 해야 margin:auto 가 뜻대로 작동한다(부모 .wizard-page-container 가 height:100% flex column). */ height: auto; /* `0 auto` 면 수평만 중앙이라 스텝퍼 바로 아래에 붙고 세로 여백이 전부 아래로 몰린다. `auto` 는 상하 여백도 균등 분배해 스텝퍼~바닥 사이 중앙에 놓인다. */ margin: auto; padding: 48px 20px; text-align: center; gap: 10px; color: var(--color-text-white); } .ssul-making__scenario { font-size: 20px; font-weight: 700; } .ssul-making__title { margin: 0 0 24px; font-size: 24px; font-weight: 700; letter-spacing: -0.015em; } .ssul-making__title.warn { color: #ffb4a8; } /* 진행 스피너 — 원본 LoadingSection 의 회전 요소만 가져왔다. SVG(loading-spinner.svg)를 쓰지 않은 이유: 색이 민트로 하드코딩돼 있어 시나리오 대표색(삼국지=적, 오디세이=청)과 부딪힌다. CSS 로 그리면 --scn 을 받는다. `spin` 키프레임은 castad 전역에 이미 있어 재사용한다(새로 만들면 3번째 중복). */ .ssul-making__spinner { position: relative; flex: none; width: 150px; height: 150px; margin: 4px 0 26px; } /* 트랙(전체 원) */ .ssul-making__spinner::before { content: ''; position: absolute; inset: 0; border-radius: 50%; border: 7px solid var(--color-border-white-10); } /* 회전하는 호 — 3/4 만 칠해 원본 SVG 의 형태를 따른다 */ .ssul-making__spinner::after { content: ''; position: absolute; inset: 0; border-radius: 50%; border: 7px solid transparent; border-top-color: var(--scn); border-right-color: var(--scn); border-bottom-color: var(--scn); animation: spin 1.1s linear infinite; } .ssul-making__bar { width: 100%; height: 6px; border-radius: 999px; margin-top: 20px; background: var(--color-bg-card-inner); overflow: hidden; } .ssul-making__fill { height: 100%; border-radius: 999px; transition: width 400ms ease; } .ssul-making__meta { display: flex; align-items: center; justify-content: space-between; width: 100%; margin-top: 10px; font-size: 16px; color: var(--color-text-gray-300); } .ssul-making__pct { font-variant-numeric: tabular-nums; font-weight: 700; } .ssul-making__desc { margin: 22px 0 0; font-size: 14px; line-height: 1.6; color: var(--color-text-gray-400); } .ssul-making__refund { margin: 8px 0 0; font-size: 14px; color: var(--color-mint); } .ssul-making__btn { margin-top: 28px; padding: 12px 24px; border: 1px solid var(--color-border-white-10); border-radius: 999px; background: var(--color-bg-card); color: var(--color-text-white); font-family: inherit; font-size: 14px; font-weight: 600; cursor: pointer; transition: border-color var(--transition-normal); } .ssul-making__btn:hover { border-color: rgba(255, 255, 255, 0.3); } /* 진행바·스피너 애니메이션은 모션 민감 사용자에게 끈다. 스피너는 회전을 멈추면 3/4 호가 그대로 남아 정적 표시로 읽힌다. */ @media (prefers-reduced-motion: reduce) { .ssul-making__fill { transition: none; } .ssul-making__spinner::after { animation: none; } } /* 썰박스 뷰어 전용 스타일은 두지 않는다 — SsulViewerModal 이 castad `video-detail-*` 클래스를 그대로 재사용해 통합 목록에서 어떤 카드를 열든 같은 모양이 나오게 했다. */ /* 결과 화면 스타일은 없다 — SsulResultContent 가 ADO2 완료 화면과 같은 `CompletionView`(comp2-* 클래스)를 쓴다(2026-08-10 통일). */