보이는 것을 정할 때 읽는 문서

디자인 가이드

「한 손으로 예약 확인과 시술 기록을 끝내는 차분한 모바일 업무 화면」이 방향입니다. 색·글꼴·간격과 화면별 적용 기준이 기계가 읽는 계약으로도 함께 있습니다.

13,851자 · 시스템이 만든 그대로입니다

DESIGN CONTRACT V1

동네 헤어샵의 시술 이력과 예약 확인 디자인 가이드

권장 방향: 디자이너가 현장에서 한 손으로 예약 확인, 고객 찾기, 최근 시술 이력과 염색약 번호·배합 확인, 시술 기록 작성을 빠르게 끝내는 차분한 모바일 업무 UI다. 장식적인 미용실 이미지보다 시간, 고객, 담당 디자이너, 발송 상태와 다음 행동을 우선한다. 원장님의 자료 가져오기와 병합 검토는 넓은 화면에서 비교 효율을 높이되 좁은 화면에서도 단계별로 완료할 수 있게 한다.

현장 중심 · 빠른 고객 식별 · 최근 시술 우선 · 배합 강조 · 예약 상태 명확화 · 안전한 병합 · 권한 구분 · 차분한 살롱 톤 · 모바일 우선

레이아웃
Mobile first
기본 글꼴
system-ui
조사 출처
6곳

COLOR SYSTEM

컬러 시스템

각 토큰의 실제 색상과 사용 맥락의 본문 대비를 보여 줍니다. AA 기준은 4.5:1입니다.

#F6F7F4

캔버스

16.60:1 · AA

전체 화면 배경과 카드 사이 영역

#FFFFFF

표면

17.85:1 · AA

카드, 입력 영역, 바텀시트와 대화상자 배경

#17211B

기본 텍스트

14.36:1 · AA

제목, 본문, 핵심 수치와 입력값

#5B665F

보조 텍스트

5.19:1 · AA

설명, 작성일, 담당자와 부가 정보

#D6DDD8

테두리

12.92:1 · AA

카드 구분, 입력 테두리와 표 행 구분

#176B4D

브랜드 기본

2.76:1 · 큰 글자용

주요 버튼, 선택 탭, 활성 필터와 핵심 링크

#0E5139

브랜드 눌림

1.92:1 · 큰 글자용

주요 버튼의 눌림 상태와 강한 강조

#E5F2EB

브랜드 연한 배경

15.50:1 · AA

선택 상태, 성공 요약과 최근 시술 강조 배경

#245EA8

정보

2.76:1 · 큰 글자용

처리 중, 안내, 연결 정보와 포커스 보조

#E9F2FC

정보 연한 배경

15.79:1 · AA

안내 배너와 처리 중 상태 배지 배경

#7A5200

경고

2.58:1 · 큰 글자용

발송 예정, 검토 필요, 미작성과 동의 미확인

#FFF2CC

경고 연한 배경

16.00:1 · AA

검토 필요 행, 미작성 할 일과 주의 배너 배경

#B42318

위험

2.72:1 · 큰 글자용

발송 실패, 노쇼, 자동 발송 중지와 파괴적 행동

#FCE8E6

위험 연한 배경

15.15:1 · AA

오류 배너, 실패 상태와 병합 취소 경고 배경

#116149

성공

2.41:1 · 큰 글자용

발송 성공, 시술 기록 완료와 연결 정상 상태

#145FCC

포커스

3.01:1 · 큰 글자용

키보드 포커스 링과 접근성 강조선

TYPOGRAPHY

한글 타이포그래피

제목 · -0.025em

흙에서 완성까지, 한눈에

본문 · -0.01em

작품의 현재 단계와 선반 위치를 기록하고, 다음 가마에 넣을 작품을 빠르게 확인합니다.

가마 02 · 1,250°C · 8–11시간

SPACING & RADIUS

간격과 형태

4px
8px
12px
16px
20px
24px
32px
40px
48px
64px
80px
sm
6px
md
10px
lg
16px
full
9999px

RESPONSIVE LAYOUT

그리드와 화면 전략

디자이너의 반복 과업은 시술 전후에 스마트폰으로 오늘·내일 예약, 고객의 최근 시술과 배합, 시술 기록을 확인하는 흐름이다. 기본은 4열 모바일 카드와 단일 열 입력 화면으로 구성한다. 원장님이 주로 사용하는 CSV 열 연결, 오류 행 검토, 고객 병합 비교와 직원 설정은 lg 이상에서 12열 그리드, 표와 양쪽 비교 패널을 사용한다. 좁은 화면에서는 같은 정보를 단계형 화면과 세로 카드로 제공해 핵심 조회와 처리를 유지한다.

모바일 · 4

데스크톱 · 12

sm
480px
md
768px
lg
1024px
xl
1280px
최대 폭
1200px

COMPONENTS

컴포넌트와 상태

계약 토큰을 적용한 버튼·입력·카드 견본과 구현 규칙입니다.

버튼

입력 상태

물레컵 3점

초벌 대기

2번 선반 · 1칸
예상 완료 9월 18일

앱 셸

모바일 하단 메뉴 · 태블릿 상단 메뉴 · 데스크톱 좌측 메뉴 · 기본 · 메뉴 펼침 · 세션 만료 · 접근 제한

오늘·내일 예약 확인, 고객 목록, 뜸해진 고객을 공통 메뉴로 제공한다. 원장 설정은 원장님에게만 표시한다. 현재 가게명과 역할을 항상 확인할 수 있게 하며 다른 가게 데이터가 섞여 보이지 않게 한다.

상단 앱 바

기본 · 뒤로 가기 · 저장 행동 포함 · 검색 포함 · 기본 · 스크롤 고정 · 오프라인 안내

화면명과 현재 날짜 또는 고객명을 우선 표시한다. 모바일에서는 주요 행동 하나만 직접 노출하고 나머지는 더보기 메뉴에 둔다.

주요 버튼

채움 · 윤곽선 · 텍스트 · 위험 · 아이콘 · 기본 · 호버 · 포커스 · 눌림 · 비활성 · 처리 중

한 화면의 채움 버튼은 원칙적으로 하나만 사용한다. 처리 중에는 버튼 폭을 유지하고 중복 제출을 막는다. 아이콘만 있는 버튼에는 접근 가능한 이름을 제공한다.

검색 입력

고객 통합 검색 · 휴대전화 번호 우선 검색 · 목록 내 검색 · 빈 값 · 입력 중 · 검색 중 · 결과 있음 · 결과 없음 · 검증 오류

안내 문구는 이름 또는 휴대전화 번호 검색으로 사용한다. 공백, 하이픈, 점, 괄호와 국가번호 입력을 허용하되 원본 입력과 정규화 결과를 구분한다. 뒷자리 검색 결과가 여러 건이면 마스킹 번호, 담당 디자이너와 최근 방문일로 구분한다.

휴대전화 번호 입력

신규 고객 · 고객 수정 · 예약 연락처 스냅샷 · CSV 검토 · 미입력 · 정상 · 기존 고객 발견 · 검토 필요 · 중복 충돌

입력 중 읽기 쉬운 형식으로 표시하되 저장 전 원본 입력값을 보존한다. 기존 011, 016, 017, 018, 019 번호를 010으로 바꾸지 않는다. 같은 가게에서 같은 정규화 번호가 발견되면 신규 생성을 바로 진행하지 않고 기존 고객 또는 병합 검토를 보여준다.

날짜 전환 탭

오늘·내일 · 고객 상세 탭 · 시술 종류 필터 · 선택 · 미선택 · 포커스 · 비활성

오늘과 내일에는 날짜와 요일을 함께 표시한다. 탭의 선택 상태는 색상뿐 아니라 굵기, 밑줄 또는 배경과 접근성 상태값으로 전달한다.

필터 칩과 필터 시트

빠른 필터 · 복수 선택 · 단일 선택 · 모바일 바텀시트 · 선택 · 미선택 · 결과 없음 · 초기화 가능

모바일에는 내 담당, 발송 필요, 미확인, 시술 기록 미작성 같은 핵심 필터만 노출한다. 추가 필터는 바텀시트에 두고 적용된 조건 수와 전체 초기화를 제공한다.

상태 배지

운영 메시지 · 방문 결과 · 고객 단계 · 동의 상태 · 고객 기록 상태 · 계정 상태 · 발송 예정 · 처리 중 · 성공 · 실패 · 자동 발송 중지 · 수동 연락 완료 · 검토 필요

색상과 함께 상태명을 항상 표시한다. 방문 결과와 운영 메시지 상태를 한 배지로 합치지 않는다. 고객 취소와 매장 취소도 서로 다른 텍스트로 표시한다.

예약 확인 카드

오늘 · 내일 · 즉시 처리 필요 · 시술 기록 미작성 · 취소됨 · 기본 · 발송 예정 · 발송 실패 · 방문 결과 미입력 · 시술 완료 · 노쇼 · 고객 취소 · 매장 취소

시간, 고객명, 마스킹된 예약 연락처 스냅샷, 담당 디자이너, 예정 시술, 접점, 고객 확인 상태, 내일·당일 안내 상태와 방문 결과를 표시한다. 고객 보기와 현재 필요한 행동 하나를 우선 노출한다. 취소된 건은 자동 발송 대상에서 제외됐음을 명시한다.

처리 필요 배너

발송 실패 · 자동 발송 중지 · 시술 기록 미작성 · 방문 결과 확인 필요 · 검토 필요 · 펼침 · 접힘 · 처리 중 · 해결됨

문제 원인, 영향받은 건수와 다음 행동을 한 문장으로 설명한다. 알림톡 오류는 알림톡 설정 또는 수동 연락 대상 목록으로 연결한다.

고객 목록 카드

기본 · 배합 있음 · 다음 예약 있음 · 뜸해짐 · 중복 정보 확인 필요 · 기본 · 선택 · 호버 · 접근 제한 · 병합됨

고객명, 마스킹 번호, 담당 디자이너, 고객 단계, 최근 방문일, 최근 시술, 다음 예약과 마케팅 수신동의 상태를 우선순위에 따라 표시한다. 병합됨 고객은 대표 고객으로 이동하는 안내만 제공한다.

최근 시술 카드

염색 · 펌 · 커트 · 클리닉 · 기타 · 기록 없음 · 기본 · 배합 있음 · 사진 있음 · 임시 저장 · 접근 제한

시술일, 실제 담당 디자이너, 시술 종류, 핵심 메모를 표시한다. 염색 기록은 염색약 번호와 배합 첫 줄을 별도 강조하고 배합 보기를 직접 제공한다. 사진은 첨부 수만 먼저 보이고 요청할 때 확대한다.

시술 이력 타임라인

전체 · 염색 · 펌 · 커트 · 클리닉 · 배합 있음 · 사진 있음 · 로딩 · 결과 있음 · 결과 없음 · 부분 오류

최신순으로 표시하며 날짜, 시술 종류, 실제 담당 디자이너, 배합 요약, 메모와 사진 수를 제공한다. 긴 메모는 접고 펼칠 수 있게 하되 염색약 번호와 배합은 접힌 상태에서도 확인할 수 있게 한다.

폼 필드

한 줄 입력 · 여러 줄 입력 · 선택 · 날짜·시간 · 복수 시술 선택 · 동의 상태 · 기본 · 포커스 · 입력 완료 · 필수 오류 · 도움말 · 읽기 전용 · 비활성

라벨을 입력창 밖에 유지하고 필수 여부와 오류 이유를 문장으로 표시한다. 시술 메모처럼 중요한 긴 입력은 저장 실패 후에도 값을 유지한다. 민감 정보는 기본 필드로 추가하지 않는다.

사진 첨부

카메라 촬영 · 파일 선택 · 썸네일 목록 · 전체 화면 보기 · 동의 확인 필요 · 업로드 중 · 완료 · 실패 · 삭제 확인

사진은 선택 입력이다. 촬영·보관 동의와 보유기간을 확인할 수 없으면 첨부를 막고 이유를 표시한다. 사진 실패가 시술 기록 전체 저장을 막지 않게 분리해 처리한다.

CSV 가져오기 단계 표시

파일 업로드 · 열 연결 · 형식 검증 · 오류 수정 · 중복 검토 · 반영 결과 · 대기 · 진행 중 · 완료 · 오류 · 재처리

현재 단계, 완료된 단계와 남은 단계를 텍스트로 표시한다. 파일을 운영 데이터에 바로 반영하지 않으며 검증 전에는 반영 버튼을 비활성화한다. 같은 가져오기 작업을 다시 실행할 때 중복 생성되지 않음을 결과 화면에서 알려준다.

