@weppy/roblox-mcp 2.16.2 → 2.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/README.md +9 -1
- package/dashboard/dist/assets/AssetsPage-BRZSoLQp.css +1 -0
- package/dashboard/dist/assets/{AssetsPage-_CPMetwm.js → AssetsPage-FecplRby.js} +9 -14
- package/dashboard/dist/assets/ChangelogPage-B1CY41my.css +1 -0
- package/dashboard/dist/assets/ChangelogPage-DXZxXvJY.js +1 -0
- package/dashboard/dist/assets/ConfirmModal-CQhMb2gs.js +1 -0
- package/dashboard/dist/assets/ConnectionPage-B3fGIK2X.css +1 -0
- package/dashboard/dist/assets/ConnectionPage-Bk4HeU0-.js +11 -0
- package/dashboard/dist/assets/ControlsPage-jEHyFrVc.js +1 -0
- package/dashboard/dist/assets/CurrentPlaceScope-B60o8hpn.js +1 -0
- package/dashboard/dist/assets/CurrentPlaceScope-COd50R0N.css +1 -0
- package/dashboard/dist/assets/{GameChangeDetail-CCQ8h1ft.js → GameChangeDetail-B5X_6M-R.js} +1 -1
- package/dashboard/dist/assets/{InfoLabel-D6WxKFnG.js → InfoLabel-csGVLmJ3.js} +1 -1
- package/dashboard/dist/assets/OverviewPage-B2_8B6fs.js +1 -0
- package/dashboard/dist/assets/OverviewPage-CviBL36S.css +1 -0
- package/dashboard/dist/assets/PageHeader-B42Je0MJ.js +6 -0
- package/dashboard/dist/assets/PageHeader-ip0Enk1k.css +1 -0
- package/dashboard/dist/assets/PlaytestPage-B89cLi76.css +1 -0
- package/dashboard/dist/assets/PlaytestPage-Cww1uTQ8.js +122 -0
- package/dashboard/dist/assets/SettingsPage-BO1WqaOl.css +1 -0
- package/dashboard/dist/assets/{SettingsPage-B_9NwPEF.js → SettingsPage-eLuRrn1E.js} +1 -1
- package/dashboard/dist/assets/{StatusBadge-Ddzg1cSk.js → StatusBadge-Ct9C2L71.js} +1 -1
- package/dashboard/dist/assets/SyncPage-BgbrC3SP.css +1 -0
- package/dashboard/dist/assets/SyncPage-CKbsNp8O.js +1 -0
- package/dashboard/dist/assets/Tabs-CPTkUoYi.css +1 -0
- package/dashboard/dist/assets/Tabs-Dos9flTe.js +1 -0
- package/dashboard/dist/assets/TierPromoPanel-Ch583WAw.css +1 -0
- package/dashboard/dist/assets/TierPromoPanel-Ci_piK2n.js +1 -0
- package/dashboard/dist/assets/ToolsPage-ApMAWvg3.css +1 -0
- package/dashboard/dist/assets/ToolsPage-mfcba-cj.js +1 -0
- package/dashboard/dist/assets/{TooltipText-B1An7dUI.js → TooltipText-EK4_jbu2.js} +1 -1
- package/dashboard/dist/assets/UiStudioPage-CSK5gQMN.css +1 -0
- package/dashboard/dist/assets/{UiStudioPage-CWQgLMHO.js → UiStudioPage-Y2PR7h_q.js} +3 -3
- package/dashboard/dist/assets/WhatsNewPage-BsVZv6D8.css +1 -0
- package/dashboard/dist/assets/WhatsNewPage-uAPdDJaM.js +1 -0
- package/dashboard/dist/assets/check-BgcyMSc_.js +6 -0
- package/dashboard/dist/assets/{copy-B03ftJiE.js → copy-BJc7IQHD.js} +1 -1
- package/dashboard/dist/assets/index-89-Xnii6.js +874 -0
- package/dashboard/dist/assets/index-VXvX8jPK.css +1 -0
- package/dashboard/dist/assets/sample-requests-BeoPIWbH.css +1 -0
- package/dashboard/dist/assets/{sample-requests-r6iFLFba.js → sample-requests-DOteSh1j.js} +1 -1
- package/dashboard/dist/assets/trash-2-CeZRGbl-.js +6 -0
- package/dashboard/dist/assets/{useLiveUptime-CnfGQ_vS.js → useLiveUptime-BX-d0MHY.js} +1 -1
- package/dashboard/dist/assets/useSettings-B45j17ns.js +1 -0
- package/dashboard/dist/assets/useSettings-I6BaXsZq.css +1 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/index.js +218 -126
- package/package.json +1 -1
- package/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
- package/dashboard/dist/assets/AssetsPage-BVUpssWN.css +0 -1
- package/dashboard/dist/assets/ChangelogPage-B9Ct115r.css +0 -1
- package/dashboard/dist/assets/ChangelogPage-BpTjHwvr.js +0 -1
- package/dashboard/dist/assets/ConfirmModal-BSbhJt6x.js +0 -1
- package/dashboard/dist/assets/ConnectionPage-BMIbBueG.js +0 -11
- package/dashboard/dist/assets/ConnectionPage-Ca5WLCm3.css +0 -1
- package/dashboard/dist/assets/ContentScopedDialog-D92wgDaU.js +0 -1
- package/dashboard/dist/assets/ContentScopedDialog-DCgVfmeB.css +0 -1
- package/dashboard/dist/assets/ControlsPage-C828Cgwo.js +0 -6
- package/dashboard/dist/assets/CurrentPlaceScope-BFYSAg2T.js +0 -1
- package/dashboard/dist/assets/CurrentPlaceScope-D-0g0WrM.css +0 -1
- package/dashboard/dist/assets/OverviewPage-B8RMrIaQ.js +0 -1
- package/dashboard/dist/assets/OverviewPage-Dsfl-NRT.css +0 -1
- package/dashboard/dist/assets/PageHeader-CrhjZjgp.css +0 -1
- package/dashboard/dist/assets/PageHeader-Xrn6BpcL.js +0 -6
- package/dashboard/dist/assets/PlaytestPage-C-WO2SsY.css +0 -1
- package/dashboard/dist/assets/PlaytestPage-CrCurhRT.js +0 -11
- package/dashboard/dist/assets/SettingsPage-BR71s-WH.css +0 -1
- package/dashboard/dist/assets/SyncPage-BNadN0NU.js +0 -1
- package/dashboard/dist/assets/SyncPage-sHUpW30U.css +0 -1
- package/dashboard/dist/assets/Tabs-CIszXeoU.css +0 -1
- package/dashboard/dist/assets/Tabs-DZDOsT6_.js +0 -1
- package/dashboard/dist/assets/ToolsPage-B4t6LvfV.css +0 -1
- package/dashboard/dist/assets/ToolsPage-bHm2QbDR.js +0 -1
- package/dashboard/dist/assets/UiStudioPage-Ds-eaGvd.css +0 -1
- package/dashboard/dist/assets/WhatsNewPage-D-iibgAc.js +0 -1
- package/dashboard/dist/assets/WhatsNewPage-wF04BABp.css +0 -1
- package/dashboard/dist/assets/index-BDzb8NjS.css +0 -1
- package/dashboard/dist/assets/index-Ygt1Wh6v.js +0 -778
- package/dashboard/dist/assets/sample-requests-DmUwqmFE.css +0 -1
- package/dashboard/dist/assets/useSettings-BrnGUYZY.js +0 -1
- package/dashboard/dist/assets/useSettings-Ce19GEW2.css +0 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import{f as
|
|
1
|
+
import{f as Se,l as V,k as Ee,r as _,u as I,j as t,a as q,R as qe,X as He,T as je,e as Ue,t as Oe}from"./index-89-Xnii6.js";import{I as D}from"./InfoLabel-csGVLmJ3.js";import{T as y}from"./TooltipText-EK4_jbu2.js";import{C as Fe,P as ze}from"./PageHeader-B42Je0MJ.js";import{D as ae,c as oe,e as Ve,g as We,h as Ke,i as le,j as Ce,k as Ye,l as ce,d as Qe}from"./sample-requests-DOteSh1j.js";import{C as Je,T as Xe}from"./Tabs-Dos9flTe.js";import{C as Ze}from"./CurrentPlaceScope-B60o8hpn.js";/**
|
|
2
2
|
* @license lucide-react v1.8.0 - ISC
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the ISC license.
|
|
5
5
|
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const et=[["path",{d:"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",key:"18u6gg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]],tt=
|
|
6
|
+
*/const et=[["path",{d:"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",key:"18u6gg"}],["circle",{cx:"12",cy:"13",r:"3",key:"1vg3eu"}]],tt=Se("camera",et);/**
|
|
7
7
|
* @license lucide-react v1.8.0 - ISC
|
|
8
8
|
*
|
|
9
9
|
* This source code is licensed under the ISC license.
|
|
10
10
|
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
-
*/const it=[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]],st=ve("ellipsis",it);async function we(e){const i=await fetch(`${V}${e}`);if(!i.ok){let s=null;try{s=await i.json()}catch{}throw new Ee(i.status,(s==null?void 0:s.message)??i.statusText,(s==null?void 0:s.error)??null,s)}return await i.json()}function H(e){return typeof e=="number"&&Number.isFinite(e)?e:0}const at=["structure","visual","interaction","primary_view_context","responsive_viewport"];function ue(e){const i=e.coverage_dimensions,s={structure:{status:e.deterministic_status==="failed"?"failed":"completed",reasons:[]},visual:{status:e.visual_status??"not_requested",reasons:[]},interaction:{status:"skipped",reasons:[]},primary_view_context:{status:"skipped",reasons:[]},responsive_viewport:{status:"skipped",reasons:[]}};if(!i)return s;for(const o of at){const l=i[o];l&&["completed","not_requested","skipped","failed"].includes(l.status)&&(s[o]={status:l.status,reasons:Array.isArray(l.reasons)?l.reasons.filter(a=>typeof a=="string"):[]})}return s}function rt(e,i){return e.readiness==="ready"||e.readiness==="review_required"||e.readiness==="insufficient_evidence"?e.readiness:"insufficient_evidence"}function ot(e){return e==="recompose"||e==="refine"||e==="approved"?e:void 0}function nt(e){return e==="recommended"||e==="required"?e:void 0}function lt(e){if(Array.isArray(e))return e.filter(i=>i==="primary_visual"||i==="functional_safe"||i==="responsive_ready")}function ct(e){if(e.design_check_summary){const o={priority_high:H(e.design_check_summary.priority_high),priority_medium:H(e.design_check_summary.priority_medium),priority_low:H(e.design_check_summary.priority_low),deterministic_status:e.design_check_summary.deterministic_status==="failed"?"failed":"completed",visual_status:e.design_check_summary.visual_status??"not_requested",coverage:e.design_check_summary.coverage==="structural_and_visual"?"structural_and_visual":"structural_only",skipped_reasons:Array.isArray(e.design_check_summary.skipped_reasons)?e.design_check_summary.skipped_reasons.filter(a=>typeof a=="string"):[],primary_visual_status:e.design_check_summary.primary_visual_status,primary_visual_verdict:ot(e.design_check_summary.primary_visual_verdict),critic_summary:typeof e.design_check_summary.critic_summary=="string"?e.design_check_summary.critic_summary:void 0,functional_safe:typeof e.design_check_summary.functional_safe=="boolean"?e.design_check_summary.functional_safe:void 0,responsive_requirement:nt(e.design_check_summary.responsive_requirement),responsive_ready:typeof e.design_check_summary.responsive_ready=="boolean"?e.design_check_summary.responsive_ready:void 0,required_dimensions:lt(e.design_check_summary.required_dimensions)},l=ue({...o,coverage_dimensions:e.design_check_summary.coverage_dimensions});return{...o,coverage_dimensions:l,viewport_profiles_tested:Array.isArray(e.design_check_summary.viewport_profiles_tested)?e.design_check_summary.viewport_profiles_tested.filter(a=>typeof a=="string"):[],readiness:rt(e.design_check_summary)}}if(!e.lint_summary)return null;const i={priority_high:H(e.lint_summary.errors),priority_medium:H(e.lint_summary.warnings),priority_low:0,deterministic_status:"completed",visual_status:"not_requested",coverage:"structural_only",skipped_reasons:[]},s=ue(i);return{...i,coverage_dimensions:s,viewport_profiles_tested:[],readiness:"insufficient_evidence"}}function ut(e){return{rule:e.rule,path:e.path,displayPriority:e.displayPriority??(e.severity==="error"?"priority_high":"priority_medium"),actual:e.actual,expected:e.expected,hint:e.hint}}function je(e){return{snapshot_id:e.snapshot_id,captured_at:e.captured_at,brief_id:e.brief_id,thresholds_source:e.thresholds_source,scope:e.scope,target:e.target,design_check_summary:ct(e),primary_view_context:e.primary_view_context,image:e.image}}function dt(e){const i=e.check_results??e.lint_results??[];return{...je(e),check_results:i.map(ut),image_url:e.image_url,meta:e.meta,layout_metadata:e.layout_metadata,target_profiles:e.target_profiles,profile_simulations:e.profile_simulations,design_check_context:e.design_check_context}}async function de(e,i){const s=new URLSearchParams;i!==void 0&&s.set("limit",String(i));const o=s.toString()?`?${s.toString()}`:"",l=await we(`/api/ui-studio/snapshots${o}`);return{...l,snapshots:l.snapshots.map(je)}}async function ht(e,i){const s=i!==void 0?`?placeId=${i}`:"",o=await we(`/api/ui-studio/snapshots/${encodeURIComponent(e)}${s}`);return dt(o)}function ke(e,i){const s=i!==void 0?`?placeId=${i}`:"";return`${V}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image${s}`}const pt=1e4;function Ie(e=50){const[i,s]=_.useState(null),[o,l]=_.useState(!0),[a,n]=_.useState(null),u=_.useCallback(async()=>{try{const d=await de(void 0,e);s(d),n(null)}catch(d){n(d instanceof Error?d.message:String(d))}finally{l(!1)}},[e]);return _.useEffect(()=>{let d=!1;const g=async()=>{try{const p=await de(void 0,e);d||(s(p),n(null))}catch(p){d||n(p instanceof Error?p.message:String(p))}finally{d||l(!1)}};g();const m=setInterval(()=>{g()},pt);return()=>{d=!0,clearInterval(m)}},[e]),{data:i,loading:o,error:a,refresh:u}}const _t="_page_x5b68_2",mt="_grid_x5b68_9",gt="_card_x5b68_16",yt="_cardBodyButton_x5b68_31",xt="_thumb_x5b68_48",ft="_badges_x5b68_57",St="_priorityHighBadge_x5b68_65",vt="_priorityMediumBadge_x5b68_66",bt="_priorityLowBadge_x5b68_67",Ct="_cardMeta_x5b68_97",wt="_target_x5b68_103",jt="_time_x5b68_110",kt="_drawer_x5b68_115",It="_drawerToolbar_x5b68_132",Nt="_drawerTitleBlock_x5b68_143",Pt="_drawerEyebrow_x5b68_150",Tt="_drawerTarget_x5b68_159",Bt="_drawerToolbarActions_x5b68_169",Rt="_closeBtn_x5b68_177",Dt="_detailBody_x5b68_198",Gt="_screenshotPreviewFrame_x5b68_205",Mt="_fullImg_x5b68_218",At="_metaDl_x5b68_225",Lt="_errorMsg_x5b68_237",$t="_suggestionsWrap_x5b68_242",Et="_prioritySection_x5b68_249",qt="_sectionHighHeader_x5b68_253",Ht="_sectionLowHeader_x5b68_259",Ut="_sectionMediumHeader_x5b68_265",Ot="_groupCard_x5b68_271",Ft="_groupHeader_x5b68_278",zt="_groupLabel_x5b68_294",Vt="_groupCount_x5b68_299",Wt="_groupChevron_x5b68_306",Kt="_groupBody_x5b68_310",Yt="_groupDescription_x5b68_313",Qt="_groupFix_x5b68_318",Jt="_falsePositive_x5b68_327",Xt="_itemList_x5b68_335",Zt="_suggestionItem_x5b68_343",ei="_suggestionInfo_x5b68_353",ti="_pathBreadcrumb_x5b68_359",ii="_currentValue_x5b68_368",si="_copyFixBtn_x5b68_372",ai="_emptySuggestions_x5b68_386",ri="_sampleBanner_x5b68_394",oi="_sampleBannerRow_x5b68_407",ni="_sampleBannerMain_x5b68_415",li="_sampleBadge_x5b68_423",ci="_sampleTitle_x5b68_433",ui="_sampleMessage_x5b68_440",di="_sampleActions_x5b68_447",hi="_primaryAction_x5b68_455",pi="_secondaryAction_x5b68_456",_i="_emptyState_x5b68_491",mi="_pluginGuideCard_x5b68_499",gi="_pluginGuideMarker_x5b68_510",yi="_pluginGuideBody_x5b68_525",xi="_pluginGuideTitle_x5b68_529",fi="_pluginGuideMessage_x5b68_537",Si="_pluginGuideChecklist_x5b68_544",vi="_pluginGuideWaiting_x5b68_567",bi="_pluginGuideDot_x5b68_576",Ci="_analysisWorkspace_x5b68_584",wi="_analysisMainColumn_x5b68_589",ji="_analysisSummaryPanel_x5b68_594",ki="_recentCapturesHeader_x5b68_607",Ii="_analysisSummaryText_x5b68_614",Ni="_recentCapturesMeta_x5b68_615",Pi="_analysisReportGrid_x5b68_621",Ti="_analysisReportGroup_x5b68_628",Bi="_analysisReportCard_x5b68_632",Ri="_analysisReportThumb_x5b68_654",Di="_analysisReportBody_x5b68_663",Gi="_analysisReportTopline_x5b68_670",Mi="_analysisVerdict_x5b68_677",Ai="_analysisVerdict_needsFix_x5b68_688",Li="_analysisVerdict_review_x5b68_689",$i="_analysisVerdict_incomplete_x5b68_694",Ei="_analysisVerdict_passed_x5b68_699",qi="_analysisReportCounts_x5b68_704",Hi="_readinessSummary_x5b68_709",Ui="_readinessChip_x5b68_715",Oi="_readinessChipReady_x5b68_730",Fi="_readinessChipPending_x5b68_736",zi="_primaryReadinessBlock_x5b68_742",Vi="_criticSummary_x5b68_749",Wi="_analysisReportTarget_x5b68_768",Ki="_analysisReportIssue_x5b68_777",Yi="_analysisReportCoverage_x5b68_783",Qi="_coverageChips_x5b68_789",Ji="_coverageChip_x5b68_789",Xi="_coverageChip_completed_x5b68_810",Zi="_coverageChip_failed_x5b68_815",es="_coverageChip_skipped_x5b68_820",ts="_coverageChip_not_requested_x5b68_821",is="_analysisReportMeta_x5b68_826",ss="_analysisChildList_x5b68_833",as="_analysisChildRow_x5b68_844",rs="_analysisChildPath_x5b68_865",os="_analysisChildSummary_x5b68_874",ns="_analysisChildDetailHint_x5b68_875",ls="_drawerAnalysisSummary_x5b68_884",cs="_drawerAnalysisSummaryItem_x5b68_895",us="_drawerAnalysisLabel_x5b68_902",ds="_drawerAnalysisCounts_x5b68_908",hs="_drawerAnalysisValue_x5b68_909",ps="_recentCapturesSection_x5b68_914",_s="_drawerPrimaryActions_x5b68_926",ms="_drawerActionBtn_x5b68_933",gs="_drawerMoreMenu_x5b68_962",ys="_drawerMoreButton_x5b68_967",xs="_drawerMoreMenuBody_x5b68_992",fs="_drawerMenuItem_x5b68_1005",Ss="_drawerMenuItemDanger_x5b68_1028",vs="_actionErrMsg_x5b68_1037",bs="_actionStatusMsg_x5b68_1046",Cs="_actionStatus_info_x5b68_1060",ws="_actionStatus_success_x5b68_1066",js="_actionStatus_warning_x5b68_1072",ks="_actionStatusDetail_x5b68_1078",Is="_galleryHeader_x5b68_1084",Ns="_cardChecked_x5b68_1097",Ps="_cardCheckbox_x5b68_1104",Ts="_captureSelectionActions_x5b68_1119",Bs="_selectionToolbar_x5b68_1128",Rs="_selectionBar_x5b68_1129",Ds="_selectionToolbarCount_x5b68_1148",Gs="_selectionToolbarActions_x5b68_1155",Ms="_selectionBarBtn_x5b68_1162",As="_selectionBarBtnDanger_x5b68_1188",r={page:_t,grid:mt,card:gt,cardBodyButton:yt,thumb:xt,badges:ft,priorityHighBadge:St,priorityMediumBadge:vt,priorityLowBadge:bt,cardMeta:Ct,target:wt,time:jt,drawer:kt,drawerToolbar:It,drawerTitleBlock:Nt,drawerEyebrow:Pt,drawerTarget:Tt,drawerToolbarActions:Bt,closeBtn:Rt,detailBody:Dt,screenshotPreviewFrame:Gt,fullImg:Mt,metaDl:At,errorMsg:Lt,suggestionsWrap:$t,prioritySection:Et,sectionHighHeader:qt,sectionLowHeader:Ht,sectionMediumHeader:Ut,groupCard:Ot,groupHeader:Ft,groupLabel:zt,groupCount:Vt,groupChevron:Wt,groupBody:Kt,groupDescription:Yt,groupFix:Qt,falsePositive:Jt,itemList:Xt,suggestionItem:Zt,suggestionInfo:ei,pathBreadcrumb:ti,currentValue:ii,copyFixBtn:si,emptySuggestions:ai,sampleBanner:ri,sampleBannerRow:oi,sampleBannerMain:ni,sampleBadge:li,sampleTitle:ci,sampleMessage:ui,sampleActions:di,primaryAction:hi,secondaryAction:pi,emptyState:_i,pluginGuideCard:mi,pluginGuideMarker:gi,pluginGuideBody:yi,pluginGuideTitle:xi,pluginGuideMessage:fi,pluginGuideChecklist:Si,pluginGuideWaiting:vi,pluginGuideDot:bi,analysisWorkspace:Ci,analysisMainColumn:wi,analysisSummaryPanel:ji,recentCapturesHeader:ki,analysisSummaryText:Ii,recentCapturesMeta:Ni,analysisReportGrid:Pi,analysisReportGroup:Ti,analysisReportCard:Bi,analysisReportThumb:Ri,analysisReportBody:Di,analysisReportTopline:Gi,analysisVerdict:Mi,analysisVerdict_needsFix:Ai,analysisVerdict_review:Li,analysisVerdict_incomplete:$i,analysisVerdict_passed:Ei,analysisReportCounts:qi,readinessSummary:Hi,readinessChip:Ui,readinessChipReady:Oi,readinessChipPending:Fi,primaryReadinessBlock:zi,criticSummary:Vi,analysisReportTarget:Wi,analysisReportIssue:Ki,analysisReportCoverage:Yi,coverageChips:Qi,coverageChip:Ji,coverageChip_completed:Xi,coverageChip_failed:Zi,coverageChip_skipped:es,coverageChip_not_requested:ts,analysisReportMeta:is,analysisChildList:ss,analysisChildRow:as,analysisChildPath:rs,analysisChildSummary:os,analysisChildDetailHint:ns,drawerAnalysisSummary:ls,drawerAnalysisSummaryItem:cs,drawerAnalysisLabel:us,drawerAnalysisCounts:ds,drawerAnalysisValue:hs,recentCapturesSection:ps,drawerPrimaryActions:_s,drawerActionBtn:ms,drawerMoreMenu:gs,drawerMoreButton:ys,drawerMoreMenuBody:xs,drawerMenuItem:fs,drawerMenuItemDanger:Ss,actionErrMsg:vs,actionStatusMsg:bs,actionStatus_info:Cs,actionStatus_success:ws,actionStatus_warning:js,actionStatusDetail:ks,galleryHeader:Is,cardChecked:Ns,cardCheckbox:Ps,captureSelectionActions:Ts,selectionToolbar:Bs,selectionBar:Rs,selectionToolbarCount:Ds,selectionToolbarActions:Gs,selectionBarBtn:Ms,selectionBarBtnDanger:As};function Ls({snapshot:e,placeId:i,onClick:s,imageUrlOverride:o,selectable:l,selected:a,onToggleSelect:n}){var b,k,G;const{t:u}=I(),d=((b=e.design_check_summary)==null?void 0:b.priority_high)??0,g=((k=e.design_check_summary)==null?void 0:k.priority_medium)??0,m=((G=e.design_check_summary)==null?void 0:G.priority_low)??0,p=new Date(e.captured_at*1e3).toLocaleString(),x=o??ke(e.snapshot_id,i),v=()=>{n==null||n(e.snapshot_id)};return t.jsxs("div",{className:`${r.card} ${a?r.cardChecked:""}`,children:[l&&t.jsx(y,{text:u("uiStudio.gallery.cardCheckbox.tooltip","Select this capture. Pick multiple to delete them together."),children:t.jsx(Fe,{className:r.cardCheckbox,"aria-label":u("uiStudio.gallery.cardCheckbox","Select screenshot"),checked:!!a,onChange:v})}),t.jsxs("button",{className:r.cardBodyButton,onClick:j=>s(j.currentTarget),type:"button",children:[t.jsx("img",{className:r.thumb,src:x,alt:e.snapshot_id,loading:"lazy"}),t.jsxs("div",{className:r.badges,children:[d>0&&t.jsx(y,{text:u("uiStudio.gallery.priorityHighBadge.tooltip","Number of suggestions to review first. Click for details."),children:t.jsx("span",{className:r.priorityHighBadge,children:d})}),g>0&&t.jsx(y,{text:u("uiStudio.gallery.priorityMediumBadge.tooltip","Number of recommended suggestions."),children:t.jsx("span",{className:r.priorityMediumBadge,children:g})}),m>0&&t.jsx(y,{text:u("uiStudio.gallery.priorityLowBadge.tooltip","Number of optional improvements."),children:t.jsx("span",{className:r.priorityLowBadge,children:m})})]}),t.jsxs("div",{className:r.cardMeta,children:[t.jsx("div",{className:r.target,children:e.target??e.scope}),t.jsx("div",{className:r.time,children:p})]})]})]})}const $s={touch_target:"touchTarget",contrast:"contrast",text_scaled:"textScaled",safezone:"safezone",min_text_size:"minTextSize"};function Es(e){return e.rule==="contrast"&&/\.(Icon|Avatar|EmptyIcon|GoldIcon|[A-Za-z]*Icon)$/.test(e.path)}const qs={touch_target:{checkLabel:"터치 타겟 크기",description:"모바일에서 손가락으로 누르기 편한 최소 크기를 만족하는지 확인합니다.",howToFix:"버튼 Size 를 44x44 px 이상으로 키우거나 UIPadding 으로 터치 영역을 확장하세요.",buildUpdateCommand:e=>JSON.stringify({action:"update",targetPath:e.path,changes:{properties:{Size:{xScale:0,xOffset:44,yScale:0,yOffset:44}}}},null,2)},contrast:{checkLabel:"텍스트 대비",description:"텍스트와 배경의 명암 비율이 WCAG 접근성 기준을 만족하는지 확인합니다.",howToFix:"TextColor3 를 더 밝은 색(예: #FFFFFF) 으로 바꾸거나, 배경(BackgroundColor3)을 어둡게 조정하세요.",falsePositiveNote:"이모지 아이콘의 경우 색이 고정되어 대비 규칙이 오탐하는 경우가 많습니다. 실제 가독성에 문제 없으면 무시해도 됩니다.",buildUpdateCommand:e=>JSON.stringify({action:"update",targetPath:e.path,changes:{properties:{TextColor3:{r:255,g:255,b:255}}}},null,2)},text_scaled:{checkLabel:"TextScaled 사용",description:"TextScaled 가 켜져 있으나 UITextSizeConstraint 가 없으면 언어 확장 시 레이아웃이 깨질 수 있습니다.",howToFix:"해당 TextLabel 에 UITextSizeConstraint 자식을 추가하고 MaxTextSize 를 지정하세요.",buildUpdateCommand:e=>JSON.stringify({action:"update",targetPath:e.path,changes:{addChildren:[{className:"UITextSizeConstraint",name:"SizeConstraint",properties:{MaxTextSize:24,MinTextSize:10}}]}},null,2)},safezone:{checkLabel:"세이프존 배치",description:"버튼이 플랫폼별 세이프존(노치·홈 인디케이터·TV safe margin) 안에 있는지 확인합니다.",howToFix:"Position 을 세이프존 안쪽으로 이동하거나, 부모 Frame 을 축소하세요.",buildUpdateCommand:()=>null},min_text_size:{checkLabel:"최소 폰트 크기",description:"텍스트가 너무 작아 가독성이 떨어지는지 확인합니다. 브리프 기준 하한을 사용합니다.",howToFix:"TextSize 를 14 이상(본문 기준)으로 올리세요.",buildUpdateCommand:e=>{const i=typeof e.expected=="string"?parseInt(e.expected.replace(/[^\d]/g,""),10):14;return JSON.stringify({action:"update",targetPath:e.path,changes:{properties:{TextSize:Number.isFinite(i)?i:14}}},null,2)}}};function Hs(e,i,s){const o=$s[e];return o?{...i,checkLabel:s(`uiStudio.fix.${o}.label`,i.checkLabel),description:s(`uiStudio.fix.${o}.description`,i.description),howToFix:s(`uiStudio.fix.${o}.howToFix`,i.howToFix),falsePositiveNote:i.falsePositiveNote?s(`uiStudio.fix.${o}.falsePositive`,i.falsePositiveNote):void 0}:i}function Us(e,i){const s=qs[e]??null;return s?i?Hs(e,s,i):s:null}function Os(e){return Es(e)}function Fs(e,i){const s=new Map;for(const l of e){const a=`${l.displayPriority}::${l.rule}`,n=s.get(a)??[];n.push(l),s.set(a,n)}const o=[];for(const[l,a]of s){const[n,u]=l.split("::"),d=a.filter(Os).length;o.push({rule:u??"unknown",priority:n,items:a,fixTemplate:Us(u??"",i),falsePositiveRatio:a.length>0?d/a.length:0})}return o.sort((l,a)=>{const n={priority_high:0,priority_medium:1,priority_low:2};return l.priority!==a.priority?n[l.priority]-n[a.priority]:a.items.length-l.items.length}),{high:o.filter(l=>l.priority==="priority_high"),medium:o.filter(l=>l.priority==="priority_medium"),low:o.filter(l=>l.priority==="priority_low")}}function Ne(e){const i=e.split("."),s=i[i.length-1]??e,o=i[i.length-2],l=o?`${o} > ${s}`:s;return{full:e,breadcrumb:l,leaf:s}}function Pe(e){return typeof e=="object"&&e!==null}function he(e){return Pe(e.data)?e.data:{}}function ee(e,i){const s=e[i];return Pe(s)?s:{}}function W(e,i){const s=e[i];return typeof s=="string"?s:null}function K(e,i){const s=e[i];return typeof s=="number"&&Number.isFinite(s)?s:0}function zs(e){const i=ee(e,"design_check_summary");return{priority_high:K(i,"priority_high"),priority_medium:K(i,"priority_medium"),priority_low:K(i,"priority_low")}}function pe(e){if(!(e.success??e.ok??!e.error))throw new Error(e.error??"UI Studio action failed")}function _e(e,i){return Te(e,zs(i))}function U(e,i,s,o,l){const a=e(i,s);return l?`${a}: ${l} · ${o}`:`${a}: ${o}`}function Vs(e){const i=e.design_check_summary;return((i==null?void 0:i.priority_high)??0)>0?"needsFix":(i==null?void 0:i.readiness)==="insufficient_evidence"?"incomplete":((i==null?void 0:i.priority_medium)??0)>0||((i==null?void 0:i.priority_low)??0)>0?"review":"passed"}function Ws(e,i){return i==="needsFix"||i==="review"?e("uiStudio.analysis.verdict.hasSuggestions","개선 제안 있음"):i==="incomplete"?e("uiStudio.analysis.verdict.incomplete","검토 증거 부족"):e("uiStudio.analysis.verdict.passed","현재 개선 제안 없음")}function Y(e,i){return`${i}${e("uiStudio.storage.countSuffix","개")}`}function Te(e,i){return`${e("uiStudio.priorityHigh","우선 검토")} ${Y(e,(i==null?void 0:i.priority_high)??0)} · ${e("uiStudio.priorityMedium","검토 권장")} ${Y(e,(i==null?void 0:i.priority_medium)??0)} · ${e("uiStudio.priorityLow","선택 개선")} ${Y(e,(i==null?void 0:i.priority_low)??0)}`}function Ks(e,i){return Te(e,i.design_check_summary)}function Ys(e,i){return i==="recompose"?e("uiStudio.primaryVisual.recompose","Recompose"):i==="refine"?e("uiStudio.primaryVisual.refine","Refine"):i==="approved"?e("uiStudio.primaryVisual.approved","Approved"):e("uiStudio.primaryVisual.unknown","Unknown")}function Qs(e,i){return i==="ready"?e("uiStudio.readiness.ready","Ready"):i==="review_required"?e("uiStudio.readiness.reviewRequired","Review required"):i==="insufficient_evidence"?e("uiStudio.readiness.insufficient","Evidence incomplete"):e("uiStudio.readiness.unknown","Readiness unknown")}function Js({snapshotId:e,placeId:i,onClose:s,sampleDetail:o,tier:l,onActionDone:a}){const[n,u]=_.useState(o??null),[d,g]=_.useState(null),[m,p]=_.useState(null),[x,v]=_.useState(null),[b,k]=_.useState(null),[G,j]=_.useState(null),{t:h}=I(),{trackEvent:T}=q(),N=l==="pro";_.useEffect(()=>{if(o){u(o),g(null);return}let w=!1;return ht(e,i).then(B=>{w||u(B)}).catch(B=>{w||g(B instanceof Error?B.message:String(B))}),()=>{w=!0}},[e,i,o]);const S=async()=>{if(n!=null&&n.target){T("dashboard_click_event",{click_target:"ui_studio_capture_current",page:"ui-studio",tab:"ui_studio_analysis"}),p(null),k("preview"),v({tone:"info",message:h("uiStudio.actions.previewRunning","캡처 중..."),detail:h("uiStudio.actions.previewRunningDetail","완료되면 새 화면 캡처 파일 ID를 표시합니다.")});try{const w=await ne("preview",{targetPath:n.target,placeId:i});pe(w);const B=he(w),E=W(B,"snapshot_id"),f=ee(B,"screenshot"),L=ee(B,"meta"),R=W(f,"saved_path"),oe=W(L,"persist_warning"),O=_e(h,B);v(oe?{tone:"warning",message:U(h,"uiStudio.actions.previewNeedsSaveCheck","캡처 완료, 저장 확인 필요",O,E),detail:oe}:E&&R?{tone:"success",message:U(h,"uiStudio.actions.previewSaved","새 화면 캡처 저장 완료",O,E),detail:h("uiStudio.actions.previewSavedDetail","기존 화면 캡처는 변경하지 않고 새 파일로 저장했습니다.")}:E?{tone:"warning",message:U(h,"uiStudio.actions.previewComplete","캡처 완료",O,E),detail:h("uiStudio.actions.previewSavedPathMissing","새 화면 캡처 ID는 받았지만 저장 경로를 확인하지 못했습니다.")}:{tone:"warning",message:U(h,"uiStudio.actions.previewComplete","캡처 완료",O),detail:h("uiStudio.actions.previewSnapshotIdMissing","새 화면 캡처 ID를 확인하지 못했습니다. 목록을 새로고침해 저장 여부를 확인해 주세요.")}),await(a==null?void 0:a())}catch(w){p(w instanceof Error?w.message:String(w))}finally{k(null)}}},P=async()=>{if(n!=null&&n.target){T("dashboard_click_event",{click_target:"ui_studio_check_again",page:"ui-studio",tab:"ui_studio_analysis"}),p(null),k("check"),v({tone:"info",message:h("uiStudio.actions.designCheckRunning","개선 제안 확인 중..."),detail:h("uiStudio.actions.designCheckRunningDetail","완료되면 우선 검토/검토 권장/선택 개선 항목 수를 표시합니다.")});try{const w=await ne("check",{targetPath:n.target,placeId:i});pe(w);const B=he(w),E=_e(h,B);v({tone:"success",message:U(h,"uiStudio.actions.designCheckComplete","개선 제안 확인 완료",E),detail:h("uiStudio.actions.designCheckNoSnapshotSaved","이 작업은 화면 캡처 파일을 새로 저장하지 않습니다.")}),await(a==null?void 0:a())}catch(w){p(w instanceof Error?w.message:String(w))}finally{k(null)}}},A=async()=>{p(null),v(null);try{await Ve(i,e),await(a==null?void 0:a()),j(null),s()}catch(w){throw p(w instanceof Error?w.message:String(w)),w}},M=N?void 0:h("uiStudio.actions.proRequired","Pro에서 사용 가능"),C=n!=null&&n.target?Ne(n.target):null;return t.jsxs("div",{className:r.drawer,children:[t.jsxs("div",{className:r.drawerToolbar,"data-testid":"snapshot-detail-toolbar",children:[t.jsxs("div",{className:r.drawerTitleBlock,children:[t.jsx("span",{className:r.drawerEyebrow,children:h("uiStudio.analysis.detailDialog","Analysis detail")}),t.jsx("span",{className:r.drawerTarget,title:(C==null?void 0:C.full)??e,children:(C==null?void 0:C.breadcrumb)??e})]}),t.jsxs("div",{className:r.drawerToolbarActions,children:[n&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:r.drawerPrimaryActions,children:[t.jsx(y,{text:M??h("uiStudio.actions.captureCurrentState.tooltip","Save the UI currently shown in Studio as a new capture. Existing captures are kept."),children:t.jsxs("button",{className:r.drawerActionBtn,onClick:()=>void S(),disabled:!N||!n.target||b!==null,type:"button",children:[t.jsx(tt,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:h("uiStudio.actions.captureCurrentState","현재 상태 캡처")})]})}),t.jsx(y,{text:M??h("uiStudio.actions.checkSuggestionsAgain.tooltip","Recompute suggestions for this capture without taking a new screenshot."),children:t.jsxs("button",{className:r.drawerActionBtn,onClick:()=>void P(),disabled:!N||!n.target||b!==null,type:"button",children:[t.jsx(qe,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:h("uiStudio.actions.checkSuggestionsAgain","개선 제안 다시 확인")})]})})]}),t.jsxs("details",{className:r.drawerMoreMenu,children:[t.jsx("summary",{className:r.drawerMoreButton,title:h("uiStudio.actions.more.tooltip","Open additional actions."),"aria-label":h("uiStudio.actions.more","More"),children:t.jsx(st,{size:18,"aria-hidden":"true"})}),t.jsx("div",{className:r.drawerMoreMenuBody,children:t.jsx(y,{text:M??h("uiStudio.actions.deleteSnapshot.tooltip","Delete only this capture file. The actual UI in Roblox Studio is not affected."),children:t.jsx("button",{className:`${r.drawerMenuItem} ${r.drawerMenuItemDanger}`,onClick:()=>{T("dashboard_click_event",{click_target:"ui_studio_delete_snapshot",page:"ui-studio",tab:"ui_studio_analysis"}),j("deleteSnapshot")},disabled:!N,type:"button",children:h("uiStudio.actions.deleteSnapshot","이 화면 캡처 삭제")})})})]})]}),t.jsx(y,{text:h("uiStudio.detailClose.tooltip","Close this detail panel."),children:t.jsx("button",{className:r.closeBtn,onClick:s,type:"button","aria-label":h("uiStudio.detailClose","Close"),children:t.jsx(He,{size:18,"aria-hidden":"true"})})})]})]}),d&&t.jsx("div",{className:r.errorMsg,children:d}),n&&t.jsxs("div",{className:r.detailBody,children:[m&&t.jsx("div",{className:r.actionErrMsg,children:m}),x&&t.jsxs("div",{className:`${r.actionStatusMsg} ${r[`actionStatus_${x.tone}`]??""}`,children:[t.jsx("div",{children:x.message}),x.detail&&t.jsx("div",{className:r.actionStatusDetail,children:x.detail})]}),t.jsx(Xs,{detail:n}),t.jsx("div",{className:r.screenshotPreviewFrame,"data-testid":"analysis-screenshot-preview",children:t.jsx("img",{className:r.fullImg,src:n.image_url,alt:n.snapshot_id})}),t.jsx(ta,{items:n.check_results,summary:n.design_check_summary}),t.jsxs("dl",{className:r.metaDl,children:[t.jsx("dt",{children:t.jsx(D,{label:h("uiStudio.capturedAt","Captured"),tooltip:h("uiStudio.capturedAt.tooltip","When this screen was captured.")})}),t.jsx("dd",{children:new Date(n.captured_at*1e3).toLocaleString()}),t.jsx("dt",{children:t.jsx(D,{label:h("uiStudio.scope","Scope"),tooltip:h("uiStudio.scope.tooltip","Capture scope (full screen or a specific UI).")})}),t.jsx("dd",{children:n.scope}),n.target&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{children:t.jsx(D,{label:h("uiStudio.target","Target"),tooltip:h("uiStudio.target.tooltip","Exact path of the captured UI instance.")})}),t.jsx("dd",{children:n.target})]}),n.brief_id&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{children:t.jsx(D,{label:h("uiStudio.briefId","Brief"),tooltip:h("uiStudio.briefId.tooltip","Identifier of the design brief that produced this UI.")})}),t.jsx("dd",{children:n.brief_id})]})]})]}),G==="deleteSnapshot"&&t.jsx(re,{title:h("uiStudio.confirm.deleteSnapshotTitle","화면 캡처 삭제"),message:h("uiStudio.confirm.deleteSnapshotMessage","이 화면 캡처 파일만 삭제됩니다 (Studio 인스턴스 보존)."),danger:!0,confirmLabel:h("common.delete","삭제"),onConfirm:A,onClose:()=>j(null)})]})}function Xs({detail:e}){const{t:i}=I(),s=Vs(e);return t.jsxs("section",{className:r.drawerAnalysisSummary,children:[t.jsxs("div",{className:r.drawerAnalysisSummaryItem,children:[t.jsx("span",{className:r.drawerAnalysisLabel,children:t.jsx(D,{label:i("uiStudio.analysis.verdictLabel","개선 요약"),tooltip:i("uiStudio.analysis.verdictLabel.tooltip","Overall improvement verdict for this capture.")})}),t.jsx("span",{className:`${r.analysisVerdict} ${r[`analysisVerdict_${s}`]??""}`,children:Ws(i,s)}),t.jsx("span",{className:r.drawerAnalysisCounts,children:Ks(i,e)})]}),t.jsxs("div",{className:r.drawerAnalysisSummaryItem,children:[t.jsx("span",{className:r.drawerAnalysisLabel,children:t.jsx(D,{label:i("uiStudio.analysis.thresholds","검토 기준"),tooltip:i("uiStudio.analysis.thresholds.tooltip","The threshold set used for this review (default or custom).")})}),t.jsx("span",{className:r.drawerAnalysisValue,children:e.thresholds_source})]}),t.jsx(Zs,{summary:e.design_check_summary}),t.jsx(ea,{summary:e.design_check_summary})]})}function Zs({summary:e}){const{t:i}=I();if(!e)return null;const s=e.functional_safe===!0?i("uiStudio.functional.safe","Safe"):e.functional_safe===!1?i("uiStudio.functional.risk","Risk found"):i("uiStudio.functional.unknown","Unknown"),o=e.responsive_requirement==="required"?i("uiStudio.responsive.required","Required"):e.responsive_requirement==="recommended"?i("uiStudio.responsive.recommended","Recommended"):i("uiStudio.responsive.unknown","Unknown");return t.jsxs("div",{className:r.primaryReadinessBlock,children:[t.jsxs("div",{className:r.readinessSummary,"aria-label":i("uiStudio.readiness.summary","UI readiness"),children:[t.jsxs("span",{className:r.readinessChip,children:[i("uiStudio.primaryVisual.label","Primary visual")," · ",Ys(i,e.primary_visual_verdict)]}),t.jsxs("span",{className:r.readinessChip,children:[i("uiStudio.functional.label","Functional")," · ",s]}),t.jsxs("span",{className:r.readinessChip,children:[i("uiStudio.responsive.label","Responsive")," · ",o]}),t.jsx("span",{className:`${r.readinessChip} ${e.readiness==="ready"?r.readinessChipReady:r.readinessChipPending}`,children:Qs(i,e.readiness)})]}),e.critic_summary&&t.jsxs("p",{className:r.criticSummary,children:[t.jsx("span",{children:i("uiStudio.criticSummary","Critic summary")}),e.critic_summary]})]})}function ea({summary:e}){const{t:i}=I(),s=e==null?void 0:e.coverage_dimensions;if(!s)return null;const o=[["Structure",s.structure],["Visual",s.visual],["Interaction",s.interaction],["Primary view",s.primary_view_context],["Responsive",s.responsive_viewport]];return t.jsx("div",{className:r.coverageChips,"aria-label":i("uiStudio.analysis.coverageDimensions","검토 범위"),children:o.map(([l,a])=>t.jsxs("span",{className:`${r.coverageChip} ${r[`coverageChip_${a.status}`]??""}`,title:a.reasons.join(", "),children:[l," · ",a.status==="completed"?i("uiStudio.analysis.coverageStatus.completed","완료"):a.status==="failed"?i("uiStudio.analysis.coverageStatus.failed","실패"):i("uiStudio.analysis.coverageStatus.skipped","생략")]},l))})}function ta({items:e,summary:i}){const{t:s}=I();if(e.length===0)return t.jsx("p",{className:r.emptySuggestions,children:(i==null?void 0:i.readiness)==="insufficient_evidence"?s("uiStudio.noSuggestionsIncomplete","제안은 없지만 검토되지 않은 범위가 남아 있습니다."):s("uiStudio.noSuggestions","현재 개선 제안 없음")});const{high:o,medium:l,low:a}=Fs(e,s);return t.jsxs("div",{className:r.suggestionsWrap,children:[t.jsx("h3",{children:t.jsx(D,{label:s("uiStudio.designCheckResultsTitle","Design Check suggestions"),tooltip:s("uiStudio.designCheckResultsTitle.tooltip","All improvement suggestions found in this capture.")})}),o.length>0&&t.jsxs("section",{className:r.prioritySection,children:[t.jsx("h4",{className:r.sectionHighHeader,children:s("uiStudio.highPrioritySection","우선 검토")}),o.map(n=>t.jsx(Q,{group:n},`h-${n.rule}`))]}),l.length>0&&t.jsxs("section",{className:r.prioritySection,children:[t.jsx("h4",{className:r.sectionMediumHeader,children:s("uiStudio.mediumPrioritySection","검토 권장")}),l.map(n=>t.jsx(Q,{group:n},`m-${n.rule}`))]}),a.length>0&&t.jsxs("section",{className:r.prioritySection,children:[t.jsx("h4",{className:r.sectionLowHeader,children:s("uiStudio.lowPrioritySection","선택 개선")}),a.map(n=>t.jsx(Q,{group:n},`l-${n.rule}`))]})]})}function Q({group:e}){var n,u,d;const{t:i}=I(),[s,o]=_.useState(e.priority==="priority_high"&&e.items.length<=5),l=e.falsePositiveRatio>=.5&&!!((n=e.fixTemplate)!=null&&n.falsePositiveNote),a=((u=e.fixTemplate)==null?void 0:u.checkLabel)??e.rule;return t.jsxs("div",{className:r.groupCard,children:[t.jsx(y,{text:i("uiStudio.suggestionGroup.tooltip","Suggestions of the same kind grouped together. Click to expand or collapse."),children:t.jsxs("button",{className:r.groupHeader,onClick:()=>o(g=>!g),type:"button",children:[t.jsx("span",{className:r.groupLabel,children:a}),t.jsx(y,{text:i("uiStudio.groupSummary.tooltip","Number of UI elements matching this group."),children:t.jsxs("span",{className:r.groupCount,children:[e.items.length," ",i("uiStudio.groupSummary","items")]})}),t.jsx("span",{className:r.groupChevron,children:s?"▾":"▸"})]})}),s&&t.jsxs("div",{className:r.groupBody,children:[e.fixTemplate&&t.jsxs(t.Fragment,{children:[t.jsx("p",{className:r.groupDescription,children:e.fixTemplate.description}),t.jsx("p",{className:r.groupFix,children:e.fixTemplate.howToFix})]}),l&&t.jsx(y,{text:i("uiStudio.falsePositiveWarning.tooltip","This check can produce false positives — verify before applying."),children:t.jsxs("p",{className:r.falsePositive,children:[i("uiStudio.falsePositiveWarning","May contain false positives"),":"," ",(d=e.fixTemplate)==null?void 0:d.falsePositiveNote]})}),t.jsx("ul",{className:r.itemList,children:e.items.map((g,m)=>t.jsx(ia,{item:g,group:e},`${g.path}-${m}`))})]})]})}function ia({item:e,group:i}){var g;const{t:s}=I(),{trackEvent:o}=q(),[l,a]=_.useState(!1),n=Ne(e.path),u=((g=i.fixTemplate)==null?void 0:g.buildUpdateCommand(e))??null,d=async()=>{if(u)try{await navigator.clipboard.writeText(u),o("dashboard_click_event",{click_target:"ui_studio_copy_ai_instruction",page:"ui-studio",tab:"ui_studio_analysis"}),a(!0),setTimeout(()=>a(!1),2e3)}catch{}};return t.jsxs("li",{className:r.suggestionItem,children:[t.jsxs("div",{className:r.suggestionInfo,children:[t.jsx("code",{className:r.pathBreadcrumb,title:`${s("uiStudio.fullPath","Full path")}: ${n.full}`,children:n.breadcrumb}),t.jsxs("span",{className:r.currentValue,children:[t.jsx(y,{text:s("uiStudio.colCurrent.tooltip","The currently applied value."),children:t.jsx("span",{children:s("uiStudio.colCurrent","Current")})}),": ",t.jsx("strong",{children:String(e.actual)})," → ",t.jsx(y,{text:s("uiStudio.colRecommended.tooltip","The recommended value."),children:t.jsx("span",{children:s("uiStudio.colRecommended","Recommended")})}),": ",t.jsx("strong",{children:String(e.expected)})]})]}),u&&t.jsx(y,{text:s("uiStudio.copyFixCommand.tooltip","Copy a prompt that asks the AI to fix this issue."),children:t.jsx("button",{className:r.copyFixBtn,onClick:d,type:"button",children:l?s("uiStudio.copiedToClipboard","Copied"):s("uiStudio.copyFixCommand","Copy AI instruction")})})]})}function J(e,i){return Object.entries(i).reduce((s,[o,l])=>s.split(`{${o}}`).join(String(l)),e)}function sa(e,i){return i.rule==="contrast"?J(e("uiStudio.sample.designCheck.contrast","Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3."),{expected:String(i.expected),actual:String(i.actual)}):i.rule==="touch_target"?J(e("uiStudio.sample.designCheck.touchTarget","Touch targets should be at least {expected} px (current {actual}). Increase Size or padding."),{expected:String(i.expected),actual:String(i.actual)}):i.rule==="min_text_size"?J(e("uiStudio.sample.designCheck.minTextSize","TextSize is below {expected} (current {actual}). Increase it for readability."),{expected:String(i.expected),actual:String(i.actual)}):i.hint}const Be="sample_inventory_preview",te=We,aa=[{path:"StarterGui.InventoryGame.Overlay.Modal.Header.GoldBox.Icon",hint:"텍스트 대비 4.5:1 미만 (현재 1.24). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥4.5:1",rule:"contrast",actual:"1.24"},{path:"StarterGui.InventoryGame.Overlay.Modal.Header.CloseBtn",hint:"텍스트 대비 4.5:1 미만 (현재 4.11). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥4.5:1",rule:"contrast",actual:"4.11"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.Portrait.Avatar",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.EquipGrid.Slot1.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.EquipGrid.Slot2.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.EquipGrid.Slot3.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.EquipGrid.Slot4.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.EquipGrid.Slot5.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.EquipGrid.Slot6.EmptyIcon",hint:"텍스트 대비 3.0:1 미만 (현재 2.53). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"2.53"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.TabBar.TabAll",hint:"터치 타겟 44x44 px 이상 권장 (현재 64x32). Size 또는 padding 늘리세요.",displayPriority:"priority_high",expected:"≥44x44",rule:"touch_target",actual:"64x32"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.TabBar.TabWeapon",hint:"터치 타겟 44x44 px 이상 권장 (현재 64x32). Size 또는 padding 늘리세요.",displayPriority:"priority_high",expected:"≥44x44",rule:"touch_target",actual:"64x32"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.TabBar.TabArmor",hint:"터치 타겟 44x44 px 이상 권장 (현재 64x32). Size 또는 padding 늘리세요.",displayPriority:"priority_high",expected:"≥44x44",rule:"touch_target",actual:"64x32"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.TabBar.TabConsume",hint:"터치 타겟 44x44 px 이상 권장 (현재 64x32). Size 또는 padding 늘리세요.",displayPriority:"priority_high",expected:"≥44x44",rule:"touch_target",actual:"64x32"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.TabBar.TabMisc",hint:"터치 타겟 44x44 px 이상 권장 (현재 64x32). Size 또는 padding 늘리세요.",displayPriority:"priority_high",expected:"≥44x44",rule:"touch_target",actual:"64x32"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I1.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I1.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I2.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I3.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I4.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I5.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I6.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I7.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I8.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I9.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I10.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I11.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I12.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I13.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I13.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I14.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I14.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I15.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I15.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I16.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I16.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I17.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I17.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I18.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I19.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I19.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I20.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I20.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.DetailPanel.ItemIconBox.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.DetailPanel.Rarity",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.DetailPanel.StatsBox.Passive",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12}];function ra(e){const o={snapshot_id:Be,captured_at:1776757908,brief_id:null,thresholds_source:"default",scope:"targetPath",target:"StarterGui.InventoryGame",design_check_summary:{priority_high:35,priority_medium:10,priority_low:0},image:{file:"ui-studio-sample.png",width:402,height:252}},l={...o,check_results:aa.map(n=>({...n,hint:sa(e,n)})),image_url:te};return{list:{placeId:0,snapshots:[o],totalCount:1},detail:l}}const oa=/plugin not connected|sync not started/i;function ie(e){return typeof e=="string"&&oa.test(e)}function Re(){const{t:e}=I();return t.jsxs("section",{className:r.pluginGuideCard,role:"status","aria-live":"polite",children:[t.jsx("div",{className:r.pluginGuideMarker,"aria-hidden":"true",children:"!"}),t.jsxs("div",{className:r.pluginGuideBody,children:[t.jsx("h2",{className:r.pluginGuideTitle,children:e("uiStudio.pluginGuide.title","Roblox Studio 플러그인이 연결되지 않았습니다")}),t.jsx("p",{className:r.pluginGuideMessage,children:e("uiStudio.pluginGuide.message","UI Studio는 연결된 Studio place의 화면 캡처와 변경 이력을 표시합니다. Studio와 WEPPY Plugin을 연결하면 자동으로 갱신됩니다.")}),t.jsxs("ul",{className:r.pluginGuideChecklist,children:[t.jsx("li",{children:e("uiStudio.pluginGuide.check1","Roblox Studio가 실행 중인가요?")}),t.jsx("li",{children:e("uiStudio.pluginGuide.check2","WEPPY Plugin이 설치되어 실행 중인가요?")})]}),t.jsxs("div",{className:r.pluginGuideWaiting,children:[t.jsx("span",{className:r.pluginGuideDot,"aria-hidden":"true"}),e("uiStudio.pluginGuide.waiting","플러그인 연결을 기다리는 중...")]})]})]})}function De(e){return e.target??e.scope}function na(e){const i=De(e),s=i.split(".").filter(l=>l.length>0),o=s.findIndex(l=>l==="StarterGui");return o>=0&&s[o+1]?["StarterGui",s[o+1]].join("."):i}function Ge(e){return((e==null?void 0:e.priority_high)??0)>0?"needsFix":(e==null?void 0:e.readiness)==="insufficient_evidence"?"incomplete":((e==null?void 0:e.priority_medium)??0)>0||((e==null?void 0:e.priority_low)??0)>0?"review":"passed"}function la(e){return Ge(e.design_check_summary)}function me(e){return se(e.design_check_summary)}function se(e){return((e==null?void 0:e.priority_high)??0)>0?0:(e==null?void 0:e.readiness)==="insufficient_evidence"?1:((e==null?void 0:e.priority_medium)??0)>0?2:((e==null?void 0:e.priority_low)??0)>0?3:4}function ca(e){var s,o,l;if(e.length===0)return null;if(e.length===1)return((s=e[0])==null?void 0:s.latest.design_check_summary)??null;const i=e.reduce((a,n)=>{const u=n.latest.design_check_summary;a.priority_high+=(u==null?void 0:u.priority_high)??0,a.priority_medium+=(u==null?void 0:u.priority_medium)??0,a.priority_low+=(u==null?void 0:u.priority_low)??0,(u==null?void 0:u.deterministic_status)==="failed"&&(a.deterministic_status="failed"),(u==null?void 0:u.visual_status)==="failed"?a.visual_status="failed":(u==null?void 0:u.visual_status)==="skipped"&&a.visual_status!=="failed"?a.visual_status="skipped":(u==null?void 0:u.visual_status)==="completed"&&a.visual_status==="completed"?a.visual_status="completed":(u==null?void 0:u.visual_status)!=="completed"&&a.visual_status==="completed"&&(a.visual_status="not_requested"),(u==null?void 0:u.coverage)!=="structural_and_visual"&&(a.coverage="structural_only");for(const d of(u==null?void 0:u.skipped_reasons)??[])a.skipped_reasons.add(d);(u==null?void 0:u.readiness)==="insufficient_evidence"?a.readiness="insufficient_evidence":(u==null?void 0:u.readiness)==="review_required"&&a.readiness==="ready"&&(a.readiness="review_required");for(const d of(u==null?void 0:u.viewport_profiles_tested)??[])a.viewport_profiles_tested.add(d);return a},{priority_high:0,priority_medium:0,priority_low:0,deterministic_status:"completed",visual_status:"completed",coverage:"structural_and_visual",skipped_reasons:new Set,readiness:"ready",viewport_profiles_tested:new Set});return{priority_high:i.priority_high,priority_medium:i.priority_medium,priority_low:i.priority_low,deterministic_status:i.deterministic_status,visual_status:i.visual_status,coverage:i.coverage,skipped_reasons:[...i.skipped_reasons],readiness:i.readiness,viewport_profiles_tested:[...i.viewport_profiles_tested],coverage_dimensions:e.length===1?(l=(o=e[0])==null?void 0:o.latest.design_check_summary)==null?void 0:l.coverage_dimensions:void 0}}function ua(e){const i=new Map;for(const l of e){const a=De(l),n=i.get(a);if(!n){i.set(a,{latest:l,snapshotCount:1});continue}n.snapshotCount+=1,l.captured_at>n.latest.captured_at&&(n.latest=l)}const s=[...i.entries()].map(([l,a])=>({key:l,latest:a.latest,snapshotCount:a.snapshotCount,verdict:la(a.latest)})),o=new Map;for(const l of s){const a=na(l.latest),n=o.get(a)??[];n.push(l),o.set(a,n)}return[...o.entries()].map(([l,a])=>{var g;const n=a.sort((m,p)=>{const x=me(m.latest)-me(p.latest);return x!==0?x:p.latest.captured_at-m.latest.captured_at}),u=n.reduce((m,p)=>p.latest.captured_at>m.captured_at?p.latest:m,((g=n[0])==null?void 0:g.latest)??a[0].latest),d=ca(n);return{key:l,latest:u,snapshotCount:n.reduce((m,p)=>m+p.snapshotCount,0),children:n,summary:d,verdict:Ge(d)}}).sort((l,a)=>{const n=se(l.summary)-se(a.summary);return n!==0?n:a.latest.captured_at-l.latest.captured_at})}function da(e){return e.reduce((i,s)=>(s.verdict==="passed"?i.noSuggestions+=1:s.verdict==="incomplete"?i.evidenceIncomplete+=1:i.hasSuggestions+=1,i),{hasSuggestions:0,evidenceIncomplete:0,noSuggestions:0})}function $(e,i){return`${i}${e("uiStudio.storage.countSuffix","개")}`}function ae(e,i){return`${e("uiStudio.priorityHigh","우선 검토")} ${$(e,(i==null?void 0:i.priority_high)??0)} · ${e("uiStudio.priorityMedium","검토 권장")} ${$(e,(i==null?void 0:i.priority_medium)??0)} · ${e("uiStudio.priorityLow","선택 개선")} ${$(e,(i==null?void 0:i.priority_low)??0)}`}function ha(e,i){return i==="recompose"?e("uiStudio.primaryVisual.recompose","Recompose"):i==="refine"?e("uiStudio.primaryVisual.refine","Refine"):i==="approved"?e("uiStudio.primaryVisual.approved","Approved"):e("uiStudio.primaryVisual.unknown","Unknown")}function pa(e,i){return i==="ready"?e("uiStudio.readiness.ready","Ready"):i==="review_required"?e("uiStudio.readiness.reviewRequired","Review required"):i==="insufficient_evidence"?e("uiStudio.readiness.insufficient","Evidence incomplete"):e("uiStudio.readiness.unknown","Readiness unknown")}function _a(e,i,s){const o=s.evidenceIncomplete>0?` · ${z(e,"incomplete")} ${$(e,s.evidenceIncomplete)}`:"";return`${e("uiStudio.analysis.targetCountLabel","분석 대상")} ${$(e,i)} · ${z(e,"needsFix")} ${$(e,s.hasSuggestions)}${o} · ${z(e,"passed")} ${$(e,s.noSuggestions)}`}function ge(e,i){return(i==null?void 0:i.deterministic_status)==="failed"?e("uiStudio.analysis.coverage.deterministicFailed","구조 검사 실패"):(i==null?void 0:i.coverage)==="structural_and_visual"&&i.visual_status==="completed"?e("uiStudio.analysis.coverage.full","구조·시각 검사 완료"):(i==null?void 0:i.visual_status)==="skipped"?e("uiStudio.analysis.coverage.visualSkipped","구조 검사만 완료 · 시각 검사 생략"):(i==null?void 0:i.visual_status)==="failed"?e("uiStudio.analysis.coverage.visualFailed","구조 검사 완료 · 시각 검사 실패"):e("uiStudio.analysis.coverage.structuralOnly","구조 검사만 완료")}function ma({tier:e}){const{t:i}=I(),{trackEvent:s}=q(),o=e==="basic",l=Ie(50),a=_.useRef(null),[n,u]=_.useState(null),[d,g]=_.useState(new Set),[m,p]=_.useState(new Set),[x,v]=_.useState(!1),b=_.useCallback((f,L)=>{const R=n===f;R||(a.current=L??null),u(R?null:f)},[n]),k=_.useCallback(()=>{u(null)},[]),G=_.useCallback(f=>{g(L=>{const R=new Set(L);return R.has(f)?R.delete(f):R.add(f),R})},[]),j=o?ra(i):null,h=(j==null?void 0:j.list)??l.data,T=o?!1:l.loading,N=_.useCallback(f=>{p(L=>{const R=new Set(L);return R.has(f)?R.delete(f):R.add(f),R})},[]),S=f=>{p(new Set(f))},P=()=>{p(new Set)},A=async()=>{const f=(h==null?void 0:h.placeId)??0;s("dashboard_click_event",{click_target:"ui_studio_delete_selected_snapshots",page:"ui-studio",tab:"ui_studio_analysis"}),await Ke(f,{ids:[...m]}),await l.refresh(),v(!1),p(new Set)};if(T)return t.jsx("div",{className:r.page,children:i("uiStudio.loading","Loading...")});if(!o&&ie(l.error))return t.jsx(Re,{});if(!o&&l.error)return t.jsxs("div",{className:r.page,children:[i("uiStudio.error","Error"),": ",l.error]});const M=(h==null?void 0:h.snapshots)??[],C=(h==null?void 0:h.placeId)??0,w=M.map(f=>f.snapshot_id),B=ua(M),E=da(B);return t.jsxs("div",{children:[t.jsx("div",{className:r.analysisWorkspace,"data-detail-open":n?"true":"false",children:t.jsxs("div",{className:r.analysisMainColumn,"data-testid":"analysis-main-column",children:[o&&t.jsx("div",{className:r.sampleBanner,children:t.jsxs("div",{className:r.sampleBannerRow,children:[t.jsxs("div",{className:r.sampleBannerMain,children:[t.jsx("div",{className:r.sampleBadge,children:i("uiStudio.sample.badge","Preview of the Pro UI gallery")}),t.jsx("div",{className:r.sampleTitle,children:i("uiStudio.sample.title","You are previewing the UI screenshot gallery that unlocks after upgrading to Pro.")}),t.jsx("div",{className:r.sampleMessage,children:i("uiStudio.sample.message","This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.")})]}),t.jsx("div",{className:r.sampleActions,children:t.jsx("a",{className:r.primaryAction,href:be.uiStudioAnalysis,target:"_blank",rel:"noreferrer",onClick:()=>s("dashboard_click_event",{click_target:"upgrade_cta",placement:"ui_studio_analysis_banner",page:"ui-studio",tab:"ui_studio_analysis"}),children:i("tier.upgrade","View Pro")})})]})}),t.jsx("div",{className:r.galleryHeader,children:t.jsx("h1",{children:t.jsx(D,{label:i("uiStudio.title","UI Studio"),tooltip:i("uiStudio.title.tooltip","A central place to review AI-generated UI screens and improvement suggestions.")})})}),M.length===0?t.jsx("div",{className:r.emptyState,children:i("uiStudio.empty","No screenshots saved yet. They are created automatically when an AI agent captures the current UI state.")}):t.jsxs(t.Fragment,{children:[t.jsx("section",{className:r.analysisSummaryPanel,children:t.jsxs("div",{children:[t.jsx("h2",{children:t.jsx(D,{label:i("uiStudio.analysis.reportsTitle","UI 루트별 최신 분석"),tooltip:i("uiStudio.analysis.reportsTitle.tooltip","Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).")})}),t.jsx("p",{className:r.analysisSummaryText,children:_a(i,B.length,E)})]})}),t.jsx("div",{className:r.analysisReportGrid,"data-testid":"analysis-report-grid",children:B.map(f=>t.jsx(ya,{report:f,placeId:C,imageUrlOverride:o?te:void 0,expanded:d.has(f.key),onPrimaryClick:L=>{f.children.length>1?G(f.key):b(f.latest.snapshot_id,L)},onChildClick:(L,R)=>b(L,R)},f.key))}),t.jsxs("section",{className:r.recentCapturesSection,children:[t.jsxs("div",{className:r.recentCapturesHeader,children:[t.jsxs("div",{children:[t.jsx("h2",{children:t.jsx(D,{label:i("uiStudio.analysis.recentCapturesTitle","최근 캡처"),tooltip:i("uiStudio.analysis.recentCapturesTitle.tooltip","All recently saved captures in chronological order.")})}),t.jsxs("p",{className:r.recentCapturesMeta,children:[i("uiStudio.storage.snapshotCount","화면 캡처")," ",$(i,M.length)]})]}),!o&&M.length>0&&t.jsxs("div",{className:r.captureSelectionActions,children:[t.jsx(y,{text:i("uiStudio.gallery.selectAll.tooltip","Select every visible capture at once."),children:t.jsx("button",{className:r.selectionBarBtn,onClick:()=>S(w),type:"button",children:i("uiStudio.gallery.selectAll","모두 선택")})}),m.size>0&&t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:r.selectionToolbarCount,children:[m.size,i("uiStudio.gallery.selection.selectedCount"," selected")]}),t.jsx(y,{text:i("uiStudio.gallery.clearSelection.tooltip","Clear the current selection."),children:t.jsx("button",{className:r.selectionBarBtn,onClick:P,type:"button",children:i("uiStudio.gallery.clearSelection","선택 해제")})}),t.jsx(y,{text:i("uiStudio.gallery.deleteSelected.tooltip","Delete only the selected capture files. The actual UI in Roblox Studio is not affected."),children:t.jsx("button",{className:`${r.selectionBarBtn} ${r.selectionBarBtnDanger}`,onClick:()=>v(!0),type:"button",children:i("common.delete","삭제")})})]})]})]}),t.jsx("div",{className:r.grid,children:M.map(f=>t.jsx(Ls,{snapshot:f,placeId:C,onClick:L=>b(f.snapshot_id,L),imageUrlOverride:o?te:void 0,selectable:!o,selected:m.has(f.snapshot_id),onToggleSelect:N},f.snapshot_id))})]})]})]})}),t.jsx(Je,{open:n!==null,ariaLabel:i("uiStudio.analysis.detailDialog","Analysis detail"),onClose:k,returnFocusTo:a.current,testId:"analysis-detail-popup-layer",children:n&&t.jsx(Js,{snapshotId:n,placeId:C,onClose:k,sampleDetail:o&&n===Be?(j==null?void 0:j.detail)??null:null,tier:e,onActionDone:o?void 0:l.refresh})}),x&&t.jsx(re,{title:i("uiStudio.confirm.deleteBatchTitle","화면 캡처 일괄 삭제"),message:i("uiStudio.confirm.deleteBatchMessage",`선택한 ${m.size}개의 화면 캡처를 삭제합니다. 이 작업은 되돌릴 수 없습니다.`),danger:!0,confirmLabel:i("common.delete","삭제"),onConfirm:A,onClose:()=>v(!1)})]})}function z(e,i){return i==="needsFix"||i==="review"?e("uiStudio.analysis.verdict.hasSuggestions","개선 제안 있음"):i==="incomplete"?e("uiStudio.analysis.verdict.incomplete","검토 증거 부족"):e("uiStudio.analysis.verdict.passed","현재 개선 제안 없음")}function ga(e,i){return((i==null?void 0:i.priority_high)??0)>0||((i==null?void 0:i.priority_medium)??0)>0||((i==null?void 0:i.priority_low)??0)>0?ae(e,i):(i==null?void 0:i.readiness)==="insufficient_evidence"?e("uiStudio.analysis.issueSummary.incomplete","제안은 없지만 interaction·responsive 검토가 남아 있습니다."):e("uiStudio.analysis.issueSummary.passed","현재 검토 기준에서 추가 개선 제안은 없습니다.")}function ya({report:e,placeId:i,imageUrlOverride:s,expanded:o,onPrimaryClick:l,onChildClick:a}){const{t:n}=I(),u=e.latest,d=s??ke(u.snapshot_id,i),g=new Date(u.captured_at*1e3).toLocaleString(),m=z(n,e.verdict),p=e.children.length>1;return t.jsxs("div",{className:r.analysisReportGroup,children:[t.jsxs("button",{className:r.analysisReportCard,"aria-expanded":p?o:void 0,"aria-label":`${e.key} ${p?n("uiStudio.analysis.expandChildren","하위 대상 보기"):n("uiStudio.analysis.openDetail","상세 보기")}`,onClick:x=>l(x.currentTarget),type:"button",children:[t.jsx("img",{className:r.analysisReportThumb,src:d,alt:u.snapshot_id,loading:"lazy"}),t.jsxs("div",{className:r.analysisReportBody,children:[t.jsxs("div",{className:r.analysisReportTopline,children:[t.jsx(y,{text:e.verdict==="passed"?n("uiStudio.analysis.verdict.passed.tooltip","No improvements suggested under the current review thresholds."):n("uiStudio.analysis.verdict.hasSuggestions.tooltip","Some improvements were found in this UI. Click the card for details."),children:t.jsx("span",{className:`${r.analysisVerdict} ${r[`analysisVerdict_${e.verdict}`]??""}`,children:m})}),t.jsx(y,{text:n("uiStudio.analysis.counts.tooltip","Shows how many suggestions are marked review first, recommended, or optional."),children:t.jsx("span",{className:r.analysisReportCounts,children:ae(n,e.summary)})})]}),t.jsx("div",{className:r.analysisReportTarget,children:e.key}),t.jsx(xa,{summary:e.summary}),t.jsx("div",{className:r.analysisReportIssue,children:ga(n,e.summary)}),t.jsx("div",{className:r.analysisReportCoverage,children:ge(n,e.summary)}),t.jsx(fa,{summary:e.summary}),t.jsxs("div",{className:r.analysisReportMeta,children:[g," ·"," ",t.jsx(y,{text:n("uiStudio.analysis.thresholds.tooltip","The threshold set used for this review (default or custom)."),children:t.jsx("span",{children:n("uiStudio.analysis.thresholds","검토 기준")})}),": ",u.thresholds_source,e.snapshotCount>1?` · ${n("uiStudio.analysis.captureLabel","캡처")} ${$(n,e.snapshotCount)}`:"",p?` · ${n("uiStudio.analysis.childTargets","하위 대상")} ${$(n,e.children.length)}`:""]})]})]}),p&&o&&t.jsx("div",{className:r.analysisChildList,children:e.children.map(x=>t.jsxs("button",{className:r.analysisChildRow,onClick:v=>a(x.latest.snapshot_id,v.currentTarget),type:"button",children:[t.jsx("span",{className:r.analysisChildPath,children:x.key}),t.jsx("span",{className:r.analysisChildSummary,children:ae(n,x.latest.design_check_summary)}),t.jsx("span",{className:r.analysisChildSummary,children:ge(n,x.latest.design_check_summary)}),t.jsx("span",{className:r.analysisChildDetailHint,children:n("uiStudio.analysis.childDetailHint","하위 대상 상세 보기")})]},x.key))})]})}function xa({summary:e}){const{t:i}=I();if(!e)return null;const s=e.functional_safe===!0?i("uiStudio.functional.safe","Safe"):e.functional_safe===!1?i("uiStudio.functional.risk","Risk found"):i("uiStudio.functional.unknown","Unknown"),o=e.responsive_requirement==="required"?i("uiStudio.responsive.required","Required"):e.responsive_requirement==="recommended"?i("uiStudio.responsive.recommended","Recommended"):i("uiStudio.responsive.unknown","Unknown");return t.jsxs("div",{className:r.readinessSummary,"aria-label":i("uiStudio.readiness.summary","UI readiness"),children:[t.jsxs("span",{className:r.readinessChip,children:[i("uiStudio.primaryVisual.label","Primary visual")," · ",ha(i,e.primary_visual_verdict)]}),t.jsxs("span",{className:r.readinessChip,children:[i("uiStudio.functional.label","Functional")," · ",s]}),t.jsxs("span",{className:r.readinessChip,children:[i("uiStudio.responsive.label","Responsive")," · ",o]}),t.jsx("span",{className:`${r.readinessChip} ${e.readiness==="ready"?r.readinessChipReady:r.readinessChipPending}`,children:pa(i,e.readiness)})]})}function fa({summary:e}){const{t:i}=I(),s=e==null?void 0:e.coverage_dimensions;if(!s)return null;const o=[["Structure",s.structure],["Visual",s.visual],["Interaction",s.interaction],["Primary view",s.primary_view_context],["Responsive",s.responsive_viewport]];return t.jsx("div",{className:r.coverageChips,"aria-label":i("uiStudio.analysis.coverageDimensions","검토 범위"),children:o.map(([l,a])=>t.jsxs("span",{className:`${r.coverageChip} ${r[`coverageChip_${a.status}`]??""}`,title:a.reasons.join(", "),children:[l," · ",a.status==="completed"?i("uiStudio.analysis.coverageStatus.completed","완료"):a.status==="failed"?i("uiStudio.analysis.coverageStatus.failed","실패"):i("uiStudio.analysis.coverageStatus.skipped","생략")]},l))})}function Sa(e,i,s=1e4){const[o,l]=_.useState(null),[a,n]=_.useState(!0),[u,d]=_.useState(null),g=JSON.stringify(i),m=_.useCallback(async()=>{if(e===null){l(null),d(null),n(!1);return}try{const p=await le(e,i);l(p),d(null)}catch(p){d(p.message)}finally{n(!1)}},[e,g]);return _.useEffect(()=>{let p=!0;if(e===null)return l(null),d(null),n(!1),()=>{p=!1};const x=async()=>{try{const b=await le(e,i);p&&(l(b),d(null))}catch(b){p&&d(b.message)}finally{p&&n(!1)}};x();const v=setInterval(()=>{x()},s);return()=>{p=!1,clearInterval(v)}},[e,g,s]),{data:o,loading:a,error:u,refresh:m}}const va="_filterBar_1ohov_4",ba="_filterGroup_1ohov_14",Ca="_filterLabel_1ohov_21",wa="_filterCheckbox_1ohov_28",ja="_segmentGroup_1ohov_45",ka="_segmentBtn_1ohov_55",Ia="_segmentBtnActive_1ohov_73",Na="_filterInput_1ohov_79",Pa="_filterResetBtn_1ohov_95",Ta="_requestRow_1ohov_114",Ba="_requestRowMain_1ohov_127",Ra="_requestDetailToggle_1ohov_134",Da="_thumbPair_1ohov_156",Ga="_thumbPairButton_1ohov_164",Ma="_thumbSlot_1ohov_179",Aa="_thumbImg_1ohov_204",La="_thumbPlaceholder_1ohov_211",$a="_thumbArrow_1ohov_219",Ea="_extraPathsBadge_1ohov_225",qa="_requestMeta_1ohov_239",Ha="_requestLabel_1ohov_247",Ua="_requestTime_1ohov_256",Oa="_requestStats_1ohov_261",Fa="_statDot_1ohov_269",za="_summaryPill_1ohov_273",Va="_requestReadiness_1ohov_277",Wa="_requestReadinessPill_1ohov_283",Ka="_requestReadinessReady_1ohov_297",Ya="_requestReadinessPending_1ohov_303",Qa="_requestActions_1ohov_310",Ja="_expandHint_1ohov_317",Xa="_mutationsArea_1ohov_330",Za="_mutLoading_1ohov_339",er="_mutEmpty_1ohov_340",tr="_mutError_1ohov_346",ir="_mutationRow_1ohov_352",sr="_mutationLine_1ohov_362",ar="_mutTs_1ohov_369",rr="_mutCommand_1ohov_375",or="_mutPath_1ohov_381",nr="_mutDiff_1ohov_391",lr="_mutErr_1ohov_346",cr="_changeDetails_1ohov_406",ur="_changeDetailRow_1ohov_414",dr="_changeDetailRowNoBefore_1ohov_423",hr="_changeDetailBadge_1ohov_427",pr="_changeDetail_text_1ohov_444",_r="_changeDetail_color_1ohov_449",mr="_changeDetail_size_1ohov_454",gr="_changeDetail_layout_1ohov_459",yr="_changeDetail_state_1ohov_464",xr="_changeDetail_asset_1ohov_469",fr="_changeDetail_property_1ohov_474",Sr="_changeDetailProperty_1ohov_478",vr="_changeDetailArrow_1ohov_486",br="_changeDetailOldValue_1ohov_492",Cr="_changeDetailNewValue_1ohov_493",wr="_compareDialogLayer_1ohov_511",jr="_compareDialog_1ohov_511",kr="_beforeAfterDrawer_1ohov_542",Ir="_drawerHeader_1ohov_552",Nr="_drawerTitle_1ohov_561",Pr="_drawerCloseBtn_1ohov_568",Tr="_drawerBody_1ohov_584",Br="_pathTabs_1ohov_591",Rr="_pathTab_1ohov_591",Dr="_pathTabActive_1ohov_620",Gr="_comparePanel_1ohov_626",Mr="_compareHalf_1ohov_636",Ar="_compareLabel_1ohov_643",Lr="_compareImg_1ohov_654",$r="_comparePlaceholder_1ohov_662",Er="_compareDetailsPanel_1ohov_674",qr="_compareDetailsHeader_1ohov_683",Hr="_drawerFooter_1ohov_701",Ur="_drawerActionBtn_1ohov_709",Or="_historyTabWrap_1ohov_727",Fr="_historyWorkspace_1ohov_733",zr="_historyMainColumn_1ohov_738",Vr="_requestList_1ohov_742",Wr="_emptyHistory_1ohov_747",Kr="_historyError_1ohov_754",Yr="_historyLoading_1ohov_760",Qr="_listHeader_1ohov_768",Jr="_listHeaderTitle_1ohov_777",Xr="_clearBtn_1ohov_784",Zr="_deleteErrBanner_1ohov_808",c={filterBar:va,filterGroup:ba,filterLabel:Ca,filterCheckbox:wa,segmentGroup:ja,segmentBtn:ka,segmentBtnActive:Ia,filterInput:Na,filterResetBtn:Pa,requestRow:Ta,requestRowMain:Ba,requestDetailToggle:Ra,thumbPair:Da,thumbPairButton:Ga,thumbSlot:Ma,thumbImg:Aa,thumbPlaceholder:La,thumbArrow:$a,extraPathsBadge:Ea,requestMeta:qa,requestLabel:Ha,requestTime:Ua,requestStats:Oa,statDot:Fa,summaryPill:za,requestReadiness:Va,requestReadinessPill:Wa,requestReadinessReady:Ka,requestReadinessPending:Ya,requestActions:Qa,expandHint:Ja,mutationsArea:Xa,mutLoading:Za,mutEmpty:er,mutError:tr,mutationRow:ir,mutationLine:sr,mutTs:ar,mutCommand:rr,mutPath:or,mutDiff:nr,mutErr:lr,changeDetails:cr,changeDetailRow:ur,changeDetailRowNoBefore:dr,changeDetailBadge:hr,changeDetail_text:pr,changeDetail_color:_r,changeDetail_size:mr,changeDetail_layout:gr,changeDetail_state:yr,changeDetail_asset:xr,changeDetail_property:fr,changeDetailProperty:Sr,changeDetailArrow:vr,changeDetailOldValue:br,changeDetailNewValue:Cr,compareDialogLayer:wr,compareDialog:jr,beforeAfterDrawer:kr,drawerHeader:Ir,drawerTitle:Nr,drawerCloseBtn:Pr,drawerBody:Tr,pathTabs:Br,pathTab:Rr,pathTabActive:Dr,comparePanel:Gr,compareHalf:Mr,compareLabel:Ar,compareImg:Lr,comparePlaceholder:$r,compareDetailsPanel:Er,compareDetailsHeader:qr,drawerFooter:Hr,drawerActionBtn:Ur,historyTabWrap:Or,historyWorkspace:Fr,historyMainColumn:zr,requestList:Vr,emptyHistory:Wr,historyError:Kr,historyLoading:Yr,listHeader:Qr,listHeaderTitle:Jr,clearBtn:Xr,deleteErrBanner:Zr};function eo(e){try{return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}function ye(e){return e==null?"nil":typeof e=="string"?`"${e}"`:typeof e=="object"?JSON.stringify(e):String(e)}function Me({mutations:e,emptyLabel:i}){const{t:s}=I();return e.length===0?t.jsx("div",{className:c.mutEmpty,children:i??s("uiStudio.history.row.mutationsEmpty","No change details")}):t.jsx(t.Fragment,{children:e.map(o=>t.jsx(to,{mutation:o},o.mutationId))})}function to({mutation:e}){return t.jsxs("div",{className:c.mutationRow,children:[t.jsxs("div",{className:c.mutationLine,children:[t.jsx("span",{className:c.mutTs,children:eo(e.ts)}),t.jsx("span",{className:c.mutCommand,children:e.command}),e.targetPath&&t.jsx("span",{className:c.mutPath,children:e.targetPath}),e.diffSummary&&t.jsx("span",{className:c.mutDiff,children:e.diffSummary})]}),e.changeDetails&&e.changeDetails.length>0&&t.jsx("div",{className:c.changeDetails,children:e.changeDetails.map(i=>t.jsx(io,{detail:i},`${i.property}:${i.category}`))}),!e.ok&&e.error&&t.jsx("span",{className:c.mutErr,children:e.error})]})}function io({detail:e}){const i=Object.prototype.hasOwnProperty.call(e,"before");return t.jsxs("div",{className:`${c.changeDetailRow} ${i?"":c.changeDetailRowNoBefore}`,children:[t.jsx("span",{className:`${c.changeDetailBadge} ${c[`changeDetail_${e.category}`]??""}`,children:e.label}),t.jsx("span",{className:c.changeDetailProperty,children:e.property}),i&&t.jsx("span",{className:c.changeDetailOldValue,children:ye(e.before)}),t.jsx("span",{className:c.changeDetailArrow,children:"→"}),t.jsx("span",{className:c.changeDetailNewValue,children:ye(e.after)})]})}function xe(e,i){return`${V}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image?placeId=${i}`}function so(e){try{return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}function ao(e){if(!e)return null;const i=e.split(/[./]/).filter(o=>o.length>0);if(i.length===0)return null;const s=i.findIndex(o=>o==="StarterGui");return s>=0&&i[s+1]?i[s+1]:i[i.length-1]??null}function X(e,i){if(i.label)return i.label;const s=ao(i.affectedPaths[0]);if(s){const o=i.mutationCount===1?"uiStudio.history.row.pathLabelOne":"uiStudio.history.row.pathLabelMany",l=i.mutationCount===1?"{path} · {n} change detail":"{path} · {n} change details";return e(o,l).replace("{path}",s).replace("{n}",String(i.mutationCount))}return e("uiStudio.history.row.toolLabel","UI changes ({n})").replace("{n}",String(i.mutationCount))}function Z(e,i){return`${i}${e("uiStudio.storage.countSuffix","")}`}function ro(e,i){if(!i)return null;const s=[i.style_family,i.layout_family,i.device_policy,i.safe_area_policy].filter(o=>typeof o=="string"&&o.length>0);return s.length===0?null:`${e("uiStudio.history.row.qualityPlan","Design direction")}: ${s.join(" · ")}`}function oo(e,i,s){if(!i)return null;if(i.source==="unavailable")return e("uiStudio.history.row.designCheckUnavailable","Suggestions: unavailable");if(s==="insufficient_evidence"||i.readiness==="insufficient_evidence")return e("uiStudio.history.row.readinessIncomplete","Readiness: evidence incomplete");if(i.total===0)return e("uiStudio.history.row.designCheckNone","Suggestions: none");const o=`${e("uiStudio.priorityHigh","Priority")} ${Z(e,i.priority_high)}`,l=`${e("uiStudio.priorityMedium","Recommended")} ${Z(e,i.priority_medium)}`,a=`${e("uiStudio.priorityLow","Optional")} ${Z(e,i.priority_low)}`;return`${e("uiStudio.history.row.designCheck","Suggestions")}: ${o} · ${l} · ${a}`}function no(e,i){return i==="recompose"?e("uiStudio.primaryVisual.recompose","Recompose"):i==="refine"?e("uiStudio.primaryVisual.refine","Refine"):i==="approved"?e("uiStudio.primaryVisual.approved","Approved"):e("uiStudio.primaryVisual.unknown","Unknown")}function Ae({req:e,placeId:i,onOpenCompare:s,imageUrlOverride:o,sampleMutations:l}){const{t:a}=I(),[n,u]=_.useState(!1),[d,g]=_.useState(null),[m,p]=_.useState(!1),[x,v]=_.useState(null),b=o!=null,k=e.affectedPaths[0]??null,G=e.affectedPaths.length-1,j=k?e.beforeSnapshots[k]??null:null,h=k?e.afterSnapshots[k]??null:null,T=j?b?o:xe(j,i):null,N=h?b?o:xe(h,i):null,S=ro(a,e.qualityPlanSummary),P=oo(a,e.postChangeDesignCheckSummary,e.readiness),A=e.postChangeDesignCheckSummary,M=async()=>{if(!n&&d===null)if(b&&l!=null)g(l);else{p(!0),v(null);try{const C=await Ce(i,e.requestId);g(C.mutations)}catch(C){v(C.message)}finally{p(!1)}}u(C=>!C)};return t.jsxs("div",{className:c.requestRow,children:[t.jsxs("div",{className:c.requestRowMain,children:[t.jsx(y,{text:a("uiStudio.history.row.compare.tooltip","Compare the before and after screens. Click to open the full comparison view."),children:t.jsxs("button",{className:`${c.thumbPair} ${c.thumbPairButton}`,onClick:C=>s(C.currentTarget),disabled:!k,"aria-label":`${X(a,e)} ${a("uiStudio.history.row.compare","Before / After")}`,type:"button",children:[t.jsx("div",{className:c.thumbSlot,children:T?t.jsx("img",{className:c.thumbImg,src:T,alt:a("uiStudio.compare.before","Before"),loading:"lazy"}):t.jsx(y,{text:a("uiStudio.history.row.noBeforeState.tooltip","No capture saved before this change."),children:t.jsx("span",{className:c.thumbPlaceholder,children:a("uiStudio.history.row.noBeforeState","이전 없음")})})}),t.jsx("span",{className:c.thumbArrow,children:"→"}),t.jsx("div",{className:c.thumbSlot,children:N?t.jsx("img",{className:c.thumbImg,src:N,alt:a("uiStudio.compare.after","After"),loading:"lazy"}):t.jsx(y,{text:a("uiStudio.history.row.noAfterState.tooltip","No capture saved after this change."),children:t.jsx("span",{className:c.thumbPlaceholder,children:a("uiStudio.history.row.noAfterState","이후 없음")})})}),G>0&&t.jsx(y,{text:a("uiStudio.history.row.extraPaths.tooltip","Number of additional UIs changed in this action."),children:t.jsxs("span",{className:c.extraPathsBadge,children:["+",G]})})]})}),t.jsxs("button",{className:c.requestDetailToggle,type:"button","aria-expanded":n,"aria-label":`${X(a,e)} ${a("uiStudio.history.row.toggleDetails","Toggle change details")}`,onClick:()=>void M(),children:[t.jsxs("span",{className:c.requestMeta,children:[t.jsx("span",{className:c.requestLabel,children:X(a,e)}),t.jsx("span",{className:c.requestTime,children:so(e.startedAt)}),t.jsxs("span",{className:c.requestStats,children:[t.jsx(y,{text:a("uiStudio.history.row.affectedPaths.tooltip","Number of UIs affected by this action."),children:t.jsxs("span",{children:[a("uiStudio.history.row.affectedPaths","Paths")," ",e.affectedPaths.length,a("uiStudio.storage.countSuffix","")]})}),t.jsx("span",{className:c.statDot,children:"·"}),t.jsx(y,{text:a("uiStudio.history.row.mutations.tooltip","Number of detailed changes (e.g., property edits)."),children:t.jsxs("span",{children:[a("uiStudio.history.row.mutations","Change details")," ",e.mutationCount,a("uiStudio.storage.countSuffix","")]})}),S&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:c.statDot,children:"·"}),t.jsx(y,{text:a("uiStudio.history.row.qualityPlan.tooltip","Brief design direction used for this change."),children:t.jsx("span",{className:c.summaryPill,children:S})})]}),P&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:c.statDot,children:"·"}),t.jsx(y,{text:a("uiStudio.history.row.designCheck.tooltip","Post-change Design Check suggestion summary."),children:t.jsx("span",{className:c.summaryPill,children:P})})]})]}),A&&t.jsxs("span",{className:c.requestReadiness,"aria-label":a("uiStudio.readiness.summary","UI readiness"),children:[t.jsx("span",{className:c.requestReadinessPill,children:no(a,A.primary_visual_verdict)}),t.jsx("span",{className:c.requestReadinessPill,children:A.functional_safe===!0?a("uiStudio.functional.safeCompact","Functional safe"):A.functional_safe===!1?a("uiStudio.functional.riskCompact","Functional risk"):a("uiStudio.functional.unknownCompact","Functional unknown")}),t.jsx("span",{className:c.requestReadinessPill,children:A.responsive_requirement==="required"?a("uiStudio.responsive.requiredCompact","Responsive required"):A.responsive_requirement==="recommended"?a("uiStudio.responsive.recommendedCompact","Responsive recommended"):a("uiStudio.responsive.unknownCompact","Responsive unknown")}),A.readiness==="ready"&&t.jsx("span",{className:`${c.requestReadinessPill} ${c.requestReadinessReady}`,children:a("uiStudio.readiness.ready","Ready")}),A.readiness==="review_required"&&t.jsx("span",{className:`${c.requestReadinessPill} ${c.requestReadinessPending}`,children:a("uiStudio.readiness.reviewRequired","Review required")})]})]}),t.jsx("span",{className:c.requestActions,children:t.jsx(y,{text:a("uiStudio.history.row.toggleDetails.tooltip","Show or hide a per-line breakdown of what changed."),children:t.jsx("span",{className:c.expandHint,children:n?a("uiStudio.history.row.collapseDetails","Hide change details"):a("uiStudio.history.row.expandDetails","Show {n} change details").replace("{n}",String(e.mutationCount))})})})]})]}),n&&t.jsxs("div",{className:c.mutationsArea,children:[m&&t.jsx("div",{className:c.mutLoading,children:a("uiStudio.history.loading","로딩 중...")}),x&&t.jsx("div",{className:c.mutError,children:x}),d&&t.jsx(Me,{mutations:d,emptyLabel:a("uiStudio.history.row.mutationsEmpty","No change details")})]})]})}function fe(e,i){return`${V}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image?placeId=${i}`}function Le({requestId:e,placeId:i,onClose:s,imageUrlOverride:o,sampleDetail:l}){const{t:a}=I(),n=_.useRef(null),u=l!=null,[d,g]=_.useState(u?l:null),[m,p]=_.useState(!u),[x,v]=_.useState(null),[b,k]=_.useState(u&&l.affectedPaths.length>0?l.affectedPaths[0]:null);_.useEffect(()=>{var S;(S=n.current)==null||S.focus()},[]),_.useEffect(()=>{const S=P=>{P.key==="Escape"&&(P.preventDefault(),s())};return document.addEventListener("keydown",S),()=>{document.removeEventListener("keydown",S)}},[s]),_.useEffect(()=>{if(u)return;let S=!0;return p(!0),v(null),Ce(i,e).then(P=>{S&&(g(P),P.affectedPaths.length>0&&k(P.affectedPaths[0]))}).catch(P=>{S&&v(P.message)}).finally(()=>{S&&p(!1)}),()=>{S=!1}},[e,i,u]);const G=b&&d?d.beforeSnapshots[b]??null:null,j=b&&d?d.afterSnapshots[b]??null:null,h=G?o??fe(G,i):null,T=j?o??fe(j,i):null,N=a("uiStudio.history.row.compare","전후 비교");return t.jsx("div",{className:c.compareDialogLayer,"data-testid":"history-compare-dialog-layer",onClick:s,role:"presentation",children:t.jsx("section",{ref:n,className:c.compareDialog,role:"dialog","aria-modal":"true","aria-label":N,tabIndex:-1,onClick:S=>S.stopPropagation(),children:t.jsxs("div",{className:c.beforeAfterDrawer,children:[t.jsxs("div",{className:c.drawerHeader,children:[t.jsx("h2",{className:c.drawerTitle,children:N}),t.jsx("button",{className:c.drawerCloseBtn,onClick:s,type:"button",children:a("uiStudio.history.drawer.close","닫기")})]}),m&&t.jsx("div",{className:c.drawerBody,children:a("uiStudio.history.loading","로딩 중...")}),x&&t.jsx("div",{className:c.drawerBody,children:t.jsx("span",{className:c.mutErr,children:x})}),!m&&!x&&d&&t.jsxs(t.Fragment,{children:[d.affectedPaths.length>0&&t.jsx("div",{className:c.pathTabs,role:"tablist",children:d.affectedPaths.map(S=>t.jsx(y,{text:`${a("uiStudio.compare.path.tooltip","The UI instance path for this screen.")} ${S}`,children:t.jsx("button",{role:"tab","aria-selected":b===S,className:`${c.pathTab} ${b===S?c.pathTabActive:""}`,onClick:()=>k(S),type:"button",children:S.split("/").pop()??S})},S))}),t.jsxs("div",{className:c.comparePanel,children:[t.jsxs("div",{className:c.compareHalf,children:[t.jsx(y,{text:a("uiStudio.compare.before.tooltip","The screen saved just before AI made the change."),children:t.jsx("div",{className:c.compareLabel,children:a("uiStudio.compare.before","Before")})}),h?t.jsx("img",{className:c.compareImg,src:h,alt:a("uiStudio.compare.before","Before")}):t.jsx("div",{className:c.comparePlaceholder,children:a("uiStudio.history.row.noBeforeState","이전 상태 없음")})]}),t.jsxs("div",{className:c.compareHalf,children:[t.jsx(y,{text:a("uiStudio.compare.after.tooltip","The screen saved just after AI made the change."),children:t.jsx("div",{className:c.compareLabel,children:a("uiStudio.compare.after","After")})}),T?t.jsx("img",{className:c.compareImg,src:T,alt:a("uiStudio.compare.after","After")}):t.jsx("div",{className:c.comparePlaceholder,children:a("uiStudio.history.row.noAfterState","이후 상태 없음")})]})]}),t.jsxs("section",{className:c.compareDetailsPanel,children:[t.jsx("div",{className:c.compareDetailsHeader,children:a("uiStudio.history.drawer.changeDetails","Change details")}),t.jsx(Me,{mutations:d.mutations,emptyLabel:a("uiStudio.history.row.mutationsEmpty","No change details")})]})]}),t.jsx("div",{className:c.drawerFooter,children:t.jsx("button",{className:c.drawerActionBtn,onClick:s,type:"button",children:a("uiStudio.history.drawer.close","닫기")})})]})})})}function F(e){const i=new Date(e.getFullYear(),e.getMonth(),e.getDate(),0,0,0,0),s=new Date(e.getFullYear(),e.getMonth(),e.getDate(),23,59,59,999);return{start:i,end:s}}function Se(e,i){const s=e.split("-").map(Number);if(s.length!==3||s.some(n=>Number.isNaN(n)))return;const[o,l,a]=s;return new Date(o,l-1,a,i?23:0,i?59:0,i?59:0,i?999:0).toISOString()}function lo(e){const i={limit:50};if(e.action!=="all"&&(i.action=e.action),e.datePreset==="custom"){const s=e.from?Se(e.from,!1):void 0,o=e.to?Se(e.to,!0):void 0;s&&(i.from=s),o&&(i.to=o)}else if(e.datePreset!=="all"){const s=new Date;if(e.datePreset==="today"){const{start:o,end:l}=F(s);i.from=o.toISOString(),i.to=l.toISOString()}else if(e.datePreset==="yesterday"){const o=new Date(s);o.setDate(o.getDate()-1);const{start:l,end:a}=F(o);i.from=l.toISOString(),i.to=a.toISOString()}else{const o=e.datePreset==="7d"?6:29,l=new Date(s);l.setDate(l.getDate()-o);const{start:a}=F(l),{end:n}=F(s);i.from=a.toISOString(),i.to=n.toISOString()}}return i}function $e(){return{action:"all",datePreset:"all"}}function co(){const{t:e}=I(),{trackEvent:i}=q(),s=Ye(e),[o,l]=_.useState(null),a=o?s.requests.find(d=>d.requestId===o)??null:null,n=_.useCallback((d,g)=>{l(d)},[]),u=_.useCallback(()=>{l(null)},[]);return t.jsxs("div",{className:c.historyTabWrap,children:[t.jsx("div",{className:r.sampleBanner,children:t.jsxs("div",{className:r.sampleBannerRow,children:[t.jsxs("div",{className:r.sampleBannerMain,children:[t.jsx("div",{className:r.sampleBadge,children:e("uiStudio.history.sample.bannerBadge","Preview of the Pro change history")}),t.jsx("div",{className:r.sampleTitle,children:e("uiStudio.history.sample.bannerTitle","You are previewing the UI change history that unlocks after upgrading to Pro.")}),t.jsx("div",{className:r.sampleMessage,children:e("uiStudio.history.sample.bannerMessage","This preview uses sample data. Real change history, before/after comparison, and batch delete unlock with Pro.")})]}),t.jsx("div",{className:r.sampleActions,children:t.jsx("a",{className:r.primaryAction,href:be.uiStudioHistory,target:"_blank",rel:"noreferrer",title:e("uiStudio.history.sample.tooltip","Full history is available with Pro"),onClick:()=>i("dashboard_click_event",{click_target:"upgrade_cta",placement:"ui_studio_history_banner",page:"ui-studio",tab:"ui_studio_history"}),children:e("tier.upgrade","View Pro")})})]})}),t.jsxs("div",{className:c.historyWorkspace,"data-compare-open":o?"true":"false",children:[t.jsxs("div",{className:c.historyMainColumn,"data-testid":"history-main-column",children:[t.jsx("div",{className:c.listHeader,children:t.jsx("h2",{className:c.listHeaderTitle,children:t.jsx(D,{label:e("uiStudio.history.title","변경 이력"),tooltip:e("uiStudio.history.title.tooltip","A timeline of every UI change made by AI.")})})}),t.jsx("div",{className:c.requestList,children:s.requests.map(d=>t.jsx(Ae,{req:d,placeId:0,onOpenCompare:g=>n(d.requestId,g),imageUrlOverride:ce,sampleMutations:s.mutationsByRequest[d.requestId]},d.requestId))})]}),o&&a&&t.jsx(Le,{requestId:o,placeId:0,onClose:u,imageUrlOverride:ce,sampleDetail:{...a,mutations:s.mutationsByRequest[a.requestId]??[]}})]})]})}function uo({filter:e,onChange:i}){const{t:s}=I(),o=[{value:"all",label:s("uiStudio.history.filter.actionAll","All"),tooltip:s("uiStudio.history.filter.actionAll.tooltip","Show every kind of action.")},{value:"create_tree",label:s("uiStudio.history.filter.actionCreate","Create"),tooltip:s("uiStudio.history.filter.actionCreate.tooltip","Show only actions that created a new UI.")},{value:"update",label:s("uiStudio.history.filter.actionUpdate","Update"),tooltip:s("uiStudio.history.filter.actionUpdate.tooltip","Show only actions that updated an existing UI.")},{value:"delete",label:s("uiStudio.history.filter.actionDelete","Delete"),tooltip:s("uiStudio.history.filter.actionDelete.tooltip","Show only actions that deleted a UI.")}],l=[{value:"all",label:s("uiStudio.history.filter.dateAll","All"),tooltip:s("uiStudio.history.filter.dateAll.tooltip","Show the full history.")},{value:"today",label:s("uiStudio.history.filter.today","Today"),tooltip:s("uiStudio.history.filter.today.tooltip","Show only changes from today.")},{value:"yesterday",label:s("uiStudio.history.filter.yesterday","Yesterday"),tooltip:s("uiStudio.history.filter.yesterday.tooltip","Show only changes from yesterday.")},{value:"7d",label:s("uiStudio.history.filter.last7Days","Last 7 days"),tooltip:s("uiStudio.history.filter.last7Days.tooltip","Show changes from the last 7 days.")},{value:"30d",label:s("uiStudio.history.filter.last30Days","Last 30 days"),tooltip:s("uiStudio.history.filter.last30Days.tooltip","Show changes from the last 30 days.")},{value:"custom",label:s("uiStudio.history.filter.customRange","Custom range"),tooltip:s("uiStudio.history.filter.customRange.tooltip","Pick a custom start and end date.")}];return t.jsxs("div",{className:c.filterBar,children:[t.jsxs("div",{className:c.filterGroup,children:[t.jsx("span",{className:c.filterLabel,children:t.jsx(D,{label:s("uiStudio.history.filter.actions","작업 유형"),tooltip:s("uiStudio.history.filter.actions.tooltip","Filter records by the kind of change AI made.")})}),t.jsx("div",{className:c.segmentGroup,children:o.map(a=>t.jsx(y,{text:a.tooltip,children:t.jsx("button",{className:`${c.segmentBtn} ${e.action===a.value?c.segmentBtnActive:""}`,onClick:()=>i({...e,action:a.value}),"aria-pressed":e.action===a.value,type:"button",children:a.label})},a.value))})]}),t.jsxs("div",{className:c.filterGroup,children:[t.jsx("span",{className:c.filterLabel,children:t.jsx(D,{label:s("uiStudio.history.filter.period","Period"),tooltip:s("uiStudio.history.filter.period.tooltip","Filter records by time range.")})}),t.jsx("div",{className:c.segmentGroup,children:l.map(a=>t.jsx(y,{text:a.tooltip,children:t.jsx("button",{className:`${c.segmentBtn} ${e.datePreset===a.value?c.segmentBtnActive:""}`,onClick:()=>i({...e,datePreset:a.value,from:a.value==="custom"?e.from:void 0,to:a.value==="custom"?e.to:void 0}),"aria-pressed":e.datePreset===a.value,type:"button",children:a.label})},a.value))})]}),e.datePreset==="custom"&&t.jsxs("div",{className:c.filterGroup,children:[t.jsx("label",{className:c.filterLabel,htmlFor:"ui-history-from-date",children:t.jsx(D,{label:s("uiStudio.history.filter.from","시작일"),tooltip:s("uiStudio.history.filter.from.tooltip","Start date for the query.")})}),t.jsx("input",{id:"ui-history-from-date",type:"date",className:c.filterInput,value:e.from??"",onChange:a=>i({...e,from:a.target.value||void 0})}),t.jsx("label",{className:c.filterLabel,htmlFor:"ui-history-to-date",children:t.jsx(D,{label:s("uiStudio.history.filter.to","종료일"),tooltip:s("uiStudio.history.filter.to.tooltip","End date for the query.")})}),t.jsx("input",{id:"ui-history-to-date",type:"date",className:c.filterInput,value:e.to??"",onChange:a=>i({...e,to:a.target.value||void 0})})]}),t.jsx(y,{text:s("uiStudio.history.filter.reset.tooltip","Reset all filters to defaults."),children:t.jsx("button",{className:c.filterResetBtn,onClick:()=>i($e()),type:"button",children:s("uiStudio.history.filter.reset","Reset")})})]})}function ho(){var M;const{t:e}=I(),{trackEvent:i}=q(),s=Ie(1),o=((M=s.data)==null?void 0:M.placeId)??null,[l,a]=_.useState($e),{data:n,loading:u,error:d,refresh:g}=Sa(o,lo(l)),[m,p]=_.useState(null),[x,v]=_.useState(!1),[b,k]=_.useState(!1),[G,j]=_.useState(null),h=async()=>{if(j(null),o===null){j(e("uiStudio.history.noPlaceAction","Current place is not available yet."));return}try{await Qe(o,{all:!0,alsoSnapshots:b}),await g(),v(!1)}catch(C){throw j(C.message),C}},T=(n==null?void 0:n.requests)??[],N=o===null&&s.loading,S=ie(s.error)||ie(d),P=_.useCallback((C,w)=>{i("dashboard_click_event",{click_target:"ui_studio_compare_before_after",page:"ui-studio",tab:"ui_studio_history"}),p(C)},[i]),A=_.useCallback(()=>{p(null)},[]);return t.jsxs("div",{className:c.historyTabWrap,children:[S?t.jsx(Re,{}):t.jsxs("div",{className:c.historyWorkspace,"data-compare-open":m?"true":"false",children:[t.jsxs("div",{className:c.historyMainColumn,"data-testid":"history-main-column",children:[t.jsx(uo,{filter:l,onChange:a}),t.jsxs("div",{className:c.listHeader,children:[t.jsx("h2",{className:c.listHeaderTitle,children:t.jsx(D,{label:e("uiStudio.history.title","변경 이력"),tooltip:e("uiStudio.history.title.tooltip","A timeline of every UI change made by AI.")})}),T.length>0&&t.jsx(y,{text:e("uiStudio.history.clear.tooltip","Delete every change record for this project. The actual UI in Roblox Studio is not affected."),children:t.jsx("button",{className:c.clearBtn,onClick:()=>{i("dashboard_click_event",{click_target:"ui_studio_clear_history",page:"ui-studio",tab:"ui_studio_history"}),v(!0)},type:"button",children:e("uiStudio.history.clear","Clear")})})]}),N&&t.jsx("div",{className:c.historyLoading,children:e("uiStudio.history.loadingPlace","Loading current place...")}),!N&&u&&t.jsx("div",{className:c.historyLoading,children:e("uiStudio.history.loading","로딩 중...")}),!N&&!u&&d&&t.jsxs("div",{className:c.historyError,children:[e("uiStudio.history.error","오류"),": ",d]}),!N&&!u&&!d&&o===null&&t.jsx("div",{className:c.emptyHistory,children:e("uiStudio.history.noPlace","No current place data is available yet. Connect WEPPY Plugin and sync a place to view UI change history.")}),!N&&!u&&!d&&o!==null&&T.length===0&&t.jsx("div",{className:c.emptyHistory,children:e("uiStudio.history.empty","아직 변경 이력이 없습니다. AI 에이전트가 manage_ui 로 UI 를 수정하면 자동으로 기록됩니다.")}),!N&&!u&&o!==null&&T.length>0&&t.jsx("div",{className:c.requestList,children:T.map(C=>t.jsx(Ae,{req:C,placeId:o,onOpenCompare:w=>P(C.requestId,w)},C.requestId))}),G&&t.jsx("div",{className:c.deleteErrBanner,children:G})]}),m&&o!==null&&t.jsx(Le,{requestId:m,placeId:o,onClose:A})]}),x&&t.jsx(re,{title:e("uiStudio.history.confirm.clearRequestsTitle","변경 이력 삭제"),message:e("uiStudio.history.confirm.clearRequestsMessage","현재 place의 변경 이력을 삭제합니다. Studio 인스턴스에는 영향을 주지 않습니다."),danger:!0,cascadeOption:{label:e("uiStudio.history.confirm.cascadeOption","연결된 화면 캡처도 함께 삭제"),checked:b,onChange:k},confirmLabel:e("common.delete","삭제"),onConfirm:h,onClose:()=>v(!1)})]})}function po({tier:e}){return e==="basic"?t.jsx(co,{}):t.jsx(ho,{})}const _o=["analysis","history"];function Co(){const{t:e}=I(),{trackEvent:i}=q(),{tier:s,loading:o}=Ue(),[l,a]=Oe(),n=l.get("tab"),u=n&&_o.includes(n)?n:"analysis",d=m=>{i("dashboard_click_event",{click_target:m==="analysis"?"ui_studio_tab_analysis":"ui_studio_tab_history",page:"ui-studio",tab:m==="analysis"?"ui_studio_analysis":"ui_studio_history"}),a(p=>{const x=new URLSearchParams(p);return x.set("tab",m),x})},g=[{key:"analysis",label:t.jsx(y,{text:e("uiStudio.tabs.analysis.tooltip","Browse AI-captured UI screens and quickly find which UIs need improvement."),children:e("uiStudio.tabs.analysis","Analysis")})},{key:"history",label:t.jsx(y,{text:e("uiStudio.tabs.history.tooltip","Every UI change AI made, in order. Compare before and after screens."),children:e("uiStudio.tabs.history","History")})}];return t.jsxs("div",{className:r.page,children:[t.jsx(ze,{title:e("page.uiStudio.title","UI Studio"),description:e("page.uiStudio.description","Review UI captures, improvement suggestions, and before/after change history."),helpTopicId:"uiStudio",helpState:{tier:s}}),!o&&s==="pro"&&t.jsx(Ze,{surface:"uiStudio"}),t.jsx(Xe,{items:g,value:u,onChange:d}),o?t.jsx("div",{className:r.emptyState,children:e("uiStudio.loading","Loading...")}):u==="analysis"?t.jsx(ma,{tier:s}):t.jsx(po,{tier:s})]})}export{Co as Component};
|
|
11
|
+
*/const it=[["circle",{cx:"12",cy:"12",r:"1",key:"41hilf"}],["circle",{cx:"19",cy:"12",r:"1",key:"1wjl8i"}],["circle",{cx:"5",cy:"12",r:"1",key:"1pcz8c"}]],st=Se("ellipsis",it);async function we(e){const i=await fetch(`${V}${e}`);if(!i.ok){let s=null;try{s=await i.json()}catch{}throw new Ee(i.status,(s==null?void 0:s.message)??i.statusText,(s==null?void 0:s.error)??null,s)}return await i.json()}function H(e){return typeof e=="number"&&Number.isFinite(e)?e:0}const rt=["structure","visual","interaction","primary_view_context","responsive_viewport"];function ue(e){const i=e.coverage_dimensions,s={structure:{status:e.deterministic_status==="failed"?"failed":"completed",reasons:[]},visual:{status:e.visual_status??"not_requested",reasons:[]},interaction:{status:"skipped",reasons:[]},primary_view_context:{status:"skipped",reasons:[]},responsive_viewport:{status:"skipped",reasons:[]}};if(!i)return s;for(const n of rt){const l=i[n];l&&["completed","not_requested","skipped","failed"].includes(l.status)&&(s[n]={status:l.status,reasons:Array.isArray(l.reasons)?l.reasons.filter(r=>typeof r=="string"):[]})}return s}function at(e,i){return e.readiness==="ready"||e.readiness==="review_required"||e.readiness==="insufficient_evidence"?e.readiness:"insufficient_evidence"}function nt(e){return e==="recompose"||e==="refine"||e==="approved"?e:void 0}function ot(e){return e==="recommended"||e==="required"?e:void 0}function lt(e){if(Array.isArray(e))return e.filter(i=>i==="primary_visual"||i==="functional_safe"||i==="responsive_ready")}function ct(e){if(e.design_check_summary){const n={priority_high:H(e.design_check_summary.priority_high),priority_medium:H(e.design_check_summary.priority_medium),priority_low:H(e.design_check_summary.priority_low),deterministic_status:e.design_check_summary.deterministic_status==="failed"?"failed":"completed",visual_status:e.design_check_summary.visual_status??"not_requested",coverage:e.design_check_summary.coverage==="structural_and_visual"?"structural_and_visual":"structural_only",skipped_reasons:Array.isArray(e.design_check_summary.skipped_reasons)?e.design_check_summary.skipped_reasons.filter(r=>typeof r=="string"):[],primary_visual_status:e.design_check_summary.primary_visual_status,primary_visual_verdict:nt(e.design_check_summary.primary_visual_verdict),critic_summary:typeof e.design_check_summary.critic_summary=="string"?e.design_check_summary.critic_summary:void 0,functional_safe:typeof e.design_check_summary.functional_safe=="boolean"?e.design_check_summary.functional_safe:void 0,responsive_requirement:ot(e.design_check_summary.responsive_requirement),responsive_ready:typeof e.design_check_summary.responsive_ready=="boolean"?e.design_check_summary.responsive_ready:void 0,required_dimensions:lt(e.design_check_summary.required_dimensions)},l=ue({...n,coverage_dimensions:e.design_check_summary.coverage_dimensions});return{...n,coverage_dimensions:l,viewport_profiles_tested:Array.isArray(e.design_check_summary.viewport_profiles_tested)?e.design_check_summary.viewport_profiles_tested.filter(r=>typeof r=="string"):[],readiness:at(e.design_check_summary)}}if(!e.lint_summary)return null;const i={priority_high:H(e.lint_summary.errors),priority_medium:H(e.lint_summary.warnings),priority_low:0,deterministic_status:"completed",visual_status:"not_requested",coverage:"structural_only",skipped_reasons:[]},s=ue(i);return{...i,coverage_dimensions:s,viewport_profiles_tested:[],readiness:"insufficient_evidence"}}function ut(e){return{rule:e.rule,path:e.path,displayPriority:e.displayPriority??(e.severity==="error"?"priority_high":"priority_medium"),actual:e.actual,expected:e.expected,hint:e.hint}}function be(e){return{snapshot_id:e.snapshot_id,captured_at:e.captured_at,brief_id:e.brief_id,thresholds_source:e.thresholds_source,scope:e.scope,target:e.target,design_check_summary:ct(e),primary_view_context:e.primary_view_context,image:e.image}}function dt(e){const i=e.check_results??e.lint_results??[];return{...be(e),check_results:i.map(ut),image_url:e.image_url,meta:e.meta,layout_metadata:e.layout_metadata,target_profiles:e.target_profiles,profile_simulations:e.profile_simulations,design_check_context:e.design_check_context}}async function de(e,i){const s=new URLSearchParams;i!==void 0&&s.set("limit",String(i));const n=s.toString()?`?${s.toString()}`:"",l=await we(`/api/ui-studio/snapshots${n}`);return{...l,snapshots:l.snapshots.map(be)}}async function ht(e,i){const s=i!==void 0?`?placeId=${i}`:"",n=await we(`/api/ui-studio/snapshots/${encodeURIComponent(e)}${s}`);return dt(n)}function ke(e,i){const s=i!==void 0?`?placeId=${i}`:"";return`${V}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image${s}`}const pt=1e4;function Ie(e=50){const[i,s]=_.useState(null),[n,l]=_.useState(!0),[r,o]=_.useState(null),u=_.useCallback(async()=>{try{const d=await de(void 0,e);s(d),o(null)}catch(d){o(d instanceof Error?d.message:String(d))}finally{l(!1)}},[e]);return _.useEffect(()=>{let d=!1;const g=async()=>{try{const p=await de(void 0,e);d||(s(p),o(null))}catch(p){d||o(p instanceof Error?p.message:String(p))}finally{d||l(!1)}};g();const m=setInterval(()=>{g()},pt);return()=>{d=!0,clearInterval(m)}},[e]),{data:i,loading:n,error:r,refresh:u}}const _t="_page_vrx8j_2",mt="_grid_vrx8j_9",gt="_card_vrx8j_16",yt="_cardBodyButton_vrx8j_31",xt="_thumb_vrx8j_48",ft="_badges_vrx8j_57",vt="_priorityHighBadge_vrx8j_65",St="_priorityMediumBadge_vrx8j_66",jt="_priorityLowBadge_vrx8j_67",Ct="_cardMeta_vrx8j_97",wt="_target_vrx8j_103",bt="_time_vrx8j_110",kt="_drawer_vrx8j_115",It="_drawerToolbar_vrx8j_132",Nt="_drawerTitleBlock_vrx8j_143",Pt="_drawerEyebrow_vrx8j_150",Tt="_drawerTarget_vrx8j_159",Bt="_drawerToolbarActions_vrx8j_169",Rt="_closeBtn_vrx8j_177",Dt="_detailBody_vrx8j_198",Gt="_screenshotPreviewFrame_vrx8j_205",Mt="_fullImg_vrx8j_218",At="_metaDl_vrx8j_225",Lt="_errorMsg_vrx8j_237",$t="_suggestionsWrap_vrx8j_242",Et="_prioritySection_vrx8j_249",qt="_sectionHighHeader_vrx8j_253",Ht="_sectionLowHeader_vrx8j_259",Ut="_sectionMediumHeader_vrx8j_265",Ot="_groupCard_vrx8j_271",Ft="_groupHeader_vrx8j_278",zt="_groupLabel_vrx8j_294",Vt="_groupCount_vrx8j_299",Wt="_groupChevron_vrx8j_306",Kt="_groupBody_vrx8j_310",Yt="_groupDescription_vrx8j_313",Qt="_groupFix_vrx8j_318",Jt="_falsePositive_vrx8j_327",Xt="_itemList_vrx8j_335",Zt="_suggestionItem_vrx8j_343",ei="_suggestionInfo_vrx8j_353",ti="_pathBreadcrumb_vrx8j_359",ii="_currentValue_vrx8j_368",si="_copyFixBtn_vrx8j_372",ri="_emptySuggestions_vrx8j_386",ai="_sampleBanner_vrx8j_394",ni="_sampleBannerRow_vrx8j_407",oi="_sampleBannerMain_vrx8j_415",li="_sampleBadge_vrx8j_423",ci="_sampleTitle_vrx8j_433",ui="_sampleMessage_vrx8j_440",di="_sampleActions_vrx8j_447",hi="_primaryAction_vrx8j_455",pi="_secondaryAction_vrx8j_456",_i="_emptyState_vrx8j_491",mi="_pluginGuideCard_vrx8j_499",gi="_pluginGuideMarker_vrx8j_510",yi="_pluginGuideBody_vrx8j_525",xi="_pluginGuideTitle_vrx8j_529",fi="_pluginGuideMessage_vrx8j_537",vi="_pluginGuideChecklist_vrx8j_544",Si="_pluginGuideWaiting_vrx8j_567",ji="_pluginGuideDot_vrx8j_576",Ci="_analysisWorkspace_vrx8j_584",wi="_analysisMainColumn_vrx8j_589",bi="_analysisSummaryPanel_vrx8j_594",ki="_recentCapturesHeader_vrx8j_607",Ii="_analysisSummaryText_vrx8j_614",Ni="_recentCapturesMeta_vrx8j_615",Pi="_analysisReportGrid_vrx8j_621",Ti="_analysisReportGroup_vrx8j_628",Bi="_analysisReportCard_vrx8j_632",Ri="_analysisReportThumb_vrx8j_654",Di="_analysisReportBody_vrx8j_663",Gi="_analysisReportTopline_vrx8j_670",Mi="_analysisVerdict_vrx8j_677",Ai="_analysisVerdict_needsFix_vrx8j_688",Li="_analysisVerdict_review_vrx8j_689",$i="_analysisVerdict_incomplete_vrx8j_694",Ei="_analysisVerdict_passed_vrx8j_699",qi="_analysisReportCounts_vrx8j_704",Hi="_readinessSummary_vrx8j_709",Ui="_readinessChip_vrx8j_715",Oi="_readinessChipReady_vrx8j_730",Fi="_readinessChipPending_vrx8j_736",zi="_primaryReadinessBlock_vrx8j_742",Vi="_criticSummary_vrx8j_749",Wi="_analysisReportTarget_vrx8j_768",Ki="_analysisReportIssue_vrx8j_777",Yi="_analysisReportCoverage_vrx8j_783",Qi="_coverageChips_vrx8j_789",Ji="_coverageChip_vrx8j_789",Xi="_coverageChip_completed_vrx8j_810",Zi="_coverageChip_failed_vrx8j_815",es="_coverageChip_skipped_vrx8j_820",ts="_coverageChip_not_requested_vrx8j_821",is="_analysisReportMeta_vrx8j_826",ss="_analysisChildList_vrx8j_833",rs="_analysisChildRow_vrx8j_844",as="_analysisChildPath_vrx8j_865",ns="_analysisChildSummary_vrx8j_874",os="_analysisChildDetailHint_vrx8j_875",ls="_drawerAnalysisSummary_vrx8j_884",cs="_drawerAnalysisSummaryItem_vrx8j_895",us="_drawerAnalysisLabel_vrx8j_902",ds="_drawerAnalysisCounts_vrx8j_908",hs="_drawerAnalysisValue_vrx8j_909",ps="_recentCapturesSection_vrx8j_914",_s="_drawerPrimaryActions_vrx8j_926",ms="_drawerActionBtn_vrx8j_933",gs="_drawerMoreMenu_vrx8j_962",ys="_drawerMoreButton_vrx8j_967",xs="_drawerMoreMenuBody_vrx8j_992",fs="_drawerMenuItem_vrx8j_1005",vs="_drawerMenuItemDanger_vrx8j_1028",Ss="_actionErrMsg_vrx8j_1037",js="_actionStatusMsg_vrx8j_1046",Cs="_actionStatus_info_vrx8j_1060",ws="_actionStatus_success_vrx8j_1066",bs="_actionStatus_warning_vrx8j_1072",ks="_actionStatusDetail_vrx8j_1078",Is="_galleryHeader_vrx8j_1084",Ns="_cardChecked_vrx8j_1101",Ps="_cardCheckbox_vrx8j_1108",Ts="_captureSelectionActions_vrx8j_1123",Bs="_selectionToolbar_vrx8j_1132",Rs="_selectionBar_vrx8j_1133",Ds="_selectionToolbarCount_vrx8j_1152",Gs="_selectionToolbarActions_vrx8j_1159",Ms="_selectionBarBtn_vrx8j_1166",As="_selectionBarBtnDanger_vrx8j_1192",a={page:_t,grid:mt,card:gt,cardBodyButton:yt,thumb:xt,badges:ft,priorityHighBadge:vt,priorityMediumBadge:St,priorityLowBadge:jt,cardMeta:Ct,target:wt,time:bt,drawer:kt,drawerToolbar:It,drawerTitleBlock:Nt,drawerEyebrow:Pt,drawerTarget:Tt,drawerToolbarActions:Bt,closeBtn:Rt,detailBody:Dt,screenshotPreviewFrame:Gt,fullImg:Mt,metaDl:At,errorMsg:Lt,suggestionsWrap:$t,prioritySection:Et,sectionHighHeader:qt,sectionLowHeader:Ht,sectionMediumHeader:Ut,groupCard:Ot,groupHeader:Ft,groupLabel:zt,groupCount:Vt,groupChevron:Wt,groupBody:Kt,groupDescription:Yt,groupFix:Qt,falsePositive:Jt,itemList:Xt,suggestionItem:Zt,suggestionInfo:ei,pathBreadcrumb:ti,currentValue:ii,copyFixBtn:si,emptySuggestions:ri,sampleBanner:ai,sampleBannerRow:ni,sampleBannerMain:oi,sampleBadge:li,sampleTitle:ci,sampleMessage:ui,sampleActions:di,primaryAction:hi,secondaryAction:pi,emptyState:_i,pluginGuideCard:mi,pluginGuideMarker:gi,pluginGuideBody:yi,pluginGuideTitle:xi,pluginGuideMessage:fi,pluginGuideChecklist:vi,pluginGuideWaiting:Si,pluginGuideDot:ji,analysisWorkspace:Ci,analysisMainColumn:wi,analysisSummaryPanel:bi,recentCapturesHeader:ki,analysisSummaryText:Ii,recentCapturesMeta:Ni,analysisReportGrid:Pi,analysisReportGroup:Ti,analysisReportCard:Bi,analysisReportThumb:Ri,analysisReportBody:Di,analysisReportTopline:Gi,analysisVerdict:Mi,analysisVerdict_needsFix:Ai,analysisVerdict_review:Li,analysisVerdict_incomplete:$i,analysisVerdict_passed:Ei,analysisReportCounts:qi,readinessSummary:Hi,readinessChip:Ui,readinessChipReady:Oi,readinessChipPending:Fi,primaryReadinessBlock:zi,criticSummary:Vi,analysisReportTarget:Wi,analysisReportIssue:Ki,analysisReportCoverage:Yi,coverageChips:Qi,coverageChip:Ji,coverageChip_completed:Xi,coverageChip_failed:Zi,coverageChip_skipped:es,coverageChip_not_requested:ts,analysisReportMeta:is,analysisChildList:ss,analysisChildRow:rs,analysisChildPath:as,analysisChildSummary:ns,analysisChildDetailHint:os,drawerAnalysisSummary:ls,drawerAnalysisSummaryItem:cs,drawerAnalysisLabel:us,drawerAnalysisCounts:ds,drawerAnalysisValue:hs,recentCapturesSection:ps,drawerPrimaryActions:_s,drawerActionBtn:ms,drawerMoreMenu:gs,drawerMoreButton:ys,drawerMoreMenuBody:xs,drawerMenuItem:fs,drawerMenuItemDanger:vs,actionErrMsg:Ss,actionStatusMsg:js,actionStatus_info:Cs,actionStatus_success:ws,actionStatus_warning:bs,actionStatusDetail:ks,galleryHeader:Is,cardChecked:Ns,cardCheckbox:Ps,captureSelectionActions:Ts,selectionToolbar:Bs,selectionBar:Rs,selectionToolbarCount:Ds,selectionToolbarActions:Gs,selectionBarBtn:Ms,selectionBarBtnDanger:As};function Ls({snapshot:e,placeId:i,onClick:s,imageUrlOverride:n,selectable:l,selected:r,onToggleSelect:o}){var j,k,G;const{t:u}=I(),d=((j=e.design_check_summary)==null?void 0:j.priority_high)??0,g=((k=e.design_check_summary)==null?void 0:k.priority_medium)??0,m=((G=e.design_check_summary)==null?void 0:G.priority_low)??0,p=new Date(e.captured_at*1e3).toLocaleString(),x=n??ke(e.snapshot_id,i),S=()=>{o==null||o(e.snapshot_id)};return t.jsxs("div",{className:`${a.card} ${r?a.cardChecked:""}`,children:[l&&t.jsx(y,{text:u("uiStudio.gallery.cardCheckbox.tooltip","Select this capture. Pick multiple to delete them together."),children:t.jsx(Fe,{className:a.cardCheckbox,"aria-label":u("uiStudio.gallery.cardCheckbox","Select screenshot"),checked:!!r,onChange:S})}),t.jsxs("button",{className:a.cardBodyButton,onClick:b=>s(b.currentTarget),type:"button",children:[t.jsx("img",{className:a.thumb,src:x,alt:e.snapshot_id,loading:"lazy"}),t.jsxs("div",{className:a.badges,children:[d>0&&t.jsx(y,{text:u("uiStudio.gallery.priorityHighBadge.tooltip","Number of suggestions to review first. Click for details."),children:t.jsx("span",{className:a.priorityHighBadge,children:d})}),g>0&&t.jsx(y,{text:u("uiStudio.gallery.priorityMediumBadge.tooltip","Number of recommended suggestions."),children:t.jsx("span",{className:a.priorityMediumBadge,children:g})}),m>0&&t.jsx(y,{text:u("uiStudio.gallery.priorityLowBadge.tooltip","Number of optional improvements."),children:t.jsx("span",{className:a.priorityLowBadge,children:m})})]}),t.jsxs("div",{className:a.cardMeta,children:[t.jsx("div",{className:a.target,children:e.target??e.scope}),t.jsx("div",{className:a.time,children:p})]})]})]})}const $s={touch_target:"touchTarget",contrast:"contrast",text_scaled:"textScaled",safezone:"safezone",min_text_size:"minTextSize"};function Es(e){return e.rule==="contrast"&&/\.(Icon|Avatar|EmptyIcon|GoldIcon|[A-Za-z]*Icon)$/.test(e.path)}const qs={touch_target:{checkLabel:"터치 타겟 크기",description:"모바일에서 손가락으로 누르기 편한 최소 크기를 만족하는지 확인합니다.",howToFix:"버튼 Size 를 44x44 px 이상으로 키우거나 UIPadding 으로 터치 영역을 확장하세요.",buildUpdateCommand:e=>JSON.stringify({action:"update",targetPath:e.path,changes:{properties:{Size:{xScale:0,xOffset:44,yScale:0,yOffset:44}}}},null,2)},contrast:{checkLabel:"텍스트 대비",description:"텍스트와 배경의 명암 비율이 WCAG 접근성 기준을 만족하는지 확인합니다.",howToFix:"TextColor3 를 더 밝은 색(예: #FFFFFF) 으로 바꾸거나, 배경(BackgroundColor3)을 어둡게 조정하세요.",falsePositiveNote:"이모지 아이콘의 경우 색이 고정되어 대비 규칙이 오탐하는 경우가 많습니다. 실제 가독성에 문제 없으면 무시해도 됩니다.",buildUpdateCommand:e=>JSON.stringify({action:"update",targetPath:e.path,changes:{properties:{TextColor3:{r:255,g:255,b:255}}}},null,2)},text_scaled:{checkLabel:"TextScaled 사용",description:"TextScaled 가 켜져 있으나 UITextSizeConstraint 가 없으면 언어 확장 시 레이아웃이 깨질 수 있습니다.",howToFix:"해당 TextLabel 에 UITextSizeConstraint 자식을 추가하고 MaxTextSize 를 지정하세요.",buildUpdateCommand:e=>JSON.stringify({action:"update",targetPath:e.path,changes:{addChildren:[{className:"UITextSizeConstraint",name:"SizeConstraint",properties:{MaxTextSize:24,MinTextSize:10}}]}},null,2)},safezone:{checkLabel:"세이프존 배치",description:"버튼이 플랫폼별 세이프존(노치·홈 인디케이터·TV safe margin) 안에 있는지 확인합니다.",howToFix:"Position 을 세이프존 안쪽으로 이동하거나, 부모 Frame 을 축소하세요.",buildUpdateCommand:()=>null},min_text_size:{checkLabel:"최소 폰트 크기",description:"텍스트가 너무 작아 가독성이 떨어지는지 확인합니다. 브리프 기준 하한을 사용합니다.",howToFix:"TextSize 를 14 이상(본문 기준)으로 올리세요.",buildUpdateCommand:e=>{const i=typeof e.expected=="string"?parseInt(e.expected.replace(/[^\d]/g,""),10):14;return JSON.stringify({action:"update",targetPath:e.path,changes:{properties:{TextSize:Number.isFinite(i)?i:14}}},null,2)}}};function Hs(e,i,s){const n=$s[e];return n?{...i,checkLabel:s(`uiStudio.fix.${n}.label`,i.checkLabel),description:s(`uiStudio.fix.${n}.description`,i.description),howToFix:s(`uiStudio.fix.${n}.howToFix`,i.howToFix),falsePositiveNote:i.falsePositiveNote?s(`uiStudio.fix.${n}.falsePositive`,i.falsePositiveNote):void 0}:i}function Us(e,i){const s=qs[e]??null;return s?i?Hs(e,s,i):s:null}function Os(e){return Es(e)}function Fs(e,i){const s=new Map;for(const l of e){const r=`${l.displayPriority}::${l.rule}`,o=s.get(r)??[];o.push(l),s.set(r,o)}const n=[];for(const[l,r]of s){const[o,u]=l.split("::"),d=r.filter(Os).length;n.push({rule:u??"unknown",priority:o,items:r,fixTemplate:Us(u??"",i),falsePositiveRatio:r.length>0?d/r.length:0})}return n.sort((l,r)=>{const o={priority_high:0,priority_medium:1,priority_low:2};return l.priority!==r.priority?o[l.priority]-o[r.priority]:r.items.length-l.items.length}),{high:n.filter(l=>l.priority==="priority_high"),medium:n.filter(l=>l.priority==="priority_medium"),low:n.filter(l=>l.priority==="priority_low")}}function Ne(e){const i=e.split("."),s=i[i.length-1]??e,n=i[i.length-2],l=n?`${n} > ${s}`:s;return{full:e,breadcrumb:l,leaf:s}}function Pe(e){return typeof e=="object"&&e!==null}function he(e){return Pe(e.data)?e.data:{}}function ee(e,i){const s=e[i];return Pe(s)?s:{}}function W(e,i){const s=e[i];return typeof s=="string"?s:null}function K(e,i){const s=e[i];return typeof s=="number"&&Number.isFinite(s)?s:0}function zs(e){const i=ee(e,"design_check_summary");return{priority_high:K(i,"priority_high"),priority_medium:K(i,"priority_medium"),priority_low:K(i,"priority_low")}}function pe(e){if(!(e.success??e.ok??!e.error))throw new Error(e.error??"UI Studio action failed")}function _e(e,i){return Te(e,zs(i))}function U(e,i,s,n,l){const r=e(i,s);return l?`${r}: ${l} · ${n}`:`${r}: ${n}`}function Vs(e){const i=e.design_check_summary;return((i==null?void 0:i.priority_high)??0)>0?"needsFix":(i==null?void 0:i.readiness)==="insufficient_evidence"?"incomplete":((i==null?void 0:i.priority_medium)??0)>0||((i==null?void 0:i.priority_low)??0)>0?"review":"passed"}function Ws(e,i){return i==="needsFix"||i==="review"?e("uiStudio.analysis.verdict.hasSuggestions","개선 제안 있음"):i==="incomplete"?e("uiStudio.analysis.verdict.incomplete","검토 증거 부족"):e("uiStudio.analysis.verdict.passed","현재 개선 제안 없음")}function Y(e,i){return`${i}${e("uiStudio.storage.countSuffix","개")}`}function Te(e,i){return`${e("uiStudio.priorityHigh","우선 검토")} ${Y(e,(i==null?void 0:i.priority_high)??0)} · ${e("uiStudio.priorityMedium","검토 권장")} ${Y(e,(i==null?void 0:i.priority_medium)??0)} · ${e("uiStudio.priorityLow","선택 개선")} ${Y(e,(i==null?void 0:i.priority_low)??0)}`}function Ks(e,i){return Te(e,i.design_check_summary)}function Ys(e,i){return i==="recompose"?e("uiStudio.primaryVisual.recompose","Recompose"):i==="refine"?e("uiStudio.primaryVisual.refine","Refine"):i==="approved"?e("uiStudio.primaryVisual.approved","Approved"):e("uiStudio.primaryVisual.unknown","Unknown")}function Qs(e,i){return i==="ready"?e("uiStudio.readiness.ready","Ready"):i==="review_required"?e("uiStudio.readiness.reviewRequired","Review required"):i==="insufficient_evidence"?e("uiStudio.readiness.insufficient","Evidence incomplete"):e("uiStudio.readiness.unknown","Readiness unknown")}function Js({snapshotId:e,placeId:i,onClose:s,sampleDetail:n,tier:l,onActionDone:r}){const[o,u]=_.useState(n??null),[d,g]=_.useState(null),[m,p]=_.useState(null),[x,S]=_.useState(null),[j,k]=_.useState(null),[G,b]=_.useState(null),{t:h}=I(),{trackEvent:T}=q(),N=l==="pro";_.useEffect(()=>{if(n){u(n),g(null);return}let w=!1;return ht(e,i).then(B=>{w||u(B)}).catch(B=>{w||g(B instanceof Error?B.message:String(B))}),()=>{w=!0}},[e,i,n]);const v=async()=>{if(o!=null&&o.target){T("dashboard_click_event",{click_target:"ui_studio_capture_current",page:"ui-studio",tab:"ui_studio_analysis"}),p(null),k("preview"),S({tone:"info",message:h("uiStudio.actions.previewRunning","캡처 중..."),detail:h("uiStudio.actions.previewRunningDetail","완료되면 새 화면 캡처 파일 ID를 표시합니다.")});try{const w=await oe("preview",{targetPath:o.target,placeId:i});pe(w);const B=he(w),E=W(B,"snapshot_id"),f=ee(B,"screenshot"),L=ee(B,"meta"),R=W(f,"saved_path"),ne=W(L,"persist_warning"),O=_e(h,B);S(ne?{tone:"warning",message:U(h,"uiStudio.actions.previewNeedsSaveCheck","캡처 완료, 저장 확인 필요",O,E),detail:ne}:E&&R?{tone:"success",message:U(h,"uiStudio.actions.previewSaved","새 화면 캡처 저장 완료",O,E),detail:h("uiStudio.actions.previewSavedDetail","기존 화면 캡처는 변경하지 않고 새 파일로 저장했습니다.")}:E?{tone:"warning",message:U(h,"uiStudio.actions.previewComplete","캡처 완료",O,E),detail:h("uiStudio.actions.previewSavedPathMissing","새 화면 캡처 ID는 받았지만 저장 경로를 확인하지 못했습니다.")}:{tone:"warning",message:U(h,"uiStudio.actions.previewComplete","캡처 완료",O),detail:h("uiStudio.actions.previewSnapshotIdMissing","새 화면 캡처 ID를 확인하지 못했습니다. 목록을 새로고침해 저장 여부를 확인해 주세요.")}),await(r==null?void 0:r())}catch(w){p(w instanceof Error?w.message:String(w))}finally{k(null)}}},P=async()=>{if(o!=null&&o.target){T("dashboard_click_event",{click_target:"ui_studio_check_again",page:"ui-studio",tab:"ui_studio_analysis"}),p(null),k("check"),S({tone:"info",message:h("uiStudio.actions.designCheckRunning","개선 제안 확인 중..."),detail:h("uiStudio.actions.designCheckRunningDetail","완료되면 우선 검토/검토 권장/선택 개선 항목 수를 표시합니다.")});try{const w=await oe("check",{targetPath:o.target,placeId:i});pe(w);const B=he(w),E=_e(h,B);S({tone:"success",message:U(h,"uiStudio.actions.designCheckComplete","개선 제안 확인 완료",E),detail:h("uiStudio.actions.designCheckNoSnapshotSaved","이 작업은 화면 캡처 파일을 새로 저장하지 않습니다.")}),await(r==null?void 0:r())}catch(w){p(w instanceof Error?w.message:String(w))}finally{k(null)}}},A=async()=>{p(null),S(null);try{await Ve(i,e),await(r==null?void 0:r()),b(null),s()}catch(w){throw p(w instanceof Error?w.message:String(w)),w}},M=N?void 0:h("uiStudio.actions.proRequired","Pro에서 사용 가능"),C=o!=null&&o.target?Ne(o.target):null;return t.jsxs("div",{className:a.drawer,children:[t.jsxs("div",{className:a.drawerToolbar,"data-testid":"snapshot-detail-toolbar",children:[t.jsxs("div",{className:a.drawerTitleBlock,children:[t.jsx("span",{className:a.drawerEyebrow,children:h("uiStudio.analysis.detailDialog","Analysis detail")}),t.jsx("span",{className:a.drawerTarget,title:(C==null?void 0:C.full)??e,children:(C==null?void 0:C.breadcrumb)??e})]}),t.jsxs("div",{className:a.drawerToolbarActions,children:[o&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:a.drawerPrimaryActions,children:[t.jsx(y,{text:M??h("uiStudio.actions.captureCurrentState.tooltip","Save the UI currently shown in Studio as a new capture. Existing captures are kept."),children:t.jsxs("button",{className:a.drawerActionBtn,onClick:()=>void v(),disabled:!N||!o.target||j!==null,type:"button",children:[t.jsx(tt,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:h("uiStudio.actions.captureCurrentState","현재 상태 캡처")})]})}),t.jsx(y,{text:M??h("uiStudio.actions.checkSuggestionsAgain.tooltip","Recompute suggestions for this capture without taking a new screenshot."),children:t.jsxs("button",{className:a.drawerActionBtn,onClick:()=>void P(),disabled:!N||!o.target||j!==null,type:"button",children:[t.jsx(qe,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:h("uiStudio.actions.checkSuggestionsAgain","개선 제안 다시 확인")})]})})]}),t.jsxs("details",{className:a.drawerMoreMenu,children:[t.jsx("summary",{className:a.drawerMoreButton,title:h("uiStudio.actions.more.tooltip","Open additional actions."),"aria-label":h("uiStudio.actions.more","More"),children:t.jsx(st,{size:18,"aria-hidden":"true"})}),t.jsx("div",{className:a.drawerMoreMenuBody,children:t.jsx(y,{text:M??h("uiStudio.actions.deleteSnapshot.tooltip","Delete only this capture file. The actual UI in Roblox Studio is not affected."),children:t.jsx("button",{className:`${a.drawerMenuItem} ${a.drawerMenuItemDanger}`,onClick:()=>{T("dashboard_click_event",{click_target:"ui_studio_delete_snapshot",page:"ui-studio",tab:"ui_studio_analysis"}),b("deleteSnapshot")},disabled:!N,type:"button",children:h("uiStudio.actions.deleteSnapshot","이 화면 캡처 삭제")})})})]})]}),t.jsx(y,{text:h("uiStudio.detailClose.tooltip","Close this detail panel."),children:t.jsx("button",{className:a.closeBtn,onClick:s,type:"button","aria-label":h("uiStudio.detailClose","Close"),children:t.jsx(He,{size:18,"aria-hidden":"true"})})})]})]}),d&&t.jsx("div",{className:a.errorMsg,children:d}),o&&t.jsxs("div",{className:a.detailBody,children:[m&&t.jsx("div",{className:a.actionErrMsg,children:m}),x&&t.jsxs("div",{className:`${a.actionStatusMsg} ${a[`actionStatus_${x.tone}`]??""}`,children:[t.jsx("div",{children:x.message}),x.detail&&t.jsx("div",{className:a.actionStatusDetail,children:x.detail})]}),t.jsx(Xs,{detail:o}),t.jsx("div",{className:a.screenshotPreviewFrame,"data-testid":"analysis-screenshot-preview",children:t.jsx("img",{className:a.fullImg,src:o.image_url,alt:o.snapshot_id})}),t.jsx(tr,{items:o.check_results,summary:o.design_check_summary}),t.jsxs("dl",{className:a.metaDl,children:[t.jsx("dt",{children:t.jsx(D,{label:h("uiStudio.capturedAt","Captured"),tooltip:h("uiStudio.capturedAt.tooltip","When this screen was captured.")})}),t.jsx("dd",{children:new Date(o.captured_at*1e3).toLocaleString()}),t.jsx("dt",{children:t.jsx(D,{label:h("uiStudio.scope","Scope"),tooltip:h("uiStudio.scope.tooltip","Capture scope (full screen or a specific UI).")})}),t.jsx("dd",{children:o.scope}),o.target&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{children:t.jsx(D,{label:h("uiStudio.target","Target"),tooltip:h("uiStudio.target.tooltip","Exact path of the captured UI instance.")})}),t.jsx("dd",{children:o.target})]}),o.brief_id&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{children:t.jsx(D,{label:h("uiStudio.briefId","Brief"),tooltip:h("uiStudio.briefId.tooltip","Identifier of the design brief that produced this UI.")})}),t.jsx("dd",{children:o.brief_id})]})]})]}),G==="deleteSnapshot"&&t.jsx(ae,{title:h("uiStudio.confirm.deleteSnapshotTitle","화면 캡처 삭제"),message:h("uiStudio.confirm.deleteSnapshotMessage","이 화면 캡처 파일만 삭제됩니다 (Studio 인스턴스 보존)."),danger:!0,confirmLabel:h("common.delete","삭제"),onConfirm:A,onClose:()=>b(null)})]})}function Xs({detail:e}){const{t:i}=I(),s=Vs(e);return t.jsxs("section",{className:a.drawerAnalysisSummary,children:[t.jsxs("div",{className:a.drawerAnalysisSummaryItem,children:[t.jsx("span",{className:a.drawerAnalysisLabel,children:t.jsx(D,{label:i("uiStudio.analysis.verdictLabel","개선 요약"),tooltip:i("uiStudio.analysis.verdictLabel.tooltip","Overall improvement verdict for this capture.")})}),t.jsx("span",{className:`${a.analysisVerdict} ${a[`analysisVerdict_${s}`]??""}`,children:Ws(i,s)}),t.jsx("span",{className:a.drawerAnalysisCounts,children:Ks(i,e)})]}),t.jsxs("div",{className:a.drawerAnalysisSummaryItem,children:[t.jsx("span",{className:a.drawerAnalysisLabel,children:t.jsx(D,{label:i("uiStudio.analysis.thresholds","검토 기준"),tooltip:i("uiStudio.analysis.thresholds.tooltip","The threshold set used for this review (default or custom).")})}),t.jsx("span",{className:a.drawerAnalysisValue,children:e.thresholds_source})]}),t.jsx(Zs,{summary:e.design_check_summary}),t.jsx(er,{summary:e.design_check_summary})]})}function Zs({summary:e}){const{t:i}=I();if(!e)return null;const s=e.functional_safe===!0?i("uiStudio.functional.safe","Safe"):e.functional_safe===!1?i("uiStudio.functional.risk","Risk found"):i("uiStudio.functional.unknown","Unknown"),n=e.responsive_requirement==="required"?i("uiStudio.responsive.required","Required"):e.responsive_requirement==="recommended"?i("uiStudio.responsive.recommended","Recommended"):i("uiStudio.responsive.unknown","Unknown");return t.jsxs("div",{className:a.primaryReadinessBlock,children:[t.jsxs("div",{className:a.readinessSummary,"aria-label":i("uiStudio.readiness.summary","UI readiness"),children:[t.jsxs("span",{className:a.readinessChip,children:[i("uiStudio.primaryVisual.label","Primary visual")," · ",Ys(i,e.primary_visual_verdict)]}),t.jsxs("span",{className:a.readinessChip,children:[i("uiStudio.functional.label","Functional")," · ",s]}),t.jsxs("span",{className:a.readinessChip,children:[i("uiStudio.responsive.label","Responsive")," · ",n]}),t.jsx("span",{className:`${a.readinessChip} ${e.readiness==="ready"?a.readinessChipReady:a.readinessChipPending}`,children:Qs(i,e.readiness)})]}),e.critic_summary&&t.jsxs("p",{className:a.criticSummary,children:[t.jsx("span",{children:i("uiStudio.criticSummary","Critic summary")}),e.critic_summary]})]})}function er({summary:e}){const{t:i}=I(),s=e==null?void 0:e.coverage_dimensions;if(!s)return null;const n=[["Structure",s.structure],["Visual",s.visual],["Interaction",s.interaction],["Primary view",s.primary_view_context],["Responsive",s.responsive_viewport]];return t.jsx("div",{className:a.coverageChips,"aria-label":i("uiStudio.analysis.coverageDimensions","검토 범위"),children:n.map(([l,r])=>t.jsxs("span",{className:`${a.coverageChip} ${a[`coverageChip_${r.status}`]??""}`,title:r.reasons.join(", "),children:[l," · ",r.status==="completed"?i("uiStudio.analysis.coverageStatus.completed","완료"):r.status==="failed"?i("uiStudio.analysis.coverageStatus.failed","실패"):i("uiStudio.analysis.coverageStatus.skipped","생략")]},l))})}function tr({items:e,summary:i}){const{t:s}=I();if(e.length===0)return t.jsx("p",{className:a.emptySuggestions,children:(i==null?void 0:i.readiness)==="insufficient_evidence"?s("uiStudio.noSuggestionsIncomplete","제안은 없지만 검토되지 않은 범위가 남아 있습니다."):s("uiStudio.noSuggestions","현재 개선 제안 없음")});const{high:n,medium:l,low:r}=Fs(e,s);return t.jsxs("div",{className:a.suggestionsWrap,children:[t.jsx("h3",{children:t.jsx(D,{label:s("uiStudio.designCheckResultsTitle","Design Check suggestions"),tooltip:s("uiStudio.designCheckResultsTitle.tooltip","All improvement suggestions found in this capture.")})}),n.length>0&&t.jsxs("section",{className:a.prioritySection,children:[t.jsx("h4",{className:a.sectionHighHeader,children:s("uiStudio.highPrioritySection","우선 검토")}),n.map(o=>t.jsx(Q,{group:o},`h-${o.rule}`))]}),l.length>0&&t.jsxs("section",{className:a.prioritySection,children:[t.jsx("h4",{className:a.sectionMediumHeader,children:s("uiStudio.mediumPrioritySection","검토 권장")}),l.map(o=>t.jsx(Q,{group:o},`m-${o.rule}`))]}),r.length>0&&t.jsxs("section",{className:a.prioritySection,children:[t.jsx("h4",{className:a.sectionLowHeader,children:s("uiStudio.lowPrioritySection","선택 개선")}),r.map(o=>t.jsx(Q,{group:o},`l-${o.rule}`))]})]})}function Q({group:e}){var o,u,d;const{t:i}=I(),[s,n]=_.useState(e.priority==="priority_high"&&e.items.length<=5),l=e.falsePositiveRatio>=.5&&!!((o=e.fixTemplate)!=null&&o.falsePositiveNote),r=((u=e.fixTemplate)==null?void 0:u.checkLabel)??e.rule;return t.jsxs("div",{className:a.groupCard,children:[t.jsx(y,{text:i("uiStudio.suggestionGroup.tooltip","Suggestions of the same kind grouped together. Click to expand or collapse."),children:t.jsxs("button",{className:a.groupHeader,onClick:()=>n(g=>!g),type:"button",children:[t.jsx("span",{className:a.groupLabel,children:r}),t.jsx(y,{text:i("uiStudio.groupSummary.tooltip","Number of UI elements matching this group."),children:t.jsxs("span",{className:a.groupCount,children:[e.items.length," ",i("uiStudio.groupSummary","items")]})}),t.jsx("span",{className:a.groupChevron,children:s?"▾":"▸"})]})}),s&&t.jsxs("div",{className:a.groupBody,children:[e.fixTemplate&&t.jsxs(t.Fragment,{children:[t.jsx("p",{className:a.groupDescription,children:e.fixTemplate.description}),t.jsx("p",{className:a.groupFix,children:e.fixTemplate.howToFix})]}),l&&t.jsx(y,{text:i("uiStudio.falsePositiveWarning.tooltip","This check can produce false positives — verify before applying."),children:t.jsxs("p",{className:a.falsePositive,children:[i("uiStudio.falsePositiveWarning","May contain false positives"),":"," ",(d=e.fixTemplate)==null?void 0:d.falsePositiveNote]})}),t.jsx("ul",{className:a.itemList,children:e.items.map((g,m)=>t.jsx(ir,{item:g,group:e},`${g.path}-${m}`))})]})]})}function ir({item:e,group:i}){var g;const{t:s}=I(),{trackEvent:n}=q(),[l,r]=_.useState(!1),o=Ne(e.path),u=((g=i.fixTemplate)==null?void 0:g.buildUpdateCommand(e))??null,d=async()=>{if(u)try{await navigator.clipboard.writeText(u),n("dashboard_click_event",{click_target:"ui_studio_copy_ai_instruction",page:"ui-studio",tab:"ui_studio_analysis"}),r(!0),setTimeout(()=>r(!1),2e3)}catch{}};return t.jsxs("li",{className:a.suggestionItem,children:[t.jsxs("div",{className:a.suggestionInfo,children:[t.jsx("code",{className:a.pathBreadcrumb,title:`${s("uiStudio.fullPath","Full path")}: ${o.full}`,children:o.breadcrumb}),t.jsxs("span",{className:a.currentValue,children:[t.jsx(y,{text:s("uiStudio.colCurrent.tooltip","The currently applied value."),children:t.jsx("span",{children:s("uiStudio.colCurrent","Current")})}),": ",t.jsx("strong",{children:String(e.actual)})," → ",t.jsx(y,{text:s("uiStudio.colRecommended.tooltip","The recommended value."),children:t.jsx("span",{children:s("uiStudio.colRecommended","Recommended")})}),": ",t.jsx("strong",{children:String(e.expected)})]})]}),u&&t.jsx(y,{text:s("uiStudio.copyFixCommand.tooltip","Copy a prompt that asks the AI to fix this issue."),children:t.jsx("button",{className:a.copyFixBtn,onClick:d,type:"button",children:l?s("uiStudio.copiedToClipboard","Copied"):s("uiStudio.copyFixCommand","Copy AI instruction")})})]})}function J(e,i){return Object.entries(i).reduce((s,[n,l])=>s.split(`{${n}}`).join(String(l)),e)}function sr(e,i){return i.rule==="contrast"?J(e("uiStudio.sample.designCheck.contrast","Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3."),{expected:String(i.expected),actual:String(i.actual)}):i.rule==="touch_target"?J(e("uiStudio.sample.designCheck.touchTarget","Touch targets should be at least {expected} px (current {actual}). Increase Size or padding."),{expected:String(i.expected),actual:String(i.actual)}):i.rule==="min_text_size"?J(e("uiStudio.sample.designCheck.minTextSize","TextSize is below {expected} (current {actual}). Increase it for readability."),{expected:String(i.expected),actual:String(i.actual)}):i.hint}const Be="sample_inventory_preview",te=We,rr=[{path:"StarterGui.InventoryGame.Overlay.Modal.Header.GoldBox.Icon",hint:"텍스트 대비 4.5:1 미만 (현재 1.24). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥4.5:1",rule:"contrast",actual:"1.24"},{path:"StarterGui.InventoryGame.Overlay.Modal.Header.CloseBtn",hint:"텍스트 대비 4.5:1 미만 (현재 4.11). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥4.5:1",rule:"contrast",actual:"4.11"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.Portrait.Avatar",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.EquipGrid.Slot1.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.EquipGrid.Slot2.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.EquipGrid.Slot3.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.EquipGrid.Slot4.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.EquipGrid.Slot5.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.LeftPanel.EquipGrid.Slot6.EmptyIcon",hint:"텍스트 대비 3.0:1 미만 (현재 2.53). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"2.53"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.TabBar.TabAll",hint:"터치 타겟 44x44 px 이상 권장 (현재 64x32). Size 또는 padding 늘리세요.",displayPriority:"priority_high",expected:"≥44x44",rule:"touch_target",actual:"64x32"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.TabBar.TabWeapon",hint:"터치 타겟 44x44 px 이상 권장 (현재 64x32). Size 또는 padding 늘리세요.",displayPriority:"priority_high",expected:"≥44x44",rule:"touch_target",actual:"64x32"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.TabBar.TabArmor",hint:"터치 타겟 44x44 px 이상 권장 (현재 64x32). Size 또는 padding 늘리세요.",displayPriority:"priority_high",expected:"≥44x44",rule:"touch_target",actual:"64x32"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.TabBar.TabConsume",hint:"터치 타겟 44x44 px 이상 권장 (현재 64x32). Size 또는 padding 늘리세요.",displayPriority:"priority_high",expected:"≥44x44",rule:"touch_target",actual:"64x32"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.TabBar.TabMisc",hint:"터치 타겟 44x44 px 이상 권장 (현재 64x32). Size 또는 padding 늘리세요.",displayPriority:"priority_high",expected:"≥44x44",rule:"touch_target",actual:"64x32"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I1.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I1.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I2.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I3.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I4.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I5.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I6.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I7.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I8.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I9.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I10.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I11.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I12.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I13.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I13.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I14.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I14.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I15.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I15.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I16.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I16.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I17.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I17.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I18.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I19.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I19.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I20.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.CenterPanel.ItemGrid.I20.Qty",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.DetailPanel.ItemIconBox.Icon",hint:"텍스트 대비 3.0:1 미만 (현재 1.25). TextColor3 또는 BackgroundColor3 조정 필요.",displayPriority:"priority_high",expected:"≥3.0:1",rule:"contrast",actual:"1.25"},{path:"StarterGui.InventoryGame.Overlay.Modal.DetailPanel.Rarity",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12},{path:"StarterGui.InventoryGame.Overlay.Modal.DetailPanel.StatsBox.Passive",hint:"TextSize 12 미만 (하한 14). 가독성 확보를 위해 상향 조정 권장.",displayPriority:"priority_medium",expected:"≥14",rule:"min_text_size",actual:12}];function ar(e){const n={snapshot_id:Be,captured_at:1776757908,brief_id:null,thresholds_source:"default",scope:"targetPath",target:"StarterGui.InventoryGame",design_check_summary:{priority_high:35,priority_medium:10,priority_low:0},image:{file:"ui-studio-sample.png",width:402,height:252}},l={...n,check_results:rr.map(o=>({...o,hint:sr(e,o)})),image_url:te};return{list:{placeId:0,snapshots:[n],totalCount:1},detail:l}}const nr=/plugin not connected|sync not started/i;function ie(e){return typeof e=="string"&&nr.test(e)}function Re(){const{t:e}=I();return t.jsxs("section",{className:a.pluginGuideCard,role:"status","aria-live":"polite",children:[t.jsx("div",{className:a.pluginGuideMarker,"aria-hidden":"true",children:"!"}),t.jsxs("div",{className:a.pluginGuideBody,children:[t.jsx("h2",{className:a.pluginGuideTitle,children:e("uiStudio.pluginGuide.title","Roblox Studio 플러그인이 연결되지 않았습니다")}),t.jsx("p",{className:a.pluginGuideMessage,children:e("uiStudio.pluginGuide.message","UI Studio는 연결된 Studio place의 화면 캡처와 변경 이력을 표시합니다. Studio와 WEPPY Plugin을 연결하면 자동으로 갱신됩니다.")}),t.jsxs("ul",{className:a.pluginGuideChecklist,children:[t.jsx("li",{children:e("uiStudio.pluginGuide.check1","Roblox Studio가 실행 중인가요?")}),t.jsx("li",{children:e("uiStudio.pluginGuide.check2","WEPPY Plugin이 설치되어 실행 중인가요?")})]}),t.jsxs("div",{className:a.pluginGuideWaiting,children:[t.jsx("span",{className:a.pluginGuideDot,"aria-hidden":"true"}),e("uiStudio.pluginGuide.waiting","플러그인 연결을 기다리는 중...")]})]})]})}function De(e){return e.target??e.scope}function or(e){const i=De(e),s=i.split(".").filter(l=>l.length>0),n=s.findIndex(l=>l==="StarterGui");return n>=0&&s[n+1]?["StarterGui",s[n+1]].join("."):i}function Ge(e){return((e==null?void 0:e.priority_high)??0)>0?"needsFix":(e==null?void 0:e.readiness)==="insufficient_evidence"?"incomplete":((e==null?void 0:e.priority_medium)??0)>0||((e==null?void 0:e.priority_low)??0)>0?"review":"passed"}function lr(e){return Ge(e.design_check_summary)}function me(e){return se(e.design_check_summary)}function se(e){return((e==null?void 0:e.priority_high)??0)>0?0:(e==null?void 0:e.readiness)==="insufficient_evidence"?1:((e==null?void 0:e.priority_medium)??0)>0?2:((e==null?void 0:e.priority_low)??0)>0?3:4}function cr(e){var s,n,l;if(e.length===0)return null;if(e.length===1)return((s=e[0])==null?void 0:s.latest.design_check_summary)??null;const i=e.reduce((r,o)=>{const u=o.latest.design_check_summary;r.priority_high+=(u==null?void 0:u.priority_high)??0,r.priority_medium+=(u==null?void 0:u.priority_medium)??0,r.priority_low+=(u==null?void 0:u.priority_low)??0,(u==null?void 0:u.deterministic_status)==="failed"&&(r.deterministic_status="failed"),(u==null?void 0:u.visual_status)==="failed"?r.visual_status="failed":(u==null?void 0:u.visual_status)==="skipped"&&r.visual_status!=="failed"?r.visual_status="skipped":(u==null?void 0:u.visual_status)==="completed"&&r.visual_status==="completed"?r.visual_status="completed":(u==null?void 0:u.visual_status)!=="completed"&&r.visual_status==="completed"&&(r.visual_status="not_requested"),(u==null?void 0:u.coverage)!=="structural_and_visual"&&(r.coverage="structural_only");for(const d of(u==null?void 0:u.skipped_reasons)??[])r.skipped_reasons.add(d);(u==null?void 0:u.readiness)==="insufficient_evidence"?r.readiness="insufficient_evidence":(u==null?void 0:u.readiness)==="review_required"&&r.readiness==="ready"&&(r.readiness="review_required");for(const d of(u==null?void 0:u.viewport_profiles_tested)??[])r.viewport_profiles_tested.add(d);return r},{priority_high:0,priority_medium:0,priority_low:0,deterministic_status:"completed",visual_status:"completed",coverage:"structural_and_visual",skipped_reasons:new Set,readiness:"ready",viewport_profiles_tested:new Set});return{priority_high:i.priority_high,priority_medium:i.priority_medium,priority_low:i.priority_low,deterministic_status:i.deterministic_status,visual_status:i.visual_status,coverage:i.coverage,skipped_reasons:[...i.skipped_reasons],readiness:i.readiness,viewport_profiles_tested:[...i.viewport_profiles_tested],coverage_dimensions:e.length===1?(l=(n=e[0])==null?void 0:n.latest.design_check_summary)==null?void 0:l.coverage_dimensions:void 0}}function ur(e){const i=new Map;for(const l of e){const r=De(l),o=i.get(r);if(!o){i.set(r,{latest:l,snapshotCount:1});continue}o.snapshotCount+=1,l.captured_at>o.latest.captured_at&&(o.latest=l)}const s=[...i.entries()].map(([l,r])=>({key:l,latest:r.latest,snapshotCount:r.snapshotCount,verdict:lr(r.latest)})),n=new Map;for(const l of s){const r=or(l.latest),o=n.get(r)??[];o.push(l),n.set(r,o)}return[...n.entries()].map(([l,r])=>{var g;const o=r.sort((m,p)=>{const x=me(m.latest)-me(p.latest);return x!==0?x:p.latest.captured_at-m.latest.captured_at}),u=o.reduce((m,p)=>p.latest.captured_at>m.captured_at?p.latest:m,((g=o[0])==null?void 0:g.latest)??r[0].latest),d=cr(o);return{key:l,latest:u,snapshotCount:o.reduce((m,p)=>m+p.snapshotCount,0),children:o,summary:d,verdict:Ge(d)}}).sort((l,r)=>{const o=se(l.summary)-se(r.summary);return o!==0?o:r.latest.captured_at-l.latest.captured_at})}function dr(e){return e.reduce((i,s)=>(s.verdict==="passed"?i.noSuggestions+=1:s.verdict==="incomplete"?i.evidenceIncomplete+=1:i.hasSuggestions+=1,i),{hasSuggestions:0,evidenceIncomplete:0,noSuggestions:0})}function $(e,i){return`${i}${e("uiStudio.storage.countSuffix","개")}`}function re(e,i){return`${e("uiStudio.priorityHigh","우선 검토")} ${$(e,(i==null?void 0:i.priority_high)??0)} · ${e("uiStudio.priorityMedium","검토 권장")} ${$(e,(i==null?void 0:i.priority_medium)??0)} · ${e("uiStudio.priorityLow","선택 개선")} ${$(e,(i==null?void 0:i.priority_low)??0)}`}function hr(e,i){return i==="recompose"?e("uiStudio.primaryVisual.recompose","Recompose"):i==="refine"?e("uiStudio.primaryVisual.refine","Refine"):i==="approved"?e("uiStudio.primaryVisual.approved","Approved"):e("uiStudio.primaryVisual.unknown","Unknown")}function pr(e,i){return i==="ready"?e("uiStudio.readiness.ready","Ready"):i==="review_required"?e("uiStudio.readiness.reviewRequired","Review required"):i==="insufficient_evidence"?e("uiStudio.readiness.insufficient","Evidence incomplete"):e("uiStudio.readiness.unknown","Readiness unknown")}function _r(e,i,s){const n=s.evidenceIncomplete>0?` · ${z(e,"incomplete")} ${$(e,s.evidenceIncomplete)}`:"";return`${e("uiStudio.analysis.targetCountLabel","분석 대상")} ${$(e,i)} · ${z(e,"needsFix")} ${$(e,s.hasSuggestions)}${n} · ${z(e,"passed")} ${$(e,s.noSuggestions)}`}function ge(e,i){return(i==null?void 0:i.deterministic_status)==="failed"?e("uiStudio.analysis.coverage.deterministicFailed","구조 검사 실패"):(i==null?void 0:i.coverage)==="structural_and_visual"&&i.visual_status==="completed"?e("uiStudio.analysis.coverage.full","구조·시각 검사 완료"):(i==null?void 0:i.visual_status)==="skipped"?e("uiStudio.analysis.coverage.visualSkipped","구조 검사만 완료 · 시각 검사 생략"):(i==null?void 0:i.visual_status)==="failed"?e("uiStudio.analysis.coverage.visualFailed","구조 검사 완료 · 시각 검사 실패"):e("uiStudio.analysis.coverage.structuralOnly","구조 검사만 완료")}function mr({tier:e}){const{t:i}=I(),{trackEvent:s}=q(),n=e==="basic",l=Ie(50),r=_.useRef(null),[o,u]=_.useState(null),[d,g]=_.useState(new Set),[m,p]=_.useState(new Set),[x,S]=_.useState(!1),j=_.useCallback((f,L)=>{const R=o===f;R||(r.current=L??null),u(R?null:f)},[o]),k=_.useCallback(()=>{u(null)},[]),G=_.useCallback(f=>{g(L=>{const R=new Set(L);return R.has(f)?R.delete(f):R.add(f),R})},[]),b=n?ar(i):null,h=(b==null?void 0:b.list)??l.data,T=n?!1:l.loading,N=_.useCallback(f=>{p(L=>{const R=new Set(L);return R.has(f)?R.delete(f):R.add(f),R})},[]),v=f=>{p(new Set(f))},P=()=>{p(new Set)},A=async()=>{const f=(h==null?void 0:h.placeId)??0;s("dashboard_click_event",{click_target:"ui_studio_delete_selected_snapshots",page:"ui-studio",tab:"ui_studio_analysis"}),await Ke(f,{ids:[...m]}),await l.refresh(),S(!1),p(new Set)};if(T)return t.jsx("div",{className:a.page,children:i("uiStudio.loading","Loading...")});if(!n&&ie(l.error))return t.jsx(Re,{});if(!n&&l.error)return t.jsxs("div",{className:a.page,children:[i("uiStudio.error","Error"),": ",l.error]});const M=(h==null?void 0:h.snapshots)??[],C=(h==null?void 0:h.placeId)??0,w=M.map(f=>f.snapshot_id),B=ur(M),E=dr(B);return t.jsxs("div",{children:[t.jsx("div",{className:a.analysisWorkspace,"data-detail-open":o?"true":"false",children:t.jsxs("div",{className:a.analysisMainColumn,"data-testid":"analysis-main-column",children:[n&&t.jsx("div",{className:a.sampleBanner,children:t.jsxs("div",{className:a.sampleBannerRow,children:[t.jsxs("div",{className:a.sampleBannerMain,children:[t.jsx("div",{className:a.sampleBadge,children:i("uiStudio.sample.badge","Preview of the Pro UI gallery")}),t.jsx("div",{className:a.sampleTitle,children:i("uiStudio.sample.title","You are previewing the UI screenshot gallery that unlocks after upgrading to Pro.")}),t.jsx("div",{className:a.sampleMessage,children:i("uiStudio.sample.message","This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.")})]}),t.jsx("div",{className:a.sampleActions,children:t.jsx("a",{className:a.primaryAction,href:je.uiStudioAnalysis,target:"_blank",rel:"noreferrer",onClick:()=>s("dashboard_click_event",{click_target:"upgrade_cta",placement:"ui_studio_analysis_banner",page:"ui-studio",tab:"ui_studio_analysis"}),children:i("tier.upgrade","View Pro")})})]})}),t.jsx("div",{className:a.galleryHeader,children:t.jsx("h2",{children:t.jsx(D,{label:i("uiStudio.title","UI Studio"),tooltip:i("uiStudio.title.tooltip","A central place to review AI-generated UI screens and improvement suggestions.")})})}),M.length===0?t.jsx("div",{className:a.emptyState,children:i("uiStudio.empty","No screenshots saved yet. They are created automatically when an AI agent captures the current UI state.")}):t.jsxs(t.Fragment,{children:[t.jsx("section",{className:a.analysisSummaryPanel,children:t.jsxs("div",{children:[t.jsx("h2",{children:t.jsx(D,{label:i("uiStudio.analysis.reportsTitle","UI 루트별 최신 분석"),tooltip:i("uiStudio.analysis.reportsTitle.tooltip","Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).")})}),t.jsx("p",{className:a.analysisSummaryText,children:_r(i,B.length,E)})]})}),t.jsx("div",{className:a.analysisReportGrid,"data-testid":"analysis-report-grid",children:B.map(f=>t.jsx(yr,{report:f,placeId:C,imageUrlOverride:n?te:void 0,expanded:d.has(f.key),onPrimaryClick:L=>{f.children.length>1?G(f.key):j(f.latest.snapshot_id,L)},onChildClick:(L,R)=>j(L,R)},f.key))}),t.jsxs("section",{className:a.recentCapturesSection,children:[t.jsxs("div",{className:a.recentCapturesHeader,children:[t.jsxs("div",{children:[t.jsx("h2",{children:t.jsx(D,{label:i("uiStudio.analysis.recentCapturesTitle","최근 캡처"),tooltip:i("uiStudio.analysis.recentCapturesTitle.tooltip","All recently saved captures in chronological order.")})}),t.jsxs("p",{className:a.recentCapturesMeta,children:[i("uiStudio.storage.snapshotCount","화면 캡처")," ",$(i,M.length)]})]}),!n&&M.length>0&&t.jsxs("div",{className:a.captureSelectionActions,children:[t.jsx(y,{text:i("uiStudio.gallery.selectAll.tooltip","Select every visible capture at once."),children:t.jsx("button",{className:a.selectionBarBtn,onClick:()=>v(w),type:"button",children:i("uiStudio.gallery.selectAll","모두 선택")})}),m.size>0&&t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:a.selectionToolbarCount,children:[m.size,i("uiStudio.gallery.selection.selectedCount"," selected")]}),t.jsx(y,{text:i("uiStudio.gallery.clearSelection.tooltip","Clear the current selection."),children:t.jsx("button",{className:a.selectionBarBtn,onClick:P,type:"button",children:i("uiStudio.gallery.clearSelection","선택 해제")})}),t.jsx(y,{text:i("uiStudio.gallery.deleteSelected.tooltip","Delete only the selected capture files. The actual UI in Roblox Studio is not affected."),children:t.jsx("button",{className:`${a.selectionBarBtn} ${a.selectionBarBtnDanger}`,onClick:()=>S(!0),type:"button",children:i("common.delete","삭제")})})]})]})]}),t.jsx("div",{className:a.grid,children:M.map(f=>t.jsx(Ls,{snapshot:f,placeId:C,onClick:L=>j(f.snapshot_id,L),imageUrlOverride:n?te:void 0,selectable:!n,selected:m.has(f.snapshot_id),onToggleSelect:N},f.snapshot_id))})]})]})]})}),t.jsx(Je,{open:o!==null,ariaLabel:i("uiStudio.analysis.detailDialog","Analysis detail"),onClose:k,returnFocusTo:r.current,testId:"analysis-detail-popup-layer",children:o&&t.jsx(Js,{snapshotId:o,placeId:C,onClose:k,sampleDetail:n&&o===Be?(b==null?void 0:b.detail)??null:null,tier:e,onActionDone:n?void 0:l.refresh})}),x&&t.jsx(ae,{title:i("uiStudio.confirm.deleteBatchTitle","화면 캡처 일괄 삭제"),message:i("uiStudio.confirm.deleteBatchMessage",`선택한 ${m.size}개의 화면 캡처를 삭제합니다. 이 작업은 되돌릴 수 없습니다.`),danger:!0,confirmLabel:i("common.delete","삭제"),onConfirm:A,onClose:()=>S(!1)})]})}function z(e,i){return i==="needsFix"||i==="review"?e("uiStudio.analysis.verdict.hasSuggestions","개선 제안 있음"):i==="incomplete"?e("uiStudio.analysis.verdict.incomplete","검토 증거 부족"):e("uiStudio.analysis.verdict.passed","현재 개선 제안 없음")}function gr(e,i){return((i==null?void 0:i.priority_high)??0)>0||((i==null?void 0:i.priority_medium)??0)>0||((i==null?void 0:i.priority_low)??0)>0?re(e,i):(i==null?void 0:i.readiness)==="insufficient_evidence"?e("uiStudio.analysis.issueSummary.incomplete","제안은 없지만 interaction·responsive 검토가 남아 있습니다."):e("uiStudio.analysis.issueSummary.passed","현재 검토 기준에서 추가 개선 제안은 없습니다.")}function yr({report:e,placeId:i,imageUrlOverride:s,expanded:n,onPrimaryClick:l,onChildClick:r}){const{t:o}=I(),u=e.latest,d=s??ke(u.snapshot_id,i),g=new Date(u.captured_at*1e3).toLocaleString(),m=z(o,e.verdict),p=e.children.length>1;return t.jsxs("div",{className:a.analysisReportGroup,children:[t.jsxs("button",{className:a.analysisReportCard,"aria-expanded":p?n:void 0,"aria-label":`${e.key} ${p?o("uiStudio.analysis.expandChildren","하위 대상 보기"):o("uiStudio.analysis.openDetail","상세 보기")}`,onClick:x=>l(x.currentTarget),type:"button",children:[t.jsx("img",{className:a.analysisReportThumb,src:d,alt:u.snapshot_id,loading:"lazy"}),t.jsxs("div",{className:a.analysisReportBody,children:[t.jsxs("div",{className:a.analysisReportTopline,children:[t.jsx(y,{text:e.verdict==="passed"?o("uiStudio.analysis.verdict.passed.tooltip","No improvements suggested under the current review thresholds."):o("uiStudio.analysis.verdict.hasSuggestions.tooltip","Some improvements were found in this UI. Click the card for details."),children:t.jsx("span",{className:`${a.analysisVerdict} ${a[`analysisVerdict_${e.verdict}`]??""}`,children:m})}),t.jsx(y,{text:o("uiStudio.analysis.counts.tooltip","Shows how many suggestions are marked review first, recommended, or optional."),children:t.jsx("span",{className:a.analysisReportCounts,children:re(o,e.summary)})})]}),t.jsx("div",{className:a.analysisReportTarget,children:e.key}),t.jsx(xr,{summary:e.summary}),t.jsx("div",{className:a.analysisReportIssue,children:gr(o,e.summary)}),t.jsx("div",{className:a.analysisReportCoverage,children:ge(o,e.summary)}),t.jsx(fr,{summary:e.summary}),t.jsxs("div",{className:a.analysisReportMeta,children:[g," ·"," ",t.jsx(y,{text:o("uiStudio.analysis.thresholds.tooltip","The threshold set used for this review (default or custom)."),children:t.jsx("span",{children:o("uiStudio.analysis.thresholds","검토 기준")})}),": ",u.thresholds_source,e.snapshotCount>1?` · ${o("uiStudio.analysis.captureLabel","캡처")} ${$(o,e.snapshotCount)}`:"",p?` · ${o("uiStudio.analysis.childTargets","하위 대상")} ${$(o,e.children.length)}`:""]})]})]}),p&&n&&t.jsx("div",{className:a.analysisChildList,children:e.children.map(x=>t.jsxs("button",{className:a.analysisChildRow,onClick:S=>r(x.latest.snapshot_id,S.currentTarget),type:"button",children:[t.jsx("span",{className:a.analysisChildPath,children:x.key}),t.jsx("span",{className:a.analysisChildSummary,children:re(o,x.latest.design_check_summary)}),t.jsx("span",{className:a.analysisChildSummary,children:ge(o,x.latest.design_check_summary)}),t.jsx("span",{className:a.analysisChildDetailHint,children:o("uiStudio.analysis.childDetailHint","하위 대상 상세 보기")})]},x.key))})]})}function xr({summary:e}){const{t:i}=I();if(!e)return null;const s=e.functional_safe===!0?i("uiStudio.functional.safe","Safe"):e.functional_safe===!1?i("uiStudio.functional.risk","Risk found"):i("uiStudio.functional.unknown","Unknown"),n=e.responsive_requirement==="required"?i("uiStudio.responsive.required","Required"):e.responsive_requirement==="recommended"?i("uiStudio.responsive.recommended","Recommended"):i("uiStudio.responsive.unknown","Unknown");return t.jsxs("div",{className:a.readinessSummary,"aria-label":i("uiStudio.readiness.summary","UI readiness"),children:[t.jsxs("span",{className:a.readinessChip,children:[i("uiStudio.primaryVisual.label","Primary visual")," · ",hr(i,e.primary_visual_verdict)]}),t.jsxs("span",{className:a.readinessChip,children:[i("uiStudio.functional.label","Functional")," · ",s]}),t.jsxs("span",{className:a.readinessChip,children:[i("uiStudio.responsive.label","Responsive")," · ",n]}),t.jsx("span",{className:`${a.readinessChip} ${e.readiness==="ready"?a.readinessChipReady:a.readinessChipPending}`,children:pr(i,e.readiness)})]})}function fr({summary:e}){const{t:i}=I(),s=e==null?void 0:e.coverage_dimensions;if(!s)return null;const n=[["Structure",s.structure],["Visual",s.visual],["Interaction",s.interaction],["Primary view",s.primary_view_context],["Responsive",s.responsive_viewport]];return t.jsx("div",{className:a.coverageChips,"aria-label":i("uiStudio.analysis.coverageDimensions","검토 범위"),children:n.map(([l,r])=>t.jsxs("span",{className:`${a.coverageChip} ${a[`coverageChip_${r.status}`]??""}`,title:r.reasons.join(", "),children:[l," · ",r.status==="completed"?i("uiStudio.analysis.coverageStatus.completed","완료"):r.status==="failed"?i("uiStudio.analysis.coverageStatus.failed","실패"):i("uiStudio.analysis.coverageStatus.skipped","생략")]},l))})}function vr(e,i,s=1e4){const[n,l]=_.useState(null),[r,o]=_.useState(!0),[u,d]=_.useState(null),g=JSON.stringify(i),m=_.useCallback(async()=>{if(e===null){l(null),d(null),o(!1);return}try{const p=await le(e,i);l(p),d(null)}catch(p){d(p.message)}finally{o(!1)}},[e,g]);return _.useEffect(()=>{let p=!0;if(e===null)return l(null),d(null),o(!1),()=>{p=!1};const x=async()=>{try{const j=await le(e,i);p&&(l(j),d(null))}catch(j){p&&d(j.message)}finally{p&&o(!1)}};x();const S=setInterval(()=>{x()},s);return()=>{p=!1,clearInterval(S)}},[e,g,s]),{data:n,loading:r,error:u,refresh:m}}const Sr="_filterBar_2mh91_4",jr="_filterGroup_2mh91_14",Cr="_filterLabel_2mh91_21",wr="_filterCheckbox_2mh91_28",br="_segmentGroup_2mh91_45",kr="_segmentBtn_2mh91_55",Ir="_segmentBtnActive_2mh91_73",Nr="_filterInput_2mh91_79",Pr="_filterResetBtn_2mh91_95",Tr="_requestRow_2mh91_114",Br="_requestRowMain_2mh91_127",Rr="_requestDetailToggle_2mh91_134",Dr="_thumbPair_2mh91_156",Gr="_thumbPairButton_2mh91_164",Mr="_thumbSlot_2mh91_179",Ar="_thumbImg_2mh91_204",Lr="_thumbPlaceholder_2mh91_211",$r="_thumbArrow_2mh91_219",Er="_extraPathsBadge_2mh91_225",qr="_requestMeta_2mh91_239",Hr="_requestLabel_2mh91_247",Ur="_requestTime_2mh91_256",Or="_requestStats_2mh91_261",Fr="_statDot_2mh91_269",zr="_summaryPill_2mh91_273",Vr="_requestReadiness_2mh91_277",Wr="_requestReadinessPill_2mh91_283",Kr="_requestReadinessReady_2mh91_297",Yr="_requestReadinessPending_2mh91_303",Qr="_requestActions_2mh91_310",Jr="_expandHint_2mh91_317",Xr="_mutationsArea_2mh91_330",Zr="_mutLoading_2mh91_339",ea="_mutEmpty_2mh91_340",ta="_mutError_2mh91_346",ia="_mutationRow_2mh91_352",sa="_mutationLine_2mh91_362",ra="_mutTs_2mh91_369",aa="_mutCommand_2mh91_375",na="_mutPath_2mh91_381",oa="_mutDiff_2mh91_391",la="_mutErr_2mh91_346",ca="_changeDetails_2mh91_406",ua="_changeDetailRow_2mh91_414",da="_changeDetailRowNoBefore_2mh91_423",ha="_changeDetailBadge_2mh91_427",pa="_changeDetail_text_2mh91_444",_a="_changeDetail_color_2mh91_449",ma="_changeDetail_size_2mh91_454",ga="_changeDetail_layout_2mh91_459",ya="_changeDetail_state_2mh91_464",xa="_changeDetail_asset_2mh91_469",fa="_changeDetail_property_2mh91_474",va="_changeDetailProperty_2mh91_478",Sa="_changeDetailArrow_2mh91_486",ja="_changeDetailOldValue_2mh91_492",Ca="_changeDetailNewValue_2mh91_493",wa="_compareDialogLayer_2mh91_511",ba="_compareDialog_2mh91_511",ka="_beforeAfterDrawer_2mh91_542",Ia="_drawerHeader_2mh91_552",Na="_drawerTitle_2mh91_561",Pa="_drawerCloseBtn_2mh91_569",Ta="_drawerBody_2mh91_585",Ba="_pathTabs_2mh91_592",Ra="_pathTab_2mh91_592",Da="_pathTabActive_2mh91_621",Ga="_comparePanel_2mh91_627",Ma="_compareHalf_2mh91_637",Aa="_compareLabel_2mh91_644",La="_compareImg_2mh91_655",$a="_comparePlaceholder_2mh91_663",Ea="_compareDetailsPanel_2mh91_675",qa="_compareDetailsHeader_2mh91_684",Ha="_drawerFooter_2mh91_702",Ua="_drawerActionBtn_2mh91_710",Oa="_historyTabWrap_2mh91_728",Fa="_historyWorkspace_2mh91_734",za="_historyMainColumn_2mh91_739",Va="_requestList_2mh91_743",Wa="_emptyHistory_2mh91_748",Ka="_historyError_2mh91_755",Ya="_historyLoading_2mh91_761",Qa="_listHeader_2mh91_769",Ja="_listHeaderTitle_2mh91_778",Xa="_clearBtn_2mh91_785",Za="_deleteErrBanner_2mh91_809",c={filterBar:Sr,filterGroup:jr,filterLabel:Cr,filterCheckbox:wr,segmentGroup:br,segmentBtn:kr,segmentBtnActive:Ir,filterInput:Nr,filterResetBtn:Pr,requestRow:Tr,requestRowMain:Br,requestDetailToggle:Rr,thumbPair:Dr,thumbPairButton:Gr,thumbSlot:Mr,thumbImg:Ar,thumbPlaceholder:Lr,thumbArrow:$r,extraPathsBadge:Er,requestMeta:qr,requestLabel:Hr,requestTime:Ur,requestStats:Or,statDot:Fr,summaryPill:zr,requestReadiness:Vr,requestReadinessPill:Wr,requestReadinessReady:Kr,requestReadinessPending:Yr,requestActions:Qr,expandHint:Jr,mutationsArea:Xr,mutLoading:Zr,mutEmpty:ea,mutError:ta,mutationRow:ia,mutationLine:sa,mutTs:ra,mutCommand:aa,mutPath:na,mutDiff:oa,mutErr:la,changeDetails:ca,changeDetailRow:ua,changeDetailRowNoBefore:da,changeDetailBadge:ha,changeDetail_text:pa,changeDetail_color:_a,changeDetail_size:ma,changeDetail_layout:ga,changeDetail_state:ya,changeDetail_asset:xa,changeDetail_property:fa,changeDetailProperty:va,changeDetailArrow:Sa,changeDetailOldValue:ja,changeDetailNewValue:Ca,compareDialogLayer:wa,compareDialog:ba,beforeAfterDrawer:ka,drawerHeader:Ia,drawerTitle:Na,drawerCloseBtn:Pa,drawerBody:Ta,pathTabs:Ba,pathTab:Ra,pathTabActive:Da,comparePanel:Ga,compareHalf:Ma,compareLabel:Aa,compareImg:La,comparePlaceholder:$a,compareDetailsPanel:Ea,compareDetailsHeader:qa,drawerFooter:Ha,drawerActionBtn:Ua,historyTabWrap:Oa,historyWorkspace:Fa,historyMainColumn:za,requestList:Va,emptyHistory:Wa,historyError:Ka,historyLoading:Ya,listHeader:Qa,listHeaderTitle:Ja,clearBtn:Xa,deleteErrBanner:Za};function en(e){try{return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}function ye(e){return e==null?"nil":typeof e=="string"?`"${e}"`:typeof e=="object"?JSON.stringify(e):String(e)}function Me({mutations:e,emptyLabel:i}){const{t:s}=I();return e.length===0?t.jsx("div",{className:c.mutEmpty,children:i??s("uiStudio.history.row.mutationsEmpty","No change details")}):t.jsx(t.Fragment,{children:e.map(n=>t.jsx(tn,{mutation:n},n.mutationId))})}function tn({mutation:e}){return t.jsxs("div",{className:c.mutationRow,children:[t.jsxs("div",{className:c.mutationLine,children:[t.jsx("span",{className:c.mutTs,children:en(e.ts)}),t.jsx("span",{className:c.mutCommand,children:e.command}),e.targetPath&&t.jsx("span",{className:c.mutPath,children:e.targetPath}),e.diffSummary&&t.jsx("span",{className:c.mutDiff,children:e.diffSummary})]}),e.changeDetails&&e.changeDetails.length>0&&t.jsx("div",{className:c.changeDetails,children:e.changeDetails.map(i=>t.jsx(sn,{detail:i},`${i.property}:${i.category}`))}),!e.ok&&e.error&&t.jsx("span",{className:c.mutErr,children:e.error})]})}function sn({detail:e}){const i=Object.prototype.hasOwnProperty.call(e,"before");return t.jsxs("div",{className:`${c.changeDetailRow} ${i?"":c.changeDetailRowNoBefore}`,children:[t.jsx("span",{className:`${c.changeDetailBadge} ${c[`changeDetail_${e.category}`]??""}`,children:e.label}),t.jsx("span",{className:c.changeDetailProperty,children:e.property}),i&&t.jsx("span",{className:c.changeDetailOldValue,children:ye(e.before)}),t.jsx("span",{className:c.changeDetailArrow,children:"→"}),t.jsx("span",{className:c.changeDetailNewValue,children:ye(e.after)})]})}function xe(e,i){return`${V}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image?placeId=${i}`}function rn(e){try{return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}function an(e){if(!e)return null;const i=e.split(/[./]/).filter(n=>n.length>0);if(i.length===0)return null;const s=i.findIndex(n=>n==="StarterGui");return s>=0&&i[s+1]?i[s+1]:i[i.length-1]??null}function X(e,i){if(i.label)return i.label;const s=an(i.affectedPaths[0]);if(s){const n=i.mutationCount===1?"uiStudio.history.row.pathLabelOne":"uiStudio.history.row.pathLabelMany",l=i.mutationCount===1?"{path} · {n} change detail":"{path} · {n} change details";return e(n,l).replace("{path}",s).replace("{n}",String(i.mutationCount))}return e("uiStudio.history.row.toolLabel","UI changes ({n})").replace("{n}",String(i.mutationCount))}function Z(e,i){return`${i}${e("uiStudio.storage.countSuffix","")}`}function nn(e,i){if(!i)return null;const s=[i.style_family,i.layout_family,i.device_policy,i.safe_area_policy].filter(n=>typeof n=="string"&&n.length>0);return s.length===0?null:`${e("uiStudio.history.row.qualityPlan","Design direction")}: ${s.join(" · ")}`}function on(e,i,s){if(!i)return null;if(i.source==="unavailable")return e("uiStudio.history.row.designCheckUnavailable","Suggestions: unavailable");if(s==="insufficient_evidence"||i.readiness==="insufficient_evidence")return e("uiStudio.history.row.readinessIncomplete","Readiness: evidence incomplete");if(i.total===0)return e("uiStudio.history.row.designCheckNone","Suggestions: none");const n=`${e("uiStudio.priorityHigh","Priority")} ${Z(e,i.priority_high)}`,l=`${e("uiStudio.priorityMedium","Recommended")} ${Z(e,i.priority_medium)}`,r=`${e("uiStudio.priorityLow","Optional")} ${Z(e,i.priority_low)}`;return`${e("uiStudio.history.row.designCheck","Suggestions")}: ${n} · ${l} · ${r}`}function ln(e,i){return i==="recompose"?e("uiStudio.primaryVisual.recompose","Recompose"):i==="refine"?e("uiStudio.primaryVisual.refine","Refine"):i==="approved"?e("uiStudio.primaryVisual.approved","Approved"):e("uiStudio.primaryVisual.unknown","Unknown")}function Ae({req:e,placeId:i,onOpenCompare:s,imageUrlOverride:n,sampleMutations:l}){const{t:r}=I(),[o,u]=_.useState(!1),[d,g]=_.useState(null),[m,p]=_.useState(!1),[x,S]=_.useState(null),j=n!=null,k=e.affectedPaths[0]??null,G=e.affectedPaths.length-1,b=k?e.beforeSnapshots[k]??null:null,h=k?e.afterSnapshots[k]??null:null,T=b?j?n:xe(b,i):null,N=h?j?n:xe(h,i):null,v=nn(r,e.qualityPlanSummary),P=on(r,e.postChangeDesignCheckSummary,e.readiness),A=e.postChangeDesignCheckSummary,M=async()=>{if(!o&&d===null)if(j&&l!=null)g(l);else{p(!0),S(null);try{const C=await Ce(i,e.requestId);g(C.mutations)}catch(C){S(C.message)}finally{p(!1)}}u(C=>!C)};return t.jsxs("div",{className:c.requestRow,children:[t.jsxs("div",{className:c.requestRowMain,children:[t.jsx(y,{text:r("uiStudio.history.row.compare.tooltip","Compare the before and after screens. Click to open the full comparison view."),children:t.jsxs("button",{className:`${c.thumbPair} ${c.thumbPairButton}`,onClick:C=>s(C.currentTarget),disabled:!k,"aria-label":`${X(r,e)} ${r("uiStudio.history.row.compare","Before / After")}`,type:"button",children:[t.jsx("div",{className:c.thumbSlot,children:T?t.jsx("img",{className:c.thumbImg,src:T,alt:r("uiStudio.compare.before","Before"),loading:"lazy"}):t.jsx(y,{text:r("uiStudio.history.row.noBeforeState.tooltip","No capture saved before this change."),children:t.jsx("span",{className:c.thumbPlaceholder,children:r("uiStudio.history.row.noBeforeState","이전 없음")})})}),t.jsx("span",{className:c.thumbArrow,children:"→"}),t.jsx("div",{className:c.thumbSlot,children:N?t.jsx("img",{className:c.thumbImg,src:N,alt:r("uiStudio.compare.after","After"),loading:"lazy"}):t.jsx(y,{text:r("uiStudio.history.row.noAfterState.tooltip","No capture saved after this change."),children:t.jsx("span",{className:c.thumbPlaceholder,children:r("uiStudio.history.row.noAfterState","이후 없음")})})}),G>0&&t.jsx(y,{text:r("uiStudio.history.row.extraPaths.tooltip","Number of additional UIs changed in this action."),children:t.jsxs("span",{className:c.extraPathsBadge,children:["+",G]})})]})}),t.jsxs("button",{className:c.requestDetailToggle,type:"button","aria-expanded":o,"aria-label":`${X(r,e)} ${r("uiStudio.history.row.toggleDetails","Toggle change details")}`,onClick:()=>void M(),children:[t.jsxs("span",{className:c.requestMeta,children:[t.jsx("span",{className:c.requestLabel,children:X(r,e)}),t.jsx("span",{className:c.requestTime,children:rn(e.startedAt)}),t.jsxs("span",{className:c.requestStats,children:[t.jsx(y,{text:r("uiStudio.history.row.affectedPaths.tooltip","Number of UIs affected by this action."),children:t.jsxs("span",{children:[r("uiStudio.history.row.affectedPaths","Paths")," ",e.affectedPaths.length,r("uiStudio.storage.countSuffix","")]})}),t.jsx("span",{className:c.statDot,children:"·"}),t.jsx(y,{text:r("uiStudio.history.row.mutations.tooltip","Number of detailed changes (e.g., property edits)."),children:t.jsxs("span",{children:[r("uiStudio.history.row.mutations","Change details")," ",e.mutationCount,r("uiStudio.storage.countSuffix","")]})}),v&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:c.statDot,children:"·"}),t.jsx(y,{text:r("uiStudio.history.row.qualityPlan.tooltip","Brief design direction used for this change."),children:t.jsx("span",{className:c.summaryPill,children:v})})]}),P&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:c.statDot,children:"·"}),t.jsx(y,{text:r("uiStudio.history.row.designCheck.tooltip","Post-change Design Check suggestion summary."),children:t.jsx("span",{className:c.summaryPill,children:P})})]})]}),A&&t.jsxs("span",{className:c.requestReadiness,"aria-label":r("uiStudio.readiness.summary","UI readiness"),children:[t.jsx("span",{className:c.requestReadinessPill,children:ln(r,A.primary_visual_verdict)}),t.jsx("span",{className:c.requestReadinessPill,children:A.functional_safe===!0?r("uiStudio.functional.safeCompact","Functional safe"):A.functional_safe===!1?r("uiStudio.functional.riskCompact","Functional risk"):r("uiStudio.functional.unknownCompact","Functional unknown")}),t.jsx("span",{className:c.requestReadinessPill,children:A.responsive_requirement==="required"?r("uiStudio.responsive.requiredCompact","Responsive required"):A.responsive_requirement==="recommended"?r("uiStudio.responsive.recommendedCompact","Responsive recommended"):r("uiStudio.responsive.unknownCompact","Responsive unknown")}),A.readiness==="ready"&&t.jsx("span",{className:`${c.requestReadinessPill} ${c.requestReadinessReady}`,children:r("uiStudio.readiness.ready","Ready")}),A.readiness==="review_required"&&t.jsx("span",{className:`${c.requestReadinessPill} ${c.requestReadinessPending}`,children:r("uiStudio.readiness.reviewRequired","Review required")})]})]}),t.jsx("span",{className:c.requestActions,children:t.jsx(y,{text:r("uiStudio.history.row.toggleDetails.tooltip","Show or hide a per-line breakdown of what changed."),children:t.jsx("span",{className:c.expandHint,children:o?r("uiStudio.history.row.collapseDetails","Hide change details"):r("uiStudio.history.row.expandDetails","Show {n} change details").replace("{n}",String(e.mutationCount))})})})]})]}),o&&t.jsxs("div",{className:c.mutationsArea,children:[m&&t.jsx("div",{className:c.mutLoading,children:r("uiStudio.history.loading","로딩 중...")}),x&&t.jsx("div",{className:c.mutError,children:x}),d&&t.jsx(Me,{mutations:d,emptyLabel:r("uiStudio.history.row.mutationsEmpty","No change details")})]})]})}function fe(e,i){return`${V}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image?placeId=${i}`}function Le({requestId:e,placeId:i,onClose:s,imageUrlOverride:n,sampleDetail:l}){const{t:r}=I(),o=_.useRef(null),u=l!=null,[d,g]=_.useState(u?l:null),[m,p]=_.useState(!u),[x,S]=_.useState(null),[j,k]=_.useState(u&&l.affectedPaths.length>0?l.affectedPaths[0]:null);_.useEffect(()=>{var v;(v=o.current)==null||v.focus()},[]),_.useEffect(()=>{const v=P=>{P.key==="Escape"&&(P.preventDefault(),s())};return document.addEventListener("keydown",v),()=>{document.removeEventListener("keydown",v)}},[s]),_.useEffect(()=>{if(u)return;let v=!0;return p(!0),S(null),Ce(i,e).then(P=>{v&&(g(P),P.affectedPaths.length>0&&k(P.affectedPaths[0]))}).catch(P=>{v&&S(P.message)}).finally(()=>{v&&p(!1)}),()=>{v=!1}},[e,i,u]);const G=j&&d?d.beforeSnapshots[j]??null:null,b=j&&d?d.afterSnapshots[j]??null:null,h=G?n??fe(G,i):null,T=b?n??fe(b,i):null,N=r("uiStudio.history.row.compare","전후 비교");return t.jsx("div",{className:c.compareDialogLayer,"data-testid":"history-compare-dialog-layer",onClick:s,role:"presentation",children:t.jsx("section",{ref:o,className:c.compareDialog,role:"dialog","aria-modal":"true","aria-label":N,tabIndex:-1,onClick:v=>v.stopPropagation(),children:t.jsxs("div",{className:c.beforeAfterDrawer,children:[t.jsxs("div",{className:c.drawerHeader,children:[t.jsx("h2",{className:c.drawerTitle,children:N}),t.jsx("button",{className:c.drawerCloseBtn,onClick:s,type:"button",children:r("uiStudio.history.drawer.close","닫기")})]}),m&&t.jsx("div",{className:c.drawerBody,children:r("uiStudio.history.loading","로딩 중...")}),x&&t.jsx("div",{className:c.drawerBody,children:t.jsx("span",{className:c.mutErr,children:x})}),!m&&!x&&d&&t.jsxs(t.Fragment,{children:[d.affectedPaths.length>0&&t.jsx("div",{className:c.pathTabs,role:"tablist",children:d.affectedPaths.map(v=>t.jsx(y,{text:`${r("uiStudio.compare.path.tooltip","The UI instance path for this screen.")} ${v}`,children:t.jsx("button",{role:"tab","aria-selected":j===v,className:`${c.pathTab} ${j===v?c.pathTabActive:""}`,onClick:()=>k(v),type:"button",children:v.split("/").pop()??v})},v))}),t.jsxs("div",{className:c.comparePanel,children:[t.jsxs("div",{className:c.compareHalf,children:[t.jsx(y,{text:r("uiStudio.compare.before.tooltip","The screen saved just before AI made the change."),children:t.jsx("div",{className:c.compareLabel,children:r("uiStudio.compare.before","Before")})}),h?t.jsx("img",{className:c.compareImg,src:h,alt:r("uiStudio.compare.before","Before")}):t.jsx("div",{className:c.comparePlaceholder,children:r("uiStudio.history.row.noBeforeState","이전 상태 없음")})]}),t.jsxs("div",{className:c.compareHalf,children:[t.jsx(y,{text:r("uiStudio.compare.after.tooltip","The screen saved just after AI made the change."),children:t.jsx("div",{className:c.compareLabel,children:r("uiStudio.compare.after","After")})}),T?t.jsx("img",{className:c.compareImg,src:T,alt:r("uiStudio.compare.after","After")}):t.jsx("div",{className:c.comparePlaceholder,children:r("uiStudio.history.row.noAfterState","이후 상태 없음")})]})]}),t.jsxs("section",{className:c.compareDetailsPanel,children:[t.jsx("div",{className:c.compareDetailsHeader,children:r("uiStudio.history.drawer.changeDetails","Change details")}),t.jsx(Me,{mutations:d.mutations,emptyLabel:r("uiStudio.history.row.mutationsEmpty","No change details")})]})]}),t.jsx("div",{className:c.drawerFooter,children:t.jsx("button",{className:c.drawerActionBtn,onClick:s,type:"button",children:r("uiStudio.history.drawer.close","닫기")})})]})})})}function F(e){const i=new Date(e.getFullYear(),e.getMonth(),e.getDate(),0,0,0,0),s=new Date(e.getFullYear(),e.getMonth(),e.getDate(),23,59,59,999);return{start:i,end:s}}function ve(e,i){const s=e.split("-").map(Number);if(s.length!==3||s.some(o=>Number.isNaN(o)))return;const[n,l,r]=s;return new Date(n,l-1,r,i?23:0,i?59:0,i?59:0,i?999:0).toISOString()}function cn(e){const i={limit:50};if(e.action!=="all"&&(i.action=e.action),e.datePreset==="custom"){const s=e.from?ve(e.from,!1):void 0,n=e.to?ve(e.to,!0):void 0;s&&(i.from=s),n&&(i.to=n)}else if(e.datePreset!=="all"){const s=new Date;if(e.datePreset==="today"){const{start:n,end:l}=F(s);i.from=n.toISOString(),i.to=l.toISOString()}else if(e.datePreset==="yesterday"){const n=new Date(s);n.setDate(n.getDate()-1);const{start:l,end:r}=F(n);i.from=l.toISOString(),i.to=r.toISOString()}else{const n=e.datePreset==="7d"?6:29,l=new Date(s);l.setDate(l.getDate()-n);const{start:r}=F(l),{end:o}=F(s);i.from=r.toISOString(),i.to=o.toISOString()}}return i}function $e(){return{action:"all",datePreset:"all"}}function un(){const{t:e}=I(),{trackEvent:i}=q(),s=Ye(e),[n,l]=_.useState(null),r=n?s.requests.find(d=>d.requestId===n)??null:null,o=_.useCallback((d,g)=>{l(d)},[]),u=_.useCallback(()=>{l(null)},[]);return t.jsxs("div",{className:c.historyTabWrap,children:[t.jsx("div",{className:a.sampleBanner,children:t.jsxs("div",{className:a.sampleBannerRow,children:[t.jsxs("div",{className:a.sampleBannerMain,children:[t.jsx("div",{className:a.sampleBadge,children:e("uiStudio.history.sample.bannerBadge","Preview of the Pro change history")}),t.jsx("div",{className:a.sampleTitle,children:e("uiStudio.history.sample.bannerTitle","You are previewing the UI change history that unlocks after upgrading to Pro.")}),t.jsx("div",{className:a.sampleMessage,children:e("uiStudio.history.sample.bannerMessage","This preview uses sample data. Real change history, before/after comparison, and batch delete unlock with Pro.")})]}),t.jsx("div",{className:a.sampleActions,children:t.jsx("a",{className:a.primaryAction,href:je.uiStudioHistory,target:"_blank",rel:"noreferrer",title:e("uiStudio.history.sample.tooltip","Full history is available with Pro"),onClick:()=>i("dashboard_click_event",{click_target:"upgrade_cta",placement:"ui_studio_history_banner",page:"ui-studio",tab:"ui_studio_history"}),children:e("tier.upgrade","View Pro")})})]})}),t.jsxs("div",{className:c.historyWorkspace,"data-compare-open":n?"true":"false",children:[t.jsxs("div",{className:c.historyMainColumn,"data-testid":"history-main-column",children:[t.jsx("div",{className:c.listHeader,children:t.jsx("h2",{className:c.listHeaderTitle,children:t.jsx(D,{label:e("uiStudio.history.title","변경 이력"),tooltip:e("uiStudio.history.title.tooltip","A timeline of every UI change made by AI.")})})}),t.jsx("div",{className:c.requestList,children:s.requests.map(d=>t.jsx(Ae,{req:d,placeId:0,onOpenCompare:g=>o(d.requestId,g),imageUrlOverride:ce,sampleMutations:s.mutationsByRequest[d.requestId]},d.requestId))})]}),n&&r&&t.jsx(Le,{requestId:n,placeId:0,onClose:u,imageUrlOverride:ce,sampleDetail:{...r,mutations:s.mutationsByRequest[r.requestId]??[]}})]})]})}function dn({filter:e,onChange:i}){const{t:s}=I(),n=[{value:"all",label:s("uiStudio.history.filter.actionAll","All"),tooltip:s("uiStudio.history.filter.actionAll.tooltip","Show every kind of action.")},{value:"create_tree",label:s("uiStudio.history.filter.actionCreate","Create"),tooltip:s("uiStudio.history.filter.actionCreate.tooltip","Show only actions that created a new UI.")},{value:"update",label:s("uiStudio.history.filter.actionUpdate","Update"),tooltip:s("uiStudio.history.filter.actionUpdate.tooltip","Show only actions that updated an existing UI.")},{value:"delete",label:s("uiStudio.history.filter.actionDelete","Delete"),tooltip:s("uiStudio.history.filter.actionDelete.tooltip","Show only actions that deleted a UI.")}],l=[{value:"all",label:s("uiStudio.history.filter.dateAll","All"),tooltip:s("uiStudio.history.filter.dateAll.tooltip","Show the full history.")},{value:"today",label:s("uiStudio.history.filter.today","Today"),tooltip:s("uiStudio.history.filter.today.tooltip","Show only changes from today.")},{value:"yesterday",label:s("uiStudio.history.filter.yesterday","Yesterday"),tooltip:s("uiStudio.history.filter.yesterday.tooltip","Show only changes from yesterday.")},{value:"7d",label:s("uiStudio.history.filter.last7Days","Last 7 days"),tooltip:s("uiStudio.history.filter.last7Days.tooltip","Show changes from the last 7 days.")},{value:"30d",label:s("uiStudio.history.filter.last30Days","Last 30 days"),tooltip:s("uiStudio.history.filter.last30Days.tooltip","Show changes from the last 30 days.")},{value:"custom",label:s("uiStudio.history.filter.customRange","Custom range"),tooltip:s("uiStudio.history.filter.customRange.tooltip","Pick a custom start and end date.")}];return t.jsxs("div",{className:c.filterBar,children:[t.jsxs("div",{className:c.filterGroup,children:[t.jsx("span",{className:c.filterLabel,children:t.jsx(D,{label:s("uiStudio.history.filter.actions","작업 유형"),tooltip:s("uiStudio.history.filter.actions.tooltip","Filter records by the kind of change AI made.")})}),t.jsx("div",{className:c.segmentGroup,children:n.map(r=>t.jsx(y,{text:r.tooltip,children:t.jsx("button",{className:`${c.segmentBtn} ${e.action===r.value?c.segmentBtnActive:""}`,onClick:()=>i({...e,action:r.value}),"aria-pressed":e.action===r.value,type:"button",children:r.label})},r.value))})]}),t.jsxs("div",{className:c.filterGroup,children:[t.jsx("span",{className:c.filterLabel,children:t.jsx(D,{label:s("uiStudio.history.filter.period","Period"),tooltip:s("uiStudio.history.filter.period.tooltip","Filter records by time range.")})}),t.jsx("div",{className:c.segmentGroup,children:l.map(r=>t.jsx(y,{text:r.tooltip,children:t.jsx("button",{className:`${c.segmentBtn} ${e.datePreset===r.value?c.segmentBtnActive:""}`,onClick:()=>i({...e,datePreset:r.value,from:r.value==="custom"?e.from:void 0,to:r.value==="custom"?e.to:void 0}),"aria-pressed":e.datePreset===r.value,type:"button",children:r.label})},r.value))})]}),e.datePreset==="custom"&&t.jsxs("div",{className:c.filterGroup,children:[t.jsx("label",{className:c.filterLabel,htmlFor:"ui-history-from-date",children:t.jsx(D,{label:s("uiStudio.history.filter.from","시작일"),tooltip:s("uiStudio.history.filter.from.tooltip","Start date for the query.")})}),t.jsx("input",{id:"ui-history-from-date",type:"date",className:c.filterInput,value:e.from??"",onChange:r=>i({...e,from:r.target.value||void 0})}),t.jsx("label",{className:c.filterLabel,htmlFor:"ui-history-to-date",children:t.jsx(D,{label:s("uiStudio.history.filter.to","종료일"),tooltip:s("uiStudio.history.filter.to.tooltip","End date for the query.")})}),t.jsx("input",{id:"ui-history-to-date",type:"date",className:c.filterInput,value:e.to??"",onChange:r=>i({...e,to:r.target.value||void 0})})]}),t.jsx(y,{text:s("uiStudio.history.filter.reset.tooltip","Reset all filters to defaults."),children:t.jsx("button",{className:c.filterResetBtn,onClick:()=>i($e()),type:"button",children:s("uiStudio.history.filter.reset","Reset")})})]})}function hn(){var M;const{t:e}=I(),{trackEvent:i}=q(),s=Ie(1),n=((M=s.data)==null?void 0:M.placeId)??null,[l,r]=_.useState($e),{data:o,loading:u,error:d,refresh:g}=vr(n,cn(l)),[m,p]=_.useState(null),[x,S]=_.useState(!1),[j,k]=_.useState(!1),[G,b]=_.useState(null),h=async()=>{if(b(null),n===null){b(e("uiStudio.history.noPlaceAction","Current place is not available yet."));return}try{await Qe(n,{all:!0,alsoSnapshots:j}),await g(),S(!1)}catch(C){throw b(C.message),C}},T=(o==null?void 0:o.requests)??[],N=n===null&&s.loading,v=ie(s.error)||ie(d),P=_.useCallback((C,w)=>{i("dashboard_click_event",{click_target:"ui_studio_compare_before_after",page:"ui-studio",tab:"ui_studio_history"}),p(C)},[i]),A=_.useCallback(()=>{p(null)},[]);return t.jsxs("div",{className:c.historyTabWrap,children:[v?t.jsx(Re,{}):t.jsxs("div",{className:c.historyWorkspace,"data-compare-open":m?"true":"false",children:[t.jsxs("div",{className:c.historyMainColumn,"data-testid":"history-main-column",children:[t.jsx(dn,{filter:l,onChange:r}),t.jsxs("div",{className:c.listHeader,children:[t.jsx("h2",{className:c.listHeaderTitle,children:t.jsx(D,{label:e("uiStudio.history.title","변경 이력"),tooltip:e("uiStudio.history.title.tooltip","A timeline of every UI change made by AI.")})}),T.length>0&&t.jsx(y,{text:e("uiStudio.history.clear.tooltip","Delete every change record for this project. The actual UI in Roblox Studio is not affected."),children:t.jsx("button",{className:c.clearBtn,onClick:()=>{i("dashboard_click_event",{click_target:"ui_studio_clear_history",page:"ui-studio",tab:"ui_studio_history"}),S(!0)},type:"button",children:e("uiStudio.history.clear","Clear")})})]}),N&&t.jsx("div",{className:c.historyLoading,children:e("uiStudio.history.loadingPlace","Loading current place...")}),!N&&u&&t.jsx("div",{className:c.historyLoading,children:e("uiStudio.history.loading","로딩 중...")}),!N&&!u&&d&&t.jsxs("div",{className:c.historyError,children:[e("uiStudio.history.error","오류"),": ",d]}),!N&&!u&&!d&&n===null&&t.jsx("div",{className:c.emptyHistory,children:e("uiStudio.history.noPlace","No current place data is available yet. Connect WEPPY Plugin and sync a place to view UI change history.")}),!N&&!u&&!d&&n!==null&&T.length===0&&t.jsx("div",{className:c.emptyHistory,children:e("uiStudio.history.empty","아직 변경 이력이 없습니다. AI 에이전트가 manage_ui 로 UI 를 수정하면 자동으로 기록됩니다.")}),!N&&!u&&n!==null&&T.length>0&&t.jsx("div",{className:c.requestList,children:T.map(C=>t.jsx(Ae,{req:C,placeId:n,onOpenCompare:w=>P(C.requestId,w)},C.requestId))}),G&&t.jsx("div",{className:c.deleteErrBanner,children:G})]}),m&&n!==null&&t.jsx(Le,{requestId:m,placeId:n,onClose:A})]}),x&&t.jsx(ae,{title:e("uiStudio.history.confirm.clearRequestsTitle","변경 이력 삭제"),message:e("uiStudio.history.confirm.clearRequestsMessage","현재 place의 변경 이력을 삭제합니다. Studio 인스턴스에는 영향을 주지 않습니다."),danger:!0,cascadeOption:{label:e("uiStudio.history.confirm.cascadeOption","연결된 화면 캡처도 함께 삭제"),checked:j,onChange:k},confirmLabel:e("common.delete","삭제"),onConfirm:h,onClose:()=>S(!1)})]})}function pn({tier:e}){return e==="basic"?t.jsx(un,{}):t.jsx(hn,{})}const _n=["analysis","history"];function jn(){const{t:e}=I(),{trackEvent:i}=q(),{tier:s,loading:n}=Ue(),[l,r]=Oe(),o=l.get("tab"),u=o&&_n.includes(o)?o:"analysis",d=m=>{i("dashboard_click_event",{click_target:m==="analysis"?"ui_studio_tab_analysis":"ui_studio_tab_history",page:"ui-studio",tab:m==="analysis"?"ui_studio_analysis":"ui_studio_history"}),r(p=>{const x=new URLSearchParams(p);return x.set("tab",m),x})},g=[{key:"analysis",label:t.jsx(y,{text:e("uiStudio.tabs.analysis.tooltip","Browse AI-captured UI screens and quickly find which UIs need improvement."),children:e("uiStudio.tabs.analysis","Analysis")})},{key:"history",label:t.jsx(y,{text:e("uiStudio.tabs.history.tooltip","Every UI change AI made, in order. Compare before and after screens."),children:e("uiStudio.tabs.history","History")})}];return t.jsxs("div",{className:a.page,children:[t.jsx(ze,{title:e("page.uiStudio.title","UI Studio"),description:e("page.uiStudio.description","Review UI captures, improvement suggestions, and before/after change history."),helpTopicId:"uiStudio",helpState:{tier:s}}),!n&&s==="pro"&&t.jsx(Ze,{surface:"uiStudio"}),t.jsx(Xe,{items:g,value:u,onChange:d}),n?t.jsx("div",{className:a.emptyState,children:e("uiStudio.loading","Loading...")}):u==="analysis"?t.jsx(mr,{tier:s}):t.jsx(pn,{tier:s})]})}export{jn as Component};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._card_1jxpn_2{position:relative;display:flex;flex-direction:column;gap:8px;padding:14px 16px;border:1px solid var(--border);border-radius:var(--radius);border-left-width:3px;background:var(--bg-card)}._cardUnread_1jxpn_15{border-left-color:var(--accent)}._cardRead_1jxpn_20{border-left-color:var(--text-muted)}._cardUnreadWarning_1jxpn_25{border-width:1px;border-color:var(--warning-border);background:var(--warning-bg)}._topRow_1jxpn_32{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._categoryChip_1jxpn_39{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;background:var(--accent-dim);color:var(--accent)}._versionChip_1jxpn_52{display:inline-flex;align-items:center;padding:2px 8px;border-radius:999px;font-size:11px;font-weight:600;background:#7f8daa24;color:var(--text-secondary);font-family:var(--font-code)}._importantBadge_1jxpn_64{display:inline-flex;align-items:center;padding:2px 8px;border:1px solid var(--warning-border);border-radius:var(--radius-sm);background:var(--warning-bg);color:var(--warning-text);font-size:11px;font-weight:800;letter-spacing:.04em}._date_1jxpn_77{margin-left:auto;font-size:12px;color:var(--text-muted);white-space:nowrap}._title_1jxpn_85{margin:0;font-size:var(--type-record-title-size);font-weight:700;color:var(--text-primary);line-height:var(--leading-title)}._body_1jxpn_94{font-size:var(--type-body-size);color:var(--text-secondary);line-height:var(--leading-body);white-space:pre-wrap;word-break:break-word}._linkList_1jxpn_102{display:flex;align-items:flex-start;flex-wrap:wrap;gap:8px}._link_1jxpn_102{display:inline-flex;align-items:center;gap:4px;font-size:13px;color:var(--accent);text-decoration:none;font-weight:600}._link_1jxpn_102:hover{text-decoration:underline}._internalLink_1jxpn_124{min-height:44px;padding:0 14px;border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg-secondary);color:var(--text-primary);font-size:14px}._internalLink_1jxpn_124:hover{border-color:var(--border-highlight);background:var(--accent-dim);text-decoration:none}._internalLink_1jxpn_124:focus-visible{outline:none;box-shadow:var(--focus-ring)}._newBadge_1jxpn_146{display:inline-flex;align-items:center;padding:1px 6px;border-radius:999px;font-size:10px;font-weight:800;letter-spacing:.06em;background:var(--error);color:#fff}._page_4653w_2{display:flex;flex-direction:column;gap:var(--space-page);max-width:720px}._section_4653w_10{display:flex;flex-direction:column;gap:var(--space-section)}._sectionTitle_4653w_16{display:flex;align-items:center;gap:var(--space-related);margin:0;font-size:var(--type-section-title-size);font-weight:600;color:var(--text-primary);text-transform:uppercase;letter-spacing:.06em}._unreadCount_4653w_28{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 6px;border-radius:999px;font-size:11px;font-weight:700;background:var(--error);color:#fff}._empty_4653w_43{padding:32px 0;text-align:center;font-size:14px;color:var(--text-muted)}._divider_4653w_51{height:1px;background:var(--border);border:none;margin:0}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u,j as e,L as y,H as f,r as g,J as N}from"./index-89-Xnii6.js";import{P as k}from"./PageHeader-B42Je0MJ.js";const C="_card_1jxpn_2",R="_cardUnread_1jxpn_15",v="_cardRead_1jxpn_20",L="_cardUnreadWarning_1jxpn_25",T="_topRow_1jxpn_32",B="_categoryChip_1jxpn_39",U="_versionChip_1jxpn_52",b="_importantBadge_1jxpn_64",S="_date_1jxpn_77",A="_title_1jxpn_85",E="_body_1jxpn_94",W="_linkList_1jxpn_102",$="_link_1jxpn_102",M="_internalLink_1jxpn_124",I="_newBadge_1jxpn_146",n={card:C,cardUnread:R,cardRead:v,cardUnreadWarning:L,topRow:T,categoryChip:B,versionChip:U,importantBadge:b,date:S,title:A,body:E,linkList:W,link:$,internalLink:M,newBadge:I},P={release:"whatsNew.category.release",notice:"whatsNew.category.notice",deprecation:"whatsNew.category.deprecation",tip:"whatsNew.category.tip"};function m({announcement:t,isNew:c}){const{locale:o,t:r}=u(),d=c?n.cardUnread:n.cardRead,l=t.severity==="warning",p=l&&c?n.cardUnreadWarning:"",w=t.title[o]??t.title.en,x=t.body[o]??t.body.en,h=t.links??(t.link?[t.link]:[]),_=s=>typeof s=="string"?s:s[o]??s.en;return e.jsxs("div",{className:`${n.card} ${d} ${p}`,children:[e.jsxs("div",{className:n.topRow,children:[e.jsx("span",{className:n.categoryChip,children:r(P[t.category])}),l&&e.jsx("span",{className:n.importantBadge,children:r("whatsNew.importantBadge","IMPORTANT")}),t.version&&e.jsx("span",{className:n.versionChip,children:t.version}),c&&e.jsx("span",{className:n.newBadge,children:r("whatsNew.newBadge","NEW")}),e.jsx("span",{className:n.date,children:t.date})]}),e.jsx("h3",{className:n.title,children:w}),e.jsx("p",{className:n.body,children:x}),h.length>0&&e.jsx("div",{className:n.linkList,children:h.map(s=>{const i=_(s.url),j=_(s.label);return i.startsWith("/")?e.jsx(y,{className:`${n.link} ${n.internalLink}`,to:i,children:j},i):e.jsxs("a",{className:n.link,href:i,target:"_blank",rel:"noopener noreferrer",children:["↗"," ",j]},i)})})]})}const z="_page_4653w_2",H="_section_4653w_10",O="_sectionTitle_4653w_16",Y="_unreadCount_4653w_28",G="_empty_4653w_43",J="_divider_4653w_51",a={page:z,section:H,sectionTitle:O,unreadCount:Y,empty:G,divider:J};function D(){const{t}=u(),{readSet:c,markRead:o}=f(),r=g.useMemo(()=>{const s=[];for(const i of N)c.has(i.id)||s.push(i.id);return s},[]),d=g.useRef(r);d.current=r,g.useEffect(()=>()=>{d.current.length>0&&o(d.current)},[]);const l=g.useMemo(()=>new Set(r),[r]),p=N.filter(s=>l.has(s.id)),w=N.filter(s=>!l.has(s.id)),x=p.length>0,h=w.length>0,_=e.jsx(k,{title:t("whatsNew.pageTitle","What's New"),description:t("whatsNew.pageSubtitle","Stay up to date with MCP changes"),helpTopicId:"whatsNew"});return N.length===0?e.jsxs("div",{className:a.page,children:[_,e.jsx("p",{className:a.empty,children:t("whatsNew.empty","No announcements yet")})]}):e.jsxs("div",{className:a.page,children:[_,x&&e.jsxs("section",{className:a.section,children:[e.jsxs("h2",{className:a.sectionTitle,children:[t("whatsNew.unreadSection","Unread"),e.jsx("span",{className:a.unreadCount,children:p.length})]}),p.map(s=>e.jsx(m,{announcement:s,isNew:!0},`unread-${s.id}`))]}),x&&h&&e.jsx("hr",{className:a.divider}),h&&e.jsxs("section",{className:a.section,children:[e.jsx("h2",{className:a.sectionTitle,children:t("whatsNew.allSection","All Announcements")}),w.map(s=>e.jsx(m,{announcement:s,isNew:!1},`all-${s.id}`))]})]})}export{D as Component};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{f as c}from"./index-89-Xnii6.js";/**
|
|
2
|
+
* @license lucide-react v1.8.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const e=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],t=c("check",e);export{t as C};
|