Skip to content

FE 메인테이너 — 멤버 상세 시트 + 마스터데이터 목록 IA

2026-09-15 KST — 증빙 중첩 카드와 단일 편집

실제 route: /master-data/resource/member/general, 변경 수준 L4. MemberEvidenceOrg의 외곽 AttributeGroupCardOrg가 증빙 전체의 편집 경계를 표시합니다. 사업자는 그 안에 사업자 정보 → 주담당자 → 부담당자 세 흰색 카드를 한 열로 둡니다. 외곽 body가 gap-4, 각 내부 CardBody가 자체 content padding을 소유합니다. 내부 담당자 카드에는 footer나 독립 편집 상태가 없습니다.

AttributeChoiceHeaderOrg는 조회값을 EDS neutral-subtle 배지로 표시합니다. 보이는 '타입' 라벨은 없고 sr-only의 '증빙 타입'을 선택기의 aria-labelledby에 연결합니다. 편집/생성 시 배지를 기존 ESelect로 교체하며 법인 사업자 고정은 유지합니다. 선택기는 접기 summary 안에 넣지 않습니다.

useMemberForm.SECTION_FIELDS.evidence에 사업자/현금영수증 필드와 담당자 14필드를 함께 등록합니다. 외곽 footer 한 곳에서 edit/cancel/save를 처리하고, 통합 편집/생성에서는 해당 footer를 숨깁니다. 한 카드 편집에서 일반 연락처 draft가 섞이지 않으며 담당자만 변경해도 부모 저장이 활성화됩니다. 타입 임시 변경 후 복귀, 전체 취소, 대상 변경/닫힘 초기화를 검증합니다. 현금영수증은 외곽 본문에 필드만 표시하고 담당자/빈 사업자 카드를 만들지 않습니다.

생성과 조회/편집은 같은 블록을 사용합니다. CSS/token/package version 변경은 없습니다. 기존 독립 카드·독립 담당자 저장 설명은 이 절로 대체합니다. SSOT 출처와 실제 검증 상태는 docs/decisions/EVIDENCE-UNIFIED-EDIT-ADOPTION-2026-09-15.md에 기록합니다. 프런트 메모리 구현이며 DB/API 확장은 포함하지 않습니다.

2026-09-14 KST — 계정 편집 UI 개정

#627 이후 사용자 요청으로 문구와 보안 편집 UI를 정정합니다. 새 Design 병합 SHA와 제품 배포 결과는 채택 PR의 provenance가 소유합니다. 계정 정보 표는 이메일·휴대전화·연결 상태, 카드 버튼은 편집/취소/저장입니다. RecordAccountOrg는 단일 editing section과 별도 identifier/password draft를 사용합니다. 보안 편집은 빈 신규 패스워드·확인 입력만 열고 기존 값을 표시하지 않습니다. 저장과 원격 mutation은 미연동으로 금지하며, 초안은 취소·닫힘·대상 변경·unmount 때 제거합니다. 설명 및 dangling aria-describedby는 삭제합니다. 표·설명을 감싸던 gap 없는 부모가 원인이었으며 CardBody 전역 CSS나 간격 토큰은 바꾸지 않습니다. 아래 최초 구현의 재설정 요청/설명 정책을 대체합니다.

2026-09-14 KST — 계정 탭 프런트 구현

이 절이 아래 식별 순서·탭 목록·관리코드 누락 표시를 대체합니다. 구조는 Header(record.name) → Card(mgmtCode·regNum·name) → ETabs(일반·계정·기존 업무 탭)입니다. 계정 패널은 RecordAccountOrg의 로그인 정보·보안 카드 두 개를 한 열 gap-4로 합성합니다. 계정에서도 기존 관계 카드가 노출되지 않도록 표시 조건을 관계 탭에 한정합니다.

Design PR #627, merge befed67b05c5286920a5a7bdbc84ff2a74c968b7의 RECORD-IDENTITY-ACCOUNT-FRONTEND-2026-09-14 및 RecordAccountOrg.vue를 채택합니다. EDS 2.34.0 및 기존 registry item은 변경하지 않습니다. 제품 배포 증거는 채택 PR에 별도 기록합니다.