검토 표와 모바일 행 카드

CSV 오류 행 · 열 연결 · 직원 목록 · 병합 이력 · 알림톡 템플릿 · 기본 · 정렬 · 필터 · 행 편집 · 오류 · 빈 결과

lg 이상에서는 고정 헤더 표를 사용하고 좁은 화면에서는 각 셀의 항목명을 포함한 세로 카드로 바꾼다. CSV 오류 행에는 원본 행 번호, 원본 값, 오류 이유와 해당 행만 재처리하는 행동을 제공한다.

병합 비교 패널

양쪽 비교 · 모바일 단계 비교 · 충돌 없음 · 충돌 있음 · 대표 고객 미선택 · 대표 고객 선택 · 검토 필요 · 병합 처리 중 · 병합 완료 · 동시 수정 감지

이름, 정규화 번호, 담당 디자이너, 동의 상태, 미래 예약, 발송 예정 알림톡과 이동할 기록 수를 비교한다. 선택한 대표값과 보수적인 동의 처리 결과를 고정 요약에 표시한다. 병합 사유 입력과 최종 확인 전에는 실행할 수 없게 한다.

연결 상태 카드

발신 프로필 · 예약 확인 템플릿 · 당일 안내 템플릿 · API 연결 · 발송 결과 수신 · 사용 가능 · 연결 필요 · 확인 필요 · 자동 발송 중지 · 오류

현재 상태, 마지막 확인 시각, 자동 발송 가능 여부와 중지 원인을 표시한다. 연결 또는 템플릿이 유효하지 않으면 실패 상태만 보여주지 말고 수동 연락 관리로 이동하는 행동을 제공한다.

대화상자와 바텀시트

확인 · 파괴적 확인 · 빠른 수정 · 필터 · 수동 연락 기록 · 열림 · 처리 중 · 오류 · 닫힘

모바일의 짧은 선택은 바텀시트, 병합 실행·취소와 계정 차단은 명시적 대화상자를 사용한다. 파괴적 행동에는 대상, 영향과 되돌릴 수 있는 범위를 표시한다.

빈 상태와 오류 상태

예약 없음 · 고객 없음 · 시술 기록 없음 · 검색 결과 없음 · 권한 없음 · 데이터 오류 · 기본 · 재시도 가능 · 행동 가능 · 접근 차단

단순히 비어 있다고 표시하지 말고 이유와 다음 행동을 제공한다. 권한 없음은 데이터 존재 여부를 과도하게 노출하지 않으며 정책이 확정된 경우에만 임시 열람 요청 행동을 표시한다.

토스트와 실시간 상태 안내

저장 완료 · 저장 실패 · 발송 상태 변경 · 병합 완료 · 재처리 완료 · 정보 · 성공 · 경고 · 오류

중요한 실패는 토스트만 사용하지 말고 해당 카드나 필드에도 남긴다. 보조 기술이 상태 변화를 읽을 수 있도록 적절한 실시간 알림 영역을 사용한다.

APPLICATION

업계 조사와 화면별 적용

· 로그인 후 첫 화면은 전체 예약 달력이 아니라 오늘·내일 예약 확인이어야 한다.

· 예약 카드에서 고객 상세까지 바로 이동하고 최근 시술, 염색약 번호와 배합을 적은 조작으로 확인할 수 있어야 한다.

· 고객 검색과 중복 판정의 중심은 이름이 아니라 가게 식별값과 정규화 번호의 조합이다.

· 예약 확인 건에는 고객 확인 상태, 운영 메시지 상태, 방문 결과와 시술 기록 미작성 여부를 함께 보여줘야 한다.

· 알림톡 실패나 자동 발송 중지는 숨기지 않고 수동 연락 대상과 처리 결과로 연결해야 한다.

· 고객 상세에서는 전체 이력보다 최근 시술과 다음 예약을 먼저 보여주는 정보 계층이 적합하다.

· 염색약 번호와 배합은 긴 시술 메모에 묻히지 않도록 별도 영역과 배합 있음 표시를 사용해야 한다.

· 시술 사진은 선택 항목이며 피부 상태나 알레르기 같은 민감한 항목은 기본 필드로 만들지 않는다.

· 뜸해진 고객 화면은 자동 광고 발송이 아니라 마케팅 수신동의 확인과 실제 연락 결과 기록을 위한 내부 목록이다.

· CSV 가져오기와 고객 병합은 업로드 즉시 반영하지 않고 열 연결, 검증, 오류 수정, 충돌 검토와 실행 결과 확인을 거쳐야 한다.

· 원장님은 현재 가게 전체를 보고 디자이너는 자기 담당 고객을 자세히 보는 권한 차이를 목록, 상세 화면과 서버 요청에 동일하게 적용해야 한다.

· 네이버 예약·톡톡과 카카오톡 채널 대화는 기존 도구에 남기고 온헤어에는 예약 확인에 필요한 최소 정보와 고객·시술 이력만 표시해야 한다.

today-tomorrow-reservations

로그인 후 첫 화면이다. 상단에 오늘·내일 전환, 날짜, 내 담당 또는 전체 범위와 예약 확인 건 등록 버튼을 둔다. 즉시 처리 필요, 시술 기록 작성 필요, 내일 안내 확인, 일반 예약 목록 순으로 묶고 각 묶음의 건수를 표시한다. 예약 카드는 시간순으로 정렬하며 고객명, 마스킹된 예약 연락처 스냅샷, 담당 디자이너, 예정 시술, 접점, 고객 확인 상태, 내일·당일 알림톡 상태와 방문 결과를 보여준다. 방문 완료를 선택하면 시술 기록 작성으로 바로 이동한다. 발송 실패나 자동 발송 중지는 수동 연락 기록 또는 알림톡 설정으로 연결한다. 전체 예약 달력은 넣지 않는다.

customer-list

상단에 고정 검색창을 두고 이름 또는 휴대전화 번호 검색을 안내한다. 원장님은 현재 가게 전체, 디자이너는 자기 담당 고객을 기본 범위로 본다. 결과에는 고객명, 마스킹 번호, 담당 디자이너, 고객 단계, 최근 방문일, 최근 시술, 배합 있음, 다음 예약과 마케팅 수신동의 상태를 표시한다. 이름이 같아도 번호가 다르면 별도 고객으로 보여준다. 같은 정규화 번호에서 충돌이 발견되면 원장님에게 중복 고객 병합 검토 진입을 제공하고 디자이너에게는 중복 후보 제시만 허용한다.

customer-detail

첫 화면에 고객명, 마스킹 번호, 담당 디자이너, 방문 횟수, 고객 단계, 최근 방문일과 다음 예약을 표시한다. 바로 아래에 최근 시술 카드를 두고 최근 염색 기록이면 염색약 번호와 배합 첫 줄을 노출한다. 요약, 시술 이력, 사진 탭을 사용하며 개인정보 및 마케팅 수신동의는 최근 시술보다 아래의 고객 관리 정보에 둔다. 하단에는 시술 기록 작성과 예약 등록 중 현재 맥락에 맞는 주요 행동을 고정한다. 디자이너가 자기 담당 고객이 아닌 상세에 접근하면 내용을 반환하지 않고 권한 안내를 표시한다. 대체 시술 열람 방식은 확인 필요이며 확정된 정책에 따라 임시 열람 요청, 원장님 승인 또는 담당 디자이너 변경 UI 중 하나만 활성화한다.

treatment-record

단일 열 폼으로 구성하고 고객, 연결된 예약 확인 건, 시술 일시와 실제 담당 디자이너를 상단에 표시한다. 입력 순서는 시술 종류, 시술명, 염색약 번호, 배합, 시술 메모, 선택 사진, 다음 예약이다. 시술 종류와 시술 메모는 기록 완료에 필수다. 염색을 선택하면 최근 염색 배합 참고 카드와 이번 기록에 복사 행동을 제공하되 복사 후 수정 여부를 사용자가 확인하게 한다. 사진은 촬영·보관 동의와 보유기간이 확인된 경우에만 선택 첨부한다. 임시 저장과 기록 완료를 구분하고 저장 실패 시 입력값을 유지한다. 완료 후 연결된 시술 기록 미작성 내부 할 일을 자동 완료한다.

inactive-customers

마지막 시술 후 달력 기준 2개월이 지났고 미래 예약이 없는 고객만 표시한다. 기준은 확인 필요 가정임을 원장 설정 또는 도움말에 명시한다. 목록에는 고객명, 담당 디자이너, 마지막 시술일, 경과 기간, 마케팅 수신동의 상태와 최근 연락 결과를 표시한다. 원장님은 전체, 디자이너는 자기 담당 고객 범위로 본다. 고객별로 연락 일시, 연락 채널, 연락 결과와 작성자를 기록한다. 마케팅 수신동의가 거부 또는 동의 미확인인 경우 광고성 연락으로 오해할 행동을 강조하지 않는다. 자동 재방문 광고 발송이나 일괄 발송 기능은 제공하지 않는다.

import-merge

원장님 전용 단계형 화면으로 파일 업로드, 열 연결, 형식 검증, 오류 수정, 중복 검토, 반영 결과 순서를 사용한다. CSV 원본은 임시 저장 영역에서 검증하고 반영 전 성공 예정, 검토 필요와 오류 행을 구분한다. 전화번호, 날짜, 담당자 연결 오류에 원본 행 번호와 이유를 표시하고 해당 행만 수정·재처리할 수 있게 한다. 연결되지 않은 담당자 이름은 이전 담당자 텍스트로 보존됨을 표시한다. 같은 파일의 재처리로 중복 생성되지 않도록 가져오기 작업 상태와 이전 처리 결과를 보여준다. lg 이상에서는 표, 좁은 화면에서는 단계별 행 카드를 사용한다. 수첩 자료 직접 입력은 고객 정보와 시술 기록 작성 흐름으로 분리한다.

staff-permissions

원장님만 접근한다. 직원명, 로그인 수단, 역할, 현재 가게 소속, 계정 활성 상태와 마지막 권한 변경일을 표시한다. 직원 추가와 수정에서 역할은 원장님 또는 디자이너만 제공한다. 마지막 원장님을 디자이너로 변경하거나 차단하려는 경우 운영 불가 영향을 설명하고 저장을 막는다. 계정을 비활성화해도 기존 고객, 예약 확인 건과 시술 기록은 삭제되지 않음을 확인 문구로 표시한다. 권한 변경 이력을 같은 화면에서 확인할 수 있게 하며 디자이너에게 자료 가져오기, 병합 실행·취소와 직원 설정 권한을 노출하지 않는다.

login

브랜드 표식, 로그인 필드와 로그인 버튼만 중심에 둔 단순한 화면으로 구성한다. 로그인 실패 시 계정 존재 여부를 구체적으로 노출하지 않는다. 차단된 계정, 소속 가게 없음, 비활성 가게와 세션 만료 상태는 서로 구분되는 안내를 제공한다. 인증 후 현재 가게와 역할을 확인하고 오늘·내일 예약 확인으로 이동한다. 세션 만료로 이동한 경우 저장하지 않은 입력이 있었음을 알린다.

owner-settings

원장님 전용 허브다. 가게 정보, 직원·권한 설정, 자료 가져오기·중복 합치기, 알림톡 설정과 고객 병합 이력을 카드로 제공한다. 각 카드에는 단순 메뉴명뿐 아니라 직원 수, 최근 가져오기 상태, 검토 필요 행, 알림톡 자동 발송 가능 여부 같은 현재 상태를 표시한다. 가게 정보에는 매장명, 연락처와 Asia/Seoul 시간대를 확인할 수 있게 한다. 알림톡 연결이 없어도 고객과 시술 기록 관리를 계속할 수 있음을 명확히 한다.

customer-merge-review

원장님 전용 화면으로 같은 가게와 정규화 번호 범위의 고객만 비교한다. lg 이상에서는 대표 고객과 통합 대상 고객을 양쪽 패널로, 모바일에서는 고객별 원본 정보 확인 후 대표값을 선택하는 단계형 화면으로 구성한다. 이름, 담당 디자이너, 개인정보 동의, 마케팅 수신동의, 미래 예약, 발송 예정 알림톡과 이동할 시술 기록·예약 확인 건 수를 비교한다. 수신 거부가 하나라도 있으면 마케팅 수신 거부를 기본 제안하며 병합으로 동의를 확대할 수 없게 한다. 대표 고객, 모든 충돌 선택값, 미래 예약과 발송 예정 처리, 병합 사유가 확정돼야 실행 버튼을 활성화한다. 처리 중 동시 수정이 감지되면 최신 정보를 다시 검토하게 한다.

