50.5 KB · 수정 2026-09-19 17:28
목차

아트조이 프레젠테이션 v1 — 설계 · 결정 (2026-09-18)

제안서 v4 PDF(비용판)와 별개 병행 문서다. 이건 «기능 설득용» 스크롤 스토리형 단일 HTML 이고, 금액 · 계약안은 한 글자도 안 들어간다. 내용 출처는 같다 — C:\dev\_work\ax-biz\ax_artjoy.py. 상태 · 진행 = handoff.md · 고객사 고유 금기 = rules.md · 진행판 = http://100.108.234.45:8799/artjoy-presentation.html

발단

🔑 확정 결정 (그릴링 · 재논의 금지)

# 항목 확정
1 이름 · 지위 프레젠테이션 v1 — 제안서 v4 PDF 와 별개 병행. 대체 아님
2 실행환경 둘 다 — 미팅 노트북 전체화면 + 링크 · 파일 발송 → 단일 HTML 자립(외부 CDN 0) · 모바일 세로 대응 필수
3 내용 비용 전면 제외 · 기능 · 프로그램 중심
4 모션 강(풀연출) · 영상 파일 0 · 전부 Canvas 2D · CSS 실시간 생성 · 목표 3~6MB · 저사양 자동 경량화
5 챕터 9개 — 12주 여정 챕터는 삭제([페페] 「개발 기간 12주는 설명 필요없음. 내 역량에 따라 더 짧게 간다」)
6 대표 전용 챕터 ①회의 받아쓰기 → 업무지시 자동분배 ②말로 묻는 ERP ③영업현장 즉답 · 즉견적 ④통화 검색 + 통화내용 기반 업무 · 스케줄 반영([페페] 추가)
7 범위 밖 자산 지위 「대표님 개인 지휘도구」 별도 챕터로 시각 분리 · 「2단계 확장 후보 · 별도 협의」 배지. 지금 계약에 딸려온다는 오해를 막는다
8 08 확장지도 확장 후보 + 신규 IT제품 = ㉮사진→맞춤 도안 생성 ㉯완성작 자랑 카드 앱. 설계는 신동승, 제작 · 판매는 아트조이([페페] 지시)
9 두 대표 대응 본문 = 영업 대표 눈높이(쉬운 말) / 각 챕터 하단 접이식 = AI 관심 대표용 기술설명
10 노출 수위 1단계 실적 숫자 O · Claude · GPT 제품명 O · 내부 코드명 · 별칭 X(빌더 금지어 규칙 그대로)
11 이미지 생성기 화면 = 8820 최신판 새로 촬영 교체(gen2-editor · gen2-products · gen2-mobile)
12 자산화 수집 레퍼런스 → C:\dev\design-refs\ 에 라이브러리 + 팔레트 · 기법 문서 둘 다

🔑 관객 — 대표 2명 (페페 제공 · 이 문서의 설계 축)

기술 결정 (코덱스 상의 반영 · 2026-09-18)

항목 결정 근거
스크롤 엔진 네이티브 CSS scroll-driven animations 우선 + IntersectionObserver 폴백 Safari 26 지원 · 26.4 부터 합성 스레드 처리. 구형 iOS 만 폴백
관성 스크롤 Lenis 1.3.26(MIT · min 18KB) — 감속감이 필요한 구간만 스크롤 위치를 가로채지 않아 네이티브와 겹쳐도 안 깨진다
애니메이션 Motion 13.4.0(MIT) 보유 · 필요한 만큼만 ⛒GSAP 배제 — 무료지만 「Webflow 경쟁 도구 금지 + Webflow 재량 종료권」 조항이 있다
파일 관리 챕터 레지스트리 패턴 — section[data-chapter] + 전용 init(), 토큰 · 모션 함수는 한곳 9챕터 단일 파일을 통제 가능하게 유지
배경 모션 Canvas 2D · DPR 1.5 상한 · 단일 requestAnimationFrame · 비가시 정지 · 저사양 입자수 · FPS 축소 저사양 노트북 · 폰 프레임 유지

⚠ 코덱스가 지적한 «이 관객 기준» 연출 실수 3개 (설계에 반영)

  1. 계속 움직여서 읽을 정지 구간이 없다.
  2. 과도한 핀 · 스크롤 탈취 — 질문받고 앞뒤로 돌아가기가 어려워진다(미팅에선 치명적).
  3. 효과가 핵심 수치 · 고객 가치보다 먼저 보여서 「멋진 데모」로만 기억된다.

🎨 팔레트 — 확정 = D 「폴리싱 스틸」

🔴1차 3안(A 미드나잇 코발트 · B 딥오션 스칼렛 · C 인디고 카본)은 페페가 기각했다 — ①세 안의 컬러 컨셉이 사실상 같았고 ②레드가 배경에 포인트로 들어갔다(미리보기의 레드 글로우). 2차는 배경 «처리 방식»으로 갈랐다(폴리싱 메탈 / 글래스 / 새틴).