계정 원천 prop은 비워 두며 일반 연락처에서 추론하지 않습니다. 계정 draft는 별도 컴포넌트 내부 소유, force-mount/v-show로 탭 전환 시 유지, accountEpoch로 닫힘·대상 변경 시 초기화합니다. 편집 시작은 이메일 입력, 취소는 편집 버튼으로 focus를 돌립니다. 일반 카드 편집 잠금은 계정 입력을 비활성화하되 초안을 버리지 않습니다. 변경·재설정은 adapter 부재로 disabled이며 실제 mutation은 없습니다. 비밀번호 input·성공 toast·API·storage를 추가하지 않습니다. 기존 카드별/전체 속성 편집과 생성 흐름은 유지합니다.

2026-09-14 KST — 식별 카드 정렬

아래 09-13의 관리코드 dl 표현을 대체합니다: Header(record.name) → Card(실제 mgmtCode·regNum·이름) → ETabs → Panel → SheetFooter. Design RECORD-DETAIL-TABS-IDENTITY-FIRST-2026-09-13과 후속 RECORD-IDENTITY-ACCOUNT-FRONTEND-2026-09-14를 적용합니다. 정본 출처는 위 계정 탭 절을 참조합니다. 기존 EDS 2.34.0 Card md/filled/inset-edged와 ETable sm/fluid-wrap 합성만 사용합니다. 표시값은 draft가 아닌 record에서 읽고 새로운 편집·저장 경로를 만들지 않습니다. create 모드에는 식별 카드를 생성하지 않습니다. 이름과 등록번호는 저장 원문을 유지합니다. 관련 테스트는 기존 SheetReadMemberArt.spec.js의 식별 카드·미저장 이름 분리 검증입니다.

2026-09-13 KST — identity-first 상세 탭 채택

이 절이 아래 과거 기록의 탭 위치·개수·속성 표 flow를 대체합니다. 실제 route는 /master-data/resource/member/general이며 변경 수준은 L4입니다.

  • Design #623 merge 36827693a9f3cac17543cb7b479d272bf9f89af4RECORD-DETAIL-TABS-IDENTITY-FIRST-2026-09-13 계약과 src/components/pattern-app/detail/RecordDetailTabsOrg.vue 합성을 참조합니다.
  • 게시된 @leysys/eds@2.34.0과 기존 e-tabs·e-table item을 그대로 사용합니다. package/lockfile/CSS/token/registry public API 변경과 새 item 복사는 없습니다.
  • Header(record.name) → 관리코드 dl → ETabs → 선택 패널 → SheetFooter 순서입니다. 로그인 계정이 없는 멤버에 가짜 계정 ID/계정 정보 카드를 만들지 않습니다.
  • GENERAL이 첫 탭이며 기본·연락처·주소의 peer Card들을 직접 소유합니다. 기존 차량·일원·증빙·페이·노트는 각 기존 패널과 공통 카드 표면을 유지합니다. 일반 활성 시 관련 카드 전체를 숨겨 빈 카드/공백을 남기지 않습니다.
  • ETabsList는 기존 plane/primary/moderate/filled/full-radius 트랙입니다. SheetBody의 gap-4가 요약↔ETabs, ETabs의 gap-4가 트랙↔패널, General 내부 stack의 gap-4가 peer Card 사이를 소유합니다. 패널 padding은 추가하지 않습니다.
  • 기본·연락처·주소 조회는 ETable size="sm" flow="fluid-wrap", static/divide-y, th scope="row"w-1/3 라벨의 2열 표입니다. 생년월일·성별을 별도 행으로 표시합니다. 실제 원문은 유지하고 길면 줄바꿈합니다. 관련 목록의 가로 scroll 계약은 유지합니다.
  • force-mountv-show로 일반 폼·관련 checkbox·하위 disclosure DOM을 보존합니다. mode가 edit/create로 바뀌면 일반으로 이동합니다. 닫힘·관리코드 변경 시 탐색/선택을 초기화하고 기존 useMemberForm.reset()으로 카드 편집 상태도 정리합니다.
  • 증빙은 속성이므로 전체 편집의 같은 draft/commit에 남습니다. 카드별 단일 편집 잠금, 저장 유효성/dirty gate, 취소 확인 및 기존 native command 대상은 바꾸지 않습니다. create는 General 안 기존 4개 입력 카드를 보여 주며 탭 트랙·기존 관계 패널은 숨깁니다.
  • 새 기능·활동 탭·백엔드 mutation은 없습니다. MemberEvidenceOrg의 기존 타입별 조건도 유지합니다.

