diff --git a/A05_EduDetail/guide/B01/00_설명서.md b/A05_EduDetail/guide/B01/00_설명서.md
index 487d18091..dfbfe9586 100644
--- a/A05_EduDetail/guide/B01/00_설명서.md
+++ b/A05_EduDetail/guide/B01/00_설명서.md
@@ -1,38 +1,51 @@
# 대시보드
-프로젝트를 만들고 고르고 관리하는 첫 화면. 계정 정보와 회사 정보도 여기서 고침.
+로그인하면 처음 열리는 화면. 왼쪽 메뉴에서 세부 페이지를 골라 프로젝트 · 보관 자료 · 사람 · 회사 · 계정을 다룸.
## 여는 길
-- 로그인하면 처음 열리는 화면.
+- 로그인하면 바로 열림 — 처음은 [홈].
- 다른 화면에서는 ☰ 를 눌러 서랍을 열고 [대시보드] 선택.
+- 머리 줄 왼쪽 [AISLO] 를 누르면 언제든 [홈] 으로 돌아옴.

## 화면 구역
-보이는 구역은 로그인한 사람의 역할(일반 사용자 · 회사 관리자 · 시스템 관리자)에 따라 다름. 그림은 회사 관리자 화면(예시 회사라 프로젝트 · 보관 자료가 비어 있음).
-
| 번호 | 구역 | 하는 일 |
| --- | --- | --- |
-| 1 | 시스템 설정 | 구조물 조합 같은 기본값 화면으로 가는 카드 · 제목을 누르면 접힘 |
-| 2 | 프로젝트 | 내 프로젝트 표 · [+] 로 새 프로젝트 · 단계 막대로 작업 화면 이동 |
-| 3 | 임시 보관함 | 프로젝트를 만들기 전에 파일을 30일 동안 올려 두는 곳 |
-| 4 | 팀원 관리 | 같은 회사 사람 추가 · 역할 변경 · 제거 (회사 관리자만) |
-| 5 | 기본정보 | 내 이름 · 직급 · 연락처 · 서명 |
-| 6 | 보안 | 비밀번호 변경 |
-| 7 | 챗봇 | 법령 · 지침 질문 창 · 화면 오른쪽 아래 둥근 단추 |
-| 8 | ☰ | 구역으로 바로 가는 목록 · 다른 화면 이동 |
+| 1 | 회사 이름 | 내 회사 · 시스템 관리자는 눌러서 볼 회사를 바꿈(「회사 선택」 창) |
+| 2 | [?] | 이 사용자 가이드 · 지금 보는 페이지의 절이 먼저 열림 |
+| 3 | 알림(종) | 처리할 일 수(가입 요청 · 새 예정노선 · 만료 임박 보관함) · 누르면 [홈] |
+| 4 | 사용자 메뉴 | 이름을 누르면 [내 정보] · 어두운 화면 · English · 터치 모드 · 설정 · 로그아웃 → [내 정보](B01/12_내_정보) |
+| 5 | 왼쪽 메뉴 | 작업 · 회사 관리 · 시스템 관리 · 도움 묶음 · 지금 페이지 강조 · 오른쪽 수 배지(빨강 = 처리할 일) |
+| 6 | 페이지 자리 | 메뉴에서 고른 세부 페이지가 그려지는 자리 |
+| 7 | 챗봇 단추 | 오른쪽 아래 둥근 단추 · 법령 · 지침 질문 창 → [지식 챗봇](B01/11_지식_챗봇) |
-회사 관리자는 가입 요청 · 회사 정보 구역이 더 보이고, 받은 예정노선이 있으면 그 구역이 프로젝트 아래에 붙음.
+## 역할별 메뉴
+
+보이는 메뉴는 로그인한 사람의 역할에 따라 다름. 그림은 회사 관리자 화면.
+
+| 메뉴 | 일반 사용자 | 회사 관리자 | 산림청 | 시스템 관리자 |
+| --- | --- | --- | --- | --- |
+| 홈 · 프로젝트 · 임시 보관함 | 보임 | 보임 | 보임 | 보임 |
+| 받은 예정노선 | 보임 | 보임 | 안 보임 | 보임 |
+| 사람 | 안 보임 | 보임 | 안 보임 | 보임 |
+| 회사 정보 | 읽기만 | 고침 | 읽기만 | 고침 |
+| 회사 설계 기본값 | 보임 | 보임(고침) | 보임 | 안 보임 — [설계 기본값] 을 씀 |
+| 시스템 관리(개요 · 회사 · 사용자 · 설계 기본값 · 시스템 로그) | 안 보임 | 안 보임 | 안 보임 | 보임 |
+| 사용자 가이드 · 지식 챗봇 | 보임 | 보임 | 보임 | 보임 |
+
+- 일반 사용자 — 자기 프로젝트 작업 · 보관함 · 회사 정보 보기.
+- 회사 관리자 — 일반 사용자 메뉴 + [사람](팀원 · 가입 요청 · 초대) · 회사 정보 고치기.
+- 산림청 — 예정노선을 만드는 계정 · [받은 예정노선] 대신 홈에 [예정노선] 칸.
+- 시스템 관리자 — 모든 메뉴 + [시스템 관리] 묶음 · 머리 줄에서 볼 회사를 바꿈.
+
+> 참고: 권한 없는 페이지 주소로 들어오면 [홈] 이 열림.
## 작업 순서
-1. 처음이면 [기본정보] 와 [보안] 확인.
-2. [프로젝트] 의 [+] 로 새 프로젝트 만들기 → [새 프로젝트 만들기](B01/01_새_프로젝트_만들기).
-3. 측량 파일이 아직 없으면 [임시 보관함] 에 먼저 올려 두기 → [임시 보관함](B01/04_임시_보관함).
-4. 만든 프로젝트는 표의 단계 막대에서 이어서 작업 → [프로젝트 목록](B01/02_프로젝트_목록).
-
-시스템 관리자 화면은 [시스템 관리자 구역](B01/09_시스템_관리자) 참고.
-
-> 참고: 구역 제목을 누르면 그 구역이 접히고 다시 누르면 펼쳐짐.
+1. 처음이면 [내 정보] 에서 이름 · 직급 · 서명 채움. → [내 정보](B01/12_내_정보)
+2. 측량 파일이 아직 없으면 [임시 보관함] 에 먼저 올려 둠. → [임시 보관함](B01/04_임시_보관함)
+3. [+ 새 프로젝트] 로 프로젝트를 만듦. → [프로젝트 목록](B01/02_프로젝트_목록)
+4. 프로젝트 카드를 눌러 상세를 보고 [작업 열기] 로 이어서 작업. → [프로젝트 상세](B01/06_프로젝트_상세)
diff --git a/A05_EduDetail/guide/B01/01_새_프로젝트_만들기.md b/A05_EduDetail/guide/B01/01_새_프로젝트_만들기.md
deleted file mode 100644
index c24dde131..000000000
--- a/A05_EduDetail/guide/B01/01_새_프로젝트_만들기.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# 새 프로젝트 만들기
-
-만들 프로젝트의 종류를 고르는 창. 종류마다 입력 화면이 따로 열림.
-
-## 여는 길
-
-- [프로젝트] 구역 오른쪽 위 [+] 누름.
-
-
-
-## 단계
-
-| 단계 | 할 일 |
-| --- | --- |
-| 1 | [프로젝트] 구역의 [+] 누름 |
-| 2 | 창의 카드 넷 가운데 만들 종류 선택 |
-| 3 | 열린 입력 화면에서 이어서 작업 |
-
-그림 번호는 아래 표의 번호와 같음. 흐린 카드는 지금 계정으로 못 고르는 카드.
-
-| 번호 | 카드 | 열리는 화면 |
-| --- | --- | --- |
-| 1 | 예정노선 | 예정노선 등록 · 산림청 계정만 가능 |
-| 2 | 임도설계 | 프로젝트 등록 → [B02](B02/00_설명서) |
-| 3 | 사방설계 | 「준비 중」 표시 · 아직 못 고름 |
-| 4 | 안정성평가 | 안정성평가 생성 → [E01](E01/00_설명서) |
-
-## 보이는 것
-
-- 못 고르는 카드는 흐리게 보임.
-- 창 오른쪽 위 [닫기] 로 만들지 않고 돌아감.
-- 임도설계를 고르면 창이 닫히고 프로젝트 등록 화면으로 넘어감 → [프로젝트 등록](B02/00_설명서).
-
-> 참고: 예정노선 카드는 산림청 계정(시스템 관리자 · go.kr 메일)만 켜짐. 그 밖의 계정은 흐리게 보임.
diff --git a/A05_EduDetail/guide/B01/01_홈.md b/A05_EduDetail/guide/B01/01_홈.md
new file mode 100644
index 000000000..a78b7ee88
--- /dev/null
+++ b/A05_EduDetail/guide/B01/01_홈.md
@@ -0,0 +1,49 @@
+# 홈
+
+지금 하는 일을 한눈에 보는 첫 페이지. 진행 중인 프로젝트 수에 따라 모양이 바뀜.
+
+## 여는 길
+
+- 왼쪽 메뉴 [홈] · 머리 줄 [AISLO] · 알림(종) 누름.
+
+## 처음 시작
+
+진행 중인 프로젝트가 없는 계정의 홈.
+
+
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | [자동] · [작게] · [크게] | 홈 모양 고름(아래 표) · 고른 것은 기억됨 |
+| 2 | [+ 새 프로젝트] | 새 프로젝트 창을 엶 → [프로젝트 목록](B01/02_프로젝트_목록) |
+| 3 | 세 걸음 | ① [내 정보 ›] ② [보관함 ›] ③ [+ 새 프로젝트] — 처음 쓰는 차례 |
+| 4 | 오른쪽 칸 | [처리할 일] · [임시 보관함] · 회사 칸(팀원 수 · 진행 중 수 · [사람 ›]) |
+
+## 프로젝트가 많을 때
+
+진행 중인 프로젝트가 9 개를 넘으면 요약 · 그래프 모양. 그림은 시스템 관리자 화면.
+
+
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | [자동] · [작게] · [크게] | 홈 모양 고름 |
+| 2 | 숫자 칸 | 진행 중 프로젝트 · 처리 대기 수(시스템 관리자는 회사 · 사용자 · 서버 칸 더) |
+| 3 | 오른쪽 칸 | [처리할 일] — 새 예정노선 [보기] · 가입 요청 [처리] · 만료 임박 파일 [열기] · [임시 보관함] |
+
+- 아래 그래프 — 회사별(시스템 관리자) 또는 담당별 진행 중 · 종류(임도설계 · 예정노선 · 안정성평가) · 단계 분포(시작 전 · 설계 중 · 확정 대기).
+- [모든 프로젝트 ›] — [프로젝트] 페이지로 감.
+
+## 모양 고르기
+
+| 진행 중 수 | [자동] 모양 |
+| --- | --- |
+| 0 | 처음 시작(세 걸음) 또는 「진행 중인 프로젝트 없음」 |
+| 1 | 큰 카드 하나 — 단계 점 · 「다음: …」 · [이어서 하기 ›] · [자세히] |
+| 2~3 | 중간 카드 |
+| 4~8 | 한 줄 목록 — [열기 ›] = 그 단계 화면 · 줄 누름 = 상세 |
+| 9 넘음 | 요약 · 그래프 |
+
+- [작게] = 한 줄 목록(9 넘으면 요약 · 그래프) · [크게] = 큰 · 중간 카드.
+
+> 참고: 산림청 계정은 오른쪽에 [예정노선] 칸이 더 있음.
diff --git a/A05_EduDetail/guide/B01/02_프로젝트_목록.md b/A05_EduDetail/guide/B01/02_프로젝트_목록.md
index 7d8624dd8..d3a8acc51 100644
--- a/A05_EduDetail/guide/B01/02_프로젝트_목록.md
+++ b/A05_EduDetail/guide/B01/02_프로젝트_목록.md
@@ -1,44 +1,53 @@
# 프로젝트 목록
-내 프로젝트를 한 표로 보고, 진행 단계로 바로 이동하고, 이름 · 정보를 고치거나 지움.
+내 프로젝트 · 회사 프로젝트를 카드 · 표 · 칸반으로 보고 찾고, 새 프로젝트를 만듦.
## 여는 길
-- 대시보드의 [프로젝트] 구역.
+- 왼쪽 메뉴 [프로젝트] · 홈의 [모든 프로젝트 ›].
-
+
-## 단계
+## 화면 구역
-그림 번호 — ① [프로젝트명] 칸 머리 · ② [워크플로우] 칸 머리(단계 막대) · ③ [수정] 단추.
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | [카드] · [표] · [칸반] | 보기 고름 · [칸반] 은 프로젝트가 10 개 이상일 때만 보임 |
+| 2 | [+ 새 프로젝트] | 새 프로젝트 창을 엶(아래) |
+| 3 | 찾기 칸 | 이름 · 지역으로 찾음 |
+| 4 | 종류 칩 | [전체] · [임도설계] · [예정노선] · [안정성평가] — 옆 숫자 = 개수 · 사방설계는 준비 중 |
+| 5 | [담당] · [내 것] · [회사 전체] | 담당자로 거름 · 내 프로젝트만 또는 회사 전체 |
+| 6 | 프로젝트 카드 | 노선 그림 · 이름 · 종류 · 지금 단계(예: 원가계산 7/7) · 단계 점 · 담당 · 고친 날 — 누르면 상세 |
-| 단계 | 할 일 |
-| --- | --- |
-| 1 | 표에서 프로젝트를 찾음 · 칸은 프로젝트명 · 종류 · 지역 · 워크플로우 · 수정일 · 관리 |
-| 2 | 워크플로우 칸의 단계 막대에서 이어갈 단계(파일입력 · 전처리 · 노선설계 …)를 누름 |
-| 3 | 그 프로젝트의 해당 화면이 열림 |
-| 4 | 정보를 바꾸려면 [수정], 지우려면 [삭제] |
+- 카드를 누르면 [프로젝트 상세] 가 열림. → [프로젝트 상세](B01/06_프로젝트_상세)
+- 「N 일 그대로」 표시 = 오래 손대지 않은 프로젝트.
-## 보이는 것
+## 표 보기
-- 단계 막대 색: 완료 · 진행 중 · 다시 확인 필요 · 시작 전이 서로 다른 색.
-- 종류 칸: 임도설계 · 예정노선 · 안정성평가 중 하나. 종류마다 단계 이름이 다름.
+
-### 프로젝트 수정
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 칸 머리 | 이름 · 종류 · 지역 · 진행 · 상태 · 담당 · 수정일 |
+| 2 | ⋯ | [수정] · [삭제] — 권한이 있는 사람에게만 보임 |
-
+- [칸반] = 시작 전 · 설계 중 · 검토 · 확정 대기 · 완료 칸으로 나눠 봄 · 완료 칸은 접혀 있음(펼치기).
-- 그림 ① 프로젝트명 칸 · 아래로 지역 · 임도 종류 · 사업 연도 · 예상 연장 · 노선 시작 · 종료 누가거리 · 비고 · 시행청 · 연도·기번(표지) · 사업량(표지) · 설계일자 · 책임자 셋 · 회사 로고 · 참여자(수정을 허락할 사람 체크)를 고침.
-- 그림 ② 아래 [취소] · [확인] 단추 줄.
-- [확인] 을 누르면 저장.
+## 새 프로젝트 만들기
-### 프로젝트 삭제
+
-
+| 번호 | 카드 | 하는 일 |
+| --- | --- | --- |
+| 1 | [예정노선] | 예정노선 지정 화면으로 감 · 산림청(시스템 관리자 · go.kr 메일)만 — 다른 계정은 흐리게 보임 |
+| 2 | [임도설계] | 프로젝트 등록 화면으로 감 → [프로젝트 등록](B02/00_설명서) |
+| 3 | [사방설계] | 준비 중 |
+| 4 | [안정성평가] | 안정성평가 만들기 화면으로 감 → [안정성평가 만들기](E01/00_설명서) |
-- [삭제] 를 누르면 「프로젝트 삭제」 확인 창이 뜸(그림 ① 안내 글). 올린 라이다 원본과 모든 계산 결과가 서버에서 영구 삭제되고 되돌릴 수 없음.
-- 그림 ② 에서 마음이 바뀌면 [취소].
+## 프로젝트 수정 · 삭제
-> 주의: 삭제한 프로젝트는 복구 불가. 확인 창의 글을 읽고 [확인] 누르기.
+- ⋯ → [수정] — 「프로젝트 수정」 창: 프로젝트명 · 지역 · 임도 종류 · 사업 연도 · 예상 연장 · 노선 시작 · 종료 누가거리 · 비고 · 시행청 · 연도 · 기번(표지) · 사업량(표지) · 설계일자 · 과업책임자 · 분야별책임자 · 설계자 · 회사 로고 · 참여자(수정을 허락할 사람 체크) → [확인].
+- ⋯ → [삭제] — 「프로젝트 삭제」 확인 창 → [확인].
+- 프로젝트 상세의 ⋯ 에도 같은 [수정] · [삭제] 가 있음.
-> 참고: [수정] · [삭제] 단추는 권한이 있는 사람에게만 보임.
+> 주의: 삭제하면 올린 라이다 원본과 모든 계산 결과가 서버에서 지워짐 — 되돌릴 수 없음.
diff --git a/A05_EduDetail/guide/B01/03_받은_예정노선.md b/A05_EduDetail/guide/B01/03_받은_예정노선.md
index 9b005e2a8..9fe2f1f25 100644
--- a/A05_EduDetail/guide/B01/03_받은_예정노선.md
+++ b/A05_EduDetail/guide/B01/03_받은_예정노선.md
@@ -1,24 +1,30 @@
# 받은 예정노선
-산림청이 우리 회사에 지정해 준 예정노선 연도를 확인하고 임도 프로젝트에 연결.
+산림청이 우리 회사에 지정한 예정노선을 모아 보고 임도 프로젝트에 연결.
## 여는 길
-- 대시보드의 [받은 예정노선] 구역. 받은 것이 있을 때만 보임.
+- 왼쪽 메뉴 [받은 예정노선] — 일반 사용자 · 회사 관리자 · 시스템 관리자(산림청 계정은 없음).
+- 메뉴 옆 빨강 숫자 = 아직 연결 안 했거나 업데이트가 있는 노선 수.
-> 참고: 받은 예정노선이 없는 계정에는 이 구역이 아예 안 보임 — 그림 없음.
+
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 페이지 머리 | 산림청이 지정한 예정노선이 모이는 곳 |
+| 2 | 빈 안내 | 받은 것이 없으면 「아직 받은 예정노선이 없음」 · [사용법 보기] |
## 단계
| 단계 | 할 일 |
| --- | --- |
-| 1 | 표에서 예정노선 이름 · 연도 · 확정 시각 · 연결 상태 확인 |
-| 2 | [보기] 로 노선 확인 |
-| 3 | [연결] 을 눌러 창에서 「새 임도 프로젝트로」 또는 「기존 프로젝트에 연결」 선택 |
-| 4 | 연결된 프로젝트의 파일입력 화면에서 계획노선 칸이 채워짐 → [B03 예정노선에서 가져오기](B03/04_예정노선_가져오기) |
+| 1 | 표에서 예정노선 · 연도 · 확정 · 연결 상태 확인 |
+| 2 | 줄 ⋯ → [보기] — 예정노선 화면에서 노선 확인 |
+| 3 | 줄 ⋯ → [연결] — 「예정노선 연결」 창에서 [새 임도 프로젝트로] 또는 기존 프로젝트를 골라 [기존 프로젝트에 연결] |
+| 4 | 연결된 프로젝트의 파일입력 화면이 열리고 계획노선 칸이 채워짐 → [B03 예정노선에서 가져오기](B03/04_예정노선_가져오기) |
## 보이는 것
-- 연결 상태 칸: 연결됨 · 미연결 · 업데이트 있음 중 하나.
+- 연결 상태 칸: 연결됨 · 미연결 · 업데이트 있음.
-> 참고: 「업데이트 있음」 이면 산림청이 노선을 고친 것. [다시 가져오기] 로 새 노선을 받음.
+> 참고: 「업데이트 있음」 = 산림청이 노선을 고친 것 · 파일입력 화면에서 다시 가져옴.
diff --git a/A05_EduDetail/guide/B01/04_임시_보관함.md b/A05_EduDetail/guide/B01/04_임시_보관함.md
index ade88aa14..d553edb9a 100644
--- a/A05_EduDetail/guide/B01/04_임시_보관함.md
+++ b/A05_EduDetail/guide/B01/04_임시_보관함.md
@@ -4,28 +4,33 @@
## 여는 길
-- 대시보드의 [임시 보관함] 구역.
+- 왼쪽 메뉴 [임시 보관함] · 홈의 [보관함 ›].
+- 메뉴 옆 숫자 = 보관 묶음 수.
-
+
-그림 번호 — ① [보관 이름] 칸 · ② [취소] · [확인] 단추 줄. 보관 자료가 없으면 구역에 「데이터가 없습니다」 만 보임.
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | [자료 올리기] | 「임시 자료 등록」 창을 엶 |
+| 2 | 빈 안내 | 묶음이 없으면 「임시 보관함이 비어 있음」 · [자료 올리기] · [사용법 보기] |
-## 단계
+## 올리기
-| 단계 | 할 일 |
-| --- | --- |
-| 1 | [임시 보관함] 구역 오른쪽 위 [+] 누름 |
-| 2 | [보관 이름] 칸에 알아보기 쉬운 이름 입력 (예: 2026년 3공구 측량자료) |
-| 3 | [파일 선택] 을 눌러 계획노선 · 라이다 · 좌표계 · 래스터 파일을 한꺼번에 고름 |
-| 4 | 고른 파일 목록 확인 후 [확인] |
-| 5 | 올리기가 끝나면 구역 목록에 보관 묶음이 생김 |
+
+
+| 번호 | 칸 | 하는 일 |
+| --- | --- | --- |
+| 1 | [보관 이름] | 알아보기 쉬운 이름(예: 2026년 3공구 측량자료) |
+| 2 | [파일 선택] | 계획노선 · 라이다 · 좌표계 · 래스터 파일을 한꺼번에 고름 · 아래 목록에 종류 · 파일명 · 크기 |
+| 3 | [취소] · [확인] | [확인] = 올리기 시작 |
## 보이는 것
-- 묶음마다 이름 · 파일 개수 · 보관 만료일과 상태(업로드 중 · 사용 가능 · 프로젝트 연결됨).
-- 파일마다 종류 · 파일명 · 크기 · 상태(저장 완료 · 대기 · 업로드 중 · 이어올리기 대기 · 실패).
-- 묶음에 [파일 추가] 로 빠진 파일을 더 올리거나 파일 · 묶음을 지울 수 있음.
-- 올린 묶음은 파일 입력 화면의 [임시 보관함] 단추로 프로젝트에 가져옴 → [B03 임시 보관함에서 가져오기](B03/03_임시_보관함에서_가져오기).
+- 묶음 줄: 보관 이름(파일 수 · 크기) · 상태(사용 가능 · 업로드 중) · 남은 기간 · 올린 날 · ⋯.
+- 이름 앞 꺾쇠를 누르면 파일 목록이 펼쳐짐 — 파일마다 저장 완료 · 대기 · 업로드 중 · 이어올리기 대기 · 실패.
+- 묶음 ⋯ → [파일 추가] · [삭제] · 파일 ⋯ → [삭제].
+- 남은 기간이 7일 안이면 빨강 · 알림(종) 수에 더해짐.
+- 올린 묶음은 파일입력 화면의 [임시 보관함] 단추로 프로젝트에 가져옴 → [B03 임시 보관함에서 가져오기](B03/03_임시_보관함에서_가져오기).
> 주의: 보관 기간(30일)이 지나면 묶음이 사라짐.
diff --git a/A05_EduDetail/guide/B01/05_회사와_팀원.md b/A05_EduDetail/guide/B01/05_회사와_팀원.md
index 070291f77..dcf33825f 100644
--- a/A05_EduDetail/guide/B01/05_회사와_팀원.md
+++ b/A05_EduDetail/guide/B01/05_회사와_팀원.md
@@ -1,61 +1,43 @@
-# 회사와 팀원
+# 사람
-같은 회사 사람을 추가하고 역할을 정하고, 회사 정보를 고침. 회사 관리자 전용 구역 모음.
+같은 회사 팀원 · 가입 요청 · 초대를 한곳에서 관리. 회사 관리자 · 시스템 관리자 전용.
## 여는 길
-- 대시보드의 [팀원 관리] · [가입 요청] · [회사 정보] 구역. 회사 관리자 계정에서만 모두 보임.
+- 왼쪽 메뉴 [사람](회사 관리 묶음) · 홈 회사 칸의 [사람 ›].
+- 메뉴 옆 빨강 숫자 = 기다리는 가입 요청 수.
-
+
-## 단계
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | [+ 팀원 추가] | 「팀원 추가」 창을 엶 |
+| 2 | 탭 | [팀원] · [가입 요청](기다리는 수) · [초대] |
+| 3 | 팀원 표 | 이름 · 이메일 · 직급 · 부서 · 역할 · 상태 |
+| 4 | ⋯ | [수정] · [역할 변경] · [제거] |
-### 팀원 추가
+## 팀원 추가
-그림 번호 — ① [이름 · 이메일 검색] 칸 · ② [취소] · [확인] 단추 줄.
+
+
+| 번호 | 칸 | 하는 일 |
+| --- | --- | --- |
+| 1 | [이름 · 이메일 검색] | 두 글자 이상 넣고 [검색] — 목록에서 사람을 고름 · 없으면 [초대 메일 발송] |
+| 2 | [취소] · [확인] | [확인] = 고른 사람을 팀원으로 넣음 |
+
+## 역할 바꾸기 · 고치기 · 빼기
| 단계 | 할 일 |
| --- | --- |
-| 1 | [팀원 관리] 구역 오른쪽 위 [+] 누름 |
-| 2 | [이름 · 이메일 검색] 칸에 입력하고 [검색] |
-| 3 | 목록에서 사람을 고르거나, 없으면 [초대 메일 발송] |
-| 4 | [확인] |
+| 1 | 팀원 줄 ⋯ → [역할 변경] — USER(일반 사용자) 또는 ADMIN(회사 관리자) 고름 → [확인] |
+| 2 | ⋯ → [수정] — 이름 · 직급 · 부서 · 전화 · 상태(활성 · 비활성) · 서명 고침 → [확인] |
+| 3 | ⋯ → [제거] — 「회사에서 빼기(계정은 남음)」 또는 「계정 삭제(로그인 불가)」 고름 → [확인] |
-### 역할 바꾸기
+## 가입 요청 · 초대
-그림 번호 — ① [역할] 고르기 칸 · ② [취소] · [확인] 단추 줄.
+- [가입 요청] 탭 — 요청자 · 이메일 · 요청일 · 상태 · 줄마다 [승인] · [거절].
+- [초대] 탭 — [초대할 이메일] 칸에 넣고 [초대 메일 보내기].
-
+> 주의: 회사의 유일한 관리자는 뺄 수 없음. 시스템 관리자로는 역할을 바꿀 수 없음.
-| 단계 | 할 일 |
-| --- | --- |
-| 1 | 팀원 줄의 [역할 변경] 누름 |
-| 2 | 역할을 USER 또는 ADMIN 에서 선택 |
-| 3 | [확인] |
-
-### 가입 요청 처리
-
-- [가입 요청] 구역에 요청이 있으면 줄마다 [승인] · [거절].
-
-### 회사 정보 고치기
-
-그림 번호 — ① [사업자등록번호] 칸 · ② [취소] · [확인] 단추 줄.
-
-
-
-| 단계 | 할 일 |
-| --- | --- |
-| 1 | [회사 정보] 구역의 [회사 정보 수정] 누름 |
-| 2 | 사업자등록번호 · 회사명 · 대표자명 입력 |
-| 3 | [주소 검색] 으로 주소를 고르거나 [직접 입력] 으로 기본주소 · 상세주소 입력 |
-| 4 | 로고 파일(png · jpg · webp · svg · 2MB 이하) 선택 — 도면 표제란에 쓰임 |
-| 5 | [확인] |
-
-## 보이는 것
-
-- 팀원 표: 이메일 · 이름 · 직급 · 부서 · 역할 · 관리([수정] · [역할 변경] · [제거]).
-- 회사 정보 구역: 회사명 · 활성 사용자 수 · 프로젝트 수 · 주소 · 회사 로고.
-
-> 주의: 회사의 유일한 관리자는 삭제할 수 없음. 시스템 관리자로는 역할을 바꿀 수 없음.
-
-> 참고: 일반 사용자 화면에는 [팀원 관리] 와 [가입 요청] 이 없고 [회사 정보] 는 읽기만 가능.
+> 참고: 일반 사용자 · 산림청 계정에는 [사람] 메뉴가 없음.
diff --git a/A05_EduDetail/guide/B01/06_내_정보와_보안.md b/A05_EduDetail/guide/B01/06_내_정보와_보안.md
deleted file mode 100644
index 8f5ab57ce..000000000
--- a/A05_EduDetail/guide/B01/06_내_정보와_보안.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# 내 정보와 보안
-
-내 이름 · 직급 · 연락처 · 서명과 비밀번호를 고침. 모든 사용자 공통.
-
-## 여는 길
-
-- 대시보드 아래쪽 [기본정보] · [보안] 구역.
-
-
-
-## 단계
-
-### 기본정보
-
-그림 번호 — ① [이름] 칸 · ② [기본정보 저장] 단추.
-
-| 단계 | 할 일 |
-| --- | --- |
-| 1 | 이름 · 직급 · 부서 · 연락처 칸을 고침 (이메일은 읽기만) |
-| 2 | 서명 줄의 [선택…] 으로 서명 그림 파일을 올림 — 도면 표제란에 쓰임 |
-| 3 | [기본정보 저장] |
-
-### 비밀번호 바꾸기
-
-
-
-그림 번호 — ① [현재 비밀번호] 칸 · ② [새 비밀번호] 칸(옆 칸이 [새 비밀번호 확인]) · ③ [비밀번호 변경] 단추.
-
-| 단계 | 할 일 |
-| --- | --- |
-| 1 | [현재 비밀번호] 입력 |
-| 2 | [새 비밀번호] 와 [새 비밀번호 확인] 에 같은 값 입력 (8자 이상) |
-| 3 | [비밀번호 변경] |
-
-## 보이는 것
-
-- 저장하면 「저장되었습니다.」 알림.
-- 새 비밀번호가 서로 다르면 「새 비밀번호가 일치하지 않습니다.」 · 8자 미만이면 「비밀번호는 8자 이상이어야 합니다.」 알림.
-
-> 참고: 프로젝트 등록 화면의 책임자 목록에는 여기 적은 이름과 직급이 나옴 → [B02 도면 표제란](B02/03_도면_표제란).
diff --git a/A05_EduDetail/guide/B01/06_프로젝트_상세.md b/A05_EduDetail/guide/B01/06_프로젝트_상세.md
new file mode 100644
index 000000000..5776bc195
--- /dev/null
+++ b/A05_EduDetail/guide/B01/06_프로젝트_상세.md
@@ -0,0 +1,25 @@
+# 프로젝트 상세
+
+프로젝트 하나의 단계 · 노선 · 기본 정보 · 연결 · 산출물 · 최근 변경을 한 페이지에서 봄.
+
+## 여는 길
+
+- [프로젝트] 페이지에서 카드 · 표 줄 누름 · 홈의 [자세히].
+
+
+
+## 화면 구역
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | [프로젝트 ›] | 프로젝트 목록으로 돌아감 |
+| 2 | [작업 열기 — 지금 단계 ›] | 지금 단계 작업 화면을 엶 · 옆 ⋯ = [수정] · [삭제] |
+| 3 | 단계 진행 | 단계 칸(완료 ✓ · 지금 · 다시 확인 필요) — 누르면 그 단계 화면 |
+| 4 | 노선 미리보기 | 계획노선 그림(시점 · 종점) · 아래 연장 · 측점 수 |
+| 5 | 기본 정보 | 사업 연도 · 지역 · 임도 종류 · 설계속도 · 시행청 · 사업 번호 · 담당 · 만든 날 |
+| 6 | 최근 변경 | 누가 언제 무엇을 고쳤는지 · 단계 마침 기록 |
+
+- [연결된 것] — 원본 · 이어 만든 것(예: 안정성평가) · 받은 예정노선 · [보기] 로 그 프로젝트를 엶.
+- [산출물 내려받기] — 도면 PDF · 수량 xlsx · 내역 xlsx · [받기 화면] 으로 그 단계 화면을 엶.
+
+> 참고: 노선이 아직 없는 프로젝트는 노선 미리보기 대신 핵심 숫자가 보임.
diff --git a/A05_EduDetail/guide/B01/07_시스템_설정.md b/A05_EduDetail/guide/B01/07_시스템_설정.md
deleted file mode 100644
index cfb7792fd..000000000
--- a/A05_EduDetail/guide/B01/07_시스템_설정.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# 시스템 설정 카드
-
-설계 기본값(구조물 조합 · 옵션 · 도면 양식)을 고치는 화면으로 가는 바로가기.
-
-## 여는 길
-
-- 대시보드 맨 위 [시스템 설정] 구역.
-
-
-
-## 단계
-
-| 단계 | 할 일 |
-| --- | --- |
-| 1 | 카드를 하나 누름 |
-| 2 | 열린 마스터 템플릿 화면에서 값을 고침 |
-
-## 보이는 것
-
-- 그림은 회사 관리자 화면의 카드 줄. 시스템 관리자는 카드가 다섯 장 → [시스템 관리자 구역](B01/09_시스템_관리자).
-
-- 카드 아래 작은 글이 내 권한을 알려 줌 (예: 마스터 읽기 · 회사 수정 · 개인 수정).
-- 일반 사용자 · 회사 관리자는 「구조물 조합」 카드 하나 · 시스템 관리자는 다섯 장.
-
-> 참고: 구역 제목을 누르면 카드 줄이 접힘.
diff --git a/A05_EduDetail/guide/B01/07_회사_정보.md b/A05_EduDetail/guide/B01/07_회사_정보.md
new file mode 100644
index 000000000..f245a0ca7
--- /dev/null
+++ b/A05_EduDetail/guide/B01/07_회사_정보.md
@@ -0,0 +1,30 @@
+# 회사 정보
+
+회사 이름 · 사업자 정보 · 도면에 들어가는 회사 로고를 봄. 회사 관리자 · 시스템 관리자만 고침.
+
+## 여는 길
+
+- 왼쪽 메뉴 [회사 정보](회사 관리 묶음).
+
+
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | [회사 정보 수정] | 「회사 정보 수정」 창을 엶 |
+| 2 | 정보 줄 | 회사 이름 · 사업자등록번호 · 대표자명 · 주소 · 사업자 상태 · 활성 사용자 · 프로젝트 수 |
+| 3 | [회사 로고] [선택…] | 도면 표제란에 들어감 · 프로젝트가 따로 고르지 않으면 이 로고를 씀 |
+
+## 고치기
+
+
+
+| 번호 | 칸 | 하는 일 |
+| --- | --- | --- |
+| 1 | [사업자등록번호] | 아래로 회사명 · 대표자명 |
+| 2 | 회사 로고 | png · jpg · webp · svg · 2MB 이하 |
+| 3 | [주소 검색] · [직접 입력] | 주소를 찾아 고르거나 기본주소 · 상세주소를 직접 넣음 |
+| 4 | [취소] · [확인] | [확인] = 고침 |
+
+> 참고: 일반 사용자 · 산림청 계정은 읽기만 — [회사 정보 수정] · [선택…] 단추가 없음.
+
+> 참고: 소속 회사가 없으면 「소속 회사가 없음」 · [회사 생성] · [회사 검색](가입 신청).
diff --git a/A05_EduDetail/guide/B01/08_챗봇.md b/A05_EduDetail/guide/B01/08_챗봇.md
deleted file mode 100644
index a4260f5c0..000000000
--- a/A05_EduDetail/guide/B01/08_챗봇.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# 챗봇
-
-법령과 지침을 물어보고 근거 문서와 함께 답을 받는 창.
-
-## 여는 길
-
-- 화면 오른쪽 아래 둥근 [챗봇] 단추.
-
-
-
-그림 번호 — ① 대화가 쌓이는 칸 · ② 질문 입력 칸과 [보내기] · ③ 닫기 ✕.
-
-## 단계
-
-| 단계 | 할 일 |
-| --- | --- |
-| 1 | 둥근 단추를 눌러 창을 엶 |
-| 2 | 아래 입력 칸에 질문 입력 · 줄을 바꾸려면 Shift+Enter |
-| 3 | [보내기] 또는 Enter |
-| 4 | 답과 근거 문서가 위쪽에 쌓임 |
-| 5 | 닫으려면 오른쪽 위 ✕ |
-
-## 보이는 것
-
-- 처음에는 「안녕하세요! 법령이나 지침에 대해 질문해 주세요. 근거 문서도 함께 보여드릴게요.」 인사.
-
-> 참고: 답은 참고용. 설계 값은 해당 법령 원문으로 확인.
diff --git a/A05_EduDetail/guide/B01/08_회사_설계_기본값.md b/A05_EduDetail/guide/B01/08_회사_설계_기본값.md
new file mode 100644
index 000000000..7258dc7a0
--- /dev/null
+++ b/A05_EduDetail/guide/B01/08_회사_설계_기본값.md
@@ -0,0 +1,19 @@
+# 회사 설계 기본값
+
+새 프로젝트가 처음 받는 구조물 조합의 회사 층을 보는 곳. 회사 층은 회사 관리자가 고침.
+
+## 여는 길
+
+- 왼쪽 메뉴 [회사 설계 기본값](회사 관리 묶음) — 일반 사용자 · 회사 관리자 · 산림청.
+
+
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 왼쪽 메뉴 | 일반 사용자 메뉴 — [사람] 없음 · [회사 정보] 는 읽기만 |
+| 2 | [구조물 조합] | [열기] = 마스터 편집 화면의 구조물 조합 표(마스터 읽기 · 회사 읽기 · 개인 수정) |
+
+- 회사 관리자는 단추가 [열기 · 수정] — 회사 층을 고침.
+- 내 것(개인 층)만 고치려면 [내 정보] 의 [구조물 조합 (내 것)]. → [내 정보](B01/12_내_정보)
+
+> 참고: 시스템 관리자는 이 메뉴 대신 [시스템 관리] 의 [설계 기본값] 을 씀. → [시스템 관리](B01/09_시스템_관리)
diff --git a/A05_EduDetail/guide/B01/09_시스템_관리.md b/A05_EduDetail/guide/B01/09_시스템_관리.md
new file mode 100644
index 000000000..e795758d3
--- /dev/null
+++ b/A05_EduDetail/guide/B01/09_시스템_관리.md
@@ -0,0 +1,69 @@
+# 시스템 관리
+
+서버 상태 · 모든 회사 · 모든 사용자 · 마스터 기본값 · 기록을 다루는 묶음. 시스템 관리자 전용.
+
+## 여는 길
+
+- 왼쪽 메뉴 [시스템 관리] 묶음 — [개요] · [회사] · [사용자] · [설계 기본값] · [시스템 로그].
+- 다른 역할에는 이 묶음이 안 보임.
+
+## 개요
+
+
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 숫자 칸 | 회사 · 사용자 · 활성 프로젝트 · 활성 사용자 수 |
+| 2 | 막대 | CPU · 메모리 · 디스크 사용률 — 70% 넘으면 주황 · 90% 넘으면 빨강 |
+| 3 | 그래프 | 최근 7일 CPU · 메모리 · 디스크 흐름 |
+
+## 회사
+
+
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | [+ 회사] | 「회사 생성」 창 — 사업자등록번호 · 회사명 · 대표자명 · 로고 · 주소 · [회사 검색](같은 회사 확인) |
+| 2 | 찾기 칸 | 회사 이름 · 사업자번호로 찾음 |
+| 3 | 회사 표 | 회사 · 사업자등록번호 · 대표자 · 상태 · 사용자 · 프로젝트 수 |
+| 4 | ⋯ | [상세 보기] · [정보 수정] · [로고 지정…] |
+
+- 회사 이름 누름 = 상세 — [정보] · [사람] · [프로젝트] 탭 · [정보 수정] · [‹ 회사 목록] 으로 돌아감.
+
+## 사용자
+
+
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | [+ 사용자] | 「팀원 추가」 창 — 이름 · 이메일로 찾아 넣음 |
+| 2 | 거르기 줄 | 이름 · 이메일 · 부서 찾기 · [모든 회사] · [모든 역할] · 오른쪽 보이는 수 |
+| 3 | 사용자 표 | 이름(이메일) · 회사 · 직급 · 부서 · 전화 · 역할 · 상태 |
+| 4 | ⋯ | [정보 수정] · [역할 변경] · [삭제…] |
+
+## 설계 기본값
+
+새 프로젝트가 처음 받는 마스터 값을 고치는 곳.
+
+
+
+| 번호 | 묶음 | 하는 일 |
+| --- | --- | --- |
+| 1 | 마스터 데이터 | [열기] = 마스터 데이터 화면(원문 원천 · 읽기) |
+| 2 | 구조물 · 도면 | [구조물 조합] · [구조물 옵션] · [도면 양식] — [열기] = 마스터 편집 화면 |
+| 3 | 계산 | [계산 자리] — 묶음마다 조작 중 계산을 브라우저 · 서버 중 어디서 할지 고름 → [저장] |
+
+## 시스템 로그
+
+
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 거르기 줄 | 사용자 · 대상 · 접속 주소 찾기 · [모든 동작] · 시작일 ~ 종료일 · 오른쪽 보이는 줄 수 |
+| 2 | 기록 표 | 사용자 · 동작(프로젝트 생성 · 수정 · 영구 삭제 등) · 대상 · 접속 주소 · 일시 — 최신순 |
+
+- 아래 [이전 기록 더 보기] 로 더 옛 기록을 불러옴.
+
+> 참고: 기록은 1년 보관.
+
+> 참고: 머리 줄 회사 이름을 눌러 볼 회사를 바꾸면 [홈] · [프로젝트] · [사람] · [회사 정보] 가 그 회사 기준으로 바뀜.
diff --git a/A05_EduDetail/guide/B01/09_시스템_관리자.md b/A05_EduDetail/guide/B01/09_시스템_관리자.md
deleted file mode 100644
index 97cfdb9a9..000000000
--- a/A05_EduDetail/guide/B01/09_시스템_관리자.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# 시스템 관리자 구역
-
-시스템 관리자 계정에만 보이는 구역. 회사 · 사용자 · 서버 상태를 관리.
-
-## 여는 길
-
-- 시스템 관리자로 로그인한 뒤 대시보드.
-
-
-
-그림 번호 — ① 리소스 현황 · ② 시스템 설정 · ③ 프로젝트 · ④ 임시 보관함 · ⑤ 사용자 관리 · ⑥ 회사 관리 · ⑦ 시스템 로그. 이름 · 메일 · 회사는 견본으로 가린 그림.
-
-## 단계
-
-| 단계 | 할 일 |
-| --- | --- |
-| 1 | 구역 제목 옆 회사 이름 알약(예: 예시건설 ▾) 누름 |
-| 2 | 회사 선택 창에서 회사를 고름 |
-| 3 | [프로젝트] · [사용자 관리] · [가입 요청] · [회사 관리] 가 그 회사 것으로 바뀜 |
-| 4 | [사용자 관리] 의 [+] 로 사용자 추가 · [역할 변경] · [사용자 삭제] |
-| 5 | [회사 관리] 의 [+] 로 회사 생성 · [로고 지정…] 으로 로고 |
-
-## 보이는 것
-
-- [리소스 현황]: CPU · 메모리 · 디스크 · 활성 사용자 · 활성 프로젝트와 최근 7일 그래프.
-- [시스템 설정]: 카드 다섯 장 — 마스터 데이터 · 구조물 조합 · 구조물 옵션 · 도면 양식 · 계산 자리.
-- [시스템 로그] 맨 아래: 동작 · 대상 · 접속 주소 · 일시.
-
-> 주의: [삭제] 는 올린 원본과 계산 결과까지 서버에서 지워 복구 불가.
diff --git a/A05_EduDetail/guide/B01/10_사용자_가이드.md b/A05_EduDetail/guide/B01/10_사용자_가이드.md
new file mode 100644
index 000000000..f8ef3e450
--- /dev/null
+++ b/A05_EduDetail/guide/B01/10_사용자_가이드.md
@@ -0,0 +1,20 @@
+# 사용자 가이드
+
+모든 화면의 사용법을 그림과 함께 보는 창.
+
+## 여는 길
+
+- 왼쪽 메뉴 [사용자 가이드](도움 묶음) — 가이드 창이 바로 열림.
+- 머리 줄 [?] — 지금 보는 페이지의 절이 먼저 열림.
+- 빈 페이지 안내의 [사용법 보기].
+- 작업 화면(파일입력 · 노선설계 등)에서는 왼쪽 아래 [?].
+
+## 보이는 것
+
+| 구역 | 하는 일 |
+| --- | --- |
+| 왼쪽 차례 | 임도 설계 → 안정성평가 → 예정노선 묶음 · 페이지 · 절 · 누르면 그 절로 감 |
+| 오른쪽 글 | 절마다 글 · 그림 · 그림 번호 표 · 다른 절로 가는 링크 |
+| [닫기] | 창을 닫음 |
+
+> 참고: 시스템 관리자는 글 · 그림을 더블클릭해 바로 고침.
diff --git a/A05_EduDetail/guide/B01/11_지식_챗봇.md b/A05_EduDetail/guide/B01/11_지식_챗봇.md
new file mode 100644
index 000000000..396f8adfa
--- /dev/null
+++ b/A05_EduDetail/guide/B01/11_지식_챗봇.md
@@ -0,0 +1,20 @@
+# 지식 챗봇
+
+임도 · 사방 법령과 기술 자료를 묻고 근거 문서와 함께 답을 받는 창.
+
+## 여는 길
+
+- 왼쪽 메뉴 [지식 챗봇](도움 묶음) — 챗봇 창이 바로 열림.
+- 대시보드 어디서나 오른쪽 아래 둥근 단추.
+
+
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 안내 카드 | [챗봇 열기] — 닫은 창을 다시 엶 |
+| 2 | 챗봇 창 | 아래 칸에 질문 입력 → [보내기] · 답 아래 근거 문서 · [×] 로 닫음 |
+| 3 | 둥근 단추 | 챗봇 창을 열고 닫음 |
+
+- Enter = 보내기 · Shift+Enter = 줄 바꿈.
+
+> 참고: 답은 근거 확인용 — 설계 값은 원문 · 지침에서 다시 확인.
diff --git a/A05_EduDetail/guide/B01/12_내_정보.md b/A05_EduDetail/guide/B01/12_내_정보.md
new file mode 100644
index 000000000..0074c1b8c
--- /dev/null
+++ b/A05_EduDetail/guide/B01/12_내_정보.md
@@ -0,0 +1,31 @@
+# 내 정보
+
+내 이름 · 서명 · 비밀번호 · 화면 테마 · 내 설계 기본값을 고치는 곳.
+
+## 여는 길
+
+- 머리 줄 오른쪽 내 이름 → [내 정보].
+- 홈 처음 시작의 [내 정보 ›].
+
+
+
+| 번호 | 구역 | 하는 일 |
+| --- | --- | --- |
+| 1 | 이름 · 역할 · 이메일 | 지금 로그인한 계정 |
+| 2 | [내 정보] | 이 페이지를 엶 |
+| 3 | [터치 모드] | [자동] · [켬] · [끔] — 터치 화면 조작 방식 |
+
+- 그 밖 — [어두운 화면] · [English] · [설정(마우스 · 단축키)] · [홈페이지] · [로그아웃].
+
+
+
+| 번호 | 묶음 | 하는 일 |
+| --- | --- | --- |
+| 1 | 기본정보 | 이름 · 직급 · 부서 · 전화 · 서명 [선택…] → [기본정보 저장] · 이메일은 로그인 계정이라 못 바꿈 |
+| 2 | 보안 | 비밀번호 [변경] — 현재 비밀번호 · 새 비밀번호(8 자 이상) · 확인 → [비밀번호 변경] |
+| 3 | 화면 | 테마 [밝음] · [어두움] |
+| 4 | 내 설계 기본값 | [구조물 조합 (내 것)] [열기] — 내 개인 층 구조물 조합 |
+
+> 참고: 이름 · 서명은 도면 표제란 · 보고서 서명란에 들어감.
+
+> 참고: 서명 칸은 회사에 속한 계정에만 보임.
diff --git a/A05_EduDetail/guide/B01/B01_00_overview.webp b/A05_EduDetail/guide/B01/B01_00_overview.webp
index 1217ad294..f5b0f32bd 100644
Binary files a/A05_EduDetail/guide/B01/B01_00_overview.webp and b/A05_EduDetail/guide/B01/B01_00_overview.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_01_home_first.webp b/A05_EduDetail/guide/B01/B01_01_home_first.webp
new file mode 100644
index 000000000..50de12881
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_01_home_first.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_01_home_many.webp b/A05_EduDetail/guide/B01/B01_01_home_many.webp
new file mode 100644
index 000000000..617af72b7
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_01_home_many.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_01_new_project_picker.webp b/A05_EduDetail/guide/B01/B01_01_new_project_picker.webp
deleted file mode 100644
index 82ba83252..000000000
Binary files a/A05_EduDetail/guide/B01/B01_01_new_project_picker.webp and /dev/null differ
diff --git a/A05_EduDetail/guide/B01/B01_02_new_project.webp b/A05_EduDetail/guide/B01/B01_02_new_project.webp
new file mode 100644
index 000000000..21ed72287
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_02_new_project.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_02_projects.webp b/A05_EduDetail/guide/B01/B01_02_projects.webp
new file mode 100644
index 000000000..397b939a3
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_02_projects.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_02_projects_table.webp b/A05_EduDetail/guide/B01/B01_02_projects_table.webp
new file mode 100644
index 000000000..bbe364756
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_02_projects_table.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_02_temp_create_modal.webp b/A05_EduDetail/guide/B01/B01_02_temp_create_modal.webp
deleted file mode 100644
index 0acbd0bab..000000000
Binary files a/A05_EduDetail/guide/B01/B01_02_temp_create_modal.webp and /dev/null differ
diff --git a/A05_EduDetail/guide/B01/B01_03_assigned.webp b/A05_EduDetail/guide/B01/B01_03_assigned.webp
new file mode 100644
index 000000000..9ff2e4e11
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_03_assigned.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_03_member_add_modal.webp b/A05_EduDetail/guide/B01/B01_03_member_add_modal.webp
deleted file mode 100644
index 903fc26d8..000000000
Binary files a/A05_EduDetail/guide/B01/B01_03_member_add_modal.webp and /dev/null differ
diff --git a/A05_EduDetail/guide/B01/B01_04_role_change.webp b/A05_EduDetail/guide/B01/B01_04_role_change.webp
deleted file mode 100644
index 355b36187..000000000
Binary files a/A05_EduDetail/guide/B01/B01_04_role_change.webp and /dev/null differ
diff --git a/A05_EduDetail/guide/B01/B01_04_temp.webp b/A05_EduDetail/guide/B01/B01_04_temp.webp
new file mode 100644
index 000000000..a54451884
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_04_temp.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_04_temp_modal.webp b/A05_EduDetail/guide/B01/B01_04_temp_modal.webp
new file mode 100644
index 000000000..48aa3d06d
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_04_temp_modal.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_05_company_edit.webp b/A05_EduDetail/guide/B01/B01_05_company_edit.webp
deleted file mode 100644
index 79cbded57..000000000
Binary files a/A05_EduDetail/guide/B01/B01_05_company_edit.webp and /dev/null differ
diff --git a/A05_EduDetail/guide/B01/B01_05_member_add.webp b/A05_EduDetail/guide/B01/B01_05_member_add.webp
new file mode 100644
index 000000000..cac0e10a9
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_05_member_add.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_05_people.webp b/A05_EduDetail/guide/B01/B01_05_people.webp
new file mode 100644
index 000000000..2c64f145b
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_05_people.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_06_chat.webp b/A05_EduDetail/guide/B01/B01_06_chat.webp
deleted file mode 100644
index abf2e5f03..000000000
Binary files a/A05_EduDetail/guide/B01/B01_06_chat.webp and /dev/null differ
diff --git a/A05_EduDetail/guide/B01/B01_06_project_detail.webp b/A05_EduDetail/guide/B01/B01_06_project_detail.webp
new file mode 100644
index 000000000..b171bae1d
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_06_project_detail.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_07_company.webp b/A05_EduDetail/guide/B01/B01_07_company.webp
new file mode 100644
index 000000000..0c977eec9
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_07_company.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_07_company_edit.webp b/A05_EduDetail/guide/B01/B01_07_company_edit.webp
new file mode 100644
index 000000000..853f1dc45
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_07_company_edit.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_07_setting_card.webp b/A05_EduDetail/guide/B01/B01_07_setting_card.webp
deleted file mode 100644
index e89b5ae56..000000000
Binary files a/A05_EduDetail/guide/B01/B01_07_setting_card.webp and /dev/null differ
diff --git a/A05_EduDetail/guide/B01/B01_08_company_defaults.webp b/A05_EduDetail/guide/B01/B01_08_company_defaults.webp
new file mode 100644
index 000000000..ed5825e83
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_08_company_defaults.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_08_sys_overview.webp b/A05_EduDetail/guide/B01/B01_08_sys_overview.webp
deleted file mode 100644
index 6a9d5665e..000000000
Binary files a/A05_EduDetail/guide/B01/B01_08_sys_overview.webp and /dev/null differ
diff --git a/A05_EduDetail/guide/B01/B01_09_sys_companies.webp b/A05_EduDetail/guide/B01/B01_09_sys_companies.webp
new file mode 100644
index 000000000..f37c0ad87
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_09_sys_companies.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_09_sys_defaults.webp b/A05_EduDetail/guide/B01/B01_09_sys_defaults.webp
new file mode 100644
index 000000000..b7efc253e
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_09_sys_defaults.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_09_sys_logs.webp b/A05_EduDetail/guide/B01/B01_09_sys_logs.webp
new file mode 100644
index 000000000..34b668978
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_09_sys_logs.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_09_sys_overview.webp b/A05_EduDetail/guide/B01/B01_09_sys_overview.webp
new file mode 100644
index 000000000..c040ea56a
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_09_sys_overview.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_09_sys_project_edit.webp b/A05_EduDetail/guide/B01/B01_09_sys_project_edit.webp
deleted file mode 100644
index 5aca1089a..000000000
Binary files a/A05_EduDetail/guide/B01/B01_09_sys_project_edit.webp and /dev/null differ
diff --git a/A05_EduDetail/guide/B01/B01_09_sys_users.webp b/A05_EduDetail/guide/B01/B01_09_sys_users.webp
new file mode 100644
index 000000000..4172c9eae
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_09_sys_users.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_10_sys_project_del.webp b/A05_EduDetail/guide/B01/B01_10_sys_project_del.webp
deleted file mode 100644
index 425b9121b..000000000
Binary files a/A05_EduDetail/guide/B01/B01_10_sys_project_del.webp and /dev/null differ
diff --git a/A05_EduDetail/guide/B01/B01_11_chat.webp b/A05_EduDetail/guide/B01/B01_11_chat.webp
new file mode 100644
index 000000000..7a48ae054
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_11_chat.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_11_project_table.webp b/A05_EduDetail/guide/B01/B01_11_project_table.webp
deleted file mode 100644
index efa415923..000000000
Binary files a/A05_EduDetail/guide/B01/B01_11_project_table.webp and /dev/null differ
diff --git a/A05_EduDetail/guide/B01/B01_12_me.webp b/A05_EduDetail/guide/B01/B01_12_me.webp
new file mode 100644
index 000000000..01bad8dbb
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_12_me.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_12_profile.webp b/A05_EduDetail/guide/B01/B01_12_profile.webp
deleted file mode 100644
index 0a854fff3..000000000
Binary files a/A05_EduDetail/guide/B01/B01_12_profile.webp and /dev/null differ
diff --git a/A05_EduDetail/guide/B01/B01_12_user_menu.webp b/A05_EduDetail/guide/B01/B01_12_user_menu.webp
new file mode 100644
index 000000000..a9c45e01f
Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_12_user_menu.webp differ
diff --git a/A05_EduDetail/guide/B01/B01_13_security.webp b/A05_EduDetail/guide/B01/B01_13_security.webp
deleted file mode 100644
index c080751ec..000000000
Binary files a/A05_EduDetail/guide/B01/B01_13_security.webp and /dev/null differ
diff --git a/A05_EduDetail/guide/B01/_scenes.json b/A05_EduDetail/guide/B01/_scenes.json
index 09ae40852..a84781cff 100644
--- a/A05_EduDetail/guide/B01/_scenes.json
+++ b/A05_EduDetail/guide/B01/_scenes.json
@@ -1,77 +1,246 @@
[
{
"name": "B01_00_overview",
- "route": "#/b01-account",
- "project": "none",
+ "route": "#/b01-account?view=home",
"account": "company_admin",
+ "project": "none",
"viewport": [
1600,
- 1800
+ 720
],
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','')"
},
{
- "wait": ".b01-dashboard__grid"
+ "wait": ".b01-shell__page"
},
{
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
}
],
"clip": null,
"callouts": [
{
"n": 1,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(1)"
+ "sel": ".b01-shell__org"
},
{
"n": 2,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(2)"
+ "sel": ".b01-shell__help-btn"
},
{
"n": 3,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(3)"
+ "sel": ".b01-shell__head .b01-shell__icon-btn"
},
{
"n": 4,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(4)"
+ "sel": ".b01-shell__user"
},
{
"n": 5,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(7)"
+ "sel": ".b01-shell__nav"
},
{
"n": 6,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(8)"
+ "sel": ".b01-shell__page"
},
{
"n": 7,
"sel": ".b01-knowledge-chat__toggle"
- },
- {
- "n": 8,
- "sel": ".app-burger"
}
]
},
{
- "name": "B01_01_new_project_picker",
- "route": "#/b01-account",
- "project": "none",
+ "name": "B01_01_home_first",
+ "route": "#/b01-account?view=home",
"account": "company_admin",
+ "project": "none",
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','')"
},
{
- "wait": ".b01-dashboard__grid"
+ "wait": ".b01-shell__page"
},
{
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
+ "wait_ms": 1200
},
{
- "click": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(2) .ui-btn--filled"
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ }
+ ],
+ "clip": ".b01-shell__page",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-home__seg"
+ },
+ {
+ "n": 2,
+ "sel": ".b01-home__head .ui-btn--filled"
+ },
+ {
+ "n": 3,
+ "sel": [
+ ".b01-home__step >> nth=0",
+ ".b01-home__step >> nth=-1"
+ ]
+ },
+ {
+ "n": 4,
+ "sel": "aside.b01-home__side"
+ }
+ ]
+ },
+ {
+ "name": "B01_01_home_many",
+ "route": "#/b01-account?view=home",
+ "account": "sys",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ }
+ ],
+ "clip": ".b01-shell__page",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-home__seg"
+ },
+ {
+ "n": 2,
+ "sel": ".b01-home__kpis"
+ },
+ {
+ "n": 3,
+ "sel": "aside.b01-home__side"
+ }
+ ]
+ },
+ {
+ "name": "B01_02_projects",
+ "route": "#/b01-account?view=projects",
+ "account": "sys",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ }
+ ],
+ "clip": ".b01-shell__page",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-proj-seg"
+ },
+ {
+ "n": 2,
+ "sel": ".b01-proj-head .ui-btn--filled"
+ },
+ {
+ "n": 3,
+ "sel": ".b01-proj-search"
+ },
+ {
+ "n": 4,
+ "sel": [
+ ".b01-proj-chip >> nth=0",
+ ".b01-proj-chip >> nth=-1"
+ ]
+ },
+ {
+ "n": 5,
+ "sel": [
+ ".b01-proj-select",
+ ".b01-proj-tools .b01-proj-seg"
+ ]
+ },
+ {
+ "n": 6,
+ "sel": ".b01-proj-card >> visible=true"
+ }
+ ]
+ },
+ {
+ "name": "B01_02_projects_table",
+ "route": "#/b01-account?view=projects",
+ "account": "sys",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ },
+ {
+ "click": ".b01-proj-seg button:nth-child(2)"
+ },
+ {
+ "wait": ".b01-proj-table"
+ }
+ ],
+ "clip": ".b01-shell__page",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-proj-table tr >> nth=0"
+ },
+ {
+ "n": 2,
+ "sel": ".b01-proj-more >> visible=true"
+ }
+ ]
+ },
+ {
+ "name": "B01_02_new_project",
+ "route": "#/b01-account?view=projects",
+ "account": "company_admin",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ },
+ {
+ "click": ".b01-proj-head .ui-btn--filled"
},
{
"wait": ".b01-new-project__grid"
@@ -101,426 +270,665 @@
]
},
{
- "name": "B01_02_temp_create_modal",
- "route": "#/b01-account",
- "project": "none",
+ "name": "B01_03_assigned",
+ "route": "#/b01-account?view=assigned",
"account": "company_admin",
+ "project": "none",
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','')"
},
{
- "wait": ".b01-dashboard__grid"
+ "wait": ".b01-shell__page"
},
{
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
+ "wait_ms": 1200
},
{
- "click": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(3) .ui-btn--filled"
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ }
+ ],
+ "clip": ".b01-shell__page",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-pg__title-wrap"
},
{
- "wait_ms": 800
+ "n": 2,
+ "sel": ".ui-empty"
+ }
+ ]
+ },
+ {
+ "name": "B01_04_temp",
+ "route": "#/b01-account?view=temp",
+ "account": "company_admin",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ }
+ ],
+ "clip": ".b01-shell__page",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-pg__action button"
+ },
+ {
+ "n": 2,
+ "sel": ".ui-empty"
+ }
+ ]
+ },
+ {
+ "name": "B01_04_temp_modal",
+ "route": "#/b01-account?view=temp",
+ "account": "company_admin",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ },
+ {
+ "click": ".b01-pg__action button"
+ },
+ {
+ "wait": ".b01-dashboard__modal-panel"
+ },
+ {
+ "wait_ms": 500
}
],
"clip": ".b01-dashboard__modal-panel",
"callouts": [
{
"n": 1,
- "sel": ".b01-dashboard__modal-panel input, .b01-dashboard__modal-panel select"
+ "sel": ".b01-dashboard__modal-panel input"
},
{
"n": 2,
- "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions"
- }
- ]
- },
- {
- "name": "B01_03_member_add_modal",
- "route": "#/b01-account",
- "project": "none",
- "account": "company_admin",
- "before": [
- {
- "eval": "document.head.insertAdjacentHTML('beforeend','')"
- },
- {
- "wait": ".b01-dashboard__grid"
- },
- {
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
- },
- {
- "click": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(4) .ui-btn--filled"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b01-dashboard__modal-panel",
- "callouts": [
- {
- "n": 1,
- "sel": ".b01-dashboard__modal-panel input, .b01-dashboard__modal-panel select"
- },
- {
- "n": 2,
- "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions"
- }
- ]
- },
- {
- "name": "B01_04_role_change",
- "route": "#/b01-account",
- "project": "none",
- "account": "company_admin",
- "before": [
- {
- "eval": "document.head.insertAdjacentHTML('beforeend','')"
- },
- {
- "wait": ".b01-dashboard__grid"
- },
- {
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
- },
- {
- "click": "button:has-text('역할 변경')"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b01-dashboard__modal-panel",
- "callouts": [
- {
- "n": 1,
- "sel": ".b01-dashboard__modal-panel input, .b01-dashboard__modal-panel select"
- },
- {
- "n": 2,
- "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions"
- }
- ]
- },
- {
- "name": "B01_05_company_edit",
- "route": "#/b01-account",
- "project": "none",
- "account": "company_admin",
- "before": [
- {
- "eval": "document.head.insertAdjacentHTML('beforeend','')"
- },
- {
- "wait": ".b01-dashboard__grid"
- },
- {
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
- },
- {
- "click": "button:has-text('회사 정보 수정')"
- },
- {
- "wait_ms": 800
- }
- ],
- "clip": ".b01-dashboard__modal-panel",
- "callouts": [
- {
- "n": 1,
- "sel": ".b01-dashboard__modal-panel input, .b01-dashboard__modal-panel select"
- },
- {
- "n": 2,
- "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions"
- }
- ]
- },
- {
- "name": "B01_06_chat",
- "route": "#/b01-account",
- "project": "none",
- "viewport": [
- 1600,
- 900
- ],
- "account": "company_admin",
- "before": [
- {
- "eval": "document.head.insertAdjacentHTML('beforeend','')"
- },
- {
- "wait": ".b01-dashboard__grid"
- },
- {
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
- },
- {
- "click": ".b01-knowledge-chat__toggle"
- },
- {
- "wait_ms": 1000
- }
- ],
- "clip": ".b01-knowledge-chat__panel",
- "callouts": [
- {
- "n": 1,
- "sel": ".b01-knowledge-chat__panel .b01-knowledge-chat__messages"
- },
- {
- "n": 2,
- "sel": ".b01-knowledge-chat__panel .b01-knowledge-chat__form"
+ "sel": ".b01-dashboard__modal-panel .ui-btn >> nth=0"
},
{
"n": 3,
- "sel": ".b01-knowledge-chat__panel .b01-knowledge-chat__close"
+ "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions"
}
]
},
{
- "name": "B01_07_setting_card",
- "route": "#/b01-account",
- "project": "none",
+ "name": "B01_05_people",
+ "route": "#/b01-account?view=people",
"account": "company_admin",
+ "project": "none",
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','')"
},
{
- "wait": ".b01-dashboard__grid"
+ "wait": ".b01-shell__page"
},
{
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
}
],
- "clip": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(1)",
- "callouts": []
+ "clip": ".b01-shell__page",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-pg__action button"
+ },
+ {
+ "n": 2,
+ "sel": ".b01-pg-tabs"
+ },
+ {
+ "n": 3,
+ "sel": ".ui-table-wrap thead"
+ },
+ {
+ "n": 4,
+ "sel": ".ui-row-menu__btn >> nth=0"
+ }
+ ]
},
{
- "name": "B01_08_sys_overview",
- "route": "#/b01-account",
+ "name": "B01_05_member_add",
+ "route": "#/b01-account?view=people",
+ "account": "company_admin",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ },
+ {
+ "click": ".b01-pg__action button"
+ },
+ {
+ "wait": ".b01-dashboard__modal-panel"
+ },
+ {
+ "wait_ms": 500
+ }
+ ],
+ "clip": ".b01-dashboard__modal-panel",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-dashboard__modal-panel input"
+ },
+ {
+ "n": 2,
+ "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions"
+ }
+ ]
+ },
+ {
+ "name": "B01_06_project_detail",
+ "route": "#/b01-account?view=project&id=c2390e1c-ee66-42ef-8cd7-253ec00bf904",
+ "account": "sys",
"project": "none",
"viewport": [
1600,
- 3080
+ 1100
],
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','')"
},
{
- "wait": ".b01-dashboard__grid"
+ "wait": ".b01-shell__page"
},
{
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ },
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ }
+ ],
+ "settle_ms": 1500,
+ "clip": ".b01-shell__page",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-pd-crumb"
+ },
+ {
+ "n": 2,
+ "sel": "[data-open-work]"
+ },
+ {
+ "n": 3,
+ "sel": ".b01-pd-steps"
+ },
+ {
+ "n": 4,
+ "sel": ".b01-pd-map, .b01-pd-kpis"
+ },
+ {
+ "n": 5,
+ "sel": ".b01-pd-kv"
+ },
+ {
+ "n": 6,
+ "sel": ".b01-pd-timeline"
+ }
+ ]
+ },
+ {
+ "name": "B01_07_company",
+ "route": "#/b01-account?view=company",
+ "account": "company_admin",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ }
+ ],
+ "clip": ".b01-shell__page",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-pg__action button"
+ },
+ {
+ "n": 2,
+ "sel": ".ui-setting-card"
+ },
+ {
+ "n": 3,
+ "sel": ".ui-setting-row:last-child .ui-setting-row__side"
+ }
+ ]
+ },
+ {
+ "name": "B01_07_company_edit",
+ "route": "#/b01-account?view=company",
+ "account": "company_admin",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ },
+ {
+ "click": ".b01-pg__action button"
+ },
+ {
+ "wait": ".b01-dashboard__modal-panel"
+ },
+ {
+ "wait_ms": 500
+ }
+ ],
+ "clip": ".b01-dashboard__modal-panel",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-dashboard__modal-panel input >> nth=0"
+ },
+ {
+ "n": 2,
+ "sel": ".b01-dashboard__modal-panel input[type=file]"
+ },
+ {
+ "n": 3,
+ "sel": ".b01-dashboard__modal-panel button:has-text('주소 검색')"
+ },
+ {
+ "n": 4,
+ "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions"
+ }
+ ]
+ },
+ {
+ "name": "B01_08_company_defaults",
+ "route": "#/b01-account?view=company-defaults",
+ "account": "user",
+ "project": "none",
+ "viewport": [
+ 1600,
+ 600
+ ],
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
}
],
"clip": null,
"callouts": [
{
"n": 1,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(1)"
+ "sel": ".b01-shell__nav"
},
{
"n": 2,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(2)"
+ "sel": ".ui-setting-row"
+ }
+ ]
+ },
+ {
+ "name": "B01_09_sys_overview",
+ "route": "#/b01-account?view=sys-overview",
+ "account": "sys",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ }
+ ],
+ "clip": ".b01-shell__page",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-sys-stat >> nth=0"
+ },
+ {
+ "n": 2,
+ "sel": ".b01-sys-gauge >> nth=0"
},
{
"n": 3,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(3)"
+ "sel": ".b01-sys-chart"
+ }
+ ]
+ },
+ {
+ "name": "B01_09_sys_companies",
+ "route": "#/b01-account?view=sys-companies",
+ "account": "sys",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ }
+ ],
+ "clip": ".b01-shell__page",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-pg__action button"
+ },
+ {
+ "n": 2,
+ "sel": ".b01-pg__body input"
+ },
+ {
+ "n": 3,
+ "sel": ".ui-table-wrap thead"
},
{
"n": 4,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(4)"
- },
- {
- "n": 5,
- "sel": ".b01-dashboard__section:has-text('사용자 관리')"
- },
- {
- "n": 6,
- "sel": ".b01-dashboard__section:has-text('회사 관리')"
- },
- {
- "n": 7,
- "sel": ".b01-dashboard__section:has-text('시스템 로그')"
+ "sel": ".ui-row-menu__btn >> nth=0"
}
]
},
{
- "name": "B01_09_sys_project_edit",
- "route": "#/b01-account",
+ "name": "B01_09_sys_users",
+ "route": "#/b01-account?view=sys-users",
+ "account": "sys",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ }
+ ],
+ "clip": ".b01-shell__page",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-pg__action button"
+ },
+ {
+ "n": 2,
+ "sel": ".b01-sys-tool"
+ },
+ {
+ "n": 3,
+ "sel": ".ui-table-wrap thead"
+ },
+ {
+ "n": 4,
+ "sel": ".ui-row-menu__btn >> nth=0"
+ }
+ ]
+ },
+ {
+ "name": "B01_09_sys_defaults",
+ "route": "#/b01-account?view=sys-defaults",
+ "account": "sys",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ }
+ ],
+ "clip": ".b01-shell__page",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-sys-group >> nth=0"
+ },
+ {
+ "n": 2,
+ "sel": ".b01-sys-group >> nth=1"
+ },
+ {
+ "n": 3,
+ "sel": ".b01-sys-group >> nth=2"
+ }
+ ]
+ },
+ {
+ "name": "B01_09_sys_logs",
+ "route": "#/b01-account?view=sys-logs",
+ "account": "sys",
"project": "none",
"viewport": [
1600,
- 1400
+ 800
],
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','')"
},
{
- "wait": ".b01-dashboard__grid"
+ "wait": ".b01-shell__page"
},
{
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
+ "wait_ms": 1200
},
{
- "click": "tr:has-text('가이드_용화'):has-text('임도설계') .ui-btn--ghost"
- },
- {
- "wait_ms": 800
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
}
],
- "clip": ".b01-dashboard__modal-panel",
+ "clip": null,
"callouts": [
{
"n": 1,
- "sel": ".b01-dashboard__modal-panel input, .b01-dashboard__modal-panel select"
+ "sel": ".b01-sys-tool"
},
{
"n": 2,
- "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions"
+ "sel": ".ui-table-wrap thead"
}
]
},
{
- "name": "B01_10_sys_project_del",
- "route": "#/b01-account",
+ "name": "B01_11_chat",
+ "route": "#/b01-account?view=chat",
+ "account": "company_admin",
"project": "none",
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','')"
},
{
- "wait": ".b01-dashboard__grid"
+ "wait": ".b01-shell__page"
},
{
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
+ "wait_ms": 1200
},
{
- "click": "tr:has-text('가이드_용화'):has-text('임도설계') .ui-btn--danger",
- "confirm": true
- },
- {
- "wait_ms": 800
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
}
],
- "after": [
- {
- "click": "button:has-text('취소')"
- }
- ],
- "clip": ".b01-dashboard__modal-panel",
+ "clip": null,
"callouts": [
{
"n": 1,
- "sel": ".b01-dashboard__modal-panel .b01-dashboard__modal-text"
+ "sel": ".b01-shell__help"
},
{
"n": 2,
- "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions"
- }
- ]
- },
- {
- "name": "B01_11_project_table",
- "route": "#/b01-account",
- "project": "none",
- "before": [
- {
- "eval": "document.head.insertAdjacentHTML('beforeend','')"
- },
- {
- "wait": ".b01-dashboard__grid"
- },
- {
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
- },
- {
- "wait": "table"
- }
- ],
- "clip": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(3)",
- "callouts": [
- {
- "n": 1,
- "sel": ".b01-dashboard__section:nth-child(3) th:nth-child(1)"
- },
- {
- "n": 2,
- "sel": ".b01-dashboard__section:nth-child(3) th:nth-child(4)"
+ "sel": ".b01-knowledge-chat__panel"
},
{
"n": 3,
- "sel": ".b01-dashboard__section:nth-child(3) .b01-dashboard__actions .ui-btn--ghost"
+ "sel": ".b01-knowledge-chat__toggle"
}
]
},
{
- "name": "B01_12_profile",
- "route": "#/b01-account",
- "project": "none",
+ "name": "B01_12_me",
+ "route": "#/b01-account?view=me",
"account": "company_admin",
+ "project": "none",
+ "viewport": [
+ 1600,
+ 1100
+ ],
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','')"
},
{
- "wait": ".b01-dashboard__grid"
+ "wait": ".b01-shell__page"
},
{
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
+ "wait_ms": 1200
},
{
- "wait_ms": 500
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
}
],
- "clip": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(7)",
+ "clip": ".b01-shell__page",
"callouts": [
{
"n": 1,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(7) input >> nth=0"
+ "sel": ".b01-sys-group >> nth=0"
},
{
"n": 2,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(7) button:has-text('기본정보 저장')"
- }
- ]
- },
- {
- "name": "B01_13_security",
- "route": "#/b01-account",
- "project": "none",
- "account": "company_admin",
- "before": [
- {
- "eval": "document.head.insertAdjacentHTML('beforeend','')"
- },
- {
- "wait": ".b01-dashboard__grid"
- },
- {
- "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()"
- },
- {
- "wait_ms": 500
- }
- ],
- "clip": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(8)",
- "callouts": [
- {
- "n": 1,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(8) input >> nth=0"
- },
- {
- "n": 2,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(8) input >> nth=1"
+ "sel": ".b01-sys-group >> nth=1"
},
{
"n": 3,
- "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(8) button:has-text('비밀번호 변경')"
+ "sel": ".b01-sys-group >> nth=2"
+ },
+ {
+ "n": 4,
+ "sel": ".b01-sys-group >> nth=3"
+ }
+ ]
+ },
+ {
+ "name": "B01_12_user_menu",
+ "route": "#/b01-account?view=home",
+ "account": "company_admin",
+ "project": "none",
+ "before": [
+ {
+ "eval": "document.head.insertAdjacentHTML('beforeend','')"
+ },
+ {
+ "wait": ".b01-shell__page"
+ },
+ {
+ "wait_ms": 1200
+ },
+ {
+ "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()"
+ },
+ {
+ "click": ".b01-shell__user-btn"
+ },
+ {
+ "wait": ".b01-shell__menu"
+ },
+ {
+ "wait_ms": 300
+ }
+ ],
+ "clip": ".b01-shell__menu",
+ "callouts": [
+ {
+ "n": 1,
+ "sel": ".b01-shell__menu-who"
+ },
+ {
+ "n": 2,
+ "sel": ".b01-shell__menu .b01-shell__menu-item >> nth=0"
+ },
+ {
+ "n": 3,
+ "sel": ".b01-shell__menu-touch"
}
]
}