customer-merge-history

원장님만 접근한다. 병합 이력 식별값, 대표 고객, 통합 대상 고객, 실행자, 실행 시각, 사유, 충돌 선택값과 이동한 시술 기록·예약 확인 건을 시간순으로 표시한다. 상세에서는 병합 전후 연결 변화를 항목별로 보여준다. 병합 취소 전에 되돌릴 기록과 병합 뒤 새로 생성되어 자동 분리되지 않는 기록을 구분한다. 새 기록이 있으면 검토 필요 상태가 된다는 영향을 명확히 표시하고 병합 작업 단위로만 취소한다. 취소 처리 중에는 같은 고객에 대한 다른 병합·수정 행동을 비활성화한다.

notification-settings

원장님 전용 설정으로 발신 프로필, 예약 확인 알림톡 템플릿, 당일 예약 안내 템플릿, API 연결과 발송 결과 수신 상태를 각각 카드로 표시한다. 상단에는 자동 발송 가능, 연결 필요, 확인 필요 또는 자동 발송 중지 상태를 한 문장으로 요약한다. 각 카드에 현재 상태, 마지막 확인 시각과 중지 원인을 표시한다. 유효하지 않은 연결이나 템플릿이 있으면 자동 발송이 중지됨을 명확히 하고 오늘·내일 예약 확인의 수동 연락 대상 목록으로 연결한다. 전날 오후 6시와 방문 3시간 전이라는 Asia/Seoul 기준을 표시하되 매장 운영 시간에 따른 변경 기능은 정확한 정책을 확인한 뒤 제공한다.

에셋 원칙
온헤어 로고 SVG 원본 또는 텍스트 로고 규칙: 제공 필요 · 16·20·24픽셀 크기의 일관된 선형 아이콘 세트: 예약, 고객, 검색, 시술 기록, 염색약 번호·배합, 알림톡, 발송 상태, 사진, 직원, CSV, 병합, 병합 취소 · 상태 아이콘: 성공, 실패, 처리 중, 검토 필요, 자동 발송 중지, 수동 연락 완료 · 기본 고객 아바타: 사진 없이 이름 첫 글자를 사용하는 중립형 SVG · 예약 없음, 고객 없음, 시술 기록 없음에 사용할 단순한 단색 빈 상태 SVG · 시술 사진 썸네일 자리표시자와 업로드 오류 이미지 · CSV 열 연결과 고객 병합 흐름에 사용할 제품 내 설명용 도식 SVG · 장식적인 헤어 모델 사진은 사용하지 않음

ACCESSIBILITY

접근성과 모션

  • · KWCAG 2.2와 WCAG 2.1 AA를 기준으로 일반 텍스트는 배경 대비 4.5:1 이상, 큰 텍스트와 핵심 그래픽은 3:1 이상을 유지한다.
  • · 주요 터치 대상은 최소 44×44픽셀로 만들고 작은 보조 대상도 오작동을 막을 간격을 둔다.
  • · 모든 입력에는 항상 보이는 라벨, 필수 여부, 입력 예시와 구체적인 오류 문장을 제공한다.
  • · 상태는 색상만으로 구분하지 않고 성공, 실패, 검토 필요, 노쇼 같은 텍스트와 아이콘을 함께 사용한다.
  • · 키보드 포커스는 2픽셀 이상의 명확한 포커스 링으로 표시하고 시각적 순서와 탭 순서를 일치시킨다.
  • · 대화상자와 바텀시트는 열린 동안 포커스를 내부에 유지하고 닫힌 뒤 실행 버튼으로 포커스를 돌려보낸다.
  • · 탭, 필터 칩, 펼침 영역과 처리 중 버튼에 선택·확장·비활성 상태를 보조 기술이 알 수 있는 속성으로 제공한다.
  • · 예약 및 시술 시간은 날짜, 요일과 시간을 함께 표시하고 Asia/Seoul 기준임을 설정 화면에서 확인할 수 있게 한다.
  • · 전화번호 마스킹 문자열은 읽기 어려운 별표 나열만 낭독되지 않게 접근 가능한 설명을 제공하되 권한이 없는 사용자에게 전체 번호를 노출하지 않는다.
  • · 표는 열 머리글과 행의 관계를 제공하고 모바일 카드로 바뀌어도 각 값의 항목명을 생략하지 않는다.
  • · 저장, 발송, 업로드와 병합 처리 결과는 실시간 알림으로 전달하며 오류가 발생한 필드나 행으로 이동할 수 있게 한다.
  • · 사진 썸네일에는 시술일과 시술 종류를 포함한 대체 설명을 제공하고 확대·닫기 기능을 키보드로 사용할 수 있게 한다.
  • · 자동으로 사라지는 메시지에만 중요한 정보를 두지 않고 발송 실패, 검토 필요와 미작성 할 일은 화면에 지속해서 남긴다.
  • · 동작 감소 설정이 켜져 있으면 화면 이동, 바텀시트와 상태 변화 애니메이션을 제거하거나 즉시 전환한다.

기본 전환 180ms cubic-bezier(0.2, 0, 0, 1) · 모션 감소 설정 지원 · 다크모드 not_planned

EVIDENCE

조사 출처

  • 알림톡 - 카카오비즈니스

    발신 프로필, 알림톡 템플릿과 발송 연결 상태를 별도 설정 항목으로 표현하는 근거로 참고했다. 실제 API 사용 조건과 심사 상태는 구현 전에 확인해야 한다.

  • 네이버 예약주문 사업자 고객센터

    네이버 예약을 온헤어가 대체하지 않고 기존 예약 도구로 유지한다는 서비스 경계를 화면 문구와 흐름에 반영할 때 참고했다.

  • 네이버 비즈니스

    네이버 스마트플레이스·예약·톡톡이 외부 접점으로 계속 사용된다는 시장 맥락을 확인하는 참고 자료다.

  • 헤어짱닷컴

    국내 미용실 고객관리 도구의 화면 밀도와 고객·시술 기록 중심 용어를 검토하는 참고 자료로 사용했다. 개별 경쟁 기능을 온헤어 요구로 추가하지 않았다.

  • 공비서 원장님

    국내 미용실 내부 운영 도구의 모바일 사용 맥락과 예약·고객 정보 계층을 검토하는 참고 자료로 사용했다.

  • 미용실 고객관리, 시술 이력이 다음 예약을 만든다

    모바일 고객 상세에서 최근 시술 이력과 다음 예약을 우선 배치하는 조사 참고 자료다. 온헤어의 구체적인 기능과 권한은 사용자 요구를 우선했다.