회귀 검증: SheetReadMemberArt.spec.js, scripts/probe-member-related.mjs. 이번 Review의 실행 결과·범위는 docs/verification/MEMBER-DETAIL-TABS-REVIEW-2026-09-13.md를 참조합니다. 현재 작업은 로컬 Review이며 PR·배포 완료를 뜻하지 않습니다.

2026-09-13 KST — 샘플 도로명주소

useMemberForm.js의 데모 roadAddress서울특별시 서초구 서초중앙로 157 (서초동)입니다. 기존 서울 서초구 …는 CSS ellipsis가 아니라 데이터 리터럴이었습니다. 주소 셀의 직접 바인딩과 기존 표 스크롤·크기 계약은 유지합니다. SheetReadMemberArt.spec.js에서 전체 문자열 렌더링을 확인합니다.

2026-09-09 KST — 관련 컬렉션 탭과 목록 조건

Design #591 4244dee55e20470d4e4280f9ab26e1f8de237584의 centered search/native external criterion label/pagination inset과 #592 561bd4385b4d87dc18941de98241d078fec0d236의 관련 컬렉션 composition을 채택합니다. EDS exact 2.31.6과 CSS/token은 그대로입니다.

SheetReadMemberArt의 5개 탭은 ETabs root가 소유하고, 트랙(ETabsList surface="filled")은 Sheet body(subtle) 위 직접 자식으로, 5개 패널은 그 아래 하나의 e-card e-card-md e-card-inset-edged e-card-filled CardBody 안에 둡니다(형제 속성 카드와 같은 inset-edged 표면 — 정본 예제의 엣지 없는 카드는 design 시트 예제 내부 일관성용이며 콘솔 유형 A 시트는 카드에 inset-edged를 쓴다)(2026-09-11 KST 정정 — 오너 결정 "탭은 아래 영역 전체의 탐색이지 한 카드의 chrome이 아님"; 정본 leysys-design ADR TABS-LIST-FILLED-SURFACE-2026-09-11, TABBED-RELATED-COLLECTIONS-2026-09-07 정정). surface="filled"는 트랙 배경을 bg-neutral-minimal로 올려 Sheet body와 같은 토큰(bg-neutral-subtle)에 묻히지 않게 합니다. 탭만 감싸는 흰 래퍼는 금지입니다. ETabsContent force-mount와 기존 v-show를 함께 사용하여 checkbox와 의미 있는 하위 disclosure의 DOM 상태를 보존합니다. 5개 중복 outer disclosure는 제거하되 증빙/페이의 4개 하위 disclosure와 관련 표 7개, 행·native command·기존 API/편집 상태는 유지합니다. 차량/일원 표에는 누락된 표 전용 가로 scroll owner를 추가했습니다.

create에서만 관련 영역을 숨기며 기존 카드별/전체 편집 이원화와 draft는 바꾸지 않습니다. mock checkbox에 새 선택 모델이나 link/unlink 서버 mutation을 만들지 않습니다. 관련 unit은 overlays/__tests__/SheetReadMemberArt.spec.js, 실제 route proof는 scripts/probe-member-related.mjs입니다. canonical closure와 의도적인 도메인 adaptation은 docs/verification/NATIVE-NAVIGATION-MEMBER-ADOPTION-2026-09-09.md에서 구분합니다.

생성 취소/저장 시 mode 변경으로 동적 close command가 사라지던 기존 결함은 두 footer handler에서 종료 순서를 명시하여 수정했습니다. create 취소는 native close 후 cancel, create 저장은 기존 메모리 commit 후 close이며 edit 취소/저장은 열린 read 상태로 돌아옵니다. 카드별 편집·composable·API는 변경하지 않습니다.

계약 연결 탭 시각 계약

  • 계약 연결 시트의 탭 목록은 SSOT 클래스 tabs-list tabs-list-primary-moderate tabs-list-radius-full을 사용한다.
  • 각 실제 목적지만 tabs-trigger tabs-trigger-md로 렌더링한다.
  • 탭 목록 안에 arrow_menu_close 같은 아이콘 전용 가짜 탭을 삽입하지 않는다. 접기·이전 이동이 필요하면 탭과 분리된 공식 컨트롤을 사용한다.
  • 탭 CSS는 leysys-design 카피본을 그대로 유지하며 제품 레포에서 크기·패딩·radius를 덮어쓰지 않는다.

