[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBDHR1KJVTNAD0SPDGYY93":3,"skill-same:01M6CBDHR1KJVTNAD0SPDGYY93":56},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":27,"publishedAt":31,"linkOnly":32,"markdownContent":33,"markdownBody":33,"frontMatter":34,"refName":35,"commitSha":36,"skillDirectory":37,"forksCount":13,"repositoryHtmlUrl":38,"repositoryHomepageUrl":6,"ownerHtmlUrl":39,"ownerBlogUrl":6,"ownerDescription":40,"updatedAt":41,"install":42,"resources":55},"01M6CBDHR1KJVTNAD0SPDGYY93","30-ui-canvas-id",null,"devwinsoft\u002Fdevian","devwinsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F22570160?v=4","01M6C6RR8W05NH8NPKQNCE3Q72","maoshy","01M6C6RRDJ5TJJCZXRTY801YDH",0,"MIT","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F23-ui-package\u002F10-base-system\u002F30-ui-canvas-id\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[28,29,30],"canvas","ui","30 ui canvas id","2026-11-10 10:12:30",false,"# 30-ui-canvas-id\n\nStatus: ACTIVE\nAppliesTo: v1\nType: Component Specification\n\n## 목적\n\n`UIBaseCanvas` 프리팹을 참조하기 위한 string wrapper ID 타입.\n\n## 파일 위치 (SSOT)\n\n- Runtime: `com.devian.foundation\u002FSamples~\u002FUIPackage\u002FRuntime\u002FBase\u002FUI_CANVAS_ID.cs`\n- Editor Selector: `com.devian.foundation\u002FSamples~\u002FUIPackage\u002FEditor\u002FUICanvasIdSelector.cs`\n- Editor Drawer: `com.devian.foundation\u002FSamples~\u002FUIPackage\u002FEditor\u002FUI_CANVAS_ID_Drawer.cs`\n\n## String Wrapper 패턴\n\n`UI_CONTAINER_ID`, `UI_SCROLL_CELL_ID`와 동일한 구조:\n\n```csharp\n[Serializable]\npublic sealed class UI_CANVAS_ID\n{\n    public string Value;\n    public bool IsValid => !string.IsNullOrEmpty(Value);\n\n    \u002F\u002F implicit operators for string 호환\n}\n```\n\n## Selector\u002FDrawer 규약 (AssetId Base 준수)\n\n### 필수 규칙\n\n- **Apply\u002FCreate 버튼 금지**\n- **ShowUtility() 필수**\n- **Selector 캐싱 금지**\n- **클릭 즉시 적용 + 창 자동 닫기**\n\n### SearchDir 공급\n\n- `UISettings.GetSearchDir(\"UI_CANVAS_ID\")`로 조회\n- 실패\u002F폴더 없음이면 `\"Assets\"` fallback\n\n### 스캔 대상\n\n- `UIBaseCanvas` 또는 concrete subclass가 있는 Prefab 목록을 SearchDir에서 스캔\n- `BaseEditorAssetIdSelector\u003CUIBaseCanvas>` 재활용 (`AssetManager.FindPrefabs`)\n- `@` prefix 이름 제외\n- case-insensitive 중복 name은 에러 로그 후 스킵\n\n## UISettings 연계\n\n- `UI_CANVAS_ID`는 일반 `UIBaseCanvas` 참조용 공용 타입이다.\n- loading canvas bootstrap에는 사용하지 않는다.\n\n## Editor 구현\n\n### Selector 클래스\n\n```csharp\npublic sealed class UICanvasIdSelector : BaseEditorAssetIdSelector\u003CUIBaseCanvas>\n{\n    protected override string GroupKey => \"UI_CANVAS_ID\";\n    protected override string DisplayTypeName => \"UI_CANVAS_ID\";\n}\n```\n\n### Drawer 클래스\n\n```csharp\n[CustomPropertyDrawer(typeof(UI_CANVAS_ID))]\npublic sealed class UI_CANVAS_ID_Drawer : BaseEditorID_Drawer\u003CUICanvasIdSelector>\n{\n    \u002F\u002F ShowUtility()로 창 표시\n}\n```\n\n## 주의 사항\n\n- `UIBaseCanvas`는 abstract base지만, selector는 prefab root의 `GetComponent\u003CUIBaseCanvas>()`로 concrete subclass를 잡는다\n- selector 캐싱 금지 (항상 `CreateInstance`)\n\n## Reference\n\n- Parent: `skills\u002Fdevian-unity\u002F23-ui-package\u002FSKILL.md`\n- AssetId Base: `skills\u002Fdevian-unity\u002F20-common-package\u002F12-asset-id\u002FSKILL.md`\n- UICanvas System: `skills\u002Fdevian-unity\u002F23-ui-package\u002F10-base-system\u002F11-ui-canvas-system\u002FSKILL.md`\n- UISettings: `skills\u002Fdevian-unity\u002F23-ui-package\u002F10-base-system\u002F13-ui-settings\u002FSKILL.md`\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian-unity\u002F23-ui-package\u002F10-base-system\u002F30-ui-canvas-id","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft","Kim Hyong Joon","2026-04-12 18:44:10",{"source":7,"skillName":5,"commands":43,"prompt":53,"zipAvailable":54},[44,47,50],{"tool":45,"command":46},"npx","npx skills add devwinsoft\u002Fdevian --skill 30-ui-canvas-id",{"tool":48,"command":49},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 30-ui-canvas-id",{"tool":51,"command":52},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 30-ui-canvas-id","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F23-ui-package\u002F10-base-system\u002F30-ui-canvas-id\u002FSKILL.md",true,[],[57,63,71,79,88,95],{"skillNo":58,"name":59,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":62,"publishedAt":31},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[59],{"skillNo":64,"name":65,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":68,"publishedAt":31},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[69,70],"archive","90 project archive",{"skillNo":72,"name":73,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":31},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[77,78],"management","30 env management",{"skillNo":80,"name":81,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":31},"01M6CBWYD3TGWBQV7V35551THF","19-page-push-send","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F19-page-push-send\u002FSKILL.md",[],[85,86,87],"push","page","19 page push send",{"skillNo":89,"name":90,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":93,"publishedAt":31},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[86,94],"18 page savedata",{"skillNo":96,"name":97,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":31},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[86,101],"17 page deobfuscate"]