기계 판독 디자인 계약 보기
{
  "version": 1,
  "direction": "권장 방향: 디자이너가 현장에서 한 손으로 예약 확인, 고객 찾기, 최근 시술 이력과 염색약 번호·배합 확인, 시술 기록 작성을 빠르게 끝내는 차분한 모바일 업무 UI다. 장식적인 미용실 이미지보다 시간, 고객, 담당 디자이너, 발송 상태와 다음 행동을 우선한다. 원장님의 자료 가져오기와 병합 검토는 넓은 화면에서 비교 효율을 높이되 좁은 화면에서도 단계별로 완료할 수 있게 한다.",
  "keywords": [
    "현장 중심",
    "빠른 고객 식별",
    "최근 시술 우선",
    "배합 강조",
    "예약 상태 명확화",
    "안전한 병합",
    "권한 구분",
    "차분한 살롱 톤",
    "모바일 우선"
  ],
  "industryFindings": [
    "로그인 후 첫 화면은 전체 예약 달력이 아니라 오늘·내일 예약 확인이어야 한다.",
    "예약 카드에서 고객 상세까지 바로 이동하고 최근 시술, 염색약 번호와 배합을 적은 조작으로 확인할 수 있어야 한다.",
    "고객 검색과 중복 판정의 중심은 이름이 아니라 가게 식별값과 정규화 번호의 조합이다.",
    "예약 확인 건에는 고객 확인 상태, 운영 메시지 상태, 방문 결과와 시술 기록 미작성 여부를 함께 보여줘야 한다.",
    "알림톡 실패나 자동 발송 중지는 숨기지 않고 수동 연락 대상과 처리 결과로 연결해야 한다.",
    "고객 상세에서는 전체 이력보다 최근 시술과 다음 예약을 먼저 보여주는 정보 계층이 적합하다.",
    "염색약 번호와 배합은 긴 시술 메모에 묻히지 않도록 별도 영역과 배합 있음 표시를 사용해야 한다.",
    "시술 사진은 선택 항목이며 피부 상태나 알레르기 같은 민감한 항목은 기본 필드로 만들지 않는다.",
    "뜸해진 고객 화면은 자동 광고 발송이 아니라 마케팅 수신동의 확인과 실제 연락 결과 기록을 위한 내부 목록이다.",
    "CSV 가져오기와 고객 병합은 업로드 즉시 반영하지 않고 열 연결, 검증, 오류 수정, 충돌 검토와 실행 결과 확인을 거쳐야 한다.",
    "원장님은 현재 가게 전체를 보고 디자이너는 자기 담당 고객을 자세히 보는 권한 차이를 목록, 상세 화면과 서버 요청에 동일하게 적용해야 한다.",
    "네이버 예약·톡톡과 카카오톡 채널 대화는 기존 도구에 남기고 온헤어에는 예약 확인에 필요한 최소 정보와 고객·시술 이력만 표시해야 한다."
  ],
  "layoutMode": "mobile_first",
  "layoutRationale": "디자이너의 반복 과업은 시술 전후에 스마트폰으로 오늘·내일 예약, 고객의 최근 시술과 배합, 시술 기록을 확인하는 흐름이다. 기본은 4열 모바일 카드와 단일 열 입력 화면으로 구성한다. 원장님이 주로 사용하는 CSV 열 연결, 오류 행 검토, 고객 병합 비교와 직원 설정은 lg 이상에서 12열 그리드, 표와 양쪽 비교 패널을 사용한다. 좁은 화면에서는 같은 정보를 단계형 화면과 세로 카드로 제공해 핵심 조회와 처리를 유지한다.",
  "typography": {
    "primaryFont": "system-ui",
    "fallback": [
      "-apple-system",
      "BlinkMacSystemFont",
      "Segoe UI",
      "Roboto",
      "Arial",
      "sans-serif"
    ],
    "scriptFallbacks": {
      "Jpan": [
        "Hiragino Sans",
        "Yu Gothic",
        "Noto Sans JP",
        "sans-serif"
      ],
      "Kore": [
        "Apple SD Gothic Neo",
        "Noto Sans KR",
        "Malgun Gothic",
        "sans-serif"
      ],
      "Latn": [
        "-apple-system",
        "BlinkMacSystemFont",
        "Segoe UI",
        "Roboto",
        "Arial",
        "sans-serif"
      ]
    },
    "bodyLetterSpacing": "-0.01em",
    "headingLetterSpacing": "-0.025em",
    "bodyLineHeight": 1.55
  },
  "colors": [
    {
      "name": "캔버스",
      "value": "#F6F7F4",
      "usage": "전체 화면 배경과 카드 사이 영역"
    },
    {
      "name": "표면",
      "value": "#FFFFFF",
      "usage": "카드, 입력 영역, 바텀시트와 대화상자 배경"
    },
    {
      "name": "기본 텍스트",
      "value": "#17211B",
      "usage": "제목, 본문, 핵심 수치와 입력값"
    },
    {
      "name": "보조 텍스트",
      "value": "#5B665F",
      "usage": "설명, 작성일, 담당자와 부가 정보"
    },
    {
      "name": "테두리",
      "value": "#D6DDD8",
      "usage": "카드 구분, 입력 테두리와 표 행 구분"
    },
    {
      "name": "브랜드 기본",
      "value": "#176B4D",
      "usage": "주요 버튼, 선택 탭, 활성 필터와 핵심 링크"
    },
    {
      "name": "브랜드 눌림",
      "value": "#0E5139",
      "usage": "주요 버튼의 눌림 상태와 강한 강조"
    },
    {
      "name": "브랜드 연한 배경",
      "value": "#E5F2EB",
      "usage": "선택 상태, 성공 요약과 최근 시술 강조 배경"
    },
    {
      "name": "정보",
      "value": "#245EA8",
      "usage": "처리 중, 안내, 연결 정보와 포커스 보조"
    },
    {
      "name": "정보 연한 배경",
      "value": "#E9F2FC",
      "usage": "안내 배너와 처리 중 상태 배지 배경"
    },
    {
      "name": "경고",
      "value": "#7A5200",
      "usage": "발송 예정, 검토 필요, 미작성과 동의 미확인"
    },
    {
      "name": "경고 연한 배경",
      "value": "#FFF2CC",
      "usage": "검토 필요 행, 미작성 할 일과 주의 배너 배경"
    },
    {
      "name": "위험",
      "value": "#B42318",
      "usage": "발송 실패, 노쇼, 자동 발송 중지와 파괴적 행동"
    },
    {
      "name": "위험 연한 배경",
      "value": "#FCE8E6",
      "usage": "오류 배너, 실패 상태와 병합 취소 경고 배경"
    },
    {
      "name": "성공",
      "value": "#116149",
      "usage": "발송 성공, 시술 기록 완료와 연결 정상 상태"
    },
    {
      "name": "포커스",
      "value": "#145FCC",
      "usage": "키보드 포커스 링과 접근성 강조선"
    }
  ],
  "breakpoints": {
    "sm": 480,
    "md": 768,
    "lg": 1024,
    "xl": 1280
  },
  "grid": {
    "baseUnit": 4,
    "mobileColumns": 4,
    "desktopColumns": 12,
    "maxContentWidth": 1200
  },
  "spacing": [
    4,
    8,
    12,
    16,
    20,
    24,
    32,
    40,
    48,
    64,
    80
  ],
  "radius": {
    "sm": 6,
    "md": 10,
    "lg": 16,
    "full": 9999
  },
  "components": [
    {
      "name": "앱 셸",
      "variants": [
        "모바일 하단 메뉴",
        "태블릿 상단 메뉴",
        "데스크톱 좌측 메뉴"
      ],
      "states": [
        "기본",
        "메뉴 펼침",
        "세션 만료",
        "접근 제한"
      ],
      "guidance": "오늘·내일 예약 확인, 고객 목록, 뜸해진 고객을 공통 메뉴로 제공한다. 원장 설정은 원장님에게만 표시한다. 현재 가게명과 역할을 항상 확인할 수 있게 하며 다른 가게 데이터가 섞여 보이지 않게 한다."
    },
    {
      "name": "상단 앱 바",
      "variants": [
        "기본",
        "뒤로 가기",
        "저장 행동 포함",
        "검색 포함"
      ],
      "states": [
        "기본",
        "스크롤 고정",
        "오프라인 안내"
      ],
      "guidance": "화면명과 현재 날짜 또는 고객명을 우선 표시한다. 모바일에서는 주요 행동 하나만 직접 노출하고 나머지는 더보기 메뉴에 둔다."
    },
    {
      "name": "주요 버튼",
      "variants": [
        "채움",
        "윤곽선",
        "텍스트",
        "위험",
        "아이콘"
      ],
      "states": [
        "기본",
        "호버",
        "포커스",
        "눌림",
        "비활성",
        "처리 중"
      ],
      "guidance": "한 화면의 채움 버튼은 원칙적으로 하나만 사용한다. 처리 중에는 버튼 폭을 유지하고 중복 제출을 막는다. 아이콘만 있는 버튼에는 접근 가능한 이름을 제공한다."
    },
    {
      "name": "검색 입력",
      "variants": [
        "고객 통합 검색",
        "휴대전화 번호 우선 검색",
        "목록 내 검색"
      ],
      "states": [
        "빈 값",
        "입력 중",
        "검색 중",
        "결과 있음",
        "결과 없음",
        "검증 오류"
      ],
      "guidance": "안내 문구는 이름 또는 휴대전화 번호 검색으로 사용한다. 공백, 하이픈, 점, 괄호와 국가번호 입력을 허용하되 원본 입력과 정규화 결과를 구분한다. 뒷자리 검색 결과가 여러 건이면 마스킹 번호, 담당 디자이너와 최근 방문일로 구분한다."
    },
    {
      "name": "휴대전화 번호 입력",
      "variants": [
        "신규 고객",
        "고객 수정",
        "예약 연락처 스냅샷",
        "CSV 검토"
      ],
      "states": [
        "미입력",
        "정상",
        "기존 고객 발견",
        "검토 필요",
        "중복 충돌"
      ],
      "guidance": "입력 중 읽기 쉬운 형식으로 표시하되 저장 전 원본 입력값을 보존한다. 기존 011, 016, 017, 018, 019 번호를 010으로 바꾸지 않는다. 같은 가게에서 같은 정규화 번호가 발견되면 신규 생성을 바로 진행하지 않고 기존 고객 또는 병합 검토를 보여준다."
    },
    {
      "name": "날짜 전환 탭",
      "variants": [
        "오늘·내일",
        "고객 상세 탭",
        "시술 종류 필터"
      ],
      "states": [
        "선택",
        "미선택",
        "포커스",
        "비활성"
      ],
      "guidance": "오늘과 내일에는 날짜와 요일을 함께 표시한다. 탭의 선택 상태는 색상뿐 아니라 굵기, 밑줄 또는 배경과 접근성 상태값으로 전달한다."
    },
    {
      "name": "필터 칩과 필터 시트",
      "variants": [
        "빠른 필터",
        "복수 선택",
        "단일 선택",
        "모바일 바텀시트"
      ],
      "states": [
        "선택",
        "미선택",
        "결과 없음",
        "초기화 가능"
      ],
      "guidance": "모바일에는 내 담당, 발송 필요, 미확인, 시술 기록 미작성 같은 핵심 필터만 노출한다. 추가 필터는 바텀시트에 두고 적용된 조건 수와 전체 초기화를 제공한다."
    },
    {
      "name": "상태 배지",
      "variants": [
        "운영 메시지",
        "방문 결과",
        "고객 단계",
        "동의 상태",
        "고객 기록 상태",
        "계정 상태"
      ],
      "states": [
        "발송 예정",
        "처리 중",
        "성공",
        "실패",
        "자동 발송 중지",
        "수동 연락 완료",
        "검토 필요"
      ],
      "guidance": "색상과 함께 상태명을 항상 표시한다. 방문 결과와 운영 메시지 상태를 한 배지로 합치지 않는다. 고객 취소와 매장 취소도 서로 다른 텍스트로 표시한다."
    },
    {
      "name": "예약 확인 카드",
      "variants": [
        "오늘",
        "내일",
        "즉시 처리 필요",
        "시술 기록 미작성",
        "취소됨"
      ],
      "states": [
        "기본",
        "발송 예정",
        "발송 실패",
        "방문 결과 미입력",
        "시술 완료",
        "노쇼",
        "고객 취소",
        "매장 취소"
      ],
      "guidance": "시간, 고객명, 마스킹된 예약 연락처 스냅샷, 담당 디자이너, 예정 시술, 접점, 고객 확인 상태, 내일·당일 안내 상태와 방문 결과를 표시한다. 고객 보기와 현재 필요한 행동 하나를 우선 노출한다. 취소된 건은 자동 발송 대상에서 제외됐음을 명시한다."
    },
    {
      "name": "처리 필요 배너",
      "variants": [
        "발송 실패",
        "자동 발송 중지",
        "시술 기록 미작성",
        "방문 결과 확인 필요",
        "검토 필요"
      ],
      "states": [
        "펼침",
        "접힘",
        "처리 중",
        "해결됨"
      ],
      "guidance": "문제 원인, 영향받은 건수와 다음 행동을 한 문장으로 설명한다. 알림톡 오류는 알림톡 설정 또는 수동 연락 대상 목록으로 연결한다."
    },
    {
      "name": "고객 목록 카드",
      "variants": [
        "기본",
        "배합 있음",
        "다음 예약 있음",
        "뜸해짐",
        "중복 정보 확인 필요"
      ],
      "states": [
        "기본",
        "선택",
        "호버",
        "접근 제한",
        "병합됨"
      ],
      "guidance": "고객명, 마스킹 번호, 담당 디자이너, 고객 단계, 최근 방문일, 최근 시술, 다음 예약과 마케팅 수신동의 상태를 우선순위에 따라 표시한다. 병합됨 고객은 대표 고객으로 이동하는 안내만 제공한다."
    },
    {
      "name": "최근 시술 카드",
      "variants": [
        "염색",
        "펌",
        "커트",
        "클리닉",
        "기타",
        "기록 없음"
      ],
      "states": [
        "기본",
        "배합 있음",
        "사진 있음",
        "임시 저장",
        "접근 제한"
      ],
      "guidance": "시술일, 실제 담당 디자이너, 시술 종류, 핵심 메모를 표시한다. 염색 기록은 염색약 번호와 배합 첫 줄을 별도 강조하고 배합 보기를 직접 제공한다. 사진은 첨부 수만 먼저 보이고 요청할 때 확대한다."
    },
    {
      "name": "시술 이력 타임라인",
      "variants": [
        "전체",
        "염색",
        "펌",
        "커트",
        "클리닉",
        "배합 있음",
        "사진 있음"
      ],
      "states": [
        "로딩",
        "결과 있음",
        "결과 없음",
        "부분 오류"
      ],
      "guidance": "최신순으로 표시하며 날짜, 시술 종류, 실제 담당 디자이너, 배합 요약, 메모와 사진 수를 제공한다. 긴 메모는 접고 펼칠 수 있게 하되 염색약 번호와 배합은 접힌 상태에서도 확인할 수 있게 한다."
    },
    {
      "name": "폼 필드",
      "variants": [
        "한 줄 입력",
        "여러 줄 입력",
        "선택",
        "날짜·시간",
        "복수 시술 선택",
        "동의 상태"
      ],
      "states": [
        "기본",
        "포커스",
        "입력 완료",
        "필수 오류",
        "도움말",
        "읽기 전용",
        "비활성"
      ],
      "guidance": "라벨을 입력창 밖에 유지하고 필수 여부와 오류 이유를 문장으로 표시한다. 시술 메모처럼 중요한 긴 입력은 저장 실패 후에도 값을 유지한다. 민감 정보는 기본 필드로 추가하지 않는다."
    },
    {
      "name": "사진 첨부",
      "variants": [
        "카메라 촬영",
        "파일 선택",
        "썸네일 목록",
        "전체 화면 보기"
      ],
      "states": [
        "동의 확인 필요",
        "업로드 중",
        "완료",
        "실패",
        "삭제 확인"
      ],
      "guidance": "사진은 선택 입력이다. 촬영·보관 동의와 보유기간을 확인할 수 없으면 첨부를 막고 이유를 표시한다. 사진 실패가 시술 기록 전체 저장을 막지 않게 분리해 처리한다."
    },
    {
      "name": "CSV 가져오기 단계 표시",
      "variants": [
        "파일 업로드",
        "열 연결",
        "형식 검증",
        "오류 수정",
        "중복 검토",
        "반영 결과"
      ],
      "states": [
        "대기",
        "진행 중",
        "완료",
        "오류",
        "재처리"
      ],
      "guidance": "현재 단계, 완료된 단계와 남은 단계를 텍스트로 표시한다. 파일을 운영 데이터에 바로 반영하지 않으며 검증 전에는 반영 버튼을 비활성화한다. 같은 가져오기 작업을 다시 실행할 때 중복 생성되지 않음을 결과 화면에서 알려준다."
    },
    {
      "name": "검토 표와 모바일 행 카드",
      "variants": [
        "CSV 오류 행",
        "열 연결",
        "직원 목록",
        "병합 이력",
        "알림톡 템플릿"
      ],
      "states": [
        "기본",
        "정렬",
        "필터",
        "행 편집",
        "오류",
        "빈 결과"
      ],
      "guidance": "lg 이상에서는 고정 헤더 표를 사용하고 좁은 화면에서는 각 셀의 항목명을 포함한 세로 카드로 바꾼다. CSV 오류 행에는 원본 행 번호, 원본 값, 오류 이유와 해당 행만 재처리하는 행동을 제공한다."
    },
    {
      "name": "병합 비교 패널",
      "variants": [
        "양쪽 비교",
        "모바일 단계 비교",
        "충돌 없음",
        "충돌 있음"
      ],
      "states": [
        "대표 고객 미선택",
        "대표 고객 선택",
        "검토 필요",
        "병합 처리 중",
        "병합 완료",
        "동시 수정 감지"
      ],
      "guidance": "이름, 정규화 번호, 담당 디자이너, 동의 상태, 미래 예약, 발송 예정 알림톡과 이동할 기록 수를 비교한다. 선택한 대표값과 보수적인 동의 처리 결과를 고정 요약에 표시한다. 병합 사유 입력과 최종 확인 전에는 실행할 수 없게 한다."
    },
    {
      "name": "연결 상태 카드",
      "variants": [
        "발신 프로필",
        "예약 확인 템플릿",
        "당일 안내 템플릿",
        "API 연결",
        "발송 결과 수신"
      ],
      "states": [
        "사용 가능",
        "연결 필요",
        "확인 필요",
        "자동 발송 중지",
        "오류"
      ],
      "guidance": "현재 상태, 마지막 확인 시각, 자동 발송 가능 여부와 중지 원인을 표시한다. 연결 또는 템플릿이 유효하지 않으면 실패 상태만 보여주지 말고 수동 연락 관리로 이동하는 행동을 제공한다."
    },
    {
      "name": "대화상자와 바텀시트",
      "variants": [
        "확인",
        "파괴적 확인",
        "빠른 수정",
        "필터",
        "수동 연락 기록"
      ],
      "states": [
        "열림",
        "처리 중",
        "오류",
        "닫힘"
      ],
      "guidance": "모바일의 짧은 선택은 바텀시트, 병합 실행·취소와 계정 차단은 명시적 대화상자를 사용한다. 파괴적 행동에는 대상, 영향과 되돌릴 수 있는 범위를 표시한다."
    },
    {
      "name": "빈 상태와 오류 상태",
      "variants": [
        "예약 없음",
        "고객 없음",
        "시술 기록 없음",
        "검색 결과 없음",
        "권한 없음",
        "데이터 오류"
      ],
      "states": [
        "기본",
        "재시도 가능",
        "행동 가능",
        "접근 차단"
      ],
      "guidance": "단순히 비어 있다고 표시하지 말고 이유와 다음 행동을 제공한다. 권한 없음은 데이터 존재 여부를 과도하게 노출하지 않으며 정책이 확정된 경우에만 임시 열람 요청 행동을 표시한다."
    },
    {
      "name": "토스트와 실시간 상태 안내",
      "variants": [
        "저장 완료",
        "저장 실패",
        "발송 상태 변경",
        "병합 완료",
        "재처리 완료"
      ],
      "states": [
        "정보",
        "성공",
        "경고",
        "오류"
      ],
      "guidance": "중요한 실패는 토스트만 사용하지 말고 해당 카드나 필드에도 남긴다. 보조 기술이 상태 변화를 읽을 수 있도록 적절한 실시간 알림 영역을 사용한다."
    }
  ],
  "accessibility": [
    "KWCAG 2.2와 WCAG 2.1 AA를 기준으로 일반 텍스트는 배경 대비 4.5:1 이상, 큰 텍스트와 핵심 그래픽은 3:1 이상을 유지한다.",
    "주요 터치 대상은 최소 44×44픽셀로 만들고 작은 보조 대상도 오작동을 막을 간격을 둔다.",
    "모든 입력에는 항상 보이는 라벨, 필수 여부, 입력 예시와 구체적인 오류 문장을 제공한다.",
    "상태는 색상만으로 구분하지 않고 성공, 실패, 검토 필요, 노쇼 같은 텍스트와 아이콘을 함께 사용한다.",
    "키보드 포커스는 2픽셀 이상의 명확한 포커스 링으로 표시하고 시각적 순서와 탭 순서를 일치시킨다.",
    "대화상자와 바텀시트는 열린 동안 포커스를 내부에 유지하고 닫힌 뒤 실행 버튼으로 포커스를 돌려보낸다.",
    "탭, 필터 칩, 펼침 영역과 처리 중 버튼에 선택·확장·비활성 상태를 보조 기술이 알 수 있는 속성으로 제공한다.",
    "예약 및 시술 시간은 날짜, 요일과 시간을 함께 표시하고 Asia/Seoul 기준임을 설정 화면에서 확인할 수 있게 한다.",
    "전화번호 마스킹 문자열은 읽기 어려운 별표 나열만 낭독되지 않게 접근 가능한 설명을 제공하되 권한이 없는 사용자에게 전체 번호를 노출하지 않는다.",
    "표는 열 머리글과 행의 관계를 제공하고 모바일 카드로 바뀌어도 각 값의 항목명을 생략하지 않는다.",
    "저장, 발송, 업로드와 병합 처리 결과는 실시간 알림으로 전달하며 오류가 발생한 필드나 행으로 이동할 수 있게 한다.",
    "사진 썸네일에는 시술일과 시술 종류를 포함한 대체 설명을 제공하고 확대·닫기 기능을 키보드로 사용할 수 있게 한다.",
    "자동으로 사라지는 메시지에만 중요한 정보를 두지 않고 발송 실패, 검토 필요와 미작성 할 일은 화면에 지속해서 남긴다.",
    "동작 감소 설정이 켜져 있으면 화면 이동, 바텀시트와 상태 변화 애니메이션을 제거하거나 즉시 전환한다."
  ],
  "motion": {
    "durationMs": 180,
    "easing": "cubic-bezier(0.2, 0, 0, 1)",
    "reducedMotion": true
  },
  "darkMode": "not_planned",
  "screenGuidance": [
    {
      "screenId": "today-tomorrow-reservations",
      "guidance": "로그인 후 첫 화면이다. 상단에 오늘·내일 전환, 날짜, 내 담당 또는 전체 범위와 예약 확인 건 등록 버튼을 둔다. 즉시 처리 필요, 시술 기록 작성 필요, 내일 안내 확인, 일반 예약 목록 순으로 묶고 각 묶음의 건수를 표시한다. 예약 카드는 시간순으로 정렬하며 고객명, 마스킹된 예약 연락처 스냅샷, 담당 디자이너, 예정 시술, 접점, 고객 확인 상태, 내일·당일 알림톡 상태와 방문 결과를 보여준다. 방문 완료를 선택하면 시술 기록 작성으로 바로 이동한다. 발송 실패나 자동 발송 중지는 수동 연락 기록 또는 알림톡 설정으로 연결한다. 전체 예약 달력은 넣지 않는다."
    },
    {
      "screenId": "customer-list",
      "guidance": "상단에 고정 검색창을 두고 이름 또는 휴대전화 번호 검색을 안내한다. 원장님은 현재 가게 전체, 디자이너는 자기 담당 고객을 기본 범위로 본다. 결과에는 고객명, 마스킹 번호, 담당 디자이너, 고객 단계, 최근 방문일, 최근 시술, 배합 있음, 다음 예약과 마케팅 수신동의 상태를 표시한다. 이름이 같아도 번호가 다르면 별도 고객으로 보여준다. 같은 정규화 번호에서 충돌이 발견되면 원장님에게 중복 고객 병합 검토 진입을 제공하고 디자이너에게는 중복 후보 제시만 허용한다."
    },
    {
      "screenId": "customer-detail",
      "guidance": "첫 화면에 고객명, 마스킹 번호, 담당 디자이너, 방문 횟수, 고객 단계, 최근 방문일과 다음 예약을 표시한다. 바로 아래에 최근 시술 카드를 두고 최근 염색 기록이면 염색약 번호와 배합 첫 줄을 노출한다. 요약, 시술 이력, 사진 탭을 사용하며 개인정보 및 마케팅 수신동의는 최근 시술보다 아래의 고객 관리 정보에 둔다. 하단에는 시술 기록 작성과 예약 등록 중 현재 맥락에 맞는 주요 행동을 고정한다. 디자이너가 자기 담당 고객이 아닌 상세에 접근하면 내용을 반환하지 않고 권한 안내를 표시한다. 대체 시술 열람 방식은 확인 필요이며 확정된 정책에 따라 임시 열람 요청, 원장님 승인 또는 담당 디자이너 변경 UI 중 하나만 활성화한다."
    },
    {
      "screenId": "treatment-record",
      "guidance": "단일 열 폼으로 구성하고 고객, 연결된 예약 확인 건, 시술 일시와 실제 담당 디자이너를 상단에 표시한다. 입력 순서는 시술 종류, 시술명, 염색약 번호, 배합, 시술 메모, 선택 사진, 다음 예약이다. 시술 종류와 시술 메모는 기록 완료에 필수다. 염색을 선택하면 최근 염색 배합 참고 카드와 이번 기록에 복사 행동을 제공하되 복사 후 수정 여부를 사용자가 확인하게 한다. 사진은 촬영·보관 동의와 보유기간이 확인된 경우에만 선택 첨부한다. 임시 저장과 기록 완료를 구분하고 저장 실패 시 입력값을 유지한다. 완료 후 연결된 시술 기록 미작성 내부 할 일을 자동 완료한다."
    },
    {
      "screenId": "inactive-customers",
      "guidance": "마지막 시술 후 달력 기준 2개월이 지났고 미래 예약이 없는 고객만 표시한다. 기준은 확인 필요 가정임을 원장 설정 또는 도움말에 명시한다. 목록에는 고객명, 담당 디자이너, 마지막 시술일, 경과 기간, 마케팅 수신동의 상태와 최근 연락 결과를 표시한다. 원장님은 전체, 디자이너는 자기 담당 고객 범위로 본다. 고객별로 연락 일시, 연락 채널, 연락 결과와 작성자를 기록한다. 마케팅 수신동의가 거부 또는 동의 미확인인 경우 광고성 연락으로 오해할 행동을 강조하지 않는다. 자동 재방문 광고 발송이나 일괄 발송 기능은 제공하지 않는다."
    },
    {
      "screenId": "import-merge",
      "guidance": "원장님 전용 단계형 화면으로 파일 업로드, 열 연결, 형식 검증, 오류 수정, 중복 검토, 반영 결과 순서를 사용한다. CSV 원본은 임시 저장 영역에서 검증하고 반영 전 성공 예정, 검토 필요와 오류 행을 구분한다. 전화번호, 날짜, 담당자 연결 오류에 원본 행 번호와 이유를 표시하고 해당 행만 수정·재처리할 수 있게 한다. 연결되지 않은 담당자 이름은 이전 담당자 텍스트로 보존됨을 표시한다. 같은 파일의 재처리로 중복 생성되지 않도록 가져오기 작업 상태와 이전 처리 결과를 보여준다. lg 이상에서는 표, 좁은 화면에서는 단계별 행 카드를 사용한다. 수첩 자료 직접 입력은 고객 정보와 시술 기록 작성 흐름으로 분리한다."
    },
    {
      "screenId": "staff-permissions",
      "guidance": "원장님만 접근한다. 직원명, 로그인 수단, 역할, 현재 가게 소속, 계정 활성 상태와 마지막 권한 변경일을 표시한다. 직원 추가와 수정에서 역할은 원장님 또는 디자이너만 제공한다. 마지막 원장님을 디자이너로 변경하거나 차단하려는 경우 운영 불가 영향을 설명하고 저장을 막는다. 계정을 비활성화해도 기존 고객, 예약 확인 건과 시술 기록은 삭제되지 않음을 확인 문구로 표시한다. 권한 변경 이력을 같은 화면에서 확인할 수 있게 하며 디자이너에게 자료 가져오기, 병합 실행·취소와 직원 설정 권한을 노출하지 않는다."
    },
    {
      "screenId": "login",
      "guidance": "브랜드 표식, 로그인 필드와 로그인 버튼만 중심에 둔 단순한 화면으로 구성한다. 로그인 실패 시 계정 존재 여부를 구체적으로 노출하지 않는다. 차단된 계정, 소속 가게 없음, 비활성 가게와 세션 만료 상태는 서로 구분되는 안내를 제공한다. 인증 후 현재 가게와 역할을 확인하고 오늘·내일 예약 확인으로 이동한다. 세션 만료로 이동한 경우 저장하지 않은 입력이 있었음을 알린다."
    },
    {
      "screenId": "owner-settings",
      "guidance": "원장님 전용 허브다. 가게 정보, 직원·권한 설정, 자료 가져오기·중복 합치기, 알림톡 설정과 고객 병합 이력을 카드로 제공한다. 각 카드에는 단순 메뉴명뿐 아니라 직원 수, 최근 가져오기 상태, 검토 필요 행, 알림톡 자동 발송 가능 여부 같은 현재 상태를 표시한다. 가게 정보에는 매장명, 연락처와 Asia/Seoul 시간대를 확인할 수 있게 한다. 알림톡 연결이 없어도 고객과 시술 기록 관리를 계속할 수 있음을 명확히 한다."
    },
    {
      "screenId": "customer-merge-review",
      "guidance": "원장님 전용 화면으로 같은 가게와 정규화 번호 범위의 고객만 비교한다. lg 이상에서는 대표 고객과 통합 대상 고객을 양쪽 패널로, 모바일에서는 고객별 원본 정보 확인 후 대표값을 선택하는 단계형 화면으로 구성한다. 이름, 담당 디자이너, 개인정보 동의, 마케팅 수신동의, 미래 예약, 발송 예정 알림톡과 이동할 시술 기록·예약 확인 건 수를 비교한다. 수신 거부가 하나라도 있으면 마케팅 수신 거부를 기본 제안하며 병합으로 동의를 확대할 수 없게 한다. 대표 고객, 모든 충돌 선택값, 미래 예약과 발송 예정 처리, 병합 사유가 확정돼야 실행 버튼을 활성화한다. 처리 중 동시 수정이 감지되면 최신 정보를 다시 검토하게 한다."
    },
    {
      "screenId": "customer-merge-history",
      "guidance": "원장님만 접근한다. 병합 이력 식별값, 대표 고객, 통합 대상 고객, 실행자, 실행 시각, 사유, 충돌 선택값과 이동한 시술 기록·예약 확인 건을 시간순으로 표시한다. 상세에서는 병합 전후 연결 변화를 항목별로 보여준다. 병합 취소 전에 되돌릴 기록과 병합 뒤 새로 생성되어 자동 분리되지 않는 기록을 구분한다. 새 기록이 있으면 검토 필요 상태가 된다는 영향을 명확히 표시하고 병합 작업 단위로만 취소한다. 취소 처리 중에는 같은 고객에 대한 다른 병합·수정 행동을 비활성화한다."
    },
    {
      "screenId": "notification-settings",
      "guidance": "원장님 전용 설정으로 발신 프로필, 예약 확인 알림톡 템플릿, 당일 예약 안내 템플릿, API 연결과 발송 결과 수신 상태를 각각 카드로 표시한다. 상단에는 자동 발송 가능, 연결 필요, 확인 필요 또는 자동 발송 중지 상태를 한 문장으로 요약한다. 각 카드에 현재 상태, 마지막 확인 시각과 중지 원인을 표시한다. 유효하지 않은 연결이나 템플릿이 있으면 자동 발송이 중지됨을 명확히 하고 오늘·내일 예약 확인의 수동 연락 대상 목록으로 연결한다. 전날 오후 6시와 방문 3시간 전이라는 Asia/Seoul 기준을 표시하되 매장 운영 시간에 따른 변경 기능은 정확한 정책을 확인한 뒤 제공한다."
    }
  ],
  "assets": [
    "온헤어 로고 SVG 원본 또는 텍스트 로고 규칙: 제공 필요",
    "16·20·24픽셀 크기의 일관된 선형 아이콘 세트: 예약, 고객, 검색, 시술 기록, 염색약 번호·배합, 알림톡, 발송 상태, 사진, 직원, CSV, 병합, 병합 취소",
    "상태 아이콘: 성공, 실패, 처리 중, 검토 필요, 자동 발송 중지, 수동 연락 완료",
    "기본 고객 아바타: 사진 없이 이름 첫 글자를 사용하는 중립형 SVG",
    "예약 없음, 고객 없음, 시술 기록 없음에 사용할 단순한 단색 빈 상태 SVG",
    "시술 사진 썸네일 자리표시자와 업로드 오류 이미지",
    "CSV 열 연결과 고객 병합 흐름에 사용할 제품 내 설명용 도식 SVG",
    "장식적인 헤어 모델 사진은 사용하지 않음"
  ],
  "sources": [
    {
      "title": "알림톡 - 카카오비즈니스",
      "url": "https://business.kakao.com/info/infotalk/",
      "note": "발신 프로필, 알림톡 템플릿과 발송 연결 상태를 별도 설정 항목으로 표현하는 근거로 참고했다. 실제 API 사용 조건과 심사 상태는 구현 전에 확인해야 한다."
    },
    {
      "title": "네이버 예약주문 사업자 고객센터",
      "url": "https://help.naver.com/service/11712/category/1048",
      "note": "네이버 예약을 온헤어가 대체하지 않고 기존 예약 도구로 유지한다는 서비스 경계를 화면 문구와 흐름에 반영할 때 참고했다."
    },
    {
      "title": "네이버 비즈니스",
      "url": "https://business.naver.com/service.html",
      "note": "네이버 스마트플레이스·예약·톡톡이 외부 접점으로 계속 사용된다는 시장 맥락을 확인하는 참고 자료다."
    },
    {
      "title": "헤어짱닷컴",
      "url": "https://www.hairzzang.com/",
      "note": "국내 미용실 고객관리 도구의 화면 밀도와 고객·시술 기록 중심 용어를 검토하는 참고 자료로 사용했다. 개별 경쟁 기능을 온헤어 요구로 추가하지 않았다."
    },
    {
      "title": "공비서 원장님",
      "url": "https://crm.gongbiz.kr/landing-page/main",
      "note": "국내 미용실 내부 운영 도구의 모바일 사용 맥락과 예약·고객 정보 계층을 검토하는 참고 자료로 사용했다."
    },
    {
      "title": "미용실 고객관리, 시술 이력이 다음 예약을 만든다",
      "url": "https://loyo.co.kr/guide/hair-salon-crm",
      "note": "모바일 고객 상세에서 최근 시술 이력과 다음 예약을 우선 배치하는 조사 참고 자료다. 온헤어의 구체적인 기능과 권한은 사용자 요구를 우선했다."
    }
  ]
}
디자인 가이드 원문 전체 보기