토큰 값
배경 linear-gradient(135deg, #0B1626 0%, #16273F 48%, #0D1A2C 100%) + 112° 금속 광택 띠
유리면 rgba(255,255,255,.07) / 보더 rgba(255,255,255,.13)
레드 #FF2D2D · 본문 #FFFFFF · 보조 #A8BBD4

🔑 [페페] 색 규칙 (재논의 금지)

  1. 배경에 레드 금지. 배경은 네이비 계열 그라디언트 · 글래스 · 광택만. 배경 캔버스도 화이트 · 블루 계열만 그린다.
  2. 레드는 라인 · 강조 글씨 · 큰 숫자에만.
  3. 레드 글씨에는 화이트 「테두리」만 — -webkit-text-stroke:.7px rgba(255,255,255,.92) + paint-order:stroke fill. ⛔text-shadow 글로우는 기각됐다 — 「쉐도우로 인해 텍스트가 희뿌옇게 뭉개진다」(페페).
  4. 본문 문단(16~18px · 모바일 15px) 안에서는 레드 글자를 안 쓴다 → 화이트 글자 + 레드 형광펜 (background:linear-gradient(transparent 58%,rgba(255,45,45,.48) 58%)).
  5. 배지 · 칩 같은 작은 조각도 레드 글자 금지 → 테두리 · 바탕만 레드, 글자는 화이트, 15px 이상.

✅ 1차 완성 (2026-09-18 KST)

항목 결과
산출 C:\dev\_work\ax-biz\deck\out\artjoy-ax-story.html 0.94MB · 외부 요청 0 · 오프라인 자립
백업본 …\out\artjoy-ax-story-print.pdf 17쪽 5.4MB(인쇄 CSS · 접이식 전부 펼침)
게시 C:\dev\devplan\media\ax-biz\artjoy-presentation-v1{,-print}.{html,pdf} → http://100.108.234.45:8799/media/ax-biz/artjoy-presentation-v1.html
챕터 9/9 · 접이식 기술설명 9/9
폰트 Pretendard Variable → 본문 599자 서브셋 106.5KB(축 wght 45~930 유지) · 패밀리명 「AJ Sans」 개명
이미지 8장 WebP q80 base64(생성기 3장 = 8820 최신판 재촬영)
검사 chromium 1440·390 + webkit 전부 통과 — 외부요청 0 · 콘솔 0 · 가로넘침 0 · 13px 하한 · End 완주 · 티어 3종 · 숫자키 점프
부가 3건 ✅상단 1px 진행 게이지 ✅정적 PDF 백업본 ⚠열람기록 = 로컬 저장까지(수집 주소는 링크판 확정 후 빌드 한 줄)

산출물 경로

무엇 경로
프레젠테이션 본체 C:\dev\_work\ax-biz\deck\out\artjoy-ax-story.html
정적 PDF 백업본 C:\dev\_work\ax-biz\deck\out\artjoy-ax-story-print.pdf
소스 · 빌더 C:\dev\_work\ax-biz\deck\src\ · build.py · check.py · make_pdf.py · deck.json
진행판 C:\dev\devplan\artjoy-presentation.html → http://100.108.234.45:8799/artjoy-presentation.html
생성기 촬영 C:\dev\_work\ax-biz\shots_gen8820.py (읽기 전용 · 8820 촬영)
새 스크린샷 C:\dev\_work\ax-biz\out\img\gen2-{editor,products,mobile}.png
레퍼런스 자산 C:\dev\design-refs\dark-scroll-deck-2026-09\ · lenis-1.3.26\ · motion-13.4.0\

고치는 법 = src\ 를 고치고 cd C:\dev\_work\ax-biz\deck && PYTHONUTF8=1 python build.py --check. 산출 HTML 을 직접 고치면 다음 빌드가 덮어쓴다(헤더에 GENERATED · 편집 금지 + sha 가 박혀 있다).

⏳ 남은 것


🔬 v2 모션 연구 — lusion.co 분석 · 응용 방법 (2026-09-18 KST · [코디])

발단

[페페] 지시 — 「처음에 내가 원했던 프레젠테이션은 https://lusion.co/ 와 같은 생생한 무빙효과가 포함된 페이지다. 텍스트 또한 살아있기를 원한다. 먼저 페이지 분석후 응용 방법 연구해봐」 → v1 1차 완성본이 그 기대에 못 미쳤다는 뜻.

1. lusion.co 실측 (Playwright · DOM · 네트워크 · 캔버스 컨텍스트)

층 실측값
렌더 three.js + WebGL2 풀스크린(__THREE__ 전역 확인). Astro 빌드
에셋 커스텀 .buf 지오메트리 18개(우주복·터널·유리파편) · matcap.exr · 사운드 12종(hover/click/focus/page/glass) · mp4 텍스처
스크롤 body{overflow:hidden} + 가상 스크롤 컨테이너 53,104px. scrollY 는 0 고정 — 휠을 가로채 자체 시간축으로 전부 구동
텍스트 DOM 이다. <div class="word"> 어절(단어) 단위 분할 + translate3d(0,N%,0), 부모 inner 에 패럴랙스 translate3d(0,-37.9px,0). 글자 단위 아님. 페이지 전체 word span 681개
타이포 Aeonik(기하학 그로테스크) · 히어로 192px
색 배경이 라이트(#EEF0FA 라벤더) + 블루/블랙 1포인트 — 우리와 정반대

🔑가장 중요한 발견 = lusion 은 반투명 dust 를 «안 쓴다». 3D 오브젝트도 텍스트도 전부 불투명이다 (C:\dev\_work\ax-biz\deck\refs\lusion-s1~s5.png). 「먼지 파티클」은 lusion 기법이 아니라 v1 이 임의로 넣은 것이다.

2. v1 이 죽어 보이는 진짜 원인 3개 (web-designer 실측 · 추정 아님)

  1. 🔴배경 모션이 «안 보이는» 수준이다. C:\dev\_work\ax-biz\deck\src\deck.js L159-169 렌더 알파 = c.a*.55, c.a∈[.18,.68] → 실효 알파 0.099~0.374. 다크 네이비(#0B1626) 위 이 알파의 흰 점 74개는 육안으로 거의 안 잡힌다. ⛒밝은 배경은 저알파도 값 차이로 보이지만 다크는 저알파가 배경에 흡수된다 — 라이트 레퍼런스 기법을 다크에 그대로 옮기다 생긴 사고. 마우스 반응도 ±13px 뿐이고 스크롤과는 무관(scene 모듈 안에 scrollY 참조 0).
  2. 🔴콘텐츠 열 밖이 매 챕터 빈다. @1440 실측 = .ch-inner 1180px / .ch-title 1013px / .step h3 638px / .step p 611px → 뷰포트 오른쪽 약 75%가 완전히 빈 캔버스. 이 패턴이 9챕터에 반복된다.
  3. 🔴이미 만들어 둔 모션 예산을 안 쓴다. rAF 가 매 프레임 챕터 진행률 --p(0~1)를 계산하는데 소비처는 C:\dev\_work\ax-biz\deck\src\deck.css L86 딱 한 줄(ch-head translateY 최대 -40px). .reveal(어절 클립리빌)도 chapters\01-opening.html L13 한 곳뿐이고 그나마 문장 전체를 span 1개로 감싼 통짜다. .step 리빌은 제목·본문·카드 구분 없이 블록 전체가 같은 0.62s 로 24회 반복.

➕감정곡선 없음 — 챕터01 오프닝과 챕터09 클로징(「말보다 이틀이 빨랐습니다」)이 구도·모션·템플릿이 완전히 동일하다. 피치의 결론 문장이 중간 데이터 챕터와 같은 무게로 지나간다.

📱모바일(390)은 상대적으로 양호(핀 비활성 · dead space 없음 · 줄바꿈 정상). 실기 안드로이드·카톡 인앱은 미검증.

3. 🔑 three.js 가 필요한가 — 실측으로 답했다: 아니다

C:\dev\_work\ax-biz\deck\refs\proto-bg.html(Canvas2D 70줄 · 의존성 0)로 찍어 확인했다 — 캡처 C:\dev\_work\ax-biz\deck\refs\proto-bg-shot.png · 게시본 http://100.108.234.45:8799/media/ax-biz/_proto-bg.html?p=0.35

기법 구현
금속 구체 확산 radial gradient + 림라이트(뒤쪽 가장자리 rgba(190,220,255,.38)) + 스펙큘러 점. 림라이트가 금속감의 8할
곡선 튜브 굵은 stroke 3겹 — 그림자면(rgba(20,38,66)) / 코어(rgba(72,120,190)) / 하이라이트(rgba(188,220,255), 폭 22% )
깊이 ctx.filter='blur(7px)' + 알파로 원경 처리
스크럽 전부 p(진행률)의 순수함수 → 그대로 --p 에 물린다

⛒결론 = three.js(+700KB) 불필요. 다크 배경 · 오프라인 자립(외부요청 0) · 저사양 티어 분기와 전부 양립한다. 못 내는 것 = lusion 의 「십자 블록 쏟아짐」 같은 강한 실루엣·물리 — 아트조이 미팅엔 과한 연출이라 버린다.

4. 응용 방법 — lusion 기법별 판정

lusion 기법 우리 이식안 판정
완전불투명 3D 지오메트리 Canvas2D 불투명 솔리드 2~3개(30~60vh · 화이트/블루 메탈) — §3 프로토 그대로 ✅채택
단일 시간축(가상 스크롤) 네이티브 스크롤 유지 + --p 전면 활용 ✅절반 채택 · 하이재킹은 기각(미팅 「앞뒤 이동」과 정면 충돌)
.word 어절 분할 + 패럴랙스 어절 리빌 9챕터 확대(build.py assemble() L40-59 가 삽입 지점) ✅채택
라운드 프레임 창이 스크롤에 축소 기존 figure.shot .frame(radius 16px)에 스크럽 scale ✅채택
블루 곡선 튜브가 섹션 관통 Canvas2D tube 또는 SVG stroke-dashoffset (보조색 #A8BBD4 계열) ✅채택
커서 반응 스포트라이트 radial-gradient — mx,my 는 이미 추적 중(deck.js L112) ✅채택
사운드 12종 — ⛔기각(회의실)
WebGL 커스텀 지오메트리 + EXR matcap — ⛔기각(§3)

5. 우선순위 — 비용 대비 체감 큰 순

# 무엇 왜 이 관객에게 먹히나 리스크
1 배경 = 반투명 점 74개 → 불투명 솔리드 + --p 구동 원인1·2 동시 해결. 화면 첫 3초 인상 = 두 관객 공통 중 — 드로잉 복잡도↑, 단 기존 tier 3단 분기가 저사양을 흡수
2 숫자 카운트업(0→목표 600~800ms) + wght 램프 재고·영업 대표(관객②)는 숫자가 언어다(763개·4,737행·3.6만). 기존 stepIO on 이벤트에 얹으면 끝 하
3 09 클로징 전용 위계 — cover-title clamp(48px,8.4vw,148px) + 1회 sheen 피치 결론에 마침표. 01 은 그대로(오프닝이 클로징을 이기면 안 된다) 하
4 어절 리빌 9챕터 확대 AI 관심 대표(관객①)에게 「기술적으로 잘 만들었다」 신호 중 — §6 함정
5 커서 스포트라이트 마우스로 발표하는 노트북 — 「화면이 내 손을 따라온다」 하 — CSS 변수만 추가

6. 🔴 한글 어절 분할 함정 (영문 word 분할과 다른 자리)

7. 타이포 — 크기는 문제가 아니었다

@1440 실측: .cover-title 103.68px · .ch-title 72px · .ch-num 144px · .step h3 36px · .step p 16.56px. 모바일(390) .ch-title 31.2px · .step p 16px — 13px 하한 여유 충분. 「타이포가 죽었다」의 원인은 px 이 아니라 §2 의 구도·웨이트 고정·뭉텅이 리빌이다.

Pretendard Variable 은 wght 축 하나뿐(wdth·slnt 없음) → 「굵기가 실시간으로 변한다」가 유일하고 유효한 변수폰트 연출이다. - 숫자·강조어 진입 시 wght 100→900 램프(400ms) · 배지/버튼 hover 600→900(150ms) · .ch-num 고스트넘버 45→900(「확정」 느낌). - ⚠긴 문단 전체에 매 프레임 wght 스크럽 금지 — font-variation-settings 변경은 텍스트 reshape 비용이 있어 저사양 모바일에서 프레임드랍. 대상은 짧은 텍스트(숫자·1줄 헤드·배지) + 1회성 트리거로 한정.

8. 🔑 레드 규칙은 임팩트를 안 죽인다 — 「정적 색 배치」 규칙이지 「정적 모션」 규칙이 아니다

색은 그대로 두고 등장 방식만 동적으로 바꾸면 규칙 위반 0 으로 임팩트가 는다.

요소 지금 규칙 안 대안
.card .n · 큰 숫자 즉시 표시 카운트업 + wght 램프
.rule(레드 3px 바) 즉시 100% 폭 stroke-dashoffset 0→100% 드로잉(400ms)
본문 형광펜(deck.css L103-105) 즉시 100% background-size 0%→100% — 글자는 계속 화이트, 배경만 칠해진다
.badge 테두리 즉시 표시 테두리 드로잉 — 글자 화이트 규칙 그대로

9. ⚠ 설계 전제 충돌 — [페페] 결정 필요

C:\dev\design-refs\dark-scroll-deck-2026-09\README.md §6 에 v1 전제가 박혀 있다: 「배경 모션 1레이어」 「스크롤 하이재킹 금지」 「계속 움직여서 읽을 정지구간 없는 것 금지」 「효과가 핵심 수치보다 먼저 보이는 것 금지」. v1 의 얌전함은 사고가 아니라 의도였다. lusion 화는 이 전제를 완화하는 것이다.

⛒다만 하이재킹 없이 §5 의 1~5 만으로도 체감은 크게 바뀐다 — 전제 중 「하이재킹 금지」·「정지구간」은 그대로 두고 간다는 게 코디 추천.

미팅 리스크 차단 장치

우려 v1 에 이미 있는 것 추가로 걸 것
읽을 정지구간 상실 stepIO 가 add 만 하고 remove 를 안 한다 → 한번 보인 스텝은 되돌아가도 안 사라진다(이미 1회성 고정) 신규 모션도 이 패턴 유지 — 재스크롤 시 숫자가 0부터 다시 안 세게
질문받고 앞뒤 이동 숫자키 1~9 점프 · #dots 내비 · 발표자바 footer 에 묻힌 「모션 줄이기」 버튼을 #present 바에 복제 — 1클릭 tier=static
「멋진 데모」로만 기억 — 신규 모션 전부 1회 트리거 + 800ms 이내 종료. 무한루프는 커버 .scrollcue 에만 허용

✅ v2 구현 완료 (2026-09-18 KST · [페페] 선택 = 「C. 전제까지 깨고 풀 lusion 화」)

항목 결과
산출 C:\dev\_work\ax-biz\deck\out\artjoy-ax-story-v2.html 0.98MB(v1 0.94MB) · 외부요청 0 · 인쇄본 …-v2-print.pdf 17쪽
게시 http://100.108.234.45:8799/media/ax-biz/artjoy-presentation-v2.html · v1 은 무접촉 보존
검사 3회 연속 CHECK OK(chromium 1440·390 + webkit) · 어절 254 · 제목 안 레드 강조 31개 보존
되돌리기 git 태그 v1(리포 = C:\dev\_work\ax-biz\deck\, 이번에 git init) · ?smooth=0 · 모션끄기 1클릭 · v1 링크

🔑아키텍처 = Lenis(네이티브 스크롤 위 관성) 채택 · lusion 식 완전 가상스크롤(scrollY 0 고정)은 기각. lusion 의 body{overflow:hidden} + 53,104px 컨테이너는 체감의 원천이 아니라 구현 세부다 — 관객이 느끼는 건 ①휠 관성 ②단일 시간축 스크럽 ③멈추지 않는 배경이고 셋 다 scrollY 를 살린 채 낸다. 반대로 버리면 앵커 · Ctrl+F 찾기 · 위치복원 · sticky · IntersectionObserver · 인쇄가 전부 같이 죽는다(코덱스 상의 일치).

🔴 이번에 잡은 v1 잠복 버그 — 04 챕터가 한 번도 활성화되지 않았다

활성 챕터 판정이 threshold 0.28 이었는데 04 의 최대 교차비는 0.243(뷰포트보다 3~4배 긴 챕터는 교차비가 낮다) → 도트 · 발표자바 · 씬 전환이 04 를 통째로 건너뛰었다. rootMargin:'-45% 0px -45% 0px' 중앙 밴드로 교체. ⛒핀을 9개로 늘리면 03 도 같은 함정에 빠질 뻔했다 — 길이와 무관한 판정이어야 한다. 9챕터 순회 실측으로 확인.

🔴 관성 엔진의 진짜 함정 (다음에 또 밟는다)

브라우저가 직접 위치를 바꾸는 길이 여럿이다 — Ctrl+F 찾기 · 스크롤바 드래그 · 앵커 · 새로고침 위치복원. 그때 Lenis 내부 위치는 옛 값에 머문다 → 그 뒤 키 이동이 먹통(실측: End 가 안 먹음). ⛒매 프레임 Math.abs(lenis.scroll - lenis.actualScroll) > 2 면 조용히 맞춘다. 🔴단, 우리가 «의도한» 이동 중에는 쉬어야 한다(quietUntil) — 안 그러면 동기화가 막 시작한 scrollTo 를 되돌려 목적지에 못 간다(webkit 간헐 실패의 정체였다).

그 밖의 함정

10. 사람 눈이 필요한 것 (v2 기준)


🔬 v3 재편성 조사 — 스크롤 연출 10컨셉 · 동적 텍스트 · 팔레트 3안 (2026-09-18 KST · [코디])

발단

[페페] 지시 — 「기대한 효과들은 구현 됐다. 하지만 기존에 있는 게 아닌 신규제작을 하다 보니 그래픽적인 완성도가 떨어진다. 실제로 스크롤 무빙 효과를 HTML 적용한 웹사이트를 조사해 디자인 레퍼런스에 추가해라. 특히 프레젠테이션 · 회사소개에 쓰인 것. 그 기술을 그대로 카피해서 효과 적용이 가능하면 제일 좋다. 안 되면 관련 프리셋 · 라이브러리를 찾아 모아라. 실제 있는 자료를 재활용해서 품질을 높인다. 색상 제한은 없다. 현재 텍스트가 정적이다 — 파편화 등 동적 텍스트가 되면 좋겠다. 글씨체 · 색상 · 크기 등 컨셉은 참고에 따라 완전 재편성한다. 2D 뿐 아니라 3D 포함. 대량 말고 프레젠테이션 스토리 기준 스크롤 진행에 대해 10개 컨셉 정도.」

산출물 (전부 자산으로 남겼다)

무엇 어디
컨셉 10 + 기법 12 + 사이트 13 (보는 창구) C:\dev\devplan\scroll-concepts.html → http://100.108.234.45:8799/scroll-concepts.html
라이브 데모(컨셉 10 + 텍스트 4) C:\dev\design-refs\scroll-motion-2026-09\demo.html?c=<id>
데이터(컨셉 · 기법 · 라이브러리) C:\dev\design-refs\scroll-motion-2026-09\concepts.json
재료 문서(실측 표 · 한글 판정 · 라이선스) C:\dev\design-refs\scroll-motion-2026-09\README.md
레퍼런스 사이트 13곳 C:\dev\design-refs\refs.json (49 → 62개) · 캡처 shots\ 14장
라이브러리 적재 C:\dev\design-refs\{animejs-4.5.0, three-0.186.0, ogl-1.0.11}\
실기검증 C:\dev\devplan\_verify_scroll_concepts.py — 23/23 OK

🔑 핵심 발견 — three.js 가 원인이 아니었다

실브라우저 프로브(14곳)로 확인한 것:

컨셉 10 — 스토리 배치 (전문 = concepts.json · 데모는 페이지에서 굴려 본다)

# 컨셉 챕터 차원 비용 참고
1 긴 항해 01~09 관통 2D(3D 선택) 중 oryzo · primland
2 방 하나에 주제 하나 03·04·05 2D/3D 중 kia360 · igloo
3 분해도 03 ERP 2D/3D 중 apple mac pro
4 전후 와이프 02 병목 2D 하 lightship · toss
5 카드 스택 06·04 2D 하 zajno
6 속도 반응 전역 전환 2D 하 haoqi
7 숫자 조립 05·01 2D 하 shopify editions
8 텍스트 파편화 01·09 만 2D 중 igloo · codrops
9 카피 시퀀스 07·09 2D 하 toss
10 손에 잡히는 3D 08 확장 3D 중~상 oryzo · basement

코디 추천 조합 = 1 + 4 + 7 + 9 를 먼저 깔고 8 을 오프닝·클로징에 한 번씩. 3D(10)는 08 에서만. 근거 = 코덱스 상의(「B2B 의사결정자에 효과 검증된 것 = 진행표시 · 수치 카운트업 · 전후 비교 와이프 · 단계 공개 · 짧은 전환」 / 「피할 것 = 긴 핀 · 휠 강탈 · 역스크롤에 깨지는 1회성 애니 · 질문 중 계속 움직이는 연출」).

⛒파편화 상한 = 코덱스 판정 「오프닝 · 클로징 한 줄만. ERP · 기능 · 수치 · 표에 쓰면 유치하다」. 희소성이 곧 효력이다.

동적 텍스트 — 한글 판정

🎨 팔레트 재편성 3안 — [페페] 결정 대기 (색 제한 해제 반영)

web-designer 실측 상담 결과. 🔴1차 3안이 「전부 다크 네이비」라 기각됐던 실수를 피해 «명도 자체»를 갈랐다.

A 옵시디언(다크 유지) B 페이퍼(라이트) C 그래파이트(미드톤)
배경 #101114 → #16181C #F7F7FA #2A2C30 → #3A3D42
본문 #C7C9CE #3D4149 #D4D6DA
강조 #C9A227 금브라스 #2451FF 블루 + #B3141A 브릭레드(희소) #FF6A30 / 대형 #FF5B1F
대비 실측 7.89:1 5.32:1 5.41:1 / 4.51:1
프로젝터 ◎ 순암전 아니라 washout 안전 ◎ 최고 △ 대비 좁아지면 밋밋
무드 IR자료 · 증권사급 lusion 그 자체 산업 · 엔지니어링

🔴 v2 의 «그래픽 완성도» 실제 원인 3개 (web-designer 실측 — 규칙 위반이 아니었다)

대비 · 13px 하한은 위반 0건이다(레드 on 네이비 4.897:1 = AA 통과). 진짜 원인:

  1. 9장이 전부 같은 템플릿(고스트넘버 + 64px 룰 + 타이틀). 배경 구체 위치만 바뀌고 골격은 100% 고정.
  2. 레드 강조가 9장 내내 같은 기법 하나(플랫레드 + .7px 화이트 스트로크) → 「인장 스티커」처럼 보인다. ⛒.7px 고정값이라 148px 제목에선 안 보이고 14~16px 에선 과하다 → 0.006em 비례값으로 바꾼다(난이도 하 · 효과 큼).
  3. 제품 스크린샷이 원본 밝기 그대로 다크 신에 박혀 눈부시다 → 프레임 안에서 듀오톤·감광.
  4. ➕lusion 재대조 = lusion 은 악센트색을 글자에 안 쓴다(라인 1개뿐). 우리는 9장 내내 악센트 = 글자색.

타이포는 안 죽었다 — Pretendard Variable 유지 추천(OFL 한글 가변폰트는 사실상 이것뿐). 고칠 건 굵기 단 수(800/900 두 단만 쓰지 말 것)와 스트로크 비례화.

⏳ [페페] 결정 대기 3건

  1. 채택할 컨셉 — 추천 조합(1·4·7·9 + 8 양끝)으로 갈지, 다른 조합인지. 페이지에서 직접 굴려 보고 지목.
  2. 팔레트 A / B / C — 이게 정해져야 폰트 크기·강조 기법이 따라 정해진다.
  3. 3D 채택 여부 — 08 확장 챕터 한 곳(CSS 3D 무료 / OGL 133KB / three.js 392KB). 안 쓰면 단일 HTML 용량 그대로.

🐟 v3 — 연출 보정 · 청고등어 항해 · 발표 구간 (2026-09-19(토) KST · [코디])

🔴 기준 파일이 바뀌었다 (페페 지시 · 재논의 금지)

[페페] 「…/design-refs/scroll-motion-2026-09/sample-deck.html 이 기준으로 봐야 한다. 프레젠테이션 구버전으로 보면 안돼」 → 정본 = C:\dev\design-refs\scroll-motion-2026-09\sample-deck.html 한 장.

[페페] 지적 4건 → 원인(실측)과 처방

효과 지적 🔴원인 (코드값 · 추측 아님) 처방
8 파편화 지저분 · 모래 느낌 · 바람에 흩날리게 · 집적되면 균열 ①샘플 격자 4px 에 조각을 3.2px 로 찍어 사방 0.8px 틈이 영구히 ②조각 알파가 1-t*.7 이라 t=0(완전 집적)에서도 1 → 원본 글자 위에 격자가 계속 덮여 있었다 격자를 모래 크기(GRAIN 3px · 저사양 5)로, 조각 알파를 글자 알파의 여집합(1-solid)으로 묶었다 → t→0 이면 조각이 사라지고 fillText 원본만 남는다(글씨체 텍스쳐 그대로 · 균열 0). 바람 = 흩어짐을 한 방향(+x)으로 몰고 개체별 위상으로 흔든다
3 분해도 아래 글씨가 겹쳐 안 보인다 · 간격 · 글씨 크게 translateZ(i*62) = 화면상 43px 인데 층은 inset:0 이라 컨테이너 높이(260px)로 늘어나 있었다. 배경 .62 반투명이라 뒤 글자가 비쳐 뭉갰다 층 높이를 «글 한 줄»(--lh)로 고정, Z 간격을 컨테이너에 맞춰 자동 최대화(고정값이면 층 수·화면 폭이 바뀔 때 다시 겹친다). 배경 .94 · 글자 clamp(18,2.6vw,27) 900 · 번호는 위에서부터 01
5 카드 스택 순서를 거꾸로 · 1번이 전면·상단을 막는다 zIndex = 10-i. 더 큰 원인은 top:0;bottom:0 + margin:auto — 카드가 컨테이너 높이로 늘어나 서로를 통째로 덮었다 바닥 정렬 + 자연 높이 + zIndex = 10+i — 나중 카드가 앞·아래, 먼저 온 카드는 PEEK 66px 씩 위로 밀려 제목만 내민다
2 방 통과 글씨 크게 · 개별 전환 시점에 딱딱 끊어지게 local = p*3.2 - i 연속함수라 «끊기는 시점»이 존재하지 않았다 구간 스냅 stepped(p,n,hold) 신설 — 각 칸의 앞 HOLD=.58 은 완전 정지(읽는 시간), 나머지에서 다음 칸으로. 글자 clamp(26,4.4vw,52)

🔑「효과도 구간 나누는 시점 동일한 스타일 적용」(페페) = 같은 stepped() 를 분해도 · 카드스택 · 숫자조립 · 카피시퀀스에도 걸었다. 발표 스텝 경계와 저절로 맞는다 — stepped(p,n) 의 정지 구간 시작이 i/(n-1) 이고 구간 기본값을 그 값으로 뒀다.

긴 항해 = 등푸른 청고등어 무리 (도형 블롭 폐기)

발표 구간 + 구간 편집 패널

🔴 이 세션에서 잡은 «조용한» 버그 (같은 패턴을 또 밟을 자리다)

  1. updaters 래퍼가 인자를 하나만 넘겼다 → 바람 계산이 Math.sin(undefined) = NaN → fillRect(NaN,…) 은 예외도 경고도 없이 아무것도 안 그린다. 증상 = 흩어진 구간만 통째로 빈 화면(집적 상태는 파편 루프를 건너뛰어 멀쩡해 보였다). ⛒캔버스가 «비어 보이면» 좌표에 NaN 이 섞였는지부터 본다. 판정 = getImageData 로 잉크 픽셀 수를 세면 0 으로 딱 떨어진다.
  2. anime.js 를 로드만 하고 한 번도 호출하지 않았다(어절 분할은 자체 splitInit). 태그 삭제 → 외부 의존성 0.
  3. 컨셉06 속도반응이 --skew 를 «쓰기만» 하고 CSS 가 안 읽었다(var(--skew) 0건) → 여태 아무 일도 안 일어났다. ⛒.scard/.layer/.room 에는 걸지 마라 — JS 가 인라인 transform 을 매 프레임 덮어써서 CSS transform 이 통째로 무시된다.
  4. 🔑클래스명 충돌 — 패널 칩줄에 .chips 를 썼다가 효과4 의 .chips{height:210px} 를 물려받아 한 줄이 210px 로 부풀었다. 한 파일 안에서 연출용 클래스와 UI 용 클래스는 이름을 겹치지 않는다(→ .stops 개명). 같은 뿌리 = [[bootstrap-class-collision-in-svg]].
  5. ⚠검사 지표를 틀리게 잡을 뻔했다 — inner.scrollHeight > stick.clientHeight 로 «잘림»을 판정하면 오탐이다. CSS 는 변형된 자식의 영역까지 스크롤 오버플로에 넣는다(방이 Z로 밀린 만큼 440 → 936px 로 부풀었다). ⛒진짜 잘림 판정 = 보이는 요소의 getBoundingClientRect() 가 .stick 사각형 밖으로 나가는가.
  6. ⚠Playwright MCP 는 브라우저 «한 대»를 공유한다 — 내가 다른 페이지를 열자 같이 돌던 web-designer 에이전트가 멈췄다(8분+ 무활동). ⛒브라우저를 쓰는 에이전트를 띄웠으면 내가 Playwright 를 잡지 않는다(또는 에이전트를 먼저 끝낸다).

기계검증 (헤드리스 chromium 1440×900 · 1366×768 · 26.9.19)

항목 결과
외부요청 · 콘솔오류 · 가로넘침 · 13px 미만 0 · 0 · 0 · 0
스페이스 전진 1/27 → 6/27 순차 OK
구간 추가 → 저장 → 기본값 → 삭제 → 전체 초기화 27→28→27→26→27 · localStorage 반영 OK
발표모드에서 패널 숨김 display:none OK
파편화 되감기 대칭(p .40 → .80 → .40) 픽셀 차이 0.79%(잔차 = 의도된 바람 흔들림)
1366×768 잘림 보이는 요소가 유리판 밖으로 나간 것 0건

⚠테스트 함정 — 패널은 저장할 때마다 행을 다시 그린다. 캡처해 둔 노드를 나중에 클릭하면 detach 돼 이벤트가 안 뜬다 (「기본값이 안 먹는다」로 오판했다). 검증 스크립트는 매번 새로 조회해야 한다.

✅ 본문 이식 1단계 — 자산 + 그릇 (26.9.19 같은 날 · [코디])

「이식」을 «내용 옮기기» 전에 «옮길 수 있게 만들기»로 먼저 쳤다. 옛 구조에선 카드·층·방 문구가 전부 JS 배열에 박혀 있어 한 줄 고치려면 코드를 열어야 했다 — 그대로 9챕터를 부으면 JS 가 본문 저장소가 된다.

무엇 결과
폰트 내장 assets.py 신설 → fonts/aj-sans.woff2 66.3KB · 글자 362 · 축 wght 45~930 유지. 실측으로 굵기 램프 확인(80px 「고객이 이미 3.6만」이 300→900 에서 565.5→575px). 🔑인스턴싱 금지(축이 죽으면 컨셉07 이 죽는다) · OFL Reserved Font Name → 「AJ Sans」 개명
이미지 원본 10장 → WebP q80 716KB(base64 환산 955KB). 🔴출력 파일명에서 금지어를 텄다 — 구판 pfs-orderpaper.jpg·pfs-nesting.jpg 를 그대로 쓰면 상대경로가 고객 문서 HTML 에 금지어를 박는다(구판은 base64 라 이름이 안 남아 드러나지 않던 함정) → mfg-order·mfg-panel
연출을 DOM 구동으로 wipe·exploded·cardstack·numbers·rooms·copyseq·cube 전부 HTML 에서 읽게 바꿨다 → 본문 이식이 순수 HTML 편집이 된다. 층 번호(01…)는 코드가 자동으로 붙이고, 방 바탕색도 순서대로 자동
범용 연출 2개 gridInit(.grid .card 가 구간마다 한 장씩) · shotInit(figure.shot .frame 스크럽) — 섹션마다 INIT 를 새로 쓰지 않아도 마크업만 보고 자동으로 붙는다
접이식 기술설명 <template data-tech> + 스크롤 밖 고정 오버레이(#tech) · 버튼 또는 키 T · Esc 로 닫힘. 유리판 안에 넣으면 한 화면을 넘겨 잘린다
조판 추가 figure.shot(라운드 프레임 + 캡션) · .grid .card · .flow(견적 → 발주 → …)
구간 끝값 보정 끝 구간을 0.99 로 두면 연출이 100% 에 못 닿는다(숫자가 4,737 이 아니라 4,729 에서 멈췄다) → 완결돼야 할 섹션은 1 로

검증 = 외부요청 0 · 콘솔 0 · 숫자 36,000건·763개·4,737행 정확 도달 · 분해도 마지막 층 강조(나머지 .52) · 카드 z 10/11/12 역전 + 64px 간격 · 방·문장 시퀀스 마지막까지 도달 · 구간 27개.

⏳ 남은 것 — 본문 «내용» 이식 (다음 한 걸음)

지금 샘플덱은 9챕터 제목·수치만 실제 값이고 분량은 샘플이다. 이번에 더미에서 고친 것 = 와이프 칩(주문 프로그램·엑셀·사람 머릿속·대화방·사진 폴더) · 분해도 층(견적→발주→입고→재고→정산, 제조 용어 「생산·네스팅」 제거) · 숫자(후기 3.6만 · 제품 763 · 정리한 자료 4,737행) · 방(재고 바닥 경보 · 입고 지연 · 어제 판매 요약).

Fable 5 계획이 낸 18섹션 배치표(챕터 → 섹션 → 컨셉 → 살릴 내용 → 이미지 → stops)가 이식 설계다. 핵심 제약 = - .stick{min-height:100vh;overflow:hidden} → 한 섹션 = 한 화면. 구판 챕터(스텝 3~5 + 문단 + 카드 + 샷 + 접이식)를 한 섹션에 못 넣는다 → 챕터를 여러 섹션으로 쪼개는 게 구조상 필연. - details.tech 9개 → <template data-tech="NN"> + 고정 모달(스크롤 밖 오버레이라 구간과 충돌 0). - 이미지 8장 = WebP q80 569KB → base64 759KB(실측 · 원본 C:\dev\_work\ax-biz\out\img\). 예산 6MB 의 1/8. - 🔴이 PC 에 Pretendard 가 없다 → 지금 샘플덱은 맑은고딕으로 렌더되고 가변폰트 굵기 램프(300→900)가 죽는다. 이식 때 구판 build.py 의 embed_font(서브셋 + OFL 「AJ Sans」 개명)를 같이 가져와야 한다. - 금지어 assert(deck.json forbidden) · 13px 하한 · 「신동승 차장」 호칭은 이식본에도 그대로 건다.

✅ 본문 이식 2단계 — 9챕터 → 20섹션 (26.9.19(토) 같은 날 · [코디])

1단계에서 연출을 DOM 구동으로 바꿔 둔 덕에 JS 를 한 줄도 안 고치고 HTML 편집만으로 끝났다(아래 주석 버그 1건 제외). 문구는 전부 구판 원문이고 길면 자르기만 했다 — 창작 0.

섹션 연출 본문(구판 출처) 실물 샷 stops
s0 커버 커버 손이 하던 일을, 시스템이 한다 · 신동승 차장 – 0
s1 오프닝 08 파편화 이 문서에는 금액이 없습니다 – .62,.9
s2 실물 6종 카드+샷 이미 한 번 해봤습니다 · 6종 / 4,737 / 1,201 aj-board .44,.72,1
s3 병목 04 와이프 흩어져 있어서입니다 · 칩 5 – .36,.8
s4 병목 네 자리 카드 그리드 상세페이지·재고·후기 3.6만·발주입고 – .37,.58,.79,1
s5 유통·재고 03 분해도 견적→발주→입고→재고→정산 – .3,.475,.65,.825,1
s6 발주·입고 샷 스크럽 각 단계가 다음 단계로 정보를 넘겨줍니다 mfg-order .55,1
s7 재고·권한 샷 스크럽 재고는 한 곳만 진실 · 대표/관리자/담당 aj-products .55,1
s8 생성기 05 카드 스택 상세페이지는 이미 돌고 있습니다 – .34,.67,1
s9 도구 화면 샷 스크럽 한 번 만들면 다시 안 만듭니다 · 1,182/763/3종 gen-editor .55,1
s10 상품↔사진 샷 스크럽 짝이 없으면 새로 찍을 목록으로 aj-mapping .55,1
s11 같은 얼굴 샷 2장 휴대폰에서도 같은 화면 gen-mobile · aj-design .55,1
s12 후기 07 숫자 조립 고객이 이미 답을 써 놨습니다 – .34,.67,1
s13 후기 활용 카드 그리드 다섯 가지 + 닫힌 고리 – .33,.5,.66,.83,1
s14 알림 02 방 통과 방 5개(재고 바닥·입고 지연·판매 요약·낮은 별점·정산 미리보기) – .22,.42,.61,.81,1
s15 알림 운영 샷 스크럽 받는 곳은 평소 쓰는 곳 aj-ledger .55,1
s16 대표 도구 09 카피 시퀀스 받아쓰기·말로 묻기·즉답즉견적·통화 검색 – .06,.34,.67,1
s17 확장 10 CSS 3D 챗봇·영상 발행·매출재고 한 판·견적서 판독 – .36,.72,1
s18 새 매출 카드 그리드 ① 사진→맞춤 도안 · ② 완성작 자랑 카드 – .58,1
s19 클로징 08 역파편화 말보다 이틀이 빨랐습니다 · 다음 한 걸음 3 – .12,.9

18섹션 계획 → 실제 20섹션. 이유 하나 — .stick{overflow:hidden} 이라 한 섹션 = 한 화면이고 구판 한 챕터(스텝 3~5 + 샷 + 카드)가 한 화면에 안 들어간다. 내용을 자르는 대신 챕터를 쪼갰다. 접이식 기술설명 9개는 구판 원문 그대로 넣었다 — 스크롤 밖 오버레이라 분량 제한이 없다(본문만 한 화면 제약을 받는다).

🔴 또 잡은 «조용한» 버그 — 컨셉06 속도 반응이 «여전히» 죽어 있었다

1단계 기록엔 「CSS 가 --skew 를 안 읽는 걸 고쳤다」고 적혀 있었지만, 실제로는 그 자리의 CSS 주석이 중간에서 한 번 닫혀(*/ 두 번) 남은 줄이 «셀렉터»로 먹혔고 .glass{transform:skewY(var(--skew,0deg))} 규칙이 통째로 버려지고 있었다. 에러도 경고도 없다. ⛒더 고약한 것 — 그 함정을 설명하려고 주석에 닫는 기호를 글자로 적었다가 같은 자리에서 또 깨뜨렸다. 지금은 실측 최대 9deg(상한값)까지 살아서 움직인다. 판정법은 rules.md 🆕 신규 참조.

기계검증 (헤드리스 chromium · 1440×900 · 1366×768 · 26.9.19)

항목 결과
외부요청 · 콘솔오류 · 가로넘침 · 13px 미만 0 · 0 · 0 · 0
잘림(보이는 요소가 유리판 밖) — 발표 스텝 56개 전부에서 판정 0건 (두 해상도)
금지어(화면 글자 + 기술설명 template + 이미지 경로·대체텍스트) 0
글꼴 document.fonts.check('900 40px "AJ Sans"') · 이미지 8장 true · 0폭 0장
기술설명(키 T → Esc) · 구간 편집(추가→기본값) · 발표모드 패널 열림/닫힘 OK · 56→57→56 · display:none
폰트 서브셋 재생성 105.6KB · 글자 591 · 축 wght 45~930 유지

⚠잘림 판정을 두 번째로 고쳤다 — scrollHeight 오탐(1단계 기록)에 이어 인접 섹션 오탐. sticky 로 가장자리에 걸친 섹션은 진행률이 중간값이라, 통과 중인 방(translateZ 3배 확대)·올라오는 중인 카드가 유리판 밖인 게 정상이다 → 화면 중앙을 차지한 섹션 하나만 잰다. 전환이 «끝난» 정지 상태에서 재는 것도 같은 이유.

⏳ 남은 것 — 3단계 단일파일 패킹