feat: 설치 가이드 개편 — IntelliJ 설치·Git 연결 단계 추가, 가이드 디자인 시스템 도입

- STEP 6 IntelliJ 설치(Community 선택, JDK 지정, 첫 실행까지)
- STEP 7 IntelliJ에서 Git 연결(클론→브랜치→커밋→푸시→PR, 클릭 경로 명시)
- 히어로·단계 필 내비·번호 리스트·팁/주의 박스 등 가이드 전용 스타일 추가 (global.css)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
AWESOMEDEV 2026-07-16 08:32:51 +09:00
parent 111590104e
commit c6d723824b
4 changed files with 446 additions and 144 deletions

View File

@ -5,7 +5,7 @@
# - 도메인이 연결되면 HTTPS 인증서를 자동으로 받아요 (Let's Encrypt)
# 도메인 접속 (DNS 연결 자동 HTTPS)
mirim.awesomedev.dev {
edu.awesomedevapp.com {
encode gzip
handle /api/* {

View File

@ -65,7 +65,7 @@ services:
image: gitea/gitea:1.23
container_name: mirim-gitea
environment:
GITEA__server__ROOT_URL: http://${GIT_HOST:-3.36.160.246}:3000/
GITEA__server__ROOT_URL: http://${GIT_HOST:-edu.awesomedevapp.com}:3000/
GITEA__server__SSH_PORT: "222"
GITEA__service__DISABLE_REGISTRATION: "false" # 학생 스스로 가입 가능
GITEA__security__INSTALL_LOCK: "true" # 웹 설치 마법사 건너뛰기(설정은 env로 완료)

View File

@ -1,6 +1,7 @@
// : " " PC
// . (JDK·PATH·Node·Git·· ·/)
// : CodingBasicsPage API ' ' .
// . (JDK·PATH·Node·Git··IntelliJ· ·/)
// : API ' ' . global.css
// (step-card, code-block, tip ) .
// · JSX / .
const CODE_JAVA_CHECK = `# 명령 프롬프트(cmd)나 PowerShell을 "새로 열고" 입력:
@ -31,40 +32,28 @@ git config --global user.email "hong@example.com"
# 확인
git config --global --list`;
const CODE_CLONE_RUN = `# 1) 프로젝트 받기 (원하는 폴더에서)
git clone http://<>:3000/awesomedev/mirim-app.git
const CODE_RUN = `# 1) 개발용 DB 띄우기 (Docker Desktop이 켜져 있어야 해요)
cd mirim-app
# 2) 개발용 DB 띄우기 (Docker Desktop이 켜져 있어야 해요)
docker compose up -d
# 3) 백엔드 실행 ( 터미널에서)
cd backend
# IntelliJ로 열어서 MirimApplication 실행하는 제일 편해요.
# 2) 백엔드 실행 IntelliJ에서 MirimApplication 실행 (STEP 6 참고)
# 4) 프론트 실행 ( 터미널에서)
# 3) 프론트 실행 ( 터미널에서)
cd frontend
npm install # 처음 번만 라이브러리 설치
npm run dev # http://localhost:5173 !`;
const CODE_GIT_FLOW = `# ── 매일 쓰는 Git 흐름 ──
const CODE_GIT_FLOW = `# ── 매일 쓰는 Git 흐름 (터미널 버전) ──
# 0) 최신 코드 받기 ( 시작할 )
git pull
git pull # 0) 시작: 최신 코드 받기
git switch -c feat/empty-state-alarm # 1) 작업 브랜치 만들기
# 1) 작업 브랜치 만들기
git switch -c feat/empty-state-alarm
# ... 코드 수정 ...
# 2) 코드 수정 , 뭐가 바뀌었나 확인
git status # 바뀐 파일 목록
git diff # 바뀐 내용 자세히
# 3) 커밋할 파일 담기(스테이징) 커밋
git add .
git status # 2) 뭐가 바뀌었나 확인
git add . # 3) 커밋할 파일 담기
git commit -m "feat: 알림 목록 빈 상태 화면 추가"
# 4) 서버(Gitea) 올리기
git push -u origin feat/empty-state-alarm
git push -u origin feat/empty-state-alarm # 4) 서버로 올리기
# 5) Gitea 웹에서 Pull Request 만들기 멘토 리뷰 머지!`;
@ -79,170 +68,226 @@ chore: 그 외 잡일 예) chore: 불필요한 로그 제거
줄로 "무엇을 왜" 나중에 이력만 봐도 흐름이 보이게!`;
// : Gitea , (hostname) .
// IP IP:3000, :3000 .
const gitHost = `${window.location.hostname}:3000`;
const HOST = window.location.hostname;
const GIT_URL = `http://${HOST}:3000`;
const CLONE_URL = `${GIT_URL}/awesomedev/mirim-app.git`;
// () .
function Step({ n, title, children }) {
//
// : . props(n, title...) .
function Step({ n, title, sub, children }) {
return (
<div className="card" style={{ marginTop: 14 }}>
<h3 style={{ margin: '0 0 8px' }}>
<span style={{ color: 'var(--primary)', marginRight: 8 }}>STEP {n}</span>
{title}
</h3>
{children}
</div>
<section className="step-card" id={`step-${n}`}>
<div className="step-head">
<span className="step-num">{n}</span>
<div>
<h3>{title}</h3>
{sub && <span className="step-sub">{sub}</span>}
</div>
</div>
<div className="step-body">{children}</div>
</section>
);
}
// / .
function Code({ children }) {
return <pre className="code-block"><code>{children}</code></pre>;
}
// [File] [Settings]
function Path({ items }) {
return (
<pre
style={{
background: 'var(--code-bg, rgba(0,0,0,0.05))',
borderRadius: 10,
padding: '12px 14px',
overflowX: 'auto',
fontSize: 13,
lineHeight: 1.7,
whiteSpace: 'pre-wrap',
}}
>
<code>{children}</code>
</pre>
<span>
{items.map((item, i) => (
<span key={item}>
<span className="kbd">{item}</span>
{i < items.length - 1 && <span className="muted"> </span>}
</span>
))}
</span>
);
}
const STEPS = [
{ n: 1, label: 'JDK 21' },
{ n: 2, label: 'PATH' },
{ n: 3, label: 'Node.js' },
{ n: 4, label: 'Git' },
{ n: 5, label: 'VS Code · Docker' },
{ n: 6, label: 'IntelliJ 설치' },
{ n: 7, label: 'IntelliJ + Git 연결' },
{ n: 8, label: '프로젝트 실행' },
{ n: 9, label: '커밋과 푸시' },
];
export default function SetupGuidePage() {
return (
<div>
<h1 className="page-title">개발 환경 설치 가이드</h1>
<p className="page-desc">
PC를 개발할 있는 상태로 만드는 과정이에요. 순서대로 따라 하면 됩니다.
막히면 <strong>30 </strong> 혼자 30 해보고, 되면 멘토에게 물어보세요.
설치 과정에서 막힌 자체가 좋은 질문 재료예요.
</p>
<Step n={1} title="자바(JDK 21) 설치 — 백엔드의 심장">
{/* 히어로: 이 페이지가 뭘 해주는지 한눈에 */}
<div className="hero">
<div className="eyebrow">Setup Guide</div>
<h1> PC를 개발자의 PC로<br />만드는 9단계</h1>
<p>
우리 백엔드(Spring Boot) 자바로 돌아가요. <strong>Eclipse Temurin 21 (LTS)</strong> 설치합니다.
순서대로 따라 하면 됩니다. 막히면 <strong>30 </strong> 혼자 30 해보고,
되면 멘토에게 물어보세요. 설치에서 막힌 자체가 좋은 질문 재료예요.
</p>
<ol style={{ lineHeight: 2 }}>
<div className="chip-row">
<span className="chip">예상 소요 2~3시간</span>
<span className="chip">Windows 기준</span>
<span className="chip">디자이너는 STEP 3·4·5</span>
</div>
</div>
{/* 단계 바로가기 */}
<nav className="pill-nav">
{STEPS.map((s) => (
<a key={s.n} href={`#step-${s.n}`}>
<b>{s.n}</b>
{s.label}
</a>
))}
</nav>
<Step n={1} title="자바(JDK 21) 설치" sub="백엔드(Spring Boot)의 심장">
<ol className="olist">
<li>브라우저에서 <strong>adoptium.net</strong> 접속 다운로드 버튼(<strong>Temurin 21 LTS</strong>, Windows x64 .msi) 클릭</li>
<li>받은 .msi 파일 실행 계속 <span className="kbd">다음</span></li>
<li>
브라우저에서 <strong>adoptium.net</strong> 접속 다운로드 버튼(Temurin 21 LTS, Windows x64 .msi) 클릭
<strong>제일 중요한 화면!</strong> "Custom Setup" 단계에서{' '}
<strong>Set JAVA_HOME variable</strong> <strong>Add to PATH</strong> 클릭해{' '}
<em>"Will be installed on local hard drive"</em> 바꾸기 이러면 PATH 설정을 설치기가 대신 해줘요
</li>
<li>받은 .msi 파일 실행 계속 [다음]</li>
<li>
<strong>제일 중요한 화면!</strong> "Custom Setup" 단계에서{' '}
<strong>"Set JAVA_HOME variable"</strong> <strong>"Add to PATH"</strong> 항목을
클릭해서 <strong>"Will be installed on local hard drive"</strong> 바꿔 주세요.
(이걸 켜면 아래 PATH 설정을 설치기가 대신 해줍니다)
</li>
<li>설치 완료 , <strong>열려 있던 터미널은 모두 닫고 새로 열어서</strong> 확인:</li>
<li>설치 완료 , <strong>열려 있던 터미널을 모두 닫고 새로 열어서</strong> 확인:</li>
</ol>
<Code>{CODE_JAVA_CHECK}</Code>
<p className="muted" style={{ marginTop: 8 }}>
💡 터미널을 새로 여는 이유: PATH 같은 환경 변수는 <strong>터미널이 켜질 </strong> 읽혀요.
<div className="tip">
<b> 터미널을 새로 여나요?</b> PATH 같은 환경 변수는 터미널이 <strong>켜질 </strong> 읽혀요.
설치 전에 열어둔 터미널은 설정을 모릅니다.
</p>
</div>
</Step>
<Step n={2} title="PATH가 뭐길래? — 손으로 직접 잡아보기">
<Step n={2} title="PATH가 뭐길래? — 손으로 직접 잡아보기" sub="java -version이 안 될 때">
<Code>{CODE_PATH_EXPLAIN}</Code>
<p style={{ marginTop: 10 }}>
설치기에서 체크를 놓쳤거나 <code>java -version</code> , 직접 잡는 방법(Windows):
</p>
<ol style={{ lineHeight: 2 }}>
<p>설치기에서 체크를 놓쳤다면 직접 잡습니다:</p>
<ol className="olist">
<li><Path items={['⊞ 시작', '"환경 변수" 검색', '시스템 환경 변수 편집']} /> 클릭</li>
<li>아래쪽 <span className="kbd">환경 변수(N)...</span> 버튼 클릭</li>
<li>
<strong> 시작 버튼</strong> "환경 변수" 검색 <strong>"시스템 환경 변수 편집"</strong> 클릭
시스템 변수에서 <span className="kbd">새로 만들기</span> 변수 이름 <span className="icode">JAVA_HOME</span> /
변수 <span className="icode">C:\Program Files\Eclipse Adoptium\jdk-21.0.x-hotspot</span>
<span className="muted"> (실제 설치 폴더를 탐색기로 확인해서 적어요)</span>
</li>
<li>아래쪽 <strong>[환경 변수(N)...]</strong> 버튼 클릭</li>
<li>
아래 (시스템 변수)에서 <strong>[새로 만들기]</strong>
변수 이름: <code>JAVA_HOME</code> /
변수 : <code>C:\Program Files\Eclipse Adoptium\jdk-21.0.x-hotspot</code>
(실제 설치된 폴더를 파일 탐색기로 확인해서 적어요)
</li>
<li>
시스템 변수 목록에서 <strong>Path</strong> 선택 [편집] [새로 만들기] {' '}
<code>%JAVA_HOME%\bin</code> 입력 전부 [확인]
</li>
<li>터미널 새로 열고 <code>java -version</code> 다시 확인!</li>
<li>시스템 변수 목록에서 <span className="kbd">Path</span> 선택 <span className="kbd">편집</span> <span className="kbd">새로 만들기</span> <span className="icode">%JAVA_HOME%\bin</span> 입력 전부 확인</li>
<li>터미널 새로 열고 <span className="icode">java -version</span> 다시 확인!</li>
</ol>
<p className="muted">
💡 <code>%JAVA_HOME%\bin</code> 의미: "JAVA_HOME 변수에 적힌 폴더 안의 bin 폴더".
binjava.exe 같은 실행 파일이 들어 있어요.
</p>
<div className="tip">
<b>%JAVA_HOME%\bin의 의미</b> "JAVA_HOME 변수에 적힌 폴더 안의 bin 폴더".
bin 안에 java.exe 같은 실행 파일이 들어 있어요.
</div>
</Step>
<Step n={3} title="Node.js 설치 — 프론트엔드의 엔진">
<p>
React 개발 도구(Vite) 라이브러리 관리(npm) 필요해요. <strong>LTS 버전</strong> 설치합니다.
</p>
<ol style={{ lineHeight: 2 }}>
<li><strong>nodejs.org</strong> 접속 초록색 <strong>LTS</strong> 버튼 클릭해 다운로드</li>
<li>설치 파일 실행 전부 기본값으로 [다음] (Node는 PATH를 자동으로 잡아줘요)</li>
<Step n={3} title="Node.js 설치" sub="프론트엔드(React)의 엔진">
<ol className="olist">
<li><strong>nodejs.org</strong> 접속 초록색 <strong>LTS</strong> 버튼으로 다운로드</li>
<li>설치 파일 실행 전부 기본값으로 <span className="kbd">Next</span> (Node는 PATH를 자동으로 잡아줘요)</li>
<li>터미널 새로 열고 확인:</li>
</ol>
<Code>{CODE_NODE_CHECK}</Code>
</Step>
<Step n={4} title="Git 설치 + 첫 설정협업의 시작">
<ol style={{ lineHeight: 2 }}>
<Step n={4} title="Git 설치 + 첫 설정" sub="협업의 시작">
<ol className="olist">
<li><strong>git-scm.com</strong> 접속 Download for Windows</li>
<li>설치 옵션이 많이 나오는데 <strong>전부 기본값</strong>으로 [Next] 해도 충분해요</li>
<li>설치 터미널에서 <code>git --version</code> 확인</li>
<li>내가 누군지 등록 (커밋마다 이름이 남아요):</li>
<li>설치 옵션이 많이 나오는데 <strong>전부 기본값</strong>으로 <span className="kbd">Next</span> 해도 충분해요</li>
<li>설치 터미널에서 <span className="icode">git --version</span> 확인</li>
<li>내가 누군지 등록 커밋마다 이름이 남아요:</li>
</ol>
<Code>{CODE_GIT_CONFIG}</Code>
<div className="warn">
<b>먼저 </b> 우리 Git 서버(Gitea) <a href={GIT_URL} target="_blank" rel="noreferrer"><strong>{GIT_URL}</strong></a>
접속해서 <strong>회원가입</strong>하고, 아이디를 멘토에게 알려 주세요. 다음 단계들에서 계정을 씁니다.
</div>
</Step>
<Step n={5} title="에디터 설치 — 코드를 쓰는 곳">
<ul style={{ lineHeight: 2 }}>
<li>
<strong>VS Code</strong> (code.visualstudio.com) 프론트엔드(React) 작업용.
설치 확장(Extensions)에서 <strong>Korean Language Pack</strong>, <strong>ES7+ React snippets</strong> 추천.
</li>
<li>
<strong>IntelliJ IDEA Community</strong> (jetbrains.com) 백엔드(Java/Spring) 작업용. 무료 Community 버전이면 충분해요.
프로젝트 열기: [Open] <code>mirim-app/backend</code> 폴더 선택 Maven 프로젝트로 자동 인식.
</li>
<li>
<strong>Docker Desktop</strong> (docker.com) 개발용 DB(PostgreSQL) 띄울 필요해요.
설치 재부팅 .
</li>
</ul>
<Step n={5} title="VS Code · Docker Desktop 설치" sub="프론트 에디터 + 개발용 DB">
<ol className="olist">
<li><strong>VS Code</strong> (code.visualstudio.com) 설치 프론트엔드(React) 작업용. 확장(Extensions)에서 <strong>Korean Language Pack</strong>, <strong>ES7+ React snippets</strong> 추천</li>
<li><strong>Docker Desktop</strong> (docker.com) 설치 개발용 DB(PostgreSQL) 띄울 필요해요. 설치 재부팅 </li>
</ol>
</Step>
<Step n={6} title="프로젝트 받아서 내 PC에서 실행하기">
<p>
우리 회사 Git 서버(Gitea) <strong>http://{gitHost}</strong> .
먼저 브라우저로 접속해 <strong>회원가입</strong>하고 멘토에게 알려 주세요.
</p>
<Code>{CODE_CLONE_RUN.replace(/<서버주소>/g, window.location.hostname)}</Code>
<p className="muted">
💡 백엔드(8080) 프론트(5173) <strong> </strong> 켜야 로그인이 돼요.
프론트의 /api 요청을 백엔드로 넘겨주는 설정은 <code>frontend/vite.config.js</code> 있어요 열어서 읽어보세요!
</p>
<Step n={6} title="IntelliJ IDEA 설치" sub="백엔드(Java·Spring) 에디터 — 무료 Community 버전">
<ol className="olist">
<li><strong>jetbrains.com/idea</strong> 접속 아래로 스크롤해 <strong>IntelliJ IDEA Community Edition</strong>(무료) 다운로드 <span className="muted">(위쪽 Ultimate는 유료 우리는 Community로 충분해요)</span></li>
<li>설치 옵션 화면에서 <strong>Add "bin" folder to the PATH</strong>, <strong>.java 연결</strong> 체크 추천 <span className="kbd">Next</span> 설치 재부팅</li>
<li> 실행 테마 고르기(아무거나) 시작 화면이 나오면 성공</li>
<li>
<strong>JDK 지정 확인</strong> 프로젝트를 (다음 단계){' '}
<Path items={['File', 'Project Structure', 'Project']} /> 에서 <strong>SDK가 21</strong>인지 확인.
비어 있으면 <span className="kbd">Add SDK</span> <span className="kbd">JDK...</span> STEP 1에서 설치한 폴더 선택
</li>
<li>
<strong>실행해 보기</strong> 좌측 파일 트리에서 <span className="icode">backend/src/.../MirimApplication.java</span> 열고,
클래스 <strong>초록 버튼</strong> 클릭 아래 콘솔에 "Started MirimApplication" 뜨면 백엔드가 켜진 거예요!
</li>
</ol>
<div className="tip">
<b>Maven이 하고 있는 거죠?</b> 프로젝트를 처음 열면 IntelliJ가 우측 하단에서 한참 뭔가를 내려받아요.
<span className="icode">pom.xml</span> 적힌 라이브러리들을 자동으로 설치하는 중이니 기다려 주세요 (처음 번만 오래 걸려요).
</div>
</Step>
<Step n={7} title="커밋하고 푸시하기 — 매일의 작업 흐름">
<Step n={7} title="IntelliJ에서 Git 연결하기" sub="클론부터 커밋·푸시까지 IDE 안에서">
<p><strong> 프로젝트 클론 (처음 )</strong></p>
<ol className="olist">
<li>IntelliJ 시작 화면에서 <span className="kbd">Clone Repository</span> 클릭 <span className="muted">(이미 다른 프로젝트가 열려 있으면 <Path items={['File', 'New', 'Project from Version Control...']} />)</span></li>
<li>URL에 <span className="icode">{CLONE_URL}</span> 입력 Directory 확인 <span className="kbd">Clone</span></li>
<li>로그인 창이 뜨면 <strong>Gitea 아이디/비밀번호</strong>(STEP 4에서 가입한 계정) 입력 입력하면 IntelliJ가 기억해요</li>
<li>"Trust Project?" 물으면 <span className="kbd">Trust Project</span></li>
</ol>
<p><strong> 브랜치 만들기</strong></p>
<ol className="olist">
<li>우측 하단(또는 좌측 상단) <strong>브랜치 이름(main)</strong> 클릭 <span className="kbd">New Branch</span> 이름 입력 (: <span className="icode">feat/my-first-fix</span>) <span className="kbd">Create</span></li>
</ol>
<p><strong> 커밋하고 푸시하기</strong></p>
<ol className="olist">
<li>코드를 수정하면 파일 이름이 <strong>파란색</strong>으로 변해요 (= 변경됨 표시)</li>
<li>좌측 <strong>Commit </strong>(체크 표시 아이콘, 단축키 <span className="kbd">Alt</span>+<span className="kbd">0</span>) 클릭 바뀐 파일 목록 확인</li>
<li>파일을 <strong>더블클릭하면 / 비교(diff)</strong> 보여요 커밋 전에 훑어보는 습관!</li>
<li>커밋할 파일 체크 아래 메시지 칸에 <span className="icode">feat: 무엇을 했는지</span> 입력</li>
<li><span className="kbd">Commit and Push...</span> 버튼 <span className="kbd">Push</span> ! Gitea 웹에서 브랜치가 보여요</li>
<li>Gitea ({HOST}:3000)에서 <span className="kbd">Pull Request 만들기</span> 멘토 리뷰 요청</li>
</ol>
<div className="tip">
<b>터미널과 IDE, 쓰든 같은 Git이에요.</b> IntelliJ 버튼들은 결국 STEP 9 git 명령을 대신 눌러주는 .
처음엔 IDE로 익히고, 익숙해지면 터미널 명령도 함께 배워두면 어디서든 일할 있어요.
</div>
<div className="warn">
<b>main에 직접 푸시 금지!</b> 항상 브랜치를 만들어 작업하고 Pull Request로 멘토 리뷰를 받아요. 이게 우리가 일하는 방식이에요.
</div>
</Step>
<Step n={8} title="프로젝트 실행 — 내 PC에서 전체 돌려보기" sub="DB + 백엔드 + 프론트 세 개가 한 세트">
<Code>{CODE_RUN}</Code>
<div className="tip">
<b> 개나 켜나요?</b> 프론트(5173) 화면, 백엔드(8080) API, PG(5432) 데이터.
프론트의 /api 요청을 백엔드로 넘기는 설정은 <span className="icode">frontend/vite.config.js</span> 있어요 열어서 읽어보세요!
</div>
</Step>
<Step n={9} title="매일의 Git 흐름 (터미널 버전) + 커밋 규칙" sub="숙련자 코스 — IDE와 같은 일을 명령어로">
<Code>{CODE_GIT_FLOW}</Code>
<Code>{CODE_COMMIT_RULE}</Code>
<p className="muted">
💡 <strong>main 브랜치에 바로 커밋하지 않기!</strong> 항상 브랜치를 만들어 작업하고,
Pull Request로 멘토 리뷰를 받은 머지해요. 이게 우리가 일하는 방식이에요.
</p>
</Step>
<div className="card" style={{ marginTop: 14 }}>
<h3 style={{ margin: '0 0 8px' }}>🎉 여기까지 됐다면</h3>
<p>
여러분 PC는 이제 어썸데브 개발자와 같은 환경이에요. 다음은{' '}
<strong>코딩 기초</strong> 메뉴에서 앱이 어떻게 만들어졌는지 읽어보고,
저장소의 <code>STUDY.md</code> 있는 "직접 해보기 미니 과제" 도전해 보세요.
</p>
<div className="step-card">
<div className="step-body">
<h3 style={{ marginBottom: 6 }}>🎉 여기까지 됐다면</h3>
<p className="muted">
여러분 PC는 이제 어썸데브 개발자와 같은 환경이에요. 다음은 <strong>코딩 기초</strong> 메뉴에서
앱이 어떻게 만들어졌는지 읽고, 저장소의 <span className="icode">STUDY.md</span> 있는
"직접 해보기 미니 과제" 도전해 보세요.
</p>
</div>
</div>
</div>
);