UI/UX 디자인 가이드

1. 디자인 방향

권장 방향: 디자이너가 현장에서 한 손으로 예약 확인, 고객 찾기, 최근 시술 이력과 염색약 번호·배합 확인, 시술 기록 작성을 빠르게 끝내는 차분한 모바일 업무 UI다. 장식적인 미용실 이미지보다 시간, 고객, 담당 디자이너, 발송 상태와 다음 행동을 우선한다. 원장님의 자료 가져오기와 병합 검토는 넓은 화면에서 비교 효율을 높이되 좁은 화면에서도 단계별로 완료할 수 있게 한다.

무드 키워드: 현장 중심 · 빠른 고객 식별 · 최근 시술 우선 · 배합 강조 · 예약 상태 명확화 · 안전한 병합 · 권한 구분 · 차분한 살롱 톤 · 모바일 우선

업계 조사에서 반영한 점

  • 로그인 후 첫 화면은 전체 예약 달력이 아니라 오늘·내일 예약 확인이어야 한다.
  • 예약 카드에서 고객 상세까지 바로 이동하고 최근 시술, 염색약 번호와 배합을 적은 조작으로 확인할 수 있어야 한다.
  • 고객 검색과 중복 판정의 중심은 이름이 아니라 가게 식별값과 정규화 번호의 조합이다.
  • 예약 확인 건에는 고객 확인 상태, 운영 메시지 상태, 방문 결과와 시술 기록 미작성 여부를 함께 보여줘야 한다.
  • 알림톡 실패나 자동 발송 중지는 숨기지 않고 수동 연락 대상과 처리 결과로 연결해야 한다.
  • 고객 상세에서는 전체 이력보다 최근 시술과 다음 예약을 먼저 보여주는 정보 계층이 적합하다.
  • 염색약 번호와 배합은 긴 시술 메모에 묻히지 않도록 별도 영역과 배합 있음 표시를 사용해야 한다.
  • 시술 사진은 선택 항목이며 피부 상태나 알레르기 같은 민감한 항목은 기본 필드로 만들지 않는다.
  • 뜸해진 고객 화면은 자동 광고 발송이 아니라 마케팅 수신동의 확인과 실제 연락 결과 기록을 위한 내부 목록이다.
  • CSV 가져오기와 고객 병합은 업로드 즉시 반영하지 않고 열 연결, 검증, 오류 수정, 충돌 검토와 실행 결과 확인을 거쳐야 한다.
  • 원장님은 현재 가게 전체를 보고 디자이너는 자기 담당 고객을 자세히 보는 권한 차이를 목록, 상세 화면과 서버 요청에 동일하게 적용해야 한다.
  • 네이버 예약·톡톡과 카카오톡 채널 대화는 기존 도구에 남기고 온헤어에는 예약 확인에 필요한 최소 정보와 고객·시술 이력만 표시해야 한다.