독자: FE 메인테이너/AI. "이 페이지를 이어 개발하려면 무엇을 알아야 하나". 대상: 멤버(general) 목록 + 통합 상세 시트(R/C/U) + 연결 컬렉션 오케스트레이션. 정본 패턴: CLAUDE.md §0(Sheet 편집 패턴, 오너 이원화) · §1(코드 체계) · 리스트 IA.

목록 구성·조회 상태·페이지네이션의 공통 계약은 Console 목록 구성·조회·페이지네이션을 따릅니다. 아래 트리는 2026-09-06 KST의 목록 채택 구조입니다.


1. 라우트

pathview상태
/master-data/resource/member/generalsrc/views/master-data/resource/member/general/IndexView.vue✅구현
/master-data/resource/member/group.../group/IndexView.vue(별도)
/master-data/resource/member/label.../label/IndexView.vue(별도)

정의: src/router/index.js (general = L921 부근).


2. 컴포넌트 트리

IndexView.vue (general)
├── HeaderOrg.vue
└── MainOrg.vue
    ├── provideConsoleListState    (조회 초안/적용 조건·페이지·선택 ID)
    ├── ETableCard
    │   ├── Body
    │   │   ├── EListQueryBar      (검색 + 개인/법인 조건)
    │   │   │   └── EInputGroupButton (입력 내부 끝의 상세 조건 열기)
    │   │   ├── ListAction / SelectionAction
    │   │   │   └── DataToolBarOrg.vue (전체 목록 작업 / 선택 작업)
    │   │   └── TableBlock
    │   │       ├── DynamicTableOrg.vue (목록·빈 결과; 이름 클릭 = 상세)
    │   │       └── ListPagination.vue → ETablePagination
    │   └── Criteria Sheet        (native dialog, 조건 초안 취소/적용)

    └── (overlays — MainOrg가 형제로 마운트)
        ├── SheetReadMemberArt.vue          ★ 통합 R/C/U 상세 시트 (read|edit|create)
        ├── SheetCreateUploadMemberArt.vue  (CSV 등 일괄 업로드)

        └── 연결 컬렉션 시트(자체 R/C/U) — SheetReadMemberArt 내 탭에서 호출:
            ├── 차량      Sheet{Read,Create,Update}VehicleArt
            ├── 일원      Sheet{Read,Create,Update}AssociateArt
            ├── 사업자    Sheet{Read,Create,Update}BusinessArt
            ├── 현금영수증 Sheet{Read,Create,Update}CashReceiptArt
            ├── 가상계좌  Sheet{Read,Create,Update}VirtualBankAccountArt
            ├── 자동이체  Sheet{Read,Create,Update}DirectDebitArt
            └── 노트      Sheet{Read,Create,Update}NoteArt
        └── 공통 다이얼로그: Dialog{Create,Read,Update,Delete,Confirm,Cancel,List,Attach}Art
  • 마운트 전략: MainOrg.vue<dialog popover>형 시트/다이얼로그를 전부 형제로 한 번씩 마운트해두고, 목록·툴바·시트 내부 버튼이 command="show-modal" commandfor="..."(네이티브 popover/dialog command)로 연다. Vue v-if 토글이 아니라 DOM id 기반 오케스트레이션이다.
  • 연결 컬렉션 시트들은 다른 도메인 디렉터리(master-data/resource/{vehicle,associate,business,...})에서 import해 재사용한다. 멤버 전용이 아님.
  • 상세 조건 Sheet는 목록의 criteria-sheet slot이 소유합니다. 검색 초안과 조건 초안은 독립이며, 검색 제출은 검색만 적용하고 Sheet의 취소/적용은 조건만 처리합니다.

3. 소비 컴포저블 — useMemberForm.js

src/composables/useMemberForm.js. 모듈 스코프 reactive 싱글톤(프로토타입 — useReceipts·useForwarding 선례). 여러 컴포넌트(DynamicTableOrg, DataToolBarOrg, SheetReadMemberArt)가 같은 인스턴스를 공유한다.

노출 상태/메서드

