[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBE17MDZARAW47WDV3GG6H":3,"skill-same:01M6CBE17MDZARAW47WDV3GG6H":62},{"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},"01M6CBE17MDZARAW47WDV3GG6H","11-ui-popup-canvas-panel",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\u002F12-ui-popup-system\u002F11-ui-popup-canvas-panel\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","11 ui popup canvas panel","2026-11-10 10:12:30",false,"# 11-ui-popup-canvas-panel — UIPopupCanvas \u002F UIPopupPanel\n\nStatus: ACTIVE\nAppliesTo: v1\n\n## Purpose\n\npopup overlay canvas와 panel layer root를 정의한다.\n\n## Implementation Location (3-path mirror)\n\n| 경로 | 역할 |\n|------|------|\n| `framework-cs\u002Fupm\u002Fcom.devian.foundation\u002FSamples~\u002FUIPackage\u002FRuntime\u002FPopup\u002F` | UPM mirror |\n| `framework-cs\u002Fapps\u002FUnityExample\u002FPackages\u002Fcom.devian.foundation\u002FSamples~\u002FUIPackage\u002FRuntime\u002FPopup\u002F` | Packages mirror |\n| `framework-cs\u002Fapps\u002FUnityExample\u002FAssets\u002FSamples\u002FDevian Foundation\u002F0.1.0\u002FUIPackage\u002FRuntime\u002FPopup\u002F` | 현재 workspace 구현 기준 |\n\n## UIPopupCanvas\n\n- `UIBaseCanvas\u003CUIPopupCanvas>, IPoolable`\n- `UIPopupPanel _panel`을 소유한다\n- `NormalizeCanvasRect()`로 full-stretch rect를 강제한다\n- bootstrap 후 `Init()`되어 `panel`을 expose한다\n- public `OnPoolSpawned()` \u002F `OnPoolDespawned()`는 base `_HandlePoolSpawned()` \u002F `_HandlePoolDespawned()` bridge다\n- canvas\u002Fpanel은 init once를 유지하고, respawn 시 base helper가 canvas-owned component와 panel-owned subtree를 재초기화한다\n\n## UIPopupPanel\n\n- `UIBasePanel\u003CUIPopupCanvas>`\n- `UIPopupDim`과 `PopupRoot`를 소유한다\n- manager가 spawn한 `UIPopupFrameBase`를 `PopupRoot`에 attach \u002F detach 한다\n- `AttachFrame(frame)`는 frame을 `PopupRoot`에 붙인 뒤 아직 init 전이면 `frame._Init(owner.canvas)` + `frame._InitComplete()`를 호출한다\n- panel 아래 시각 계층은 다음을 기준으로 정리한다\n\n```text\nDim (UIPopupDim)\nPopupRoot\n  -> popup frames...\n```\n\n## UIPopupDim\n\n- `Dim` child `GameObject`에 붙는 shared modal layer component\n- 같은 `GameObject`의 `Image`와 `CanvasGroup`를 사용한다\n- `RequireComponent(typeof(Image))`, `RequireComponent(typeof(CanvasGroup))` 규약으로 고정한다\n- `IPointerClickHandler`로 dim click을 manager에 전달한다\n- `Button` \u002F `EventTrigger`는 사용하지 않는다\n\n## Modal State\n\n`ApplyModalState(bool showDim, bool blockBehind, bool closeOnDimClick)`가 담당한다.\n\n- dim 표시 여부\n- blocker 여부\n- dim click 허용 여부\n\npanel은 `UIPopupDim.ApplyState(...)`로 위 상태를 위임한다.\ndim color\u002Falpha는 prefab Image의 원본 값을 사용한다 (스크립트에서 덮어쓰지 않음).\ndim과 blocker는 항상 top popup frame policy 기준으로 계산한다.\n\n## Input Gate Boundary\n\n- shared dim\u002Fblocker는 `UIPopupDim`이 담당한다\n- popup 간 top-only input gate는 `UIPopupFrameBase`의 root `CanvasGroup`가 담당한다\n- `UIPopupPanel`은 popup별 input gate를 직접 관리하지 않는다\n\n## Editor Install\n\n- `UIPopupPanelEditor`가 Edit Mode inspector button을 제공한다\n- `Install Missing`은 `Dim`과 `PopupRoot` child를 생성하고 reference를 연결한다\n- `Dim`에는 `Image`, `CanvasGroup`, `UIPopupDim`을 설치한다\n- `Normalize Layout`는 두 child rect를 full-stretch로 다시 맞춘다\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian-unity\u002F23-ui-package\u002F12-ui-popup-system\u002F11-ui-popup-canvas-panel","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 11-ui-popup-canvas-panel",{"tool":48,"command":49},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 11-ui-popup-canvas-panel",{"tool":51,"command":52},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 11-ui-popup-canvas-panel","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F23-ui-package\u002F12-ui-popup-system\u002F11-ui-popup-canvas-panel\u002FSKILL.md",true,[56],{"path":57,"resourceType":58,"resourceTypeDesc":59,"sizeBytes":60,"sourceHtmlUrl":61},"README.md","REFERENCE","参考文档",4179,"https:\u002F\u002Fgithub.com\u002FDicklesworthstone\u002Fpi_agent_rust\u002Fblob\u002Fmain\u002Ftests\u002Fext_conformance\u002Fartifacts\u002Ftemplates-davila7\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fdomain-name-brainstormer\u002FREADME.md",[63,69,77,85,94,101],{"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},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[65],{"skillNo":70,"name":71,"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":72,"categories":73,"keywords":74,"publishedAt":31},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[75,76],"archive","90 project archive",{"skillNo":78,"name":79,"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":80,"categories":81,"keywords":82,"publishedAt":31},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[83,84],"management","30 env management",{"skillNo":86,"name":87,"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":88,"categories":89,"keywords":90,"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",[],[91,92,93],"push","page","19 page push send",{"skillNo":95,"name":96,"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":97,"categories":98,"keywords":99,"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",[],[92,100],"18 page savedata",{"skillNo":102,"name":103,"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":104,"categories":105,"keywords":106,"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",[],[92,107],"17 page deobfuscate"]