diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 08fe7b39..5195bc45 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -35,7 +35,8 @@ "Bash(/bin/mkdir -p:*)", "Bash(/bin/rm:*)", "WebFetch(domain:docs.unity3d.com)", - "Bash(ls:*)" + "Bash(ls:*)", + "WebFetch(domain:discussions.unity.com)" ], "deny": [], "ask": [] diff --git a/Assets/Resources/Studio/UIToolkit.meta b/Assets/Resources/Studio/UIToolkit.meta new file mode 100644 index 00000000..04b1cc7a --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 036922f6ebd1fc246b7f9dcbed76951d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Studio/UIToolkit/Modal.meta b/Assets/Resources/Studio/UIToolkit/Modal.meta new file mode 100644 index 00000000..3359da6d --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 523651d33563a6e4eb5a39945fe0017f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentDBUXML.uxml b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentDBUXML.uxml new file mode 100644 index 00000000..d0afa7c9 --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentDBUXML.uxml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentDBUXML.uxml.meta b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentDBUXML.uxml.meta new file mode 100644 index 00000000..61356b36 --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentDBUXML.uxml.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: d27b20f78aec0354b8b97b9af0765701 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentGeneralUXML.uxml b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentGeneralUXML.uxml new file mode 100644 index 00000000..c3cd0cfc --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentGeneralUXML.uxml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentGeneralUXML.uxml.meta b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentGeneralUXML.uxml.meta new file mode 100644 index 00000000..670af551 --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentGeneralUXML.uxml.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 0a709a335acffbd4c9d4358c153fad81 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentShortcutUXML.uxml b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentShortcutUXML.uxml new file mode 100644 index 00000000..96d9145f --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentShortcutUXML.uxml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentShortcutUXML.uxml.meta b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentShortcutUXML.uxml.meta new file mode 100644 index 00000000..37338f45 --- /dev/null +++ b/Assets/Resources/Studio/UIToolkit/Modal/UTKSettingModalContentShortcutUXML.uxml.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: dcdd51dd452d3e94ca374da0307608a4 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Resources/UIToolkit/Input/UTKInputField.uss b/Assets/Resources/UIToolkit/Input/UTKInputField.uss index 0a5c8fa0..1800f2d8 100644 --- a/Assets/Resources/UIToolkit/Input/UTKInputField.uss +++ b/Assets/Resources/UIToolkit/Input/UTKInputField.uss @@ -35,7 +35,7 @@ .utk-input > .unity-base-text-field__input { flex-grow: 1; height: var(--size-input-height); - min-width: 120px; + min-width: 60px; padding-left: var(--space-m); padding-right: var(--space-m); background-color: var(--color-bg-input); diff --git a/Assets/Resources/UIToolkit/List/UTKShortcutList.uxml b/Assets/Resources/UIToolkit/List/UTKShortcutList.uxml new file mode 100644 index 00000000..3fb58dbf --- /dev/null +++ b/Assets/Resources/UIToolkit/List/UTKShortcutList.uxml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Assets/Resources/UIToolkit/List/UTKShortcutList.uxml.meta b/Assets/Resources/UIToolkit/List/UTKShortcutList.uxml.meta new file mode 100644 index 00000000..0c38a658 --- /dev/null +++ b/Assets/Resources/UIToolkit/List/UTKShortcutList.uxml.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 009b695fb58d74b43a48be6fb5a00895 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Resources/UIToolkit/List/UTKShortcutListItem.uxml b/Assets/Resources/UIToolkit/List/UTKShortcutListItem.uxml new file mode 100644 index 00000000..1011d7ce --- /dev/null +++ b/Assets/Resources/UIToolkit/List/UTKShortcutListItem.uxml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Assets/Resources/UIToolkit/List/UTKShortcutListItem.uxml.meta b/Assets/Resources/UIToolkit/List/UTKShortcutListItem.uxml.meta new file mode 100644 index 00000000..5cf4441b --- /dev/null +++ b/Assets/Resources/UIToolkit/List/UTKShortcutListItem.uxml.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 0d18cdf18ee19874aaf8decc2b8805ff +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0} diff --git a/Assets/Resources/UIToolkit/List/UTKShortcutListUss.uss b/Assets/Resources/UIToolkit/List/UTKShortcutListUss.uss new file mode 100644 index 00000000..93d4b59c --- /dev/null +++ b/Assets/Resources/UIToolkit/List/UTKShortcutListUss.uss @@ -0,0 +1,262 @@ +/* + * =================================== + * UTKShortcutListUss.uss + * 단축키 설정 리스트 컴포넌트 전용 스타일 + * =================================== + * + * 이 파일은 UTKThemeManager 의 CSS 변수를 참조합니다. + * - 색상 : var(--color-*) + * - 간격 : var(--space-*) + * - 반지름: var(--radius-*) + * - 폰트 : var(--font-size-*) + * + * 컬럼 너비 (컨테이너 · 헤더 · 아이템 공통으로 맞춤): + * command flex-grow:1 명령 이름 (나머지 공간 전부) + * modifier 52px Ctrl / Shift / Alt 체크박스 셀 + * key 76px 주요 키 입력 셀 + * + * 관련 파일: + * UTKShortcutList.uxml – 메인 레이아웃 + * UTKShortcutListItem.uxml – 아이템 행 레이아웃 + * UTKShortcutList.cs – 컴포넌트 로직 + */ + +/* ============================================= + 루트 컨테이너 + ============================================= */ + +.utk-shortcut-list { + flex-grow: 1; + flex-direction: column; + background-color: var(--color-bg-panel); +} + +.utk-shortcut-list-container { + flex-grow: 1; + flex-direction: column; +} + +/* ============================================= + 검색 영역 (검색 필드 + Clear 버튼) + ============================================= */ + +.utk-shortcut-list__search-container { + position: relative; + margin: var(--space-m) var(--space-m) 0 var(--space-m); + justify-content: center; +} + +.utk-shortcut-list__search { + flex-grow: 1; +} + +/* 검색어 있을 때 텍스트가 버튼 뒤로 가리지 않도록 오른쪽 패딩 확보 */ +.utk-shortcut-list__search .unity-text-field__input { + padding-right: 28px; +} + +.utk-shortcut-list__clear-btn { + width: 16px; + height: 16px; + min-width: 16px; + min-height: 16px; + border-width: 0; + margin: 0; + padding: 0; + align-self: center; + position: absolute; + right: 4px; +} + +.utk-shortcut-list__search .unity-text-field__input { + background-color: var(--color-bg-input); + border-width: var(--border-width); + border-color: var(--color-border); + border-radius: var(--radius-s); + padding: var(--space-xs) var(--space-m); + font-size: var(--font-size-body2); + min-height: 28px; +} + +.utk-shortcut-list__search:focus .unity-text-field__input { + border-color: var(--color-border-focus); +} + +/* UTKInputField 내부 label 숨김 (placeholder 모드에서 label 없이 사용) */ +.utk-shortcut-list__search .unity-label { + display: none; + min-width: 0; + width: 0; + padding: 0; +} + +/* ============================================= + 컬럼 헤더 행 + ============================================= */ + +.utk-shortcut-list__header { + flex-direction: row; + align-items: center; + padding: var(--space-s) var(--space-m); + margin-top: var(--space-s); + border-bottom-width: 1px; + border-color: var(--color-border); +} + +.utk-shortcut-list__header-command { + flex-grow: 1; + font-size: var(--font-size-body2); + color: var(--color-text-secondary); + -unity-font-style: bold; + overflow: hidden; + min-width: 0; +} + +.utk-shortcut-list__header-modifier { + width: 52px; + flex-shrink: 0; + font-size: var(--font-size-body2); + color: var(--color-text-secondary); + -unity-text-align: middle-center; + -unity-font-style: bold; +} + +.utk-shortcut-list__header-key { + width: 90px; + flex-shrink: 0; + font-size: var(--font-size-body2); + color: var(--color-text-secondary); + -unity-text-align: middle-center; + -unity-font-style: bold; +} + +/* ============================================= + UTKListView 컨테이너 + ============================================= */ + +.utk-shortcut-list__listview { + flex-grow: 1; + background-color: transparent; +} + +/* ListView 자체의 테두리·배경 제거 (디자인 가이드: 패널 배경 사용) */ +.utk-shortcut-list__listview.utk-listview { + border-width: 0; + border-radius: 0; + background-color: transparent; +} + +/* ============================================= + 아이템 행 컨테이너 + ============================================= */ + +.utk-shortcut-list-item { + flex-direction: row; + align-items: center; + padding: 0 var(--space-m); + min-height: 36px; + flex-grow: 1; + border-bottom-width: 1px; + border-color: var(--color-border); + transition-duration: var(--anim-fast); + transition-property: background-color; +} + +.utk-shortcut-list-item:hover { + background-color: var(--color-btn-hover); +} + +/* ============================================= + 아이템 – 명령 이름 레이블 + ============================================= */ + +.utk-shortcut-list-item__command { + flex-grow: 1; + min-width: 0; + overflow: hidden; +} + +/* UTKLabel 내부 Label 텍스트 스타일 */ +.utk-shortcut-list-item__command .unity-label { + font-size: var(--font-size-body2); + color: var(--color-text-primary); + -unity-text-align: middle-left; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* ============================================= + 아이템 – 수정자 키 체크박스 (Ctrl / Shift / Alt) + ============================================= */ + +.utk-shortcut-list-item__modifier { + width: 52px; + flex-shrink: 0; + justify-content: center; + align-items: center; + margin: 0; + padding: 0; +} + +/* UTKCheckBox 내부 컨테이너를 중앙 정렬 */ +.utk-shortcut-list-item__modifier .utk-checkbox { + justify-content: center; + margin: 0; +} + +/* 체크박스 레이블(텍스트) 숨김 – 헤더가 컬럼 레이블 역할을 담당 */ +.utk-shortcut-list-item__modifier .utk-checkbox__label { + display: none; +} + +/* ============================================= + 아이템 – 주요 키 입력 필드 + ============================================= */ + +.utk-shortcut-list-item__key { + width: 90px; + flex-shrink: 0; + margin: 0; + padding: 0; +} + +/* UTKInputField label 숨김 */ +.utk-shortcut-list-item__key .unity-label { + display: none; + min-width: 0; + width: 0; + padding: 0; +} + +/* 텍스트 입력 영역: 키 뱃지 스타일 */ +.utk-shortcut-list-item__key .unity-text-field__input { + background-color: var(--color-bg-secondary); + border-width: var(--border-width); + border-color: var(--color-border); + border-radius: var(--radius-s); + -unity-text-align: middle-center; + font-size: var(--font-size-body2); + color: var(--color-text-primary); + padding: 0 var(--space-s); + min-height: 24px; + cursor: link; + transition-duration: var(--anim-fast); + transition-property: border-color, background-color; +} + +.utk-shortcut-list-item__key .unity-text-field__input:hover { + border-color: var(--color-border-focus); +} + +/* 캡처 모드: 키 입력 대기 중 */ +.utk-shortcut-list-item__key--capturing .unity-text-field__input { + border-color: var(--color-border-focus); + background-color: var(--color-bg-input); + color: var(--color-text-secondary); +} + +/* 텍스트 커서(caret) 숨김 – 읽기전용이므로 커서 불필요 */ +.utk-shortcut-list-item__key .unity-text-field__input > TextElement { + cursor: link; +} diff --git a/Assets/Resources/UIToolkit/List/UTKShortcutListUss.uss.meta b/Assets/Resources/UIToolkit/List/UTKShortcutListUss.uss.meta new file mode 100644 index 00000000..c71c8d73 --- /dev/null +++ b/Assets/Resources/UIToolkit/List/UTKShortcutListUss.uss.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a9fafe6cd359d2c4899d36f1fb6ad99a +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0} + disableValidation: 0 diff --git a/Assets/Resources/UIToolkit/Modal/UTKAlert.uss b/Assets/Resources/UIToolkit/Modal/UTKAlert.uss index 1c63b144..00af26cd 100644 --- a/Assets/Resources/UIToolkit/Modal/UTKAlert.uss +++ b/Assets/Resources/UIToolkit/Modal/UTKAlert.uss @@ -69,10 +69,12 @@ justify-content: flex-end; } +.utk-alert__buttons .last-child { + margin-left: var(--space-s); +} + .utk-alert__btn { min-width: 80px; - margin-left: var(--space-s); - margin-right: var(--space-s); } /* =================================== diff --git a/Assets/Resources/UIToolkit/Modal/UTKModal.uss b/Assets/Resources/UIToolkit/Modal/UTKModal.uss index d5282c65..64e832fd 100644 --- a/Assets/Resources/UIToolkit/Modal/UTKModal.uss +++ b/Assets/Resources/UIToolkit/Modal/UTKModal.uss @@ -33,7 +33,8 @@ } .utk-modal--large { - width: 640px; + width: 800px; + height: 600px; max-height: 800px; } @@ -112,6 +113,14 @@ justify-content: flex-end; align-items: center; padding: var(--space-m) var(--space-l); - border-top-width: var(--border-width); + border-top-width: 0; border-top-color: var(--color-border); } + +.utk-modal__footer--has-children { + border-top-width: var(--border-width); +} + +.utk-modal__footer .last-child { + margin-left: var(--space-s); +} \ No newline at end of file diff --git a/Assets/Resources/UIToolkit/Modal/UTKNotification.uss b/Assets/Resources/UIToolkit/Modal/UTKNotification.uss index 5c773a35..3a846328 100644 --- a/Assets/Resources/UIToolkit/Modal/UTKNotification.uss +++ b/Assets/Resources/UIToolkit/Modal/UTKNotification.uss @@ -131,3 +131,7 @@ justify-content: flex-end; margin-top: var(--space-s); } + +.utk-notification__actions .last-child { + margin-left: var(--space-s); +} \ No newline at end of file diff --git a/Assets/Resources/UIToolkit/Sample/List/UTKListSample.uss b/Assets/Resources/UIToolkit/Sample/List/UTKListSample.uss index 79fd825b..476076fc 100644 --- a/Assets/Resources/UIToolkit/Sample/List/UTKListSample.uss +++ b/Assets/Resources/UIToolkit/Sample/List/UTKListSample.uss @@ -29,3 +29,8 @@ height: 150px; width: 200px; } + +.utk-sample-shortcut-list { + height: 320px; + width: 620px; +} diff --git a/Assets/Resources/UIToolkit/Sample/List/UTKShortcutListSample.uxml b/Assets/Resources/UIToolkit/Sample/List/UTKShortcutListSample.uxml new file mode 100644 index 00000000..ca0ebcc8 --- /dev/null +++ b/Assets/Resources/UIToolkit/Sample/List/UTKShortcutListSample.uxml @@ -0,0 +1,20 @@ + + +