이름종류역할
recordreactive표시 원본(조회). 저장 시 여기에 커밋
draftreactive편집·생성 작업본
moderef 'read'|'edit'|'create'시트 통합 모드
validcomputed필수 충족: type && regNum && name && representative
dirtycomputeddraft ≠ 편집 진입 스냅샷(baseline)
openRead(rec?)fnrec 있으면 record 주입 + mode='read' (목록에서 호출)
startEdit()fndraft←record + 스냅샷 + mode='edit'
startCreate()fn빈 폼 + 기본값(개인/남자) + 관리코드 자동부여 + mode='create'
cancel()fnmode='read' (작업분 버림)
save()fnrecord←draft + mode='read'
syncDraft()fn카드별 편집용 — mode 불변, draft←record + 스냅샷
commitDraft()fn카드별 편집용 — record←draft (mode 불변)
autoRegNum()fn[자동입력] 등록번호 생성(아래 §5)

⚠ 프로토타입 한계: 단일 데모 레코드(DEMO()). 목록의 openRead()는 인자 없이 호출되어 항상 같은 데모 레코드를 연다(행별 주입 미구현 ❌예정). 실제 구현 시 디렉터리/스토어에서 선택 행을 openRead(rec)로 주입.


4. 편집 모델 — 이원화 (사용자 결정, CLAUDE.md §0)

SheetReadMemberArt.vue 속성 영역은 두 편집 경로를 병존시킨다(중복이 아니라 의도된 이원화).

  • 기본·컨택·주소 각 카드가 자체 [편집]→[취소/저장]로 그 카드만 인라인 폼 전환.
  • 상태: reactive cardEdit { basic, contact, address }.
  • editCard(key)syncDraft() + cardEdit[key]=true.
  • cancelCard(key)cardEdit[key]=false(버림). saveCard(key)commitDraft() + false.
  • 카드 폼 표시 여부 = {section}Editing = editing(통합) || cardEdit.{section}.
  • [편집]startEdit()mode='edit': 속성 전체가 한 번에 폼 전환.
  • editing = computed(mode !== 'read').
  • [취소]=cancel(), [저장/생성]=save():disabled="!valid || !dirty"(통째 편집 게이트 §0-7).

4-3. 이원 충돌 방지

  • 통합 편집 중(mode!=='read')엔 카드 footer를 숨긴다(v-if="mode === 'read'"). 커밋 경로를 sheet-footer 하나로 모아 이중 저장 방지.
  • create 모드: 카드 footer 없음(전부 통합), 연결 컬렉션 탭은 v-show="mode !== 'create'"로 숨김(아직 멤버 미존재).

5. 필드 잠금 / 자동화 규칙 (CLAUDE.md §1 코드 체계)

