Merge remote-tracking branch 'origin/sub_laptop_4' into main_laptop_1

This commit is contained in:
2026-10-26 09:40:42 +09:00
25 changed files with 881 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
# 대시보드
프로젝트를 만들고 고르고 관리하는 첫 화면. 계정 정보와 회사 정보도 여기서 고침.
## 여는 길
- 로그인하면 처음 열리는 화면.
- 다른 화면에서는 ☰ 를 눌러 서랍을 열고 [대시보드] 선택.
![화면 한눈에](B01_00_overview.webp)
## 화면 구역
보이는 구역은 로그인한 사람의 역할(일반 사용자 · 회사 관리자 · 시스템 관리자)에 따라 다름. 그림은 회사 관리자 화면(예시 회사라 프로젝트 · 보관 자료가 비어 있음).
| 번호 | 구역 | 하는 일 |
| --- | --- | --- |
| 1 | 시스템 설정 | 구조물 조합 같은 기본값 화면으로 가는 카드 · 제목을 누르면 접힘 |
| 2 | 프로젝트 | 내 프로젝트 표 · [+] 로 새 프로젝트 · 단계 막대로 작업 화면 이동 |
| 3 | 임시 보관함 | 프로젝트를 만들기 전에 파일을 30일 동안 올려 두는 곳 |
| 4 | 팀원 관리 | 같은 회사 사람 추가 · 역할 변경 · 제거 (회사 관리자만) |
| 5 | 기본정보 | 내 이름 · 직급 · 연락처 · 서명 |
| 6 | 보안 | 비밀번호 변경 |
| 7 | 챗봇 | 법령 · 지침 질문 창 · 화면 오른쪽 아래 둥근 단추 |
| 8 | ☰ | 구역으로 바로 가는 목록 · 다른 화면 이동 |
회사 관리자는 가입 요청 · 회사 정보 구역이 더 보이고, 받은 예정노선이 있으면 그 구역이 프로젝트 아래에 붙음.
## 작업 순서
1. 처음이면 [기본정보] 와 [보안] 확인.
2. [프로젝트] 의 [+] 로 새 프로젝트 만들기 → [새 프로젝트 만들기](B01/01_새_프로젝트_만들기).
3. 측량 파일이 아직 없으면 [임시 보관함] 에 먼저 올려 두기 → [임시 보관함](B01/04_임시_보관함).
4. 만든 프로젝트는 표의 단계 막대에서 이어서 작업 → [프로젝트 목록](B01/02_프로젝트_목록).
시스템 관리자 화면은 [시스템 관리자 구역](B01/09_시스템_관리자) 참고.
> 참고: 구역 제목을 누르면 그 구역이 접히고 다시 누르면 펼쳐짐.
@@ -0,0 +1,34 @@
# 새 프로젝트 만들기
만들 프로젝트의 종류를 고르는 창. 종류마다 입력 화면이 따로 열림.
## 여는 길
- [프로젝트] 구역 오른쪽 위 [+] 누름.
![새 프로젝트 고르기 창](B01_01_new_project_picker.webp)
## 단계
| 단계 | 할 일 |
| --- | --- |
| 1 | [프로젝트] 구역의 [+] 누름 |
| 2 | 창의 카드 넷 가운데 만들 종류 선택 |
| 3 | 열린 입력 화면에서 이어서 작업 |
그림 번호는 아래 표의 번호와 같음. 흐린 카드는 지금 계정으로 못 고르는 카드.
| 번호 | 카드 | 열리는 화면 |
| --- | --- | --- |
| 1 | 예정노선 | 예정노선 등록 · 산림청 계정만 가능 |
| 2 | 임도설계 | 프로젝트 등록 → [B02](B02/00_설명서) |
| 3 | 사방설계 | 「준비 중」 표시 · 아직 못 고름 |
| 4 | 안정성평가 | 안정성평가 생성 → [E01](E01/00_설명서) |
## 보이는 것
- 못 고르는 카드는 흐리게 보임.
- 창 오른쪽 위 [닫기] 로 만들지 않고 돌아감.
- 임도설계를 고르면 창이 닫히고 프로젝트 등록 화면으로 넘어감 → [프로젝트 등록](B02/00_설명서).
> 참고: 예정노선 카드는 산림청 계정(시스템 관리자 · go.kr 메일)만 켜짐. 그 밖의 계정은 흐리게 보임.
@@ -0,0 +1,44 @@
# 프로젝트 목록
내 프로젝트를 한 표로 보고, 진행 단계로 바로 이동하고, 이름 · 정보를 고치거나 지움.
## 여는 길
- 대시보드의 [프로젝트] 구역.
![프로젝트 표](B01_11_project_table.webp)
## 단계
그림 번호 — ① [프로젝트명] 칸 머리 · ② [워크플로우] 칸 머리(단계 막대) · ③ [수정] 단추.
| 단계 | 할 일 |
| --- | --- |
| 1 | 표에서 프로젝트를 찾음 · 칸은 프로젝트명 · 종류 · 지역 · 워크플로우 · 수정일 · 관리 |
| 2 | 워크플로우 칸의 단계 막대에서 이어갈 단계(파일입력 · 전처리 · 노선설계 …)를 누름 |
| 3 | 그 프로젝트의 해당 화면이 열림 |
| 4 | 정보를 바꾸려면 [수정], 지우려면 [삭제] |
## 보이는 것
- 단계 막대 색: 완료 · 진행 중 · 다시 확인 필요 · 시작 전이 서로 다른 색.
- 종류 칸: 임도설계 · 예정노선 · 안정성평가 중 하나. 종류마다 단계 이름이 다름.
### 프로젝트 수정
![프로젝트 수정 창](B01_09_sys_project_edit.webp)
- 그림 ① 프로젝트명 칸 · 아래로 지역 · 임도 종류 · 사업 연도 · 예상 연장 · 노선 시작 · 종료 누가거리 · 비고 · 시행청 · 연도·기번(표지) · 사업량(표지) · 설계일자 · 책임자 셋 · 회사 로고 · 참여자(수정을 허락할 사람 체크)를 고침.
- 그림 ② 아래 [취소] · [확인] 단추 줄.
- [확인] 을 누르면 저장.
### 프로젝트 삭제
![프로젝트 삭제 확인 창](B01_10_sys_project_del.webp)
- [삭제] 를 누르면 「프로젝트 삭제」 확인 창이 뜸(그림 ① 안내 글). 올린 라이다 원본과 모든 계산 결과가 서버에서 영구 삭제되고 되돌릴 수 없음.
- 그림 ② 에서 마음이 바뀌면 [취소].
> 주의: 삭제한 프로젝트는 복구 불가. 확인 창의 글을 읽고 [확인] 누르기.
> 참고: [수정] · [삭제] 단추는 권한이 있는 사람에게만 보임.
@@ -0,0 +1,24 @@
# 받은 예정노선
산림청이 우리 회사에 지정해 준 예정노선 연도를 확인하고 임도 프로젝트에 연결.
## 여는 길
- 대시보드의 [받은 예정노선] 구역. 받은 것이 있을 때만 보임.
> 참고: 받은 예정노선이 없는 계정에는 이 구역이 아예 안 보임 — 그림 없음.
## 단계
| 단계 | 할 일 |
| --- | --- |
| 1 | 표에서 예정노선 이름 · 연도 · 확정 시각 · 연결 상태 확인 |
| 2 | [보기] 로 노선 확인 |
| 3 | [연결] 을 눌러 창에서 「새 임도 프로젝트로」 또는 「기존 프로젝트에 연결」 선택 |
| 4 | 연결된 프로젝트의 파일입력 화면에서 계획노선 칸이 채워짐 → [B03 예정노선에서 가져오기](B03/04_예정노선_가져오기) |
## 보이는 것
- 연결 상태 칸: 연결됨 · 미연결 · 업데이트 있음 중 하나.
> 참고: 「업데이트 있음」 이면 산림청이 노선을 고친 것. [다시 가져오기] 로 새 노선을 받음.
@@ -0,0 +1,32 @@
# 임시 보관함
프로젝트를 만들기 전에 측량 파일을 먼저 올려 두는 곳. 30일 동안 보관됨.
## 여는 길
- 대시보드의 [임시 보관함] 구역.
![임시 자료 등록 창](B01_02_temp_create_modal.webp)
그림 번호 — ① [보관 이름] 칸 · ② [취소] · [확인] 단추 줄. 보관 자료가 없으면 구역에 「데이터가 없습니다」 만 보임.
## 단계
| 단계 | 할 일 |
| --- | --- |
| 1 | [임시 보관함] 구역 오른쪽 위 [+] 누름 |
| 2 | [보관 이름] 칸에 알아보기 쉬운 이름 입력 (예: 2026년 3공구 측량자료) |
| 3 | [파일 선택] 을 눌러 계획노선 · 라이다 · 좌표계 · 래스터 파일을 한꺼번에 고름 |
| 4 | 고른 파일 목록 확인 후 [확인] |
| 5 | 올리기가 끝나면 구역 목록에 보관 묶음이 생김 |
## 보이는 것
- 묶음마다 이름 · 파일 개수 · 보관 만료일과 상태(업로드 중 · 사용 가능 · 프로젝트 연결됨).
- 파일마다 종류 · 파일명 · 크기 · 상태(저장 완료 · 대기 · 업로드 중 · 이어올리기 대기 · 실패).
- 묶음에 [파일 추가] 로 빠진 파일을 더 올리거나 파일 · 묶음을 지울 수 있음.
- 올린 묶음은 파일 입력 화면의 [임시 보관함] 단추로 프로젝트에 가져옴 → [B03 임시 보관함에서 가져오기](B03/03_임시_보관함에서_가져오기).
> 주의: 보관 기간(30일)이 지나면 묶음이 사라짐.
> 참고: 필수 파일(계획노선 · 라이다 · 지형 좌표계)을 다 올린 묶음만 프로젝트에서 고를 수 있음.
@@ -0,0 +1,61 @@
# 회사와 팀원
같은 회사 사람을 추가하고 역할을 정하고, 회사 정보를 고침. 회사 관리자 전용 구역 모음.
## 여는 길
- 대시보드의 [팀원 관리] · [가입 요청] · [회사 정보] 구역. 회사 관리자 계정에서만 모두 보임.
![팀원 추가 창](B01_03_member_add_modal.webp)
## 단계
### 팀원 추가
그림 번호 — ① [이름 · 이메일 검색] 칸 · ② [취소] · [확인] 단추 줄.
| 단계 | 할 일 |
| --- | --- |
| 1 | [팀원 관리] 구역 오른쪽 위 [+] 누름 |
| 2 | [이름 · 이메일 검색] 칸에 입력하고 [검색] |
| 3 | 목록에서 사람을 고르거나, 없으면 [초대 메일 발송] |
| 4 | [확인] |
### 역할 바꾸기
그림 번호 — ① [역할] 고르기 칸 · ② [취소] · [확인] 단추 줄.
![역할 변경 창](B01_04_role_change.webp)
| 단계 | 할 일 |
| --- | --- |
| 1 | 팀원 줄의 [역할 변경] 누름 |
| 2 | 역할을 USER 또는 ADMIN 에서 선택 |
| 3 | [확인] |
### 가입 요청 처리
- [가입 요청] 구역에 요청이 있으면 줄마다 [승인] · [거절].
### 회사 정보 고치기
그림 번호 — ① [사업자등록번호] 칸 · ② [취소] · [확인] 단추 줄.
![회사 정보 수정 창](B01_05_company_edit.webp)
| 단계 | 할 일 |
| --- | --- |
| 1 | [회사 정보] 구역의 [회사 정보 수정] 누름 |
| 2 | 사업자등록번호 · 회사명 · 대표자명 입력 |
| 3 | [주소 검색] 으로 주소를 고르거나 [직접 입력] 으로 기본주소 · 상세주소 입력 |
| 4 | 로고 파일(png · jpg · webp · svg · 2MB 이하) 선택 — 도면 표제란에 쓰임 |
| 5 | [확인] |
## 보이는 것
- 팀원 표: 이메일 · 이름 · 직급 · 부서 · 역할 · 관리([수정] · [역할 변경] · [제거]).
- 회사 정보 구역: 회사명 · 활성 사용자 수 · 프로젝트 수 · 주소 · 회사 로고.
> 주의: 회사의 유일한 관리자는 삭제할 수 없음. 시스템 관리자로는 역할을 바꿀 수 없음.
> 참고: 일반 사용자 화면에는 [팀원 관리] 와 [가입 요청] 이 없고 [회사 정보] 는 읽기만 가능.
@@ -0,0 +1,40 @@
# 내 정보와 보안
내 이름 · 직급 · 연락처 · 서명과 비밀번호를 고침. 모든 사용자 공통.
## 여는 길
- 대시보드 아래쪽 [기본정보] · [보안] 구역.
![기본정보 구역](B01_12_profile.webp)
## 단계
### 기본정보
그림 번호 — ① [이름] 칸 · ② [기본정보 저장] 단추.
| 단계 | 할 일 |
| --- | --- |
| 1 | 이름 · 직급 · 부서 · 연락처 칸을 고침 (이메일은 읽기만) |
| 2 | 서명 줄의 [선택…] 으로 서명 그림 파일을 올림 — 도면 표제란에 쓰임 |
| 3 | [기본정보 저장] |
### 비밀번호 바꾸기
![보안 구역](B01_13_security.webp)
그림 번호 — ① [현재 비밀번호] 칸 · ② [새 비밀번호] 칸(옆 칸이 [새 비밀번호 확인]) · ③ [비밀번호 변경] 단추.
| 단계 | 할 일 |
| --- | --- |
| 1 | [현재 비밀번호] 입력 |
| 2 | [새 비밀번호] 와 [새 비밀번호 확인] 에 같은 값 입력 (8자 이상) |
| 3 | [비밀번호 변경] |
## 보이는 것
- 저장하면 「저장되었습니다.」 알림.
- 새 비밀번호가 서로 다르면 「새 비밀번호가 일치하지 않습니다.」 · 8자 미만이면 「비밀번호는 8자 이상이어야 합니다.」 알림.
> 참고: 프로젝트 등록 화면의 책임자 목록에는 여기 적은 이름과 직급이 나옴 → [B02 도면 표제란](B02/03_도면_표제란).
@@ -0,0 +1,25 @@
# 시스템 설정 카드
설계 기본값(구조물 조합 · 옵션 · 도면 양식)을 고치는 화면으로 가는 바로가기.
## 여는 길
- 대시보드 맨 위 [시스템 설정] 구역.
![시스템 설정 카드](B01_07_setting_card.webp)
## 단계
| 단계 | 할 일 |
| --- | --- |
| 1 | 카드를 하나 누름 |
| 2 | 열린 마스터 템플릿 화면에서 값을 고침 |
## 보이는 것
- 그림은 회사 관리자 화면의 카드 줄. 시스템 관리자는 카드가 다섯 장 → [시스템 관리자 구역](B01/09_시스템_관리자).
- 카드 아래 작은 글이 내 권한을 알려 줌 (예: 마스터 읽기 · 회사 수정 · 개인 수정).
- 일반 사용자 · 회사 관리자는 「구조물 조합」 카드 하나 · 시스템 관리자는 다섯 장.
> 참고: 구역 제목을 누르면 카드 줄이 접힘.
+27
View File
@@ -0,0 +1,27 @@
# 챗봇
법령과 지침을 물어보고 근거 문서와 함께 답을 받는 창.
## 여는 길
- 화면 오른쪽 아래 둥근 [챗봇] 단추.
![챗봇 창](B01_06_chat.webp)
그림 번호 — ① 대화가 쌓이는 칸 · ② 질문 입력 칸과 [보내기] · ③ 닫기 ✕.
## 단계
| 단계 | 할 일 |
| --- | --- |
| 1 | 둥근 단추를 눌러 창을 엶 |
| 2 | 아래 입력 칸에 질문 입력 · 줄을 바꾸려면 Shift+Enter |
| 3 | [보내기] 또는 Enter |
| 4 | 답과 근거 문서가 위쪽에 쌓임 |
| 5 | 닫으려면 오른쪽 위 ✕ |
## 보이는 것
- 처음에는 「안녕하세요! 법령이나 지침에 대해 질문해 주세요. 근거 문서도 함께 보여드릴게요.」 인사.
> 참고: 답은 참고용. 설계 값은 해당 법령 원문으로 확인.
@@ -0,0 +1,29 @@
# 시스템 관리자 구역
시스템 관리자 계정에만 보이는 구역. 회사 · 사용자 · 서버 상태를 관리.
## 여는 길
- 시스템 관리자로 로그인한 뒤 대시보드.
![시스템 관리자 대시보드](B01_08_sys_overview.webp)
그림 번호 — ① 리소스 현황 · ② 시스템 설정 · ③ 프로젝트 · ④ 임시 보관함 · ⑤ 사용자 관리 · ⑥ 회사 관리 · ⑦ 시스템 로그. 이름 · 메일 · 회사는 견본으로 가린 그림.
## 단계
| 단계 | 할 일 |
| --- | --- |
| 1 | 구역 제목 옆 회사 이름 알약(예: 예시건설 ▾) 누름 |
| 2 | 회사 선택 창에서 회사를 고름 |
| 3 | [프로젝트] · [사용자 관리] · [가입 요청] · [회사 관리] 가 그 회사 것으로 바뀜 |
| 4 | [사용자 관리] 의 [+] 로 사용자 추가 · [역할 변경] · [사용자 삭제] |
| 5 | [회사 관리] 의 [+] 로 회사 생성 · [로고 지정…] 으로 로고 |
## 보이는 것
- [리소스 현황]: CPU · 메모리 · 디스크 · 활성 사용자 · 활성 프로젝트와 최근 7일 그래프.
- [시스템 설정]: 카드 다섯 장 — 마스터 데이터 · 구조물 조합 · 구조물 옵션 · 도면 양식 · 계산 자리.
- [시스템 로그] 맨 아래: 동작 · 대상 · 접속 주소 · 일시.
> 주의: [삭제] 는 올린 원본과 계산 결과까지 서버에서 지워 복구 불가.
Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