2. 레이아웃 전략

  • 방식: Mobile first
  • 근거: 디자이너의 반복 과업은 시술 전후에 스마트폰으로 오늘·내일 예약, 고객의 최근 시술과 배합, 시술 기록을 확인하는 흐름이다. 기본은 4열 모바일 카드와 단일 열 입력 화면으로 구성한다. 원장님이 주로 사용하는 CSV 열 연결, 오류 행 검토, 고객 병합 비교와 직원 설정은 lg 이상에서 12열 그리드, 표와 양쪽 비교 패널을 사용한다. 좁은 화면에서는 같은 정보를 단계형 화면과 세로 카드로 제공해 핵심 조회와 처리를 유지한다.
  • 좁은 화면에서도 핵심 조회·입력·처리를 제거하지 않습니다.
  • 최대 콘텐츠 폭: 1200px
  • 그리드: 모바일 4열 / 데스크톱 12열 / 기본 단위 4px
  • Breakpoint: sm 480px, md 768px, lg 1024px, xl 1280px

3. 컬러 시스템

토큰용도
캔버스#F6F7F4전체 화면 배경과 카드 사이 영역
표면#FFFFFF카드, 입력 영역, 바텀시트와 대화상자 배경
기본 텍스트#17211B제목, 본문, 핵심 수치와 입력값
보조 텍스트#5B665F설명, 작성일, 담당자와 부가 정보
테두리#D6DDD8카드 구분, 입력 테두리와 표 행 구분
브랜드 기본#176B4D주요 버튼, 선택 탭, 활성 필터와 핵심 링크
브랜드 눌림#0E5139주요 버튼의 눌림 상태와 강한 강조
브랜드 연한 배경#E5F2EB선택 상태, 성공 요약과 최근 시술 강조 배경
정보#245EA8처리 중, 안내, 연결 정보와 포커스 보조
정보 연한 배경#E9F2FC안내 배너와 처리 중 상태 배지 배경
경고#7A5200발송 예정, 검토 필요, 미작성과 동의 미확인
경고 연한 배경#FFF2CC검토 필요 행, 미작성 할 일과 주의 배너 배경
위험#B42318발송 실패, 노쇼, 자동 발송 중지와 파괴적 행동
위험 연한 배경#FCE8E6오류 배너, 실패 상태와 병합 취소 경고 배경
성공#116149발송 성공, 시술 기록 완료와 연결 정상 상태
포커스#145FCC키보드 포커스 링과 접근성 강조선

상태는 색상만으로 구분하지 않고 아이콘·문구·테두리를 함께 사용합니다.

4. 타이포그래피

  • 기본 글꼴: system-ui
  • 대체 글꼴: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Arial, sans-serif
  • 문자 체계별 대체: Latn(-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Arial, sans-serif) · Kore(Apple SD Gothic Neo, Noto Sans KR, Malgun Gothic, sans-serif) · Jpan(Hiragino Sans, Yu Gothic, Noto Sans JP, sans-serif)
  • 본문 자간: -0.01em
  • 제목 자간: -0.025em
  • 본문 행간: 1.55

5. 간격·형태

  • 간격: 4px, 8px, 12px, 16px, 20px, 24px, 32px, 40px, 48px, 64px, 80px
  • 모서리: sm 6px, md 10px, lg 16px, full 9999px

6. 컴포넌트와 상태

앱 셸

  • 변형: 모바일 하단 메뉴, 태블릿 상단 메뉴, 데스크톱 좌측 메뉴
  • 상태: 기본, 메뉴 펼침, 세션 만료, 접근 제한
  • 적용: 오늘·내일 예약 확인, 고객 목록, 뜸해진 고객을 공통 메뉴로 제공한다. 원장 설정은 원장님에게만 표시한다. 현재 가게명과 역할을 항상 확인할 수 있게 하며 다른 가게 데이터가 섞여 보이지 않게 한다.

상단 앱 바

  • 변형: 기본, 뒤로 가기, 저장 행동 포함, 검색 포함
  • 상태: 기본, 스크롤 고정, 오프라인 안내
  • 적용: 화면명과 현재 날짜 또는 고객명을 우선 표시한다. 모바일에서는 주요 행동 하나만 직접 노출하고 나머지는 더보기 메뉴에 둔다.

주요 버튼

  • 변형: 채움, 윤곽선, 텍스트, 위험, 아이콘
  • 상태: 기본, 호버, 포커스, 눌림, 비활성, 처리 중
  • 적용: 한 화면의 채움 버튼은 원칙적으로 하나만 사용한다. 처리 중에는 버튼 폭을 유지하고 중복 제출을 막는다. 아이콘만 있는 버튼에는 접근 가능한 이름을 제공한다.