View File

@ -16,6 +16,8 @@
--rose: #B4463C;
--radius: 14px;
--shadow: 0 1px 3px rgba(16, 26, 40, 0.06), 0 4px 14px rgba(16, 26, 40, 0.05);
--code-bg: #F1F4F9;
--ink-faint: #7B8798;
}
/* 학습 포인트: 사용자의 OS가 다크 모드면 블록이 변수 값만 바꿔치기한다.
@ -30,6 +32,8 @@
--primary: #6AA0F0;
--primary-soft: #172A44;
--shadow: 0 1px 3px rgba(0, 0, 0, 0.35), 0 4px 14px rgba(0, 0, 0, 0.25);
--code-bg: #161E28;
--ink-faint: #74808F;
}
}
@ -369,3 +373,256 @@ a {
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 14px;
}
/* ---------- 가이드 페이지 전용 (교육 문서 세트와 같은 디자인 언어) ---------- */
/* 학습 포인트: 아래 클래스들은 SetupGuidePage '읽는 페이지' 완성도를 올리는 부품이다.
기존 페이지의 클래스는 건드리지 않고 추가만 했다 이렇게 하면 사이드이펙트가 없다. */
.eyebrow {
display: flex;
align-items: center;
gap: 10px;
font-size: 12px;
font-weight: 800;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--primary);
}
.eyebrow::before {
content: "";
width: 22px;
height: 2px;
border-radius: 2px;
background: var(--primary);
}
.hero {
position: relative;
overflow: hidden;
border: 1px solid var(--line);
border-radius: var(--radius);
background:
radial-gradient(120% 150% at 100% 0%, var(--primary-soft) 0%, transparent 55%),
var(--card);
box-shadow: var(--shadow);
padding: 28px 28px 26px;
margin-bottom: 22px;
}
.hero h1 {
font-size: clamp(24px, 4vw, 32px);
font-weight: 800;
letter-spacing: -0.02em;
line-height: 1.2;
margin: 10px 0 8px;
text-wrap: balance;
}
.hero p {
color: var(--muted);
max-width: 56ch;
}
.chip-row {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 16px;
}
.chip {
display: inline-flex;
align-items: center;
gap: 7px;
font-size: 12.5px;
font-weight: 600;
color: var(--muted);
background: var(--bg);
border: 1px solid var(--line);
border-radius: 999px;
padding: 5px 12px;
}
.chip::before {
content: "";
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--primary);
}
/* 단계 이동 필 내비게이션 */
.pill-nav {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 22px;
}
.pill-nav a {
font-size: 13px;
font-weight: 700;
color: var(--muted);
border: 1px solid var(--line);
background: var(--card);
border-radius: 999px;
padding: 6px 13px;
transition: color 0.12s ease, border-color 0.12s ease;
}
.pill-nav a:hover {
color: var(--primary);
border-color: var(--primary);
}
.pill-nav a b {
color: var(--primary);
margin-right: 5px;
}
/* 단계 카드 */
.step-card {
background: var(--card);
border: 1px solid var(--line);
border-radius: var(--radius);
box-shadow: var(--shadow);
overflow: hidden;
margin-top: 16px;
scroll-margin-top: 76px; /* 앵커 이동 시 상단 네비에 가리지 않게 */
}
.step-head {
display: flex;
align-items: center;
gap: 14px;
padding: 15px 20px;
background: var(--primary-soft);
border-bottom: 1px solid var(--line);
}
.step-num {
flex: none;
width: 36px;
height: 36px;
border-radius: 11px;
background: var(--primary);
color: #fff;
font-weight: 800;
font-size: 15px;
display: grid;
place-items: center;
font-variant-numeric: tabular-nums;
}
.step-head h3 {
font-size: 16.5px;
font-weight: 800;
letter-spacing: -0.015em;
}
.step-head .step-sub {
display: block;
font-size: 12.5px;
font-weight: 600;
color: var(--muted);
margin-top: 1px;
}
.step-body {
padding: 18px 20px 20px;
}
.step-body > * + * {
margin-top: 12px;
}
/* 번호 매긴 진행 순서 */
.olist {
padding-left: 4px;
list-style: none;
counter-reset: ol;
display: grid;
gap: 9px;
}
.olist li {
counter-increment: ol;
position: relative;
padding-left: 32px;
line-height: 1.7;
}
.olist li::before {
content: counter(ol);
position: absolute;
left: 0;
top: 2px;
width: 22px;
height: 22px;
border-radius: 7px;
background: var(--primary-soft);
color: var(--primary);
font-weight: 800;
font-size: 12.5px;
display: grid;
place-items: center;
}
/* 코드/명령어 블록 */
.code-block {
background: var(--code-bg);
border: 1px solid var(--line);
border-radius: 10px;
padding: 13px 15px;
overflow-x: auto;
font-family: "Cascadia Code", "SF Mono", Consolas, ui-monospace, monospace;
font-size: 13px;
line-height: 1.75;
white-space: pre-wrap;
word-break: break-word;
}
/* 팁/주의 박스 */
.tip, .warn {
border-radius: 10px;
padding: 12px 15px;
font-size: 13.5px;
line-height: 1.65;
}
.tip {
background: color-mix(in srgb, var(--teal) 9%, transparent);
border: 1px solid color-mix(in srgb, var(--teal) 28%, transparent);
}
.tip b { color: var(--teal); }
.warn {
background: color-mix(in srgb, var(--amber) 10%, transparent);
border: 1px solid color-mix(in srgb, var(--amber) 32%, transparent);
}
.warn b { color: var(--amber); }
/* 메뉴 경로 표시: [File] > [Settings] 같은 클릭 경로 */
.kbd {
display: inline-block;
padding: 1px 8px;
border: 1px solid var(--line);
border-bottom-width: 2px;
border-radius: 6px;
background: var(--card);
font-size: 12.5px;
font-weight: 700;
color: var(--ink);
white-space: nowrap;
}
inline-code, .icode {
font-family: "Cascadia Code", "SF Mono", Consolas, ui-monospace, monospace;
font-size: 0.92em;
background: var(--code-bg);
border-radius: 5px;
padding: 1px 6px;
}