필드createedit규칙
관리코드 mgmtCode편집 가능 필드(자동부여 디폴트 mgmt-####, 직접 수정 가능)비노출 — zone-top에 subtitle-sm로만 표시최초 등록만 결정. 이후 불변
등록번호 regNum입력 가능 + [자동입력] 버튼(autoRegNum):disabled(잠금)준식별 코드. 최초 등록만 변경
생년월일 birthDate입력 가능:disabled(잠금)불변
이름 name입력 가능입력 가능중복 허용. 개인이면 대표자=이름 watch 동기화
대표자 representative법인만 노출 입력법인만 노출개인은 숨김(watch가 name으로 자동 세팅)
타입 typeSelect(개인/법인)Select필수

등록번호 자동입력 포맷(autoRegNum)

  • 개인: 생년월일 8자리 있으면 생년월일6 + 영숫자7, 6자리면 앞6 + 영숫자7, 없으면 영숫자6 + 영숫자7.
  • 법인: 영숫자6 + 영숫자7.
  • 영숫자(alnum)는 첫 글자 소문자 영문 강제(숫자만 패턴 회피).

대표자 동기화 watch

watch([draft.type, draft.name]) → if 개인: draft.representative = draft.name. 개인 멤버는 대표자 입력 필드를 노출하지 않는 근거.


6. 리스트 IA — DynamicTableOrg.vue

  • 제목(이름) 클릭 = 상세 시트 진입. 전용 "상세" 버튼 폐기(CLAUDE.md 리스트 IA). 이름 셀이 <button @click="openRead()" command="show-modal" commandfor="sheet-read-member-art">.
  • 클릭 affordance: hover:underline + cursor-pointer + table-hover(행 호버 하이라이트) + sticky-thead. 이름 등 시작 컬럼은 기본 고정하지 않으며, 수평 스크롤 시 표와 함께 이동합니다.
  • 컬럼 노출(§1 UI 노출 순서): 타입(badge) → 이름 → 연락처(dropdown) → 차량/일원/사업자/현금영수증/가상계좌/자동이체/노트(요약 badge). 등록번호·대표자·생년월일·성별 컬럼은 주석으로 보존(노출 안 함). 관리코드는 목록 비노출(정책 준수).
  • 데이터: 로컬 members ref(데모 3건)를 useConsoleListRows로 연결합니다. 표시 행은 list.pageRows이며 원천 데이터와 분리합니다. 연락처는 각 행의 mobileNum/phoneNum/faxNum/email을 표시하고, 검색은 명시적인 표시 필드와 현재 언어의 타입 라벨을 사용합니다. i18n 라벨은 KO 값 → legalTypeLabel() 등으로 로케일 파생합니다(값은 KO 유지).
  • 헤더 체크박스는 현재 페이지 선택입니다. 적용 조회·페이지 크기 변경 시 선택을 비우며, 단순 페이지 이동은 선택을 유지합니다. 페이지네이션은 표 아래 Body의 TableBlock에 두고 CardFooter로 옮기지 않습니다.

7. 엔티티 속성 vs 연결 컬렉션 (CLAUDE.md §0-6)

  • 엔티티 속성(기본·컨택·주소): 한 몸 — read↔edit 토글 + 통째 저장(또는 카드별). useMemberFormrecord/draft가 바인딩.
  • 연결 컬렉션(차량·일원·증빙〔사업자+현금영수증〕·페이〔가상계좌+자동이체〕·노트): 독립 생명주기 1:N. ETabs root 아래 트랙(Sheet body 위, surface="filled") + 패널 카드 1개(single CardBody) + 자체 Data Tool Bar + 자체 상세 시트이며, 의미 있는 하위 증빙/페이 그룹만 disclosure를 유지합니다. useMemberForm과 무관, read↔edit 토글과 분리됩니다. Data Tool Bar는 SSOT RelatedCollectionsOrg 계약(TABBED-RELATED-COLLECTIONS 정정 2, 2026-09-11 KST 오너 결정)대로 start 쪽 = 선택 의존 벌크 액션, end 쪽 = 일반 액션입니다. [연결 해제] 또는 [삭제]는 start 쪽에 항상 보이되 destructive-minimal md이고 선택이 없으면 :disabled, [생성][연결]은 end 쪽입니다. 선택 수 readout과 [선택 해제] 버튼은 두지 않습니다 — 체크박스 열과 헤더 전체 선택이 상태 표시·해제를 담당하며, 선택 수 표시는 pagination이 있는 목록에서만 pagination 행 start(하단 왼쪽)에 둡니다. 선택 모델은 collectionSelection(표별 배열, collectionRowIds는 프로토타입 정적 행 id), 전체 선택 checkbox는 :checked/:indeterminate. 생성 라벨은 탭이 대상을 이미 말하므로 overlay.create("생성")로 통일했고, 보조 액션 [연결]은 primary-minimal로 무게만 낮췄습니다. 크기는 control-scale 계약대로 데이터 액션 md, 행 내부 sm을 유지합니다.
  • 시트 폭 sheet-width-3xl(48rem) — 세로 폼 집중 폭(§0-5).

8. 확장 / 전파 포인트

  1. 행별 레코드 주입(❌예정): openRead(member) 인자 전달 + record 행별 매핑. 현재 데모 싱글톤.
  2. 실제 디렉터리/스토어: DEMO() reactive 싱글톤 → API 백킹 스토어로 교체. record/draft 계약은 유지.
  3. 유효성 확장: valid에 등록번호 포맷·연락처 정규식 등 추가 시 useMemberForm computed에 집중(컴포넌트 ad-hoc 금지).
  4. 연결 컬렉션 추가: 새 1:N은 같은 패턴(탭 + Data Tool Bar + 외부 도메인 시트 import). 속성 폼에 섞지 말 것.
  5. 다른 마스터데이터 리소스(vehicle/business 등) 목록 IA: 본 패턴(이름 클릭 진입 + table-hover + 상세버튼 폐기)을 동일 적용 — 본 문서가 레퍼런스.
  6. leysys-design SSOT: card/field/sheet/table 클래스는 전부 SSOT 카피본. DS 결함은 본 레포 즉석 패치 금지(§SSOT 강제 룰).