검색 입력

  • 변형: 고객 통합 검색, 휴대전화 번호 우선 검색, 목록 내 검색
  • 상태: 빈 값, 입력 중, 검색 중, 결과 있음, 결과 없음, 검증 오류
  • 적용: 안내 문구는 이름 또는 휴대전화 번호 검색으로 사용한다. 공백, 하이픈, 점, 괄호와 국가번호 입력을 허용하되 원본 입력과 정규화 결과를 구분한다. 뒷자리 검색 결과가 여러 건이면 마스킹 번호, 담당 디자이너와 최근 방문일로 구분한다.

휴대전화 번호 입력

  • 변형: 신규 고객, 고객 수정, 예약 연락처 스냅샷, CSV 검토
  • 상태: 미입력, 정상, 기존 고객 발견, 검토 필요, 중복 충돌
  • 적용: 입력 중 읽기 쉬운 형식으로 표시하되 저장 전 원본 입력값을 보존한다. 기존 011, 016, 017, 018, 019 번호를 010으로 바꾸지 않는다. 같은 가게에서 같은 정규화 번호가 발견되면 신규 생성을 바로 진행하지 않고 기존 고객 또는 병합 검토를 보여준다.

날짜 전환 탭

  • 변형: 오늘·내일, 고객 상세 탭, 시술 종류 필터
  • 상태: 선택, 미선택, 포커스, 비활성
  • 적용: 오늘과 내일에는 날짜와 요일을 함께 표시한다. 탭의 선택 상태는 색상뿐 아니라 굵기, 밑줄 또는 배경과 접근성 상태값으로 전달한다.

필터 칩과 필터 시트

  • 변형: 빠른 필터, 복수 선택, 단일 선택, 모바일 바텀시트
  • 상태: 선택, 미선택, 결과 없음, 초기화 가능
  • 적용: 모바일에는 내 담당, 발송 필요, 미확인, 시술 기록 미작성 같은 핵심 필터만 노출한다. 추가 필터는 바텀시트에 두고 적용된 조건 수와 전체 초기화를 제공한다.

상태 배지

  • 변형: 운영 메시지, 방문 결과, 고객 단계, 동의 상태, 고객 기록 상태, 계정 상태
  • 상태: 발송 예정, 처리 중, 성공, 실패, 자동 발송 중지, 수동 연락 완료, 검토 필요
  • 적용: 색상과 함께 상태명을 항상 표시한다. 방문 결과와 운영 메시지 상태를 한 배지로 합치지 않는다. 고객 취소와 매장 취소도 서로 다른 텍스트로 표시한다.

예약 확인 카드

  • 변형: 오늘, 내일, 즉시 처리 필요, 시술 기록 미작성, 취소됨
  • 상태: 기본, 발송 예정, 발송 실패, 방문 결과 미입력, 시술 완료, 노쇼, 고객 취소, 매장 취소
  • 적용: 시간, 고객명, 마스킹된 예약 연락처 스냅샷, 담당 디자이너, 예정 시술, 접점, 고객 확인 상태, 내일·당일 안내 상태와 방문 결과를 표시한다. 고객 보기와 현재 필요한 행동 하나를 우선 노출한다. 취소된 건은 자동 발송 대상에서 제외됐음을 명시한다.

처리 필요 배너

  • 변형: 발송 실패, 자동 발송 중지, 시술 기록 미작성, 방문 결과 확인 필요, 검토 필요
  • 상태: 펼침, 접힘, 처리 중, 해결됨
  • 적용: 문제 원인, 영향받은 건수와 다음 행동을 한 문장으로 설명한다. 알림톡 오류는 알림톡 설정 또는 수동 연락 대상 목록으로 연결한다.

고객 목록 카드

  • 변형: 기본, 배합 있음, 다음 예약 있음, 뜸해짐, 중복 정보 확인 필요
  • 상태: 기본, 선택, 호버, 접근 제한, 병합됨
  • 적용: 고객명, 마스킹 번호, 담당 디자이너, 고객 단계, 최근 방문일, 최근 시술, 다음 예약과 마케팅 수신동의 상태를 우선순위에 따라 표시한다. 병합됨 고객은 대표 고객으로 이동하는 안내만 제공한다.

최근 시술 카드

  • 변형: 염색, 펌, 커트, 클리닉, 기타, 기록 없음
  • 상태: 기본, 배합 있음, 사진 있음, 임시 저장, 접근 제한
  • 적용: 시술일, 실제 담당 디자이너, 시술 종류, 핵심 메모를 표시한다. 염색 기록은 염색약 번호와 배합 첫 줄을 별도 강조하고 배합 보기를 직접 제공한다. 사진은 첨부 수만 먼저 보이고 요청할 때 확대한다.

시술 이력 타임라인

  • 변형: 전체, 염색, 펌, 커트, 클리닉, 배합 있음, 사진 있음
  • 상태: 로딩, 결과 있음, 결과 없음, 부분 오류
  • 적용: 최신순으로 표시하며 날짜, 시술 종류, 실제 담당 디자이너, 배합 요약, 메모와 사진 수를 제공한다. 긴 메모는 접고 펼칠 수 있게 하되 염색약 번호와 배합은 접힌 상태에서도 확인할 수 있게 한다.

폼 필드

  • 변형: 한 줄 입력, 여러 줄 입력, 선택, 날짜·시간, 복수 시술 선택, 동의 상태
  • 상태: 기본, 포커스, 입력 완료, 필수 오류, 도움말, 읽기 전용, 비활성
  • 적용: 라벨을 입력창 밖에 유지하고 필수 여부와 오류 이유를 문장으로 표시한다. 시술 메모처럼 중요한 긴 입력은 저장 실패 후에도 값을 유지한다. 민감 정보는 기본 필드로 추가하지 않는다.

사진 첨부

  • 변형: 카메라 촬영, 파일 선택, 썸네일 목록, 전체 화면 보기
  • 상태: 동의 확인 필요, 업로드 중, 완료, 실패, 삭제 확인
  • 적용: 사진은 선택 입력이다. 촬영·보관 동의와 보유기간을 확인할 수 없으면 첨부를 막고 이유를 표시한다. 사진 실패가 시술 기록 전체 저장을 막지 않게 분리해 처리한다.

CSV 가져오기 단계 표시

  • 변형: 파일 업로드, 열 연결, 형식 검증, 오류 수정, 중복 검토, 반영 결과
  • 상태: 대기, 진행 중, 완료, 오류, 재처리
  • 적용: 현재 단계, 완료된 단계와 남은 단계를 텍스트로 표시한다. 파일을 운영 데이터에 바로 반영하지 않으며 검증 전에는 반영 버튼을 비활성화한다. 같은 가져오기 작업을 다시 실행할 때 중복 생성되지 않음을 결과 화면에서 알려준다.

검토 표와 모바일 행 카드

  • 변형: CSV 오류 행, 열 연결, 직원 목록, 병합 이력, 알림톡 템플릿
  • 상태: 기본, 정렬, 필터, 행 편집, 오류, 빈 결과
  • 적용: lg 이상에서는 고정 헤더 표를 사용하고 좁은 화면에서는 각 셀의 항목명을 포함한 세로 카드로 바꾼다. CSV 오류 행에는 원본 행 번호, 원본 값, 오류 이유와 해당 행만 재처리하는 행동을 제공한다.

병합 비교 패널

  • 변형: 양쪽 비교, 모바일 단계 비교, 충돌 없음, 충돌 있음
  • 상태: 대표 고객 미선택, 대표 고객 선택, 검토 필요, 병합 처리 중, 병합 완료, 동시 수정 감지
  • 적용: 이름, 정규화 번호, 담당 디자이너, 동의 상태, 미래 예약, 발송 예정 알림톡과 이동할 기록 수를 비교한다. 선택한 대표값과 보수적인 동의 처리 결과를 고정 요약에 표시한다. 병합 사유 입력과 최종 확인 전에는 실행할 수 없게 한다.

연결 상태 카드

  • 변형: 발신 프로필, 예약 확인 템플릿, 당일 안내 템플릿, API 연결, 발송 결과 수신
  • 상태: 사용 가능, 연결 필요, 확인 필요, 자동 발송 중지, 오류
  • 적용: 현재 상태, 마지막 확인 시각, 자동 발송 가능 여부와 중지 원인을 표시한다. 연결 또는 템플릿이 유효하지 않으면 실패 상태만 보여주지 말고 수동 연락 관리로 이동하는 행동을 제공한다.

대화상자와 바텀시트

  • 변형: 확인, 파괴적 확인, 빠른 수정, 필터, 수동 연락 기록
  • 상태: 열림, 처리 중, 오류, 닫힘
  • 적용: 모바일의 짧은 선택은 바텀시트, 병합 실행·취소와 계정 차단은 명시적 대화상자를 사용한다. 파괴적 행동에는 대상, 영향과 되돌릴 수 있는 범위를 표시한다.

빈 상태와 오류 상태

  • 변형: 예약 없음, 고객 없음, 시술 기록 없음, 검색 결과 없음, 권한 없음, 데이터 오류
  • 상태: 기본, 재시도 가능, 행동 가능, 접근 차단
  • 적용: 단순히 비어 있다고 표시하지 말고 이유와 다음 행동을 제공한다. 권한 없음은 데이터 존재 여부를 과도하게 노출하지 않으며 정책이 확정된 경우에만 임시 열람 요청 행동을 표시한다.

토스트와 실시간 상태 안내

  • 변형: 저장 완료, 저장 실패, 발송 상태 변경, 병합 완료, 재처리 완료
  • 상태: 정보, 성공, 경고, 오류
  • 적용: 중요한 실패는 토스트만 사용하지 말고 해당 카드나 필드에도 남긴다. 보조 기술이 상태 변화를 읽을 수 있도록 적절한 실시간 알림 영역을 사용한다.

7. 화면별 적용

today-tomorrow-reservations · 오늘·내일 예약 확인

로그인 후 첫 화면이다. 상단에 오늘·내일 전환, 날짜, 내 담당 또는 전체 범위와 예약 확인 건 등록 버튼을 둔다. 즉시 처리 필요, 시술 기록 작성 필요, 내일 안내 확인, 일반 예약 목록 순으로 묶고 각 묶음의 건수를 표시한다. 예약 카드는 시간순으로 정렬하며 고객명, 마스킹된 예약 연락처 스냅샷, 담당 디자이너, 예정 시술, 접점, 고객 확인 상태, 내일·당일 알림톡 상태와 방문 결과를 보여준다. 방문 완료를 선택하면 시술 기록 작성으로 바로 이동한다. 발송 실패나 자동 발송 중지는 수동 연락 기록 또는 알림톡 설정으로 연결한다. 전체 예약 달력은 넣지 않는다.

customer-list · 고객 목록

상단에 고정 검색창을 두고 이름 또는 휴대전화 번호 검색을 안내한다. 원장님은 현재 가게 전체, 디자이너는 자기 담당 고객을 기본 범위로 본다. 결과에는 고객명, 마스킹 번호, 담당 디자이너, 고객 단계, 최근 방문일, 최근 시술, 배합 있음, 다음 예약과 마케팅 수신동의 상태를 표시한다. 이름이 같아도 번호가 다르면 별도 고객으로 보여준다. 같은 정규화 번호에서 충돌이 발견되면 원장님에게 중복 고객 병합 검토 진입을 제공하고 디자이너에게는 중복 후보 제시만 허용한다.

customer-detail · 고객 상세

첫 화면에 고객명, 마스킹 번호, 담당 디자이너, 방문 횟수, 고객 단계, 최근 방문일과 다음 예약을 표시한다. 바로 아래에 최근 시술 카드를 두고 최근 염색 기록이면 염색약 번호와 배합 첫 줄을 노출한다. 요약, 시술 이력, 사진 탭을 사용하며 개인정보 및 마케팅 수신동의는 최근 시술보다 아래의 고객 관리 정보에 둔다. 하단에는 시술 기록 작성과 예약 등록 중 현재 맥락에 맞는 주요 행동을 고정한다. 디자이너가 자기 담당 고객이 아닌 상세에 접근하면 내용을 반환하지 않고 권한 안내를 표시한다. 대체 시술 열람 방식은 확인 필요이며 확정된 정책에 따라 임시 열람 요청, 원장님 승인 또는 담당 디자이너 변경 UI 중 하나만 활성화한다.

treatment-record · 시술 기록 작성