+527
View File
@@ -0,0 +1,527 @@
[
{
"name": "B01_00_overview",
"route": "#/b01-account",
"project": "none",
"account": "company_admin",
"viewport": [
1600,
1800
],
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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);})()"
}
],
"clip": null,
"callouts": [
{
"n": 1,
"sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(1)"
},
{
"n": 2,
"sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(2)"
},
{
"n": 3,
"sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(3)"
},
{
"n": 4,
"sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(4)"
},
{
"n": 5,
"sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(7)"
},
{
"n": 6,
"sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(8)"
},
{
"n": 7,
"sel": ".b01-knowledge-chat__toggle"
},
{
"n": 8,
"sel": ".app-burger"
}
]
},
{
"name": "B01_01_new_project_picker",
"route": "#/b01-account",
"project": "none",
"account": "company_admin",
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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(2) .ui-btn--filled"
},
{
"wait": ".b01-new-project__grid"
},
{
"wait_ms": 500
}
],
"clip": ".b01-new-project",
"callouts": [
{
"n": 1,
"sel": ".b01-new-project__card[data-new-project=plan]"
},
{
"n": 2,
"sel": ".b01-new-project__card[data-new-project=road]"
},
{
"n": 3,
"sel": ".b01-new-project__card[data-new-project=erosion]"
},
{
"n": 4,
"sel": ".b01-new-project__card[data-new-project=stability]"
}
]
},
{
"name": "B01_02_temp_create_modal",
"route": "#/b01-account",
"project": "none",
"account": "company_admin",
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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(3) .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_03_member_add_modal",
"route": "#/b01-account",
"project": "none",
"account": "company_admin",
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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"
},
{
"n": 3,
"sel": ".b01-knowledge-chat__panel .b01-knowledge-chat__close"
}
]
},
{
"name": "B01_07_setting_card",
"route": "#/b01-account",
"project": "none",
"account": "company_admin",
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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);})()"
}
],
"clip": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(1)",
"callouts": []
},
{
"name": "B01_08_sys_overview",
"route": "#/b01-account",
"project": "none",
"viewport": [
1600,
3080
],
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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);})()"
}
],
"clip": null,
"callouts": [
{
"n": 1,
"sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(1)"
},
{
"n": 2,
"sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(2)"
},
{
"n": 3,
"sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(3)"
},
{
"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('시스템 로그')"
}
]
},
{
"name": "B01_09_sys_project_edit",
"route": "#/b01-account",
"project": "none",
"viewport": [
1600,
1400
],
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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": "tr:has-text('가이드_용화'):has-text('임도설계') .ui-btn--ghost"
},
{
"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_10_sys_project_del",
"route": "#/b01-account",
"project": "none",
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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": "tr:has-text('가이드_용화'):has-text('임도설계') .ui-btn--danger",
"confirm": true
},
{
"wait_ms": 800
}
],
"after": [
{
"click": "button:has-text('취소')"
}
],
"clip": ".b01-dashboard__modal-panel",
"callouts": [
{
"n": 1,
"sel": ".b01-dashboard__modal-panel .b01-dashboard__modal-text"
},
{
"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','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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)"
},
{
"n": 3,
"sel": ".b01-dashboard__section:nth-child(3) .b01-dashboard__actions .ui-btn--ghost"
}
]
},
{
"name": "B01_12_profile",
"route": "#/b01-account",
"project": "none",
"account": "company_admin",
"before": [
{
"eval": "document.head.insertAdjacentHTML('beforeend','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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(7)",
"callouts": [
{
"n": 1,
"sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(7) input >> 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','<style>.ui-toast-container{display:none!important}</style>')"
},
{
"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"
},
{
"n": 3,
"sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(8) button:has-text('비밀번호 변경')"
}
]
}
]