This commit is contained in:
DDD1542
2026-04-09 11:08:49 +09:00
parent b54a23d18f
commit 9ed293e572
17 changed files with 949 additions and 74 deletions

View File

@@ -0,0 +1,50 @@
- generic [active] [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- button "사이드바 접기/펼치기" [ref=e4] [cursor=pointer]:
- img [ref=e5]
- generic [ref=e7]:
- generic [ref=e8]: W
- generic [ref=e9]: WACE 솔루션
- generic [ref=e10]:
- generic [ref=e12] [cursor=pointer]:
- img [ref=e13]
- generic [ref=e16]: 대시보드
- generic [ref=e17] [cursor=pointer]:
- generic [ref=e18]:
- img [ref=e19]
- generic [ref=e24]: 사용자 관리
- img [ref=e25]
- generic [ref=e27] [cursor=pointer]:
- generic [ref=e28]:
- img [ref=e29]
- generic [ref=e31]: 제품 관리
- img [ref=e32]
- generic [ref=e35] [cursor=pointer]:
- img [ref=e36]
- generic [ref=e37]: 통계/분석
- generic [ref=e38] [cursor=pointer]:
- generic [ref=e39]:
- img [ref=e40]
- generic [ref=e43]: 시스템 설정
- img [ref=e44]
- generic [ref=e47] [cursor=pointer]:
- generic [ref=e48]:
- generic [ref=e49]:
- generic [ref=e50]: 박개발
- generic [ref=e51]: 개발팀
- generic [ref=e52]:
- generic [ref=e54]: 대시보드
- generic [ref=e55]: 컨텐츠 영역
- generic [ref=e56]:
- strong [ref=e57]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e58]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e59]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e60]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,50 @@
- generic [active] [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- button "사이드바 접기/펼치기" [ref=e4] [cursor=pointer]:
- img [ref=e5]
- generic [ref=e7]:
- generic [ref=e8]: W
- generic [ref=e9]: WACE 솔루션
- generic [ref=e10]:
- generic [ref=e12] [cursor=pointer]:
- img [ref=e13]
- generic [ref=e16]: 대시보드
- generic [ref=e17] [cursor=pointer]:
- generic [ref=e18]:
- img [ref=e19]
- generic [ref=e24]: 사용자 관리
- img [ref=e25]
- generic [ref=e27] [cursor=pointer]:
- generic [ref=e28]:
- img [ref=e29]
- generic [ref=e31]: 제품 관리
- img [ref=e32]
- generic [ref=e35] [cursor=pointer]:
- img [ref=e36]
- generic [ref=e37]: 통계/분석
- generic [ref=e38] [cursor=pointer]:
- generic [ref=e39]:
- img [ref=e40]
- generic [ref=e43]: 시스템 설정
- img [ref=e44]
- generic [ref=e47] [cursor=pointer]:
- generic [ref=e48]:
- generic [ref=e49]:
- generic [ref=e50]: 박개발
- generic [ref=e51]: 개발팀
- generic [ref=e52]:
- generic [ref=e54]: 대시보드
- generic [ref=e55]: 컨텐츠 영역
- generic [ref=e56]:
- strong [ref=e57]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e58]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e59]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e60]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,38 @@
- generic [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- button "사이드바 접기/펼치기" [active] [ref=e4] [cursor=pointer]:
- img [ref=e5]
- generic [ref=e8]: W
- generic [ref=e61]:
- generic [ref=e62] [cursor=pointer]:
- img [ref=e63]
- generic: 대시보드
- generic [ref=e66] [cursor=pointer]:
- img [ref=e67]
- generic: 사용자 관리
- generic [ref=e72] [cursor=pointer]:
- img [ref=e73]
- generic: 제품 관리
- generic [ref=e75] [cursor=pointer]:
- img [ref=e76]
- generic: 통계/분석
- generic [ref=e77] [cursor=pointer]:
- img [ref=e78]
- generic: 시스템 설정
- generic [ref=e48] [cursor=pointer]:
- generic [ref=e52]:
- generic [ref=e54]: 대시보드
- generic [ref=e55]: 컨텐츠 영역
- generic [ref=e56]:
- strong [ref=e57]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e58]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e59]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e60]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,49 @@
- generic [active] [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- button "사이드바 접기/펼치기" [ref=e4] [cursor=pointer]:
- img [ref=e5]
- generic [ref=e8]: W
- generic [ref=e61]:
- generic [ref=e62] [cursor=pointer]:
- img [ref=e63]
- generic: 대시보드
- generic [ref=e66] [cursor=pointer]:
- img [ref=e67]
- generic: 사용자 관리
- generic [ref=e81]:
- generic [ref=e82]: 사용자 관리
- generic [ref=e83]:
- img [ref=e84]
- text: 사용자 목록
- generic [ref=e87]:
- img [ref=e88]
- text: 권한 설정
- generic [ref=e91]:
- img [ref=e92]
- text: 부서 관리
- generic [ref=e72] [cursor=pointer]:
- img [ref=e73]
- generic: 제품 관리
- generic [ref=e75] [cursor=pointer]:
- img [ref=e76]
- generic: 통계/분석
- generic [ref=e77] [cursor=pointer]:
- img [ref=e78]
- generic: 시스템 설정
- generic [ref=e48] [cursor=pointer]:
- generic [ref=e52]:
- generic [ref=e54]: 대시보드
- generic [ref=e55]: 컨텐츠 영역
- generic [ref=e56]:
- strong [ref=e57]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e58]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e59]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e60]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,50 @@
- generic [active] [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- button "사이드바 접기/펼치기" [ref=e4] [cursor=pointer]:
- img [ref=e5]
- generic [ref=e7]:
- generic [ref=e8]: W
- generic [ref=e9]: WACE 솔루션
- generic [ref=e10]:
- generic [ref=e12] [cursor=pointer]:
- img [ref=e13]
- generic [ref=e16]: 대시보드
- generic [ref=e17] [cursor=pointer]:
- generic [ref=e18]:
- img [ref=e19]
- generic [ref=e24]: 사용자 관리
- img [ref=e25]
- generic [ref=e27] [cursor=pointer]:
- generic [ref=e28]:
- img [ref=e29]
- generic [ref=e31]: 제품 관리
- img [ref=e32]
- generic [ref=e35] [cursor=pointer]:
- img [ref=e36]
- generic [ref=e37]: 통계/분석
- generic [ref=e38] [cursor=pointer]:
- generic [ref=e39]:
- img [ref=e40]
- generic [ref=e43]: 시스템 설정
- img [ref=e44]
- generic [ref=e47] [cursor=pointer]:
- generic [ref=e48]:
- generic [ref=e49]:
- generic [ref=e50]: 박개발
- generic [ref=e51]: 개발팀
- generic [ref=e52]:
- generic [ref=e54]: 대시보드
- generic [ref=e55]: 컨텐츠 영역
- generic [ref=e56]:
- strong [ref=e57]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e58]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e59]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e60]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,38 @@
- generic [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- button "사이드바 접기/펼치기" [active] [ref=e4] [cursor=pointer]:
- img [ref=e5]
- generic [ref=e8]: W
- generic [ref=e61]:
- generic [ref=e62] [cursor=pointer]:
- img [ref=e63]
- generic: 대시보드
- generic [ref=e66] [cursor=pointer]:
- img [ref=e67]
- generic: 사용자 관리
- generic [ref=e72] [cursor=pointer]:
- img [ref=e73]
- generic: 제품 관리
- generic [ref=e75] [cursor=pointer]:
- img [ref=e76]
- generic: 통계/분석
- generic [ref=e77] [cursor=pointer]:
- img [ref=e78]
- generic: 시스템 설정
- generic [ref=e48] [cursor=pointer]:
- generic [ref=e52]:
- generic [ref=e54]: 대시보드
- generic [ref=e55]: 컨텐츠 영역
- generic [ref=e56]:
- strong [ref=e57]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e58]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e59]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e60]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,49 @@
- generic [active] [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- button "사이드바 접기/펼치기" [ref=e4] [cursor=pointer]:
- img [ref=e5]
- generic [ref=e8]: W
- generic [ref=e61]:
- generic [ref=e62] [cursor=pointer]:
- img [ref=e63]
- generic: 대시보드
- generic [ref=e66] [cursor=pointer]:
- img [ref=e67]
- generic: 사용자 관리
- generic [ref=e81]:
- generic [ref=e82]: 사용자 관리
- generic [ref=e83]:
- img [ref=e84]
- text: 사용자 목록
- generic [ref=e87]:
- img [ref=e88]
- text: 권한 설정
- generic [ref=e91]:
- img [ref=e92]
- text: 부서 관리
- generic [ref=e72] [cursor=pointer]:
- img [ref=e73]
- generic: 제품 관리
- generic [ref=e75] [cursor=pointer]:
- img [ref=e76]
- generic: 통계/분석
- generic [ref=e77] [cursor=pointer]:
- img [ref=e78]
- generic: 시스템 설정
- generic [ref=e48] [cursor=pointer]:
- generic [ref=e52]:
- generic [ref=e54]: 대시보드
- generic [ref=e55]: 컨텐츠 영역
- generic [ref=e56]:
- strong [ref=e57]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e58]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e59]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e60]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,50 @@
- generic [active] [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- button "사이드바 접기/펼치기" [ref=e4] [cursor=pointer]:
- img [ref=e5]
- generic [ref=e7]:
- generic [ref=e8]: W
- generic [ref=e9]: WACE 솔루션
- generic [ref=e10]:
- generic [ref=e12] [cursor=pointer]:
- img [ref=e13]
- generic [ref=e16]: 대시보드
- generic [ref=e17] [cursor=pointer]:
- generic [ref=e18]:
- img [ref=e19]
- generic [ref=e24]: 사용자 관리
- img [ref=e25]
- generic [ref=e27] [cursor=pointer]:
- generic [ref=e28]:
- img [ref=e29]
- generic [ref=e31]: 제품 관리
- img [ref=e32]
- generic [ref=e35] [cursor=pointer]:
- img [ref=e36]
- generic [ref=e37]: 통계/분석
- generic [ref=e38] [cursor=pointer]:
- generic [ref=e39]:
- img [ref=e40]
- generic [ref=e43]: 시스템 설정
- img [ref=e44]
- generic [ref=e47] [cursor=pointer]:
- generic [ref=e48]:
- generic [ref=e49]:
- generic [ref=e50]: 박개발
- generic [ref=e51]: 개발팀
- generic [ref=e52]:
- generic [ref=e54]: 대시보드
- generic [ref=e55]: 컨텐츠 영역
- generic [ref=e56]:
- strong [ref=e57]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e58]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e59]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e60]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,50 @@
- generic [active] [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- button "사이드바 접기/펼치기" [ref=e4] [cursor=pointer]:
- img [ref=e5]
- generic [ref=e7]:
- generic [ref=e8]: W
- generic [ref=e9]: WACE 솔루션
- generic [ref=e10]:
- generic [ref=e12] [cursor=pointer]:
- img [ref=e13]
- generic [ref=e16]: 대시보드
- generic [ref=e17] [cursor=pointer]:
- generic [ref=e18]:
- img [ref=e19]
- generic [ref=e24]: 사용자 관리
- img [ref=e25]
- generic [ref=e27] [cursor=pointer]:
- generic [ref=e28]:
- img [ref=e29]
- generic [ref=e31]: 제품 관리
- img [ref=e32]
- generic [ref=e35] [cursor=pointer]:
- img [ref=e36]
- generic [ref=e37]: 통계/분석
- generic [ref=e38] [cursor=pointer]:
- generic [ref=e39]:
- img [ref=e40]
- generic [ref=e43]: 시스템 설정
- img [ref=e44]
- generic [ref=e47] [cursor=pointer]:
- generic [ref=e48]:
- generic [ref=e49]:
- generic [ref=e50]: 박개발
- generic [ref=e51]: 개발팀
- generic [ref=e52]:
- generic [ref=e54]: 대시보드
- generic [ref=e55]: 컨텐츠 영역
- generic [ref=e56]:
- strong [ref=e57]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e58]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e59]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e60]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,50 @@
- generic [active] [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- generic [ref=e4]:
- generic [ref=e5]: W
- generic [ref=e6]: WACE 솔루션
- button "사이드바 접기/펼치기" [ref=e7] [cursor=pointer]:
- img [ref=e8]
- generic [ref=e11]:
- generic [ref=e13] [cursor=pointer]:
- img [ref=e14]
- generic [ref=e17]: 대시보드
- generic [ref=e18] [cursor=pointer]:
- generic [ref=e19]:
- img [ref=e20]
- generic [ref=e25]: 사용자 관리
- img [ref=e26]
- generic [ref=e28] [cursor=pointer]:
- generic [ref=e29]:
- img [ref=e30]
- generic [ref=e32]: 제품 관리
- img [ref=e33]
- generic [ref=e36] [cursor=pointer]:
- img [ref=e37]
- generic [ref=e38]: 통계/분석
- generic [ref=e39] [cursor=pointer]:
- generic [ref=e40]:
- img [ref=e41]
- generic [ref=e44]: 시스템 설정
- img [ref=e45]
- generic [ref=e48] [cursor=pointer]:
- generic [ref=e49]:
- generic [ref=e50]:
- generic [ref=e51]: 박개발
- generic [ref=e52]: 개발팀
- generic [ref=e53]:
- generic [ref=e55]: 대시보드
- generic [ref=e56]: 컨텐츠 영역
- generic [ref=e57]:
- strong [ref=e58]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e59]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e60]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e61]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,39 @@
- generic [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- generic [ref=e4]:
- generic [ref=e5]: W
- button "사이드바 접기/펼치기" [active] [ref=e7] [cursor=pointer]:
- img [ref=e62]
- generic [ref=e65]:
- generic [ref=e66] [cursor=pointer]:
- img [ref=e67]
- generic: 대시보드
- generic [ref=e70] [cursor=pointer]:
- img [ref=e71]
- generic: 사용자 관리
- generic [ref=e76] [cursor=pointer]:
- img [ref=e77]
- generic: 제품 관리
- generic [ref=e79] [cursor=pointer]:
- img [ref=e80]
- generic: 통계/분석
- generic [ref=e81] [cursor=pointer]:
- img [ref=e82]
- generic: 시스템 설정
- generic [ref=e49] [cursor=pointer]:
- generic [ref=e53]:
- generic [ref=e55]: 대시보드
- generic [ref=e56]: 컨텐츠 영역
- generic [ref=e57]:
- strong [ref=e58]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e59]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e60]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e61]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,50 @@
- generic [active] [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- generic [ref=e4]:
- generic [ref=e5]: W
- generic [ref=e6]: WACE 솔루션
- button "사이드바 접기/펼치기" [ref=e7] [cursor=pointer]:
- img [ref=e8]
- generic [ref=e11]:
- generic [ref=e13] [cursor=pointer]:
- img [ref=e14]
- generic [ref=e17]: 대시보드
- generic [ref=e18] [cursor=pointer]:
- generic [ref=e19]:
- img [ref=e20]
- generic [ref=e25]: 사용자 관리
- img [ref=e26]
- generic [ref=e28] [cursor=pointer]:
- generic [ref=e29]:
- img [ref=e30]
- generic [ref=e32]: 제품 관리
- img [ref=e33]
- generic [ref=e36] [cursor=pointer]:
- img [ref=e37]
- generic [ref=e38]: 통계/분석
- generic [ref=e39] [cursor=pointer]:
- generic [ref=e40]:
- img [ref=e41]
- generic [ref=e44]: 시스템 설정
- img [ref=e45]
- generic [ref=e48] [cursor=pointer]:
- generic [ref=e49]:
- generic [ref=e50]:
- generic [ref=e51]: 박개발
- generic [ref=e52]: 개발팀
- generic [ref=e53]:
- generic [ref=e55]: 대시보드
- generic [ref=e56]: 컨텐츠 영역
- generic [ref=e57]:
- strong [ref=e58]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e59]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e60]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e61]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,39 @@
- generic [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- generic [ref=e4]:
- generic [ref=e5]: W
- button "사이드바 접기/펼치기" [active] [ref=e7] [cursor=pointer]:
- img [ref=e62]
- generic [ref=e65]:
- generic [ref=e66] [cursor=pointer]:
- img [ref=e67]
- generic: 대시보드
- generic [ref=e70] [cursor=pointer]:
- img [ref=e71]
- generic: 사용자 관리
- generic [ref=e76] [cursor=pointer]:
- img [ref=e77]
- generic: 제품 관리
- generic [ref=e79] [cursor=pointer]:
- img [ref=e80]
- generic: 통계/분석
- generic [ref=e81] [cursor=pointer]:
- img [ref=e82]
- generic: 시스템 설정
- generic [ref=e49] [cursor=pointer]:
- generic [ref=e53]:
- generic [ref=e55]: 대시보드
- generic [ref=e56]: 컨텐츠 영역
- generic [ref=e57]:
- strong [ref=e58]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e59]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e60]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e61]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,50 @@
- generic [active] [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- generic [ref=e4]:
- generic [ref=e5]: W
- generic [ref=e6]: WACE 솔루션
- button "사이드바 접기" [ref=e7] [cursor=pointer]:
- img [ref=e8]
- generic [ref=e11]:
- generic [ref=e13] [cursor=pointer]:
- img [ref=e14]
- generic [ref=e17]: 대시보드
- generic [ref=e18] [cursor=pointer]:
- generic [ref=e19]:
- img [ref=e20]
- generic [ref=e25]: 사용자 관리
- img [ref=e26]
- generic [ref=e28] [cursor=pointer]:
- generic [ref=e29]:
- img [ref=e30]
- generic [ref=e32]: 제품 관리
- img [ref=e33]
- generic [ref=e36] [cursor=pointer]:
- img [ref=e37]
- generic [ref=e38]: 통계/분석
- generic [ref=e39] [cursor=pointer]:
- generic [ref=e40]:
- img [ref=e41]
- generic [ref=e44]: 시스템 설정
- img [ref=e45]
- generic [ref=e48] [cursor=pointer]:
- generic [ref=e49]:
- generic [ref=e50]:
- generic [ref=e51]: 박개발
- generic [ref=e52]: 개발팀
- generic [ref=e53]:
- generic [ref=e55]: 대시보드
- generic [ref=e56]: 컨텐츠 영역
- generic [ref=e57]:
- strong [ref=e58]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e59]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e60]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e61]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,38 @@
- generic [active] [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- generic [ref=e5]: W
- button "사이드바 펼치기" [ref=e63] [cursor=pointer]:
- img [ref=e64]
- generic [ref=e67]:
- generic [ref=e68] [cursor=pointer]:
- img [ref=e69]
- generic: 대시보드
- generic [ref=e72] [cursor=pointer]:
- img [ref=e73]
- generic: 사용자 관리
- generic [ref=e78] [cursor=pointer]:
- img [ref=e79]
- generic: 제품 관리
- generic [ref=e81] [cursor=pointer]:
- img [ref=e82]
- generic: 통계/분석
- generic [ref=e83] [cursor=pointer]:
- img [ref=e84]
- generic: 시스템 설정
- generic [ref=e49] [cursor=pointer]:
- generic [ref=e53]:
- generic [ref=e55]: 대시보드
- generic [ref=e56]: 컨텐츠 영역
- generic [ref=e57]:
- strong [ref=e58]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e59]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e60]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e61]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -0,0 +1,49 @@
- generic [active] [ref=e1]:
- generic [ref=e2]:
- generic [ref=e3]:
- generic [ref=e5]: W
- button "사이드바 펼치기" [ref=e63] [cursor=pointer]:
- img [ref=e64]
- generic [ref=e67]:
- generic [ref=e68] [cursor=pointer]:
- img [ref=e69]
- generic: 대시보드
- generic [ref=e72] [cursor=pointer]:
- img [ref=e73]
- generic: 사용자 관리
- generic [ref=e87]:
- generic [ref=e88]: 사용자 관리
- generic [ref=e89]:
- img [ref=e90]
- text: 사용자 목록
- generic [ref=e93]:
- img [ref=e94]
- text: 권한 설정
- generic [ref=e97]:
- img [ref=e98]
- text: 부서 관리
- generic [ref=e78] [cursor=pointer]:
- img [ref=e79]
- generic: 제품 관리
- generic [ref=e81] [cursor=pointer]:
- img [ref=e82]
- generic: 통계/분석
- generic [ref=e83] [cursor=pointer]:
- img [ref=e84]
- generic: 시스템 설정
- generic [ref=e49] [cursor=pointer]:
- generic [ref=e53]:
- generic [ref=e55]: 대시보드
- generic [ref=e56]: 컨텐츠 영역
- generic [ref=e57]:
- strong [ref=e58]: 사이드바 프로토타입
- text: • 사이드바 우측
- strong [ref=e59]: ◀ 버튼
- text: 을 클릭하면 축소
- text: • 축소 상태에서 아이콘
- strong [ref=e60]: hover → 툴팁
- text: 표시
- text: • 하위 메뉴가 있는 아이콘
- strong [ref=e61]: 클릭 → 플라이아웃
- text: 팝업
- text: • 리프 메뉴 아이콘 클릭 → 바로 이동