단일 열 폼으로 구성하고 고객, 연결된 예약 확인 건, 시술 일시와 실제 담당 디자이너를 상단에 표시한다. 입력 순서는 시술 종류, 시술명, 염색약 번호, 배합, 시술 메모, 선택 사진, 다음 예약이다. 시술 종류와 시술 메모는 기록 완료에 필수다. 염색을 선택하면 최근 염색 배합 참고 카드와 이번 기록에 복사 행동을 제공하되 복사 후 수정 여부를 사용자가 확인하게 한다. 사진은 촬영·보관 동의와 보유기간이 확인된 경우에만 선택 첨부한다. 임시 저장과 기록 완료를 구분하고 저장 실패 시 입력값을 유지한다. 완료 후 연결된 시술 기록 미작성 내부 할 일을 자동 완료한다.

inactive-customers · 뜸해진 고객

마지막 시술 후 달력 기준 2개월이 지났고 미래 예약이 없는 고객만 표시한다. 기준은 확인 필요 가정임을 원장 설정 또는 도움말에 명시한다. 목록에는 고객명, 담당 디자이너, 마지막 시술일, 경과 기간, 마케팅 수신동의 상태와 최근 연락 결과를 표시한다. 원장님은 전체, 디자이너는 자기 담당 고객 범위로 본다. 고객별로 연락 일시, 연락 채널, 연락 결과와 작성자를 기록한다. 마케팅 수신동의가 거부 또는 동의 미확인인 경우 광고성 연락으로 오해할 행동을 강조하지 않는다. 자동 재방문 광고 발송이나 일괄 발송 기능은 제공하지 않는다.

import-merge · 자료 가져오기·중복 합치기

원장님 전용 단계형 화면으로 파일 업로드, 열 연결, 형식 검증, 오류 수정, 중복 검토, 반영 결과 순서를 사용한다. CSV 원본은 임시 저장 영역에서 검증하고 반영 전 성공 예정, 검토 필요와 오류 행을 구분한다. 전화번호, 날짜, 담당자 연결 오류에 원본 행 번호와 이유를 표시하고 해당 행만 수정·재처리할 수 있게 한다. 연결되지 않은 담당자 이름은 이전 담당자 텍스트로 보존됨을 표시한다. 같은 파일의 재처리로 중복 생성되지 않도록 가져오기 작업 상태와 이전 처리 결과를 보여준다. lg 이상에서는 표, 좁은 화면에서는 단계별 행 카드를 사용한다. 수첩 자료 직접 입력은 고객 정보와 시술 기록 작성 흐름으로 분리한다.

staff-permissions · 직원·권한 설정

원장님만 접근한다. 직원명, 로그인 수단, 역할, 현재 가게 소속, 계정 활성 상태와 마지막 권한 변경일을 표시한다. 직원 추가와 수정에서 역할은 원장님 또는 디자이너만 제공한다. 마지막 원장님을 디자이너로 변경하거나 차단하려는 경우 운영 불가 영향을 설명하고 저장을 막는다. 계정을 비활성화해도 기존 고객, 예약 확인 건과 시술 기록은 삭제되지 않음을 확인 문구로 표시한다. 권한 변경 이력을 같은 화면에서 확인할 수 있게 하며 디자이너에게 자료 가져오기, 병합 실행·취소와 직원 설정 권한을 노출하지 않는다.

login · 로그인

브랜드 표식, 로그인 필드와 로그인 버튼만 중심에 둔 단순한 화면으로 구성한다. 로그인 실패 시 계정 존재 여부를 구체적으로 노출하지 않는다. 차단된 계정, 소속 가게 없음, 비활성 가게와 세션 만료 상태는 서로 구분되는 안내를 제공한다. 인증 후 현재 가게와 역할을 확인하고 오늘·내일 예약 확인으로 이동한다. 세션 만료로 이동한 경우 저장하지 않은 입력이 있었음을 알린다.

owner-settings · 원장 설정

원장님 전용 허브다. 가게 정보, 직원·권한 설정, 자료 가져오기·중복 합치기, 알림톡 설정과 고객 병합 이력을 카드로 제공한다. 각 카드에는 단순 메뉴명뿐 아니라 직원 수, 최근 가져오기 상태, 검토 필요 행, 알림톡 자동 발송 가능 여부 같은 현재 상태를 표시한다. 가게 정보에는 매장명, 연락처와 Asia/Seoul 시간대를 확인할 수 있게 한다. 알림톡 연결이 없어도 고객과 시술 기록 관리를 계속할 수 있음을 명확히 한다.

customer-merge-review · 중복 고객 병합 검토

원장님 전용 화면으로 같은 가게와 정규화 번호 범위의 고객만 비교한다. lg 이상에서는 대표 고객과 통합 대상 고객을 양쪽 패널로, 모바일에서는 고객별 원본 정보 확인 후 대표값을 선택하는 단계형 화면으로 구성한다. 이름, 담당 디자이너, 개인정보 동의, 마케팅 수신동의, 미래 예약, 발송 예정 알림톡과 이동할 시술 기록·예약 확인 건 수를 비교한다. 수신 거부가 하나라도 있으면 마케팅 수신 거부를 기본 제안하며 병합으로 동의를 확대할 수 없게 한다. 대표 고객, 모든 충돌 선택값, 미래 예약과 발송 예정 처리, 병합 사유가 확정돼야 실행 버튼을 활성화한다. 처리 중 동시 수정이 감지되면 최신 정보를 다시 검토하게 한다.

customer-merge-history · 고객 병합 이력

원장님만 접근한다. 병합 이력 식별값, 대표 고객, 통합 대상 고객, 실행자, 실행 시각, 사유, 충돌 선택값과 이동한 시술 기록·예약 확인 건을 시간순으로 표시한다. 상세에서는 병합 전후 연결 변화를 항목별로 보여준다. 병합 취소 전에 되돌릴 기록과 병합 뒤 새로 생성되어 자동 분리되지 않는 기록을 구분한다. 새 기록이 있으면 검토 필요 상태가 된다는 영향을 명확히 표시하고 병합 작업 단위로만 취소한다. 취소 처리 중에는 같은 고객에 대한 다른 병합·수정 행동을 비활성화한다.

notification-settings · 알림톡 설정

원장님 전용 설정으로 발신 프로필, 예약 확인 알림톡 템플릿, 당일 예약 안내 템플릿, API 연결과 발송 결과 수신 상태를 각각 카드로 표시한다. 상단에는 자동 발송 가능, 연결 필요, 확인 필요 또는 자동 발송 중지 상태를 한 문장으로 요약한다. 각 카드에 현재 상태, 마지막 확인 시각과 중지 원인을 표시한다. 유효하지 않은 연결이나 템플릿이 있으면 자동 발송이 중지됨을 명확히 하고 오늘·내일 예약 확인의 수동 연락 대상 목록으로 연결한다. 전날 오후 6시와 방문 3시간 전이라는 Asia/Seoul 기준을 표시하되 매장 운영 시간에 따른 변경 기능은 정확한 정책을 확인한 뒤 제공한다.

8. 에셋과 모션

  • 온헤어 로고 SVG 원본 또는 텍스트 로고 규칙: 제공 필요
  • 16·20·24픽셀 크기의 일관된 선형 아이콘 세트: 예약, 고객, 검색, 시술 기록, 염색약 번호·배합, 알림톡, 발송 상태, 사진, 직원, CSV, 병합, 병합 취소
  • 상태 아이콘: 성공, 실패, 처리 중, 검토 필요, 자동 발송 중지, 수동 연락 완료
  • 기본 고객 아바타: 사진 없이 이름 첫 글자를 사용하는 중립형 SVG
  • 예약 없음, 고객 없음, 시술 기록 없음에 사용할 단순한 단색 빈 상태 SVG
  • 시술 사진 썸네일 자리표시자와 업로드 오류 이미지
  • CSV 열 연결과 고객 병합 흐름에 사용할 제품 내 설명용 도식 SVG
  • 장식적인 헤어 모델 사진은 사용하지 않음
  • 기본 전환: 180ms cubic-bezier(0.2, 0, 0, 1)
  • prefers-reduced-motion 사용자는 불필요한 움직임을 제거합니다.
  • 다크모드: 초기 범위에서 제외

9. 접근성

  • KWCAG 2.2와 WCAG 2.1 AA를 기준으로 일반 텍스트는 배경 대비 4.5:1 이상, 큰 텍스트와 핵심 그래픽은 3:1 이상을 유지한다.
  • 주요 터치 대상은 최소 44×44픽셀로 만들고 작은 보조 대상도 오작동을 막을 간격을 둔다.
  • 모든 입력에는 항상 보이는 라벨, 필수 여부, 입력 예시와 구체적인 오류 문장을 제공한다.
  • 상태는 색상만으로 구분하지 않고 성공, 실패, 검토 필요, 노쇼 같은 텍스트와 아이콘을 함께 사용한다.
  • 키보드 포커스는 2픽셀 이상의 명확한 포커스 링으로 표시하고 시각적 순서와 탭 순서를 일치시킨다.
  • 대화상자와 바텀시트는 열린 동안 포커스를 내부에 유지하고 닫힌 뒤 실행 버튼으로 포커스를 돌려보낸다.
  • 탭, 필터 칩, 펼침 영역과 처리 중 버튼에 선택·확장·비활성 상태를 보조 기술이 알 수 있는 속성으로 제공한다.
  • 예약 및 시술 시간은 날짜, 요일과 시간을 함께 표시하고 Asia/Seoul 기준임을 설정 화면에서 확인할 수 있게 한다.
  • 전화번호 마스킹 문자열은 읽기 어려운 별표 나열만 낭독되지 않게 접근 가능한 설명을 제공하되 권한이 없는 사용자에게 전체 번호를 노출하지 않는다.
  • 표는 열 머리글과 행의 관계를 제공하고 모바일 카드로 바뀌어도 각 값의 항목명을 생략하지 않는다.
  • 저장, 발송, 업로드와 병합 처리 결과는 실시간 알림으로 전달하며 오류가 발생한 필드나 행으로 이동할 수 있게 한다.
  • 사진 썸네일에는 시술일과 시술 종류를 포함한 대체 설명을 제공하고 확대·닫기 기능을 키보드로 사용할 수 있게 한다.
  • 자동으로 사라지는 메시지에만 중요한 정보를 두지 않고 발송 실패, 검토 필요와 미작성 할 일은 화면에 지속해서 남긴다.
  • 동작 감소 설정이 켜져 있으면 화면 이동, 바텀시트와 상태 변화 애니메이션을 제거하거나 즉시 전환한다.

10. 구현 체크리스트

  • 디자인 토큰을 CSS 변수 또는 Tailwind theme에 한 번만 정의합니다.
  • 디자인 계약의 기본 글꼴, 문자 체계별 fallback과 지정 자간이 모든 화면에 적용되는지 확인합니다.
  • 선택한 레이아웃 전략과 breakpoint가 화면마다 달라지지 않게 합니다.
  • 버튼·입력·표·대화상자의 focus, disabled, error 상태를 확인합니다.
  • 모바일과 데스크톱에서 핵심 사용자 흐름을 각각 끝까지 확인합니다.

조사 출처

  • 알림톡 - 카카오비즈니스 — 발신 프로필, 알림톡 템플릿과 발송 연결 상태를 별도 설정 항목으로 표현하는 근거로 참고했다. 실제 API 사용 조건과 심사 상태는 구현 전에 확인해야 한다.
  • 네이버 예약주문 사업자 고객센터 — 네이버 예약을 온헤어가 대체하지 않고 기존 예약 도구로 유지한다는 서비스 경계를 화면 문구와 흐름에 반영할 때 참고했다.
  • 네이버 비즈니스 — 네이버 스마트플레이스·예약·톡톡이 외부 접점으로 계속 사용된다는 시장 맥락을 확인하는 참고 자료다.
  • 헤어짱닷컴 — 국내 미용실 고객관리 도구의 화면 밀도와 고객·시술 기록 중심 용어를 검토하는 참고 자료로 사용했다. 개별 경쟁 기능을 온헤어 요구로 추가하지 않았다.
  • 공비서 원장님 — 국내 미용실 내부 운영 도구의 모바일 사용 맥락과 예약·고객 정보 계층을 검토하는 참고 자료로 사용했다.
  • 미용실 고객관리, 시술 이력이 다음 예약을 만든다 — 모바일 고객 상세에서 최근 시술 이력과 다음 예약을 우선 배치하는 조사 참고 자료다. 온헤어의 구체적인 기능과 권한은 사용자 요구를 우선했다.
디자인 가이드 — 동네 헤어샵의 시술 이력과 예약 확인 | Prometheon