Merge branch 'jskim-node' of https://g.wace.me/jskim/vexplor_dev into jskim-node
This commit is contained in:
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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: • 리프 메뉴 아이콘 클릭 → 바로 이동
|
||||
@@ -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;
|
||||
@@ -252,8 +255,36 @@ 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 [hasPopMenus, setHasPopMenus] = useState(false);
|
||||
|
||||
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(() => {
|
||||
const store = useTabStore.getState();
|
||||
@@ -605,6 +636,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>
|
||||
@@ -721,95 +772,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
|
||||
@@ -823,12 +956,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">
|
||||
@@ -884,6 +1019,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"}`}>
|
||||
|
||||
Generated
+37
-5
@@ -270,6 +270,7 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
},
|
||||
@@ -311,6 +312,7 @@
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
@@ -344,6 +346,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz",
|
||||
"integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@dnd-kit/accessibility": "^3.1.1",
|
||||
"@dnd-kit/utilities": "^3.2.2",
|
||||
@@ -3059,6 +3062,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.4.0.tgz",
|
||||
"integrity": "sha512-k4iu1R6e5D54918V4sqmISUkI5OgTw3v7/sDRKEC632Wd5g2WBtUS5gyG63X0GJO/HZUj1tsjSXfyzwrUHZl1g==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.17.8",
|
||||
"@types/react-reconciler": "^0.32.0",
|
||||
@@ -3718,6 +3722,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.90.6.tgz",
|
||||
"integrity": "sha512-gB1sljYjcobZKxjPbKSa31FUTyr+ROaBdoH+wSSs9Dk+yDCmMs+TkTV3PybRRVLC7ax7q0erJ9LvRWnMktnRAw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@tanstack/query-core": "5.90.6"
|
||||
},
|
||||
@@ -3812,6 +3817,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.27.2.tgz",
|
||||
"integrity": "sha512-ABL1N6eoxzDzC1bYvkMbvyexHacszsKdVPYqhl5GwHLOvpZcv9VE9QaKwDILTyz5voCA0lGcAAXZp+qnXOk5lQ==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ueberdosis"
|
||||
@@ -4155,6 +4161,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.27.2.tgz",
|
||||
"integrity": "sha512-kaEg7BfiJPDQMKbjVIzEPO3wlcA+pZb2tlcK9gPrdDnEFaec2QTF1sXz2ak2IIb2curvnIrQ4yrfHgLlVA72wA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"prosemirror-changeset": "^2.3.0",
|
||||
"prosemirror-collab": "^1.3.1",
|
||||
@@ -6655,6 +6662,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz",
|
||||
"integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"csstype": "^3.0.2"
|
||||
}
|
||||
@@ -6665,6 +6673,7 @@
|
||||
"integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==",
|
||||
"devOptional": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"peerDependencies": {
|
||||
"@types/react": "^19.2.0"
|
||||
}
|
||||
@@ -6707,6 +6716,7 @@
|
||||
"resolved": "https://registry.npmjs.org/@types/three/-/three-0.180.0.tgz",
|
||||
"integrity": "sha512-ykFtgCqNnY0IPvDro7h+9ZeLY+qjgUWv+qEvUt84grhenO60Hqd4hScHE7VTB9nOQ/3QM8lkbNE+4vKjEpUxKg==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@dimforge/rapier3d-compat": "~0.12.0",
|
||||
"@tweenjs/tween.js": "~23.1.3",
|
||||
@@ -6789,6 +6799,7 @@
|
||||
"integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@typescript-eslint/scope-manager": "8.46.2",
|
||||
"@typescript-eslint/types": "8.46.2",
|
||||
@@ -7421,6 +7432,7 @@
|
||||
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"acorn": "bin/acorn"
|
||||
},
|
||||
@@ -8571,7 +8583,8 @@
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
|
||||
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
|
||||
"license": "MIT"
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/d3": {
|
||||
"version": "7.9.0",
|
||||
@@ -8893,6 +8906,7 @@
|
||||
"resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
|
||||
"integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
|
||||
"license": "ISC",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
@@ -9674,6 +9688,7 @@
|
||||
"integrity": "sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@eslint-community/eslint-utils": "^4.8.0",
|
||||
"@eslint-community/regexpp": "^4.12.1",
|
||||
@@ -9762,6 +9777,7 @@
|
||||
"integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"eslint-config-prettier": "bin/cli.js"
|
||||
},
|
||||
@@ -9863,6 +9879,7 @@
|
||||
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@rtsao/scc": "^1.1.0",
|
||||
"array-includes": "^3.1.9",
|
||||
@@ -11019,6 +11036,7 @@
|
||||
"resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz",
|
||||
"integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/immer"
|
||||
@@ -11799,7 +11817,8 @@
|
||||
"version": "1.9.4",
|
||||
"resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz",
|
||||
"integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==",
|
||||
"license": "BSD-2-Clause"
|
||||
"license": "BSD-2-Clause",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/levn": {
|
||||
"version": "0.4.1",
|
||||
@@ -13118,6 +13137,7 @@
|
||||
"integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"prettier": "bin/prettier.cjs"
|
||||
},
|
||||
@@ -13411,6 +13431,7 @@
|
||||
"resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.4.tgz",
|
||||
"integrity": "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"orderedmap": "^2.0.0"
|
||||
}
|
||||
@@ -13440,6 +13461,7 @@
|
||||
"resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz",
|
||||
"integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"prosemirror-model": "^1.0.0",
|
||||
"prosemirror-transform": "^1.0.0",
|
||||
@@ -13488,6 +13510,7 @@
|
||||
"resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.4.tgz",
|
||||
"integrity": "sha512-WkKgnyjNncri03Gjaz3IFWvCAE94XoiEgvtr0/r2Xw7R8/IjK3sKLSiDoCHWcsXSAinVaKlGRZDvMCsF1kbzjA==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"prosemirror-model": "^1.20.0",
|
||||
"prosemirror-state": "^1.0.0",
|
||||
@@ -13691,6 +13714,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
|
||||
"integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
@@ -13760,6 +13784,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
|
||||
"integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"scheduler": "^0.26.0"
|
||||
},
|
||||
@@ -13810,6 +13835,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.66.0.tgz",
|
||||
"integrity": "sha512-xXBqsWGKrY46ZqaHDo+ZUYiMUgi8suYu5kdrS20EG8KiL7VRQitEbNjm+UcrDYrNi1YLyfpmAeGjCZYXLT9YBw==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
},
|
||||
@@ -13851,7 +13877,8 @@
|
||||
"version": "18.3.1",
|
||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
|
||||
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
|
||||
"license": "MIT"
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/react-leaflet": {
|
||||
"version": "5.0.0",
|
||||
@@ -14159,6 +14186,7 @@
|
||||
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz",
|
||||
"integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==",
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@types/use-sync-external-store": "^0.0.6",
|
||||
"use-sync-external-store": "^1.4.0"
|
||||
@@ -14181,7 +14209,8 @@
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
|
||||
"integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
|
||||
"license": "MIT"
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/recharts/node_modules/redux-thunk": {
|
||||
"version": "3.1.0",
|
||||
@@ -15239,7 +15268,8 @@
|
||||
"version": "0.180.0",
|
||||
"resolved": "https://registry.npmjs.org/three/-/three-0.180.0.tgz",
|
||||
"integrity": "sha512-o+qycAMZrh+TsE01GqWUxUIKR1AL0S8pq7zDkYOQw8GqfX8b8VoCKYUoHbhiX5j+7hr8XsuHDVU6+gkQJQKg9w==",
|
||||
"license": "MIT"
|
||||
"license": "MIT",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/three-mesh-bvh": {
|
||||
"version": "0.8.3",
|
||||
@@ -15327,6 +15357,7 @@
|
||||
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"peer": true,
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
@@ -15675,6 +15706,7 @@
|
||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||
"dev": true,
|
||||
"license": "Apache-2.0",
|
||||
"peer": true,
|
||||
"bin": {
|
||||
"tsc": "bin/tsc",
|
||||
"tsserver": "bin/tsserver"
|
||||
|
||||
Reference in New Issue
Block a user