View File

@@ -1,6 +1,6 @@
"use client";
import { useState, Suspense, useEffect, useCallback } from "react";
import React, { useState, Suspense, useEffect, useCallback, useRef } from "react";
import { useRouter, usePathname, useSearchParams } from "next/navigation";
import { Button } from "@/components/ui/button";
import {
@@ -14,6 +14,8 @@ import {
Package,
ChevronDown,
ChevronRight,
PanelLeftClose,
PanelLeftOpen,
UserCheck,
LogOut,
User,
@@ -52,6 +54,7 @@ import {
} from "@/components/ui/dialog";
import { CompanySwitcher } from "@/components/admin/CompanySwitcher";
import { getIconComponent } from "@/components/admin/MenuIconPicker";
import { TooltipProvider } from "@/components/ui/tooltip";
interface ExtendedUserInfo {
userId: string;
@@ -249,6 +252,34 @@ function AppLayoutInner({ children }: AppLayoutProps) {
const [isMobile, setIsMobile] = useState(false);
const [showCompanySwitcher, setShowCompanySwitcher] = useState(false);
const [currentCompanyName, setCurrentCompanyName] = useState<string>("");
const [sidebarCollapsed, setSidebarCollapsed] = useState(() => {
if (typeof window !== "undefined") {
return localStorage.getItem("sidebarCollapsed") === "true";
}
return false;
});
const [collapsedHover, setCollapsedHover] = useState(false);
const collapsedHoverTimer = useRef<NodeJS.Timeout | null>(null);
const toggleSidebarCollapse = () => {
setSidebarCollapsed((prev) => {
const next = !prev;
localStorage.setItem("sidebarCollapsed", String(next));
return next;
});
setCollapsedHover(false);
};
const handleCollapsedMouseEnter = () => {
if (!sidebarCollapsed || isMobile) return;
if (collapsedHoverTimer.current) clearTimeout(collapsedHoverTimer.current);
collapsedHoverTimer.current = setTimeout(() => setCollapsedHover(true), 200);
};
const handleCollapsedMouseLeave = () => {
if (collapsedHoverTimer.current) clearTimeout(collapsedHoverTimer.current);
setCollapsedHover(false);
};
// URL 직접 접근 시 탭 자동 열기
useEffect(() => {
@@ -581,6 +612,26 @@ function AppLayoutInner({ children }: AppLayoutProps) {
);
};
// 축소 상태 메뉴 렌더링 (아이콘만, hover 시 오버레이 메뉴로 조작)
const renderCollapsedMenu = (menu: any) => {
const isActive = isMenuActive(menu);
const hasActiveChild = menu.hasChildren && menu.children?.some((child: any) => isMenuActive(child));
return (
<button
key={menu.id}
className={`flex h-10 w-10 items-center justify-center rounded-lg transition-colors [&_svg]:h-5 [&_svg]:w-5 ${
isActive || hasActiveChild
? "bg-primary/10 text-primary"
: "text-muted-foreground hover:bg-accent hover:text-foreground"
}`}
onClick={() => handleMenuClick(menu)}
>
{menu.icon}
</button>
);
};
if (isPreviewMode) {
return (
<div className="bg-background h-screen w-full overflow-auto p-4">{children}</div>
@@ -695,95 +746,177 @@ function AppLayoutInner({ children }: AppLayoutProps) {
)}
{/* 왼쪽 사이드바 */}
<TooltipProvider delayDuration={0}>
<aside
className={`${
isMobile
? (sidebarOpen ? "translate-x-0" : "-translate-x-full") + " fixed top-14 left-0 z-40 h-[calc(100vh-56px)]"
: "relative z-auto h-screen translate-x-0"
} border-sidebar-border bg-sidebar flex w-[260px] flex-col border-r transition-transform duration-300 sm:w-[220px] lg:w-[240px]`}
} border-sidebar-border bg-sidebar flex flex-col border-r transition-all duration-300 flex-shrink-0 overflow-hidden ${
!isMobile && sidebarCollapsed ? "w-16" : "w-[260px] sm:w-[220px] lg:w-[240px]"
}`}
onMouseEnter={handleCollapsedMouseEnter}
onMouseLeave={handleCollapsedMouseLeave}
>
{!isMobile && (
<div className="border-border flex h-14 items-center justify-between border-b px-4">
<Logo />
</div>
)}
{(user as ExtendedUserInfo)?.userType === "SUPER_ADMIN" && (
<div className="border-border bg-muted/50 mx-3 mt-3 rounded-md border p-3">
<div className="flex items-center gap-2">
<Building2 className="text-primary h-4 w-4 shrink-0" />
<div className="min-w-0 flex-1">
<p className="text-muted-foreground text-[10px]"> </p>
<p className="truncate text-sm font-semibold" title={currentCompanyName || "로딩 중..."}>
{currentCompanyName || "로딩 중..."}
</p>
{/* 축소 hover 오버레이: 마우스 올리면 전체 메뉴 표시 */}
{!isMobile && sidebarCollapsed && collapsedHover && (
<>
<div
className="fixed inset-0 z-30"
onMouseEnter={handleCollapsedMouseLeave}
/>
<div
className="border-sidebar-border bg-sidebar fixed left-16 top-0 z-40 flex h-screen w-[240px] flex-col border-r shadow-xl animate-in slide-in-from-left-2 duration-200"
onMouseEnter={() => { if (collapsedHoverTimer.current) clearTimeout(collapsedHoverTimer.current); setCollapsedHover(true); }}
onMouseLeave={handleCollapsedMouseLeave}
>
<div className="border-border flex h-14 items-center justify-between border-b px-4">
<Logo />
<button
onClick={toggleSidebarCollapse}
className="flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border border-border/50 transition-colors hover:bg-accent"
title="사이드바 펼치기"
>
<PanelLeftOpen className="h-[18px] w-[18px] text-muted-foreground" />
</button>
</div>
<div className="flex-1 overflow-y-auto py-4">
<nav className="space-y-0.5 px-3">
{uiMenus.map((menu) => renderMenu(menu))}
</nav>
</div>
</div>
</div>
</>
)}
{((user as ExtendedUserInfo)?.userType === "SUPER_ADMIN" ||
(user as ExtendedUserInfo)?.userType === "COMPANY_ADMIN" ||
(user as ExtendedUserInfo)?.userType === "admin") && (
<div className="border-border space-y-2 border-b p-3">
<Button
onClick={handleModeSwitch}
className={`flex w-full items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium transition-colors duration-150 hover:cursor-pointer ${
isAdminMode
? "border border-amber-200 bg-amber-50 text-amber-700 hover:bg-amber-100 dark:border-amber-800 dark:bg-amber-950 dark:text-amber-400"
: "border-primary/20 bg-primary/5 text-primary hover:bg-primary/10 border"
}`}
>
{isAdminMode ? (
<>
<UserCheck className="h-4 w-4" />
</>
) : (
<>
<Shield className="h-4 w-4" />
</>
)}
</Button>
{(user as ExtendedUserInfo)?.userType === "SUPER_ADMIN" && (
<Button
onClick={() => {
console.log("🔴 회사 선택 버튼 클릭!");
setShowCompanySwitcher(true);
}}
className="border-primary/20 bg-primary/5 text-primary hover:bg-primary/10 flex w-full items-center justify-center gap-2 rounded-md border px-3 py-2 text-sm font-medium transition-colors duration-150 hover:cursor-pointer"
{/* 헤더: 로고 + 토글 버튼 */}
{!isMobile && (
<div className={`border-border flex h-14 items-center border-b overflow-hidden ${sidebarCollapsed ? "justify-center px-2" : "justify-between px-4"}`}>
{sidebarCollapsed ? (
<button
onClick={toggleSidebarCollapse}
className="flex h-9 w-9 items-center justify-center rounded-lg border border-border/50 transition-colors hover:bg-accent"
title="사이드바 펼치기"
>
<Building2 className="h-4 w-4" />
</Button>
<PanelLeftOpen className="h-5 w-5 text-muted-foreground" />
</button>
) : (
<>
<Logo />
<button
onClick={toggleSidebarCollapse}
className="flex h-8 w-8 shrink-0 items-center justify-center rounded-lg border border-border/50 transition-colors hover:bg-accent"
title="사이드바 접기"
>
<PanelLeftClose className="h-[18px] w-[18px] text-muted-foreground" />
</button>
</>
)}
</div>
)}
<div className="flex-1 overflow-y-auto py-4">
<nav className="space-y-0.5 px-3">
{loading ? (
<div className="animate-pulse space-y-2">
{[...Array(5)].map((_, i) => (
<div key={i} className="bg-muted h-8 rounded"></div>
))}
{/* 확장 상태 전용: 관리 회사, 모드 전환 버튼 */}
{(!isMobile && sidebarCollapsed) ? null : (
<>
{(user as ExtendedUserInfo)?.userType === "SUPER_ADMIN" && (
<div className="border-border bg-muted/50 mx-3 mt-3 rounded-md border p-3">
<div className="flex items-center gap-2">
<Building2 className="text-primary h-4 w-4 shrink-0" />
<div className="min-w-0 flex-1">
<p className="text-muted-foreground text-[10px]"> </p>
<p className="truncate text-sm font-semibold" title={currentCompanyName || "로딩 중..."}>
{currentCompanyName || "로딩 중..."}
</p>
</div>
</div>
</div>
) : (
uiMenus.map((menu) => renderMenu(menu))
)}
</nav>
{((user as ExtendedUserInfo)?.userType === "SUPER_ADMIN" ||
(user as ExtendedUserInfo)?.userType === "COMPANY_ADMIN" ||
(user as ExtendedUserInfo)?.userType === "admin") && (
<div className="border-border space-y-2 border-b p-3">
<Button
onClick={handleModeSwitch}
className={`flex w-full items-center justify-center gap-2 rounded-md px-3 py-2 text-sm font-medium transition-colors duration-150 hover:cursor-pointer ${
isAdminMode
? "border border-amber-200 bg-amber-50 text-amber-700 hover:bg-amber-100 dark:border-amber-800 dark:bg-amber-950 dark:text-amber-400"
: "border-primary/20 bg-primary/5 text-primary hover:bg-primary/10 border"
}`}
>
{isAdminMode ? (
<>
<UserCheck className="h-4 w-4" />
</>
) : (
<>
<Shield className="h-4 w-4" />
</>
)}
</Button>
{(user as ExtendedUserInfo)?.userType === "SUPER_ADMIN" && (
<Button
onClick={() => {
console.log("🔴 회사 선택 버튼 클릭!");
setShowCompanySwitcher(true);
}}
className="border-primary/20 bg-primary/5 text-primary hover:bg-primary/10 flex w-full items-center justify-center gap-2 rounded-md border px-3 py-2 text-sm font-medium transition-colors duration-150 hover:cursor-pointer"
>
<Building2 className="h-4 w-4" />
</Button>
)}
</div>
)}
</>
)}
{/* 메뉴 영역 */}
<div className="flex-1 overflow-y-auto py-4">
{!isMobile && sidebarCollapsed ? (
/* 축소 상태: 아이콘 메뉴 */
<nav className="flex flex-col items-center gap-1">
{loading ? (
<div className="animate-pulse space-y-2">
{[...Array(5)].map((_, i) => (
<div key={i} className="bg-muted h-10 w-10 rounded-lg"></div>
))}
</div>
) : (
uiMenus.map((menu) => renderCollapsedMenu(menu))
)}
</nav>
) : (
/* 확장 상태: 기존 메뉴 */
<nav className="space-y-0.5 px-3">
{loading ? (
<div className="animate-pulse space-y-2">
{[...Array(5)].map((_, i) => (
<div key={i} className="bg-muted h-8 rounded"></div>
))}
</div>
) : (
uiMenus.map((menu) => renderMenu(menu))
)}
</nav>
)}
</div>
<div className="border-border border-t px-3 py-1">
<ThemeToggle />
</div>
{/* 테마 토글 */}
{(!isMobile && sidebarCollapsed) ? null : (
<div className="border-border border-t px-3 py-1">
<ThemeToggle />
</div>
)}
<div className="border-border bg-muted/30 border-t p-3">
{/* 하단 유저 영역 */}
<div className={`border-border bg-muted/30 border-t ${!isMobile && sidebarCollapsed ? "flex justify-center p-2" : "p-3"}`}>
<DropdownMenu modal={false}>
<DropdownMenuTrigger asChild>
<button className="hover:bg-accent flex w-full items-center gap-3 rounded-lg px-2 py-2 text-left transition-colors">
<button className={`hover:bg-accent flex items-center rounded-lg transition-colors ${!isMobile && sidebarCollapsed ? "h-10 w-10 justify-center" : "w-full gap-3 px-2 py-2 text-left"}`}>
<div className="relative flex h-9 w-9 shrink-0 overflow-hidden rounded-full">
{user.photo && user.photo.trim() !== "" && user.photo !== "null" ? (
<img
@@ -797,12 +930,14 @@ function AppLayoutInner({ children }: AppLayoutProps) {
</div>
)}
</div>
<div className="min-w-0 flex-1">
<p className="text-foreground truncate text-sm font-medium">{user.userName || "사용자"}</p>
<p className="text-muted-foreground truncate text-xs">
{user.deptName || user.email || user.userId}
</p>
</div>
{(!isMobile && sidebarCollapsed) ? null : (
<div className="min-w-0 flex-1">
<p className="text-foreground truncate text-sm font-medium">{user.userName || "사용자"}</p>
<p className="text-muted-foreground truncate text-xs">
{user.deptName || user.email || user.userId}
</p>
</div>
)}
</button>
</DropdownMenuTrigger>
<DropdownMenuContent className="w-56" align="start" side="top">
@@ -856,6 +991,7 @@ function AppLayoutInner({ children }: AppLayoutProps) {
</DropdownMenu>
</div>
</aside>
</TooltipProvider>
{/* 가운데 컨텐츠 영역 - 탭 시스템 */}
<main className={`flex min-w-0 flex-1 flex-col overflow-hidden bg-background ${isMobile ? "h-[calc(100vh-56px)]" : "h-screen"}`}>