@weppy/roblox-mcp 2.17.1 → 2.17.2
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 +8 -0
- package/dashboard/dist/assets/AiPromptExamples-CJjCcxg8.js +1 -0
- package/dashboard/dist/assets/AiPromptExamples-DvVR2a1g.css +1 -0
- package/dashboard/dist/assets/AssetsPage-DTiyyQxl.js +61 -0
- package/dashboard/dist/assets/AssetsPage-DX8NUPQo.css +1 -0
- package/dashboard/dist/assets/{ChangelogPage-CRXXHovV.js → ChangelogPage-DuuVSnIa.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-Dz7mVKLZ.js → ConfirmModal-DaOuVA6n.js} +1 -1
- package/dashboard/dist/assets/{ConnectionPage-CKKn3lt0.js → ConnectionPage-BIq2TqY_.js} +1 -1
- package/dashboard/dist/assets/{ControlsPage-Ch6He2CV.js → ControlsPage-DqEbayDU.js} +1 -1
- package/dashboard/dist/assets/{CurrentPlaceScope-DhPCqaMU.js → CurrentPlaceScope-p_fkZWK9.js} +1 -1
- package/dashboard/dist/assets/{GameChangeDetail-CZuYgFvS.js → GameChangeDetail-BOp_DXQ9.js} +1 -1
- package/dashboard/dist/assets/{InfoLabel-BGeOUBIl.js → InfoLabel-gl5i0JQy.js} +1 -1
- package/dashboard/dist/assets/{OverviewPage-B-CtTLEP.js → OverviewPage-DcQz5h3p.js} +1 -1
- package/dashboard/dist/assets/{PageHeader-CYbeZdtL.js → PageHeader-BkXyqPrA.js} +1 -1
- package/dashboard/dist/assets/PlaytestAiPromptExamples-Ciyd-GNB.js +1 -0
- package/dashboard/dist/assets/{PlaytestPage-C092tN-C.js → PlaytestPage-CoclFxfc.js} +2 -2
- package/dashboard/dist/assets/{SettingsPage-bEHQn_8W.js → SettingsPage-BC0XIU-3.js} +1 -1
- package/dashboard/dist/assets/{StatusBadge-BmR5_DsF.js → StatusBadge-BQsRd8hv.js} +1 -1
- package/dashboard/dist/assets/{SyncPage-BFz_XQ40.js → SyncPage-DF2YdMPy.js} +1 -1
- package/dashboard/dist/assets/{Tabs-C7TenrZD.js → Tabs-Dy5daI-F.js} +1 -1
- package/dashboard/dist/assets/{TierPromoPanel-C02VRkHz.js → TierPromoPanel-nA1RBcJp.js} +1 -1
- package/dashboard/dist/assets/{ToolsPage-CJeoFakm.js → ToolsPage-DSsqmlnt.js} +1 -1
- package/dashboard/dist/assets/{TooltipText-sb-BSgUg.js → TooltipText-BEK9VoiS.js} +1 -1
- package/dashboard/dist/assets/UiStudioPage-CiRNdRE-.js +11 -0
- package/dashboard/dist/assets/{UiStudioPage-CSK5gQMN.css → UiStudioPage-DdLVbHdA.css} +1 -1
- package/dashboard/dist/assets/WhatsNewPage-DX9G9ZFd.js +1 -0
- package/dashboard/dist/assets/{bot-oMwejCZF.js → bot-B06rJuWg.js} +1 -1
- package/dashboard/dist/assets/{check-EdHXSSef.js → check-CZ_wdz7l.js} +1 -1
- package/dashboard/dist/assets/{copy-CePVq0VI.js → copy-CGFMtAPH.js} +1 -1
- package/dashboard/dist/assets/{index-DchewB5y.js → index-Hgv8iCTe.js} +36 -36
- package/dashboard/dist/assets/{sample-requests-CQvn7a4-.js → sample-requests-DafsjfJi.js} +1 -1
- package/dashboard/dist/assets/{trash-2-8V3SCC8q.js → trash-2-DMQtyT_y.js} +1 -1
- package/dashboard/dist/assets/{useLiveUptime-BeZ9TLyF.js → useLiveUptime-C6MCUOz0.js} +1 -1
- package/dashboard/dist/assets/{useSettings-D5XHMODc.js → useSettings-DfLxtt-w.js} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
- package/dashboard/dist/assets/AssetsPage-BRZSoLQp.css +0 -1
- package/dashboard/dist/assets/AssetsPage-ClzgrkC_.js +0 -56
- package/dashboard/dist/assets/PlaytestAiPromptExamples-DHVX0Ljy.css +0 -1
- package/dashboard/dist/assets/PlaytestAiPromptExamples-flhav1EU.js +0 -1
- package/dashboard/dist/assets/UiStudioPage-C5dYQMax.js +0 -11
- package/dashboard/dist/assets/WhatsNewPage-C_z4g3oa.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as e,r as i,b as I,D as ht,u as at,X as mt,a as bt,i as xt}from"./index-DchewB5y.js";import{P as ft}from"./PageHeader-CYbeZdtL.js";import{T as M}from"./TooltipText-sb-BSgUg.js";import{C as _t}from"./ConfirmModal-Dz7mVKLZ.js";import{T as gt,C as jt}from"./Tabs-C7TenrZD.js";import{C as yt}from"./CurrentPlaceScope-DhPCqaMU.js";import"./ConfirmModal.module-DJksQHBd.js";const Ct="_wrapper_1s3lp_2",Tt="_table_1s3lp_7",kt="_sortable_1s3lp_32",Nt="_sortArrow_1s3lp_41",St="_clickable_1s3lp_52",wt="_empty_1s3lp_57",A={wrapper:Ct,table:Tt,sortable:kt,sortArrow:Nt,clickable:St,empty:wt};function vt({columns:t,data:o,sortBy:c,sortDir:T="asc",onSort:b,onRowClick:l,rowKey:N,emptyMessage:S}){return e.jsx("div",{className:A.wrapper,children:e.jsxs("table",{className:A.table,children:[e.jsx("thead",{children:e.jsx("tr",{children:t.map(h=>e.jsxs("th",{style:h.width?{width:h.width}:void 0,className:h.sortable?A.sortable:void 0,onClick:h.sortable&&b?()=>b(h.key):void 0,children:[e.jsx("span",{children:h.label}),h.sortable&&c===h.key&&e.jsx("span",{className:A.sortArrow,children:T==="asc"?"▴":"▾"})]},h.key))})}),e.jsx("tbody",{children:o.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:t.length,className:A.empty,children:S||"No data"})}):o.map((h,w)=>{const C=N?N(h):String(w);return e.jsx("tr",{className:l?A.clickable:void 0,tabIndex:l?-1:void 0,onClick:l?_=>l(h,_.currentTarget):void 0,children:t.map(_=>e.jsx("td",{children:_.render?_.render(h):String(h[_.key]??"")},_.key))},C)})})]})})}function Mt(t){return{...t,sequenceNumber:typeof t.sequenceNumber=="number"?t.sequenceNumber:void 0,executionTimeMs:typeof t.executionTimeMs=="number"?t.executionTimeMs:void 0}}const Bt=50;function Pt(t){if(typeof t=="number")return{placeId:String(t)}}function Y(t,o){return typeof o!="number"?t:`${t}?placeId=${encodeURIComponent(String(o))}`}function Lt(t){const o=(t==null?void 0:t.placeId)??null,[c,T]=i.useState(null),[b,l]=i.useState(!0),[N,S]=i.useState([]),[h,w]=i.useState(0),[C,_]=i.useState(!1),[U,O]=i.useState(!0),[m,E]=i.useState(0),[g,F]=i.useState(""),B=i.useRef(null),k=i.useCallback(async()=>{l(!0);try{const j=Pt(o),u=j?await I.get("/api/dashboard/tool-stats",j):await I.get("/api/dashboard/tool-stats");T(u)}catch{}finally{l(!1)}},[o]),x=i.useCallback(async(j,u)=>{O(!0);try{const P={limit:String(Bt),offset:String(j)};u&&(P.tool=u),typeof o=="number"&&(P.placeId=String(o));const H=await I.get("/api/dashboard/history",P);S(H.entries.map(Mt)),w(H.total),_(H.hasMore)}catch{S([]),w(0),_(!1)}finally{O(!1)}},[o]),D=i.useCallback(()=>{k(),x(m,g)},[x,k,m,g]),V=i.useCallback(async()=>{await I.post(Y("/api/dashboard/tools/history/clear",o)),x(m,g)},[x,m,g,o]),K=i.useCallback(async()=>{await I.post(Y("/api/dashboard/tools/statistics/clear",o)),k()},[k,o]);return i.useEffect(()=>{k()},[k]),i.useEffect(()=>{x(m,g)},[x,m,g]),i.useEffect(()=>{const j=new ht;B.current=j,j.connect();const u=j.on("command",()=>{k(),x(m,g)});return()=>{u(),j.disconnect(),B.current=null}},[x,k,m,g]),{statistics:c,statsLoading:b,history:N,historyTotal:h,historyHasMore:C,historyLoading:U,historyOffset:m,historyToolFilter:g,setHistoryOffset:E,setHistoryToolFilter:F,refresh:D,clearHistory:V,clearStatistics:K}}const Et="_page_1rtjt_2",Ht="_card_1rtjt_14",At="_cardToolbar_1rtjt_21",Rt="_sectionTitle_1rtjt_29",It="_dangerButton_1rtjt_36",Ot="_proBadge_1rtjt_55",Ft="_statusOk_1rtjt_70",Dt="_statusFallback_1rtjt_83",$t="_statusUnsupported_1rtjt_96",qt="_statusWarning_1rtjt_109",Wt="_statusError_1rtjt_122",Ut="_tierBasic_1rtjt_136",Vt="_tierPro_1rtjt_140",Kt="_tierMixed_1rtjt_145",Gt="_filterRow_1rtjt_156",zt="_filterLabel_1rtjt_163",Jt="_filterSelect_1rtjt_172",Qt="_detailsButton_1rtjt_187",Zt="_detailShell_1rtjt_210",Xt="_detailHeader_1rtjt_218",Yt="_detailHeading_1rtjt_229",te="_detailTitle_1rtjt_236",ee="_detailRecordName_1rtjt_243",se="_detailHeaderActions_1rtjt_252",ae="_detailCloseButton_1rtjt_259",oe="_detailBody_1rtjt_282",le="_detailSection_1rtjt_294",re="_detailList_1rtjt_313",ie="_detailItem_1rtjt_319",ne="_detailLabel_1rtjt_326",ce="_detailValue_1rtjt_331",de="_pre_1rtjt_337",ue="_pagination_1rtjt_355",pe="_pageInfo_1rtjt_363",he="_btn_1rtjt_369",me="_tierDistribution_1rtjt_397",be="_tierBarWrap_1rtjt_401",xe="_tierBarBasic_1rtjt_409",fe="_tierBarPro_1rtjt_414",_e="_tierLabels_1rtjt_419",ge="_statsTableWrap_1rtjt_428",je="_statsTable_1rtjt_428",ye="_sortableHeader_1rtjt_460",Ce="_sortArrow_1rtjt_465",Te="_statsToolRow_1rtjt_469",ke="_statsActionRow_1rtjt_477",Ne="_expandButton_1rtjt_481",Se="_expandIcon_1rtjt_493",we="_actionLabel_1rtjt_498",ve="_emptyStats_1rtjt_505",Me="_summaryLine_1rtjt_511",a={page:Et,card:Ht,cardToolbar:At,sectionTitle:Rt,dangerButton:It,proBadge:Ot,statusOk:Ft,statusFallback:Dt,statusUnsupported:$t,statusWarning:qt,statusError:Wt,tierBasic:Ut,tierPro:Vt,tierMixed:Kt,filterRow:Gt,filterLabel:zt,filterSelect:Jt,detailsButton:Qt,detailShell:Zt,detailHeader:Xt,detailHeading:Yt,detailTitle:te,detailRecordName:ee,detailHeaderActions:se,detailCloseButton:ae,detailBody:oe,detailSection:le,detailList:re,detailItem:ie,detailLabel:ne,detailValue:ce,pre:de,pagination:ue,pageInfo:pe,btn:he,tierDistribution:me,tierBarWrap:be,tierBarBasic:xe,tierBarPro:fe,tierLabels:_e,statsTableWrap:ge,statsTable:je,sortableHeader:ye,sortArrow:Ce,statsToolRow:Te,statsActionRow:ke,expandButton:Ne,expandIcon:Se,actionLabel:we,emptyStats:ve,summaryLine:Me},Be=new Set(["clientId","placeId","pinnedTarget","recentPriority","globalQueue"]);function tt(t){return typeof t=="string"&&t.length>0?t:void 0}function Pe(t){if(!Array.isArray(t))return;const o=t.filter(c=>typeof c=="string"&&c.length>0);return o.length>0?o:void 0}function Le(t){const o=t.result??{};return{requestedCommand:t.requestedCommand??tt(o.requestedCommand),executedCommand:t.executedCommand??tt(o.executedCommand),alternatives:t.alternatives??Pe(o.alternatives)}}function ot(t,o){switch(t.status){case"fallback":return{label:o("tools.badge.fallback","FALLBACK"),tooltip:o("tools.badge.fallback.tooltip","The requested Pro action succeeded via a Basic fallback."),className:a.statusFallback};case"unsupported":return{label:o("tools.badge.unsupported","UNSUPPORTED"),tooltip:o("tools.badge.unsupported.tooltip","The requested Pro action was blocked and no fallback ran."),className:a.statusUnsupported};case"warning":return{label:o("tools.badge.warn","WARN"),tooltip:o("tools.badge.warn.tooltip","The tool call failed as an expected caller, project, policy, or user-code issue."),className:a.statusWarning};case"error":return{label:o("tools.badge.err","FAILED"),tooltip:o("tools.badge.err.tooltip","The tool run failed."),className:a.statusError};default:return{label:o("tools.status.ok","OK"),tooltip:o("tools.status.ok.tooltip","The tool run completed successfully."),className:a.statusOk}}}function y(t,o){return e.jsxs("div",{className:a.detailItem,children:[e.jsx("span",{className:a.detailLabel,children:t}),e.jsx("span",{className:a.detailValue,children:o})]})}function Ee(t){if(!t||typeof t!="object")return;const o=t;if(typeof o.selectionMode=="string"&&Be.has(o.selectionMode))return o}function et(t){if(!(!t||typeof t!="object"||!("routing"in t)))return Ee(t.routing)}function He(t){return t.routing??et(t.result)??et(t.data)}function Ae(t,o){return t.requestedClientId?t.requestedClientId:t.requestedPlaceId!==void 0?t.requestedPlaceId:o("tools.history.routing.none","No Studio target named")}function Re(t){return t.actualPlaceName?`${t.actualPlaceName} · ${t.actualPlaceId??"-"}`:t.actualClientId??"-"}function Ie({entry:t,onClose:o}){const{t:c}=at(),T=ot(t,c),b=Le(t),l=He(t);return e.jsxs("div",{className:a.detailShell,children:[e.jsxs("header",{className:a.detailHeader,children:[e.jsxs("div",{className:a.detailHeading,children:[e.jsx("span",{className:a.detailTitle,children:c("tools.detail.title","Tool execution")}),e.jsx("span",{className:a.detailRecordName,children:t.command})]}),e.jsxs("div",{className:a.detailHeaderActions,children:[e.jsx(M,{text:T.tooltip,children:e.jsx("span",{className:T.className,children:T.label})}),e.jsx("button",{type:"button",className:a.detailCloseButton,onClick:o,"aria-label":c("common.close","Close"),children:e.jsx(mt,{size:18,"aria-hidden":"true"})})]})]}),e.jsxs("div",{className:a.detailBody,children:[e.jsxs("section",{className:a.detailSection,children:[e.jsx("strong",{children:e.jsx(M,{text:c("tools.detail.params.tooltip","Input parameters passed to this tool run."),children:c("tools.detail.params","Parameters")})}),e.jsx("pre",{className:a.pre,children:JSON.stringify(t.parameters,null,2)})]}),t.result&&e.jsxs("section",{className:a.detailSection,children:[e.jsx("strong",{children:e.jsx(M,{text:c("tools.detail.result.tooltip","Returned result payload for this tool run."),children:c("tools.detail.result","Result")})}),e.jsx("pre",{className:a.pre,children:JSON.stringify(t.result,null,2)})]}),l&&e.jsxs("section",{className:a.detailSection,children:[e.jsx("strong",{children:c("tools.history.routing","Routing")}),e.jsxs("div",{className:a.detailList,children:[y(c("tools.history.routing.mode","Mode"),l.selectionMode),y(c("tools.history.routing.requested","Requested"),Ae(l,c)),y(c("tools.history.routing.actual","Actual"),Re(l))]})]}),(t.status==="fallback"||t.status==="unsupported"||t.status==="warning"||t.status==="error")&&e.jsx("section",{className:a.detailSection,children:e.jsxs("div",{className:a.detailList,children:[t.status==="fallback"&&b.requestedCommand?y(c("tools.detail.requestedCommand","Requested Command"),b.requestedCommand):null,t.status==="fallback"&&b.executedCommand?y(c("tools.detail.executedCommand","Executed Command"),b.executedCommand):null,t.status==="fallback"&&b.alternatives?y(c("tools.detail.alternatives","Alternatives"),b.alternatives.join(", ")):null,t.status==="unsupported"&&t.blockedMessage?y(c("tools.detail.blockedMessage","Blocked Reason"),t.blockedMessage):null,t.status==="unsupported"?y(c("tools.detail.noFallback","No Fallback"),c("tools.detail.noFallback.value","No fallback ran.")):null,t.status==="warning"&&t.warningMessage?y(c("tools.detail.warningMessage","Warning Message"),t.warningMessage):null,t.status==="error"&&t.errorMessage?y(c("tools.detail.errorMessage","Error Message"),t.errorMessage):null,t.status==="error"&&t.blockedMessage?y(c("tools.detail.blockedMessage","Blocked Reason"),t.blockedMessage):null,t.status==="error"&&t.fallbackCommand?y(c("tools.detail.executedCommand","Executed Command"),t.fallbackCommand):null]})})]})]})}const G=50;function Oe(t){const o=new Date(t);return`${String(o.getHours()).padStart(2,"0")}:${String(o.getMinutes()).padStart(2,"0")}:${String(o.getSeconds()).padStart(2,"0")}`}function W(t){return typeof t!="number"||!Number.isFinite(t)?"-":t<1e3?`${t}ms`:`${(t/1e3).toFixed(1)}s`}function R(t,o){return o==="pro"?t("tier.pro","Pro"):o==="mixed"?t("tier.mixed","Mixed"):t("tier.basic","Basic")}function lt(t,o){return o!==t&&o.startsWith(`${t}_`)?o.slice(t.length+1):""}function st(t,o){const c=lt(t,o);return c?`${t}.${c}`:t}function Ge(){const{t}=at(),{trackEvent:o,trackPageView:c}=bt(),[T,b]=i.useState(null),l=Lt({placeId:T}),{show:N}=xt(),[S,h]=i.useState("history"),[w,C]=i.useState(null),_=i.useRef(null),[U,O]=i.useState(null),[m,E]=i.useState(null),[g,F]=i.useState(!1),[B,k]=i.useState("totalCalls"),[x,D]=i.useState("desc"),V=i.useCallback(s=>{k(n=>n===s?(D(r=>r==="asc"?"desc":"asc"),s):(D("desc"),s))},[]),K=i.useMemo(()=>{var n;const s=new Set;return Object.keys(((n=l.statistics)==null?void 0:n.tools)??{}).forEach(r=>s.add(r)),l.history.forEach(r=>{r.tool&&s.add(r.tool)}),l.historyToolFilter&&s.add(l.historyToolFilter),Array.from(s).sort()},[l.history,l.historyToolFilter,l.statistics]),j=i.useMemo(()=>{var s;return(s=l.statistics)!=null&&s.tools?Object.values(l.statistics.tools).map(n=>{var X;const r=Object.entries(n.commands??{}).map(([p,d])=>({toolName:n.tool,commandName:d.command??p,label:lt(n.tool,d.command??p)||(d.command??p),tier:d.tier,totalCalls:d.totalCalls,successCount:d.successCount,fallbackCount:d.fallbackCount,unsupportedCount:d.unsupportedCount,warningCount:d.warningCount??0,failureCount:d.failureCount,totalExecutionTimeMs:d.totalExecutionTimeMs,avgExecutionTimeMs:d.avgExecutionTimeMs})),f=r.reduce((p,d)=>p+d.totalCalls,0),v=r.reduce((p,d)=>p+d.successCount,0),$=r.reduce((p,d)=>p+d.fallbackCount,0),q=r.reduce((p,d)=>p+d.unsupportedCount,0),dt=r.reduce((p,d)=>p+d.warningCount,0),ut=r.reduce((p,d)=>p+d.failureCount,0),Z=r.reduce((p,d)=>p+d.totalExecutionTimeMs,0),pt=new Set(r.map(p=>p.tier)).size>1?"mixed":((X=r[0])==null?void 0:X.tier)??n.tier;return{toolName:n.tool,tier:pt,commands:r,totalCalls:f,successCount:v,fallbackCount:$,unsupportedCount:q,warningCount:dt,failureCount:ut,totalExecutionTimeMs:Z,avgExecutionTimeMs:f>0?Math.round(Z/f):0}}):[]},[l.statistics]),u=i.useCallback((s,n,r,f)=>e.jsx(M,{text:t(r,f),children:t(s,n)}),[t]),P=i.useCallback((s,n)=>{_.current=n,C(s)},[]),H=i.useCallback(()=>{C(null)},[]),z=i.useMemo(()=>[...j].sort((n,r)=>{const f=n[B],v=r[B];if(typeof f=="number"&&typeof v=="number")return x==="asc"?f-v:v-f;const $=String(f??""),q=String(v??"");return x==="asc"?$.localeCompare(q):q.localeCompare($)}),[j,B,x]),rt=i.useMemo(()=>[{key:"timestamp",label:u("tools.col.time","Time","tools.col.time.tooltip","When the tool run was recorded."),width:"80px",render:s=>Oe(s.timestamp)},{key:"toolName",label:u("tools.col.toolAction","Tool.Action","tools.col.toolAction.tooltip","Tool name and action that were executed."),render:s=>e.jsxs("span",{children:[st(s.tool,s.command),s.tier==="pro"&&e.jsx(M,{text:t("tools.badge.pro.tooltip","This entry used a Pro-only tool or action."),children:e.jsx("span",{className:a.proBadge,children:t("tools.badge.pro","PRO")})})]})},{key:"executionTimeMs",label:u("tools.col.duration","Duration","tools.col.duration.tooltip","How long the tool took to finish."),width:"80px",render:s=>W(s.executionTimeMs)},{key:"status",label:u("tools.col.status","Status","tools.col.status.tooltip","Outcome of the recorded tool run."),width:"120px",render:s=>{const n=ot(s,t);return e.jsx(M,{text:n.tooltip,children:e.jsx("span",{className:n.className,children:n.label})})}},{key:"tier",label:u("tools.col.tier","Tier","tools.col.tier.tooltip","License tier required for the tool or action."),width:"60px",render:s=>e.jsx("span",{className:s.tier==="pro"?a.tierPro:a.tierBasic,children:R(t,s.tier)})},{key:"details",label:t("tools.detail.open","Details"),width:"84px",render:s=>{const n=st(s.tool,s.command);return e.jsx("button",{type:"button",className:a.detailsButton,"aria-haspopup":"dialog","aria-label":t("tools.detail.openLabel","View details for {command}").replace("{command}",n),onClick:r=>{r.stopPropagation(),P(s,r.currentTarget)},children:t("tools.detail.open","Details")})}}],[P,t,u]),J=i.useMemo(()=>[{key:"toolName",label:u("tools.col.tool","Tool","tools.col.tool.tooltip","Consolidated tool name in the statistics table."),sortable:!0},{key:"totalCalls",label:u("tools.col.calls","Calls","tools.col.calls.tooltip","Total number of recorded calls for this tool."),sortable:!0,width:"70px"},{key:"successCount",label:u("tools.col.ok","OK","tools.col.ok.tooltip","Number of direct successful runs."),sortable:!0,width:"70px"},{key:"fallbackCount",label:u("tools.col.fallback","FALLBACK","tools.col.fallback.tooltip","Number of runs that succeeded through fallback execution."),sortable:!0,width:"110px"},{key:"unsupportedCount",label:u("tools.col.unsupported","UNSUPPORTED","tools.col.unsupported.tooltip","Number of blocked runs without fallback execution."),sortable:!0,width:"130px"},{key:"warningCount",label:u("tools.col.warn","WARN","tools.col.warn.tooltip","Number of expected failures caused by caller input, project state, Roblox policy, or user code."),sortable:!0,width:"80px"},{key:"failureCount",label:u("tools.col.err","FAILED","tools.col.err.tooltip","Number of runs that failed."),sortable:!0,width:"70px"},{key:"avgExecutionTimeMs",label:u("tools.col.avgTime","Avg Time","tools.col.avgTime.tooltip","Average execution time across recorded calls."),sortable:!0,width:"90px",render:s=>W(s.avgExecutionTimeMs)},{key:"tier",label:u("tools.col.tier","Tier","tools.col.tierStats.tooltip","Basic, Pro, or Mixed summary for the tool statistics row."),sortable:!0,width:"70px",render:s=>e.jsx(M,{text:s.tier==="mixed"?t("tools.tier.mixed.tooltip","This tool includes both Basic and Pro actions."):"",children:e.jsx("span",{className:s.tier==="pro"?a.tierPro:s.tier==="mixed"?a.tierMixed:a.tierBasic,children:R(t,s.tier)})})}],[t,u]),L=i.useMemo(()=>{if(!l.statistics)return null;const s=l.statistics.tierSummary.basic.totalCalls,n=l.statistics.tierSummary.pro.totalCalls,r=s+n;if(r===0)return null;const f=Math.round(s/r*100),v=100-f;return{basic:s,pro:n,basicPct:f,proPct:v}},[l.statistics]),Q=i.useCallback(s=>{O(n=>n===s?null:s)},[]),it=i.useCallback(async()=>{if(m){F(!0);try{m==="history"?await l.clearHistory():await l.clearStatistics(),N(t("toast.clearSuccess","Cleared successfully"),"success"),E(null)}catch{N(t("toast.clearFailed","Failed to clear data"),"error")}finally{F(!1)}}},[m,N,t,l]),nt=i.useCallback(s=>{const n=s==="history"?"tools_history":"tools_statistics";o("dashboard_click_event",{click_target:s==="history"?"tools_tab_history":"tools_tab_statistics",page:"tools",tab:n}),c({page:"tools",tab:n}),C(null),h(s)},[o,c]),ct=["history","statistics"].map(s=>({key:s,label:t(`tools.tab.${s}`,s.charAt(0).toUpperCase()+s.slice(1))}));return e.jsxs("div",{className:a.page,children:[e.jsx(ft,{title:t("page.tools.title","Tools"),description:t("page.tools.description","Inspect tool history, outcomes, fallback details, and usage statistics."),helpTopicId:"tools"}),e.jsx(yt,{surface:"tools",selectable:!0,selectedPlaceId:T,onSelectedPlaceIdChange:s=>{C(null),b(s),l.setHistoryOffset(0)}}),e.jsx(gt,{items:ct,value:S,onChange:nt}),S==="history"&&e.jsxs("div",{className:a.card,children:[e.jsxs("div",{className:a.cardToolbar,children:[e.jsx("div",{className:a.sectionTitle,children:t("tools.tab.history","History")}),e.jsx("button",{className:a.dangerButton,onClick:()=>{o("dashboard_click_event",{click_target:"tools_clear_history",page:"tools",tab:"tools_history"}),E("history")},children:t("common.clear","Clear")})]}),e.jsx("div",{className:a.filterRow,children:e.jsxs("label",{className:a.filterLabel,children:[t("tools.filter.tool","Tool"),":",e.jsxs("select",{className:a.filterSelect,value:l.historyToolFilter,onChange:s=>{C(null),l.setHistoryToolFilter(s.target.value),l.setHistoryOffset(0)},children:[e.jsx("option",{value:"",children:t("tools.filter.all","All")}),K.map(s=>e.jsx("option",{value:s,children:s},s))]})]})}),e.jsx(vt,{columns:rt,data:l.history,rowKey:s=>s.id,onRowClick:(s,n)=>P(s,n),emptyMessage:t("tools.empty.history","No tool history entries for this place")}),e.jsxs("div",{className:a.pagination,children:[e.jsx("button",{className:a.btn,disabled:l.historyOffset===0,title:t("tools.page.prev.tooltip","Go to the previous page of tool history results."),onClick:()=>{C(null),l.setHistoryOffset(Math.max(0,l.historyOffset-G))},children:t("tools.page.prev","Prev")}),e.jsxs("span",{className:a.pageInfo,children:[l.historyOffset+1,"–",Math.min(l.historyOffset+G,l.historyTotal)," / ",l.historyTotal]}),e.jsx("button",{className:a.btn,disabled:!l.historyHasMore,title:t("tools.page.next.tooltip","Go to the next page of tool history results."),onClick:()=>{C(null),l.setHistoryOffset(l.historyOffset+G)},children:t("tools.page.next","Next")})]})]}),S==="statistics"&&e.jsxs("div",{className:a.card,children:[e.jsxs("div",{className:a.cardToolbar,children:[e.jsx("div",{className:a.sectionTitle,children:t("tools.tab.statistics","Statistics")}),e.jsx("button",{className:a.dangerButton,onClick:()=>{o("dashboard_click_event",{click_target:"tools_clear_statistics",page:"tools",tab:"tools_statistics"}),E("statistics")},children:t("common.clear","Clear")})]}),L&&e.jsxs("div",{className:a.tierDistribution,children:[e.jsxs("div",{className:a.tierBarWrap,children:[e.jsx("div",{className:a.tierBarBasic,style:{width:`${L.basicPct}%`}}),e.jsx("div",{className:a.tierBarPro,style:{width:`${L.proPct}%`}})]}),e.jsxs("div",{className:a.tierLabels,children:[e.jsxs("span",{children:[R(t,"basic")," ",L.basicPct,"% (",L.basic,")"]}),e.jsxs("span",{children:[R(t,"pro")," ",L.proPct,"% (",L.pro,")"]})]})]}),e.jsx("div",{className:a.statsTableWrap,children:e.jsxs("table",{className:a.statsTable,children:[e.jsx("thead",{children:e.jsx("tr",{children:J.map(s=>e.jsxs("th",{style:s.width?{width:s.width}:void 0,className:s.sortable?a.sortableHeader:void 0,onClick:s.sortable?()=>V(s.key):void 0,children:[e.jsx("span",{children:s.label}),s.sortable&&B===s.key&&e.jsx("span",{className:a.sortArrow,children:x==="asc"?"▴":"▾"})]},s.key))})}),e.jsx("tbody",{children:z.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:J.length,className:a.emptyStats,children:t("tools.empty.stats","No tool statistics for this place")})}):z.map(s=>{const n=U===s.toolName;return e.jsxs(i.Fragment,{children:[e.jsxs("tr",{className:a.statsToolRow,onClick:()=>Q(s.toolName),children:[e.jsx("td",{children:e.jsxs("button",{type:"button",className:a.expandButton,"aria-expanded":n,"aria-label":`${s.toolName} ${n?t("common.collapse","Collapse"):t("common.expand","Expand")}`,onClick:r=>{r.stopPropagation(),Q(s.toolName)},children:[e.jsx("span",{className:a.expandIcon,"aria-hidden":"true",children:n?"▾":"▸"}),e.jsx("span",{children:s.toolName})]})}),e.jsx("td",{children:s.totalCalls}),e.jsx("td",{children:s.successCount}),e.jsx("td",{children:s.fallbackCount}),e.jsx("td",{children:s.unsupportedCount}),e.jsx("td",{children:s.warningCount}),e.jsx("td",{children:s.failureCount}),e.jsx("td",{children:W(s.avgExecutionTimeMs)}),e.jsx("td",{children:e.jsx(M,{text:s.tier==="mixed"?t("tools.tier.mixed.tooltip","This tool includes both Basic and Pro actions."):"",children:e.jsx("span",{className:s.tier==="pro"?a.tierPro:s.tier==="mixed"?a.tierMixed:a.tierBasic,children:R(t,s.tier)})})})]}),n&&s.commands.map(r=>e.jsxs("tr",{className:a.statsActionRow,children:[e.jsx("td",{children:e.jsx("span",{className:a.actionLabel,children:r.label})}),e.jsx("td",{children:r.totalCalls}),e.jsx("td",{children:r.successCount}),e.jsx("td",{children:r.fallbackCount}),e.jsx("td",{children:r.unsupportedCount}),e.jsx("td",{children:r.warningCount}),e.jsx("td",{children:r.failureCount}),e.jsx("td",{children:W(r.avgExecutionTimeMs)}),e.jsx("td",{children:e.jsx("span",{className:r.tier==="pro"?a.tierPro:a.tierBasic,children:R(t,r.tier)})})]},`${s.toolName}:${r.commandName}`))]},s.toolName)})})]})}),l.statistics&&e.jsxs("div",{className:a.summaryLine,children:[t("tools.summary.total","Total"),": ",l.statistics.totalCalls," ",t("tools.summary.calls","calls")," | ",t("tools.summary.sessions","Sessions"),": ",l.statistics.totalSessions]})]}),e.jsx(jt,{open:w!==null,ariaLabel:t("tools.detail.dialogLabel","Tool execution detail"),onClose:H,returnFocusTo:_.current,testId:"tools-history-detail-popup-layer",children:w&&e.jsx(Ie,{entry:w,onClose:H})}),e.jsx(_t,{open:m!==null,title:m==="history"?t("tools.clear.history.title","Clear history?"):t("tools.clear.statistics.title","Clear statistics?"),message:m==="history"?t("tools.clear.history.message","This permanently removes the current place tools history."):t("tools.clear.statistics.message","This permanently resets the current place tool statistics."),cancelLabel:t("common.cancel","Cancel"),confirmLabel:t("common.clear","Clear"),loading:g,onCancel:()=>!g&&E(null),onConfirm:it})]})}export{Ge as Component};
|
|
1
|
+
import{j as e,r as i,b as I,D as ht,u as at,X as mt,a as bt,i as xt}from"./index-Hgv8iCTe.js";import{P as ft}from"./PageHeader-BkXyqPrA.js";import{T as M}from"./TooltipText-BEK9VoiS.js";import{C as _t}from"./ConfirmModal-DaOuVA6n.js";import{T as gt,C as jt}from"./Tabs-Dy5daI-F.js";import{C as yt}from"./CurrentPlaceScope-p_fkZWK9.js";import"./ConfirmModal.module-DJksQHBd.js";const Ct="_wrapper_1s3lp_2",Tt="_table_1s3lp_7",kt="_sortable_1s3lp_32",Nt="_sortArrow_1s3lp_41",St="_clickable_1s3lp_52",wt="_empty_1s3lp_57",A={wrapper:Ct,table:Tt,sortable:kt,sortArrow:Nt,clickable:St,empty:wt};function vt({columns:t,data:o,sortBy:c,sortDir:T="asc",onSort:b,onRowClick:l,rowKey:N,emptyMessage:S}){return e.jsx("div",{className:A.wrapper,children:e.jsxs("table",{className:A.table,children:[e.jsx("thead",{children:e.jsx("tr",{children:t.map(h=>e.jsxs("th",{style:h.width?{width:h.width}:void 0,className:h.sortable?A.sortable:void 0,onClick:h.sortable&&b?()=>b(h.key):void 0,children:[e.jsx("span",{children:h.label}),h.sortable&&c===h.key&&e.jsx("span",{className:A.sortArrow,children:T==="asc"?"▴":"▾"})]},h.key))})}),e.jsx("tbody",{children:o.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:t.length,className:A.empty,children:S||"No data"})}):o.map((h,w)=>{const C=N?N(h):String(w);return e.jsx("tr",{className:l?A.clickable:void 0,tabIndex:l?-1:void 0,onClick:l?_=>l(h,_.currentTarget):void 0,children:t.map(_=>e.jsx("td",{children:_.render?_.render(h):String(h[_.key]??"")},_.key))},C)})})]})})}function Mt(t){return{...t,sequenceNumber:typeof t.sequenceNumber=="number"?t.sequenceNumber:void 0,executionTimeMs:typeof t.executionTimeMs=="number"?t.executionTimeMs:void 0}}const Bt=50;function Pt(t){if(typeof t=="number")return{placeId:String(t)}}function Y(t,o){return typeof o!="number"?t:`${t}?placeId=${encodeURIComponent(String(o))}`}function Lt(t){const o=(t==null?void 0:t.placeId)??null,[c,T]=i.useState(null),[b,l]=i.useState(!0),[N,S]=i.useState([]),[h,w]=i.useState(0),[C,_]=i.useState(!1),[U,O]=i.useState(!0),[m,E]=i.useState(0),[g,F]=i.useState(""),B=i.useRef(null),k=i.useCallback(async()=>{l(!0);try{const j=Pt(o),u=j?await I.get("/api/dashboard/tool-stats",j):await I.get("/api/dashboard/tool-stats");T(u)}catch{}finally{l(!1)}},[o]),x=i.useCallback(async(j,u)=>{O(!0);try{const P={limit:String(Bt),offset:String(j)};u&&(P.tool=u),typeof o=="number"&&(P.placeId=String(o));const H=await I.get("/api/dashboard/history",P);S(H.entries.map(Mt)),w(H.total),_(H.hasMore)}catch{S([]),w(0),_(!1)}finally{O(!1)}},[o]),D=i.useCallback(()=>{k(),x(m,g)},[x,k,m,g]),V=i.useCallback(async()=>{await I.post(Y("/api/dashboard/tools/history/clear",o)),x(m,g)},[x,m,g,o]),K=i.useCallback(async()=>{await I.post(Y("/api/dashboard/tools/statistics/clear",o)),k()},[k,o]);return i.useEffect(()=>{k()},[k]),i.useEffect(()=>{x(m,g)},[x,m,g]),i.useEffect(()=>{const j=new ht;B.current=j,j.connect();const u=j.on("command",()=>{k(),x(m,g)});return()=>{u(),j.disconnect(),B.current=null}},[x,k,m,g]),{statistics:c,statsLoading:b,history:N,historyTotal:h,historyHasMore:C,historyLoading:U,historyOffset:m,historyToolFilter:g,setHistoryOffset:E,setHistoryToolFilter:F,refresh:D,clearHistory:V,clearStatistics:K}}const Et="_page_1rtjt_2",Ht="_card_1rtjt_14",At="_cardToolbar_1rtjt_21",Rt="_sectionTitle_1rtjt_29",It="_dangerButton_1rtjt_36",Ot="_proBadge_1rtjt_55",Ft="_statusOk_1rtjt_70",Dt="_statusFallback_1rtjt_83",$t="_statusUnsupported_1rtjt_96",qt="_statusWarning_1rtjt_109",Wt="_statusError_1rtjt_122",Ut="_tierBasic_1rtjt_136",Vt="_tierPro_1rtjt_140",Kt="_tierMixed_1rtjt_145",Gt="_filterRow_1rtjt_156",zt="_filterLabel_1rtjt_163",Jt="_filterSelect_1rtjt_172",Qt="_detailsButton_1rtjt_187",Zt="_detailShell_1rtjt_210",Xt="_detailHeader_1rtjt_218",Yt="_detailHeading_1rtjt_229",te="_detailTitle_1rtjt_236",ee="_detailRecordName_1rtjt_243",se="_detailHeaderActions_1rtjt_252",ae="_detailCloseButton_1rtjt_259",oe="_detailBody_1rtjt_282",le="_detailSection_1rtjt_294",re="_detailList_1rtjt_313",ie="_detailItem_1rtjt_319",ne="_detailLabel_1rtjt_326",ce="_detailValue_1rtjt_331",de="_pre_1rtjt_337",ue="_pagination_1rtjt_355",pe="_pageInfo_1rtjt_363",he="_btn_1rtjt_369",me="_tierDistribution_1rtjt_397",be="_tierBarWrap_1rtjt_401",xe="_tierBarBasic_1rtjt_409",fe="_tierBarPro_1rtjt_414",_e="_tierLabels_1rtjt_419",ge="_statsTableWrap_1rtjt_428",je="_statsTable_1rtjt_428",ye="_sortableHeader_1rtjt_460",Ce="_sortArrow_1rtjt_465",Te="_statsToolRow_1rtjt_469",ke="_statsActionRow_1rtjt_477",Ne="_expandButton_1rtjt_481",Se="_expandIcon_1rtjt_493",we="_actionLabel_1rtjt_498",ve="_emptyStats_1rtjt_505",Me="_summaryLine_1rtjt_511",a={page:Et,card:Ht,cardToolbar:At,sectionTitle:Rt,dangerButton:It,proBadge:Ot,statusOk:Ft,statusFallback:Dt,statusUnsupported:$t,statusWarning:qt,statusError:Wt,tierBasic:Ut,tierPro:Vt,tierMixed:Kt,filterRow:Gt,filterLabel:zt,filterSelect:Jt,detailsButton:Qt,detailShell:Zt,detailHeader:Xt,detailHeading:Yt,detailTitle:te,detailRecordName:ee,detailHeaderActions:se,detailCloseButton:ae,detailBody:oe,detailSection:le,detailList:re,detailItem:ie,detailLabel:ne,detailValue:ce,pre:de,pagination:ue,pageInfo:pe,btn:he,tierDistribution:me,tierBarWrap:be,tierBarBasic:xe,tierBarPro:fe,tierLabels:_e,statsTableWrap:ge,statsTable:je,sortableHeader:ye,sortArrow:Ce,statsToolRow:Te,statsActionRow:ke,expandButton:Ne,expandIcon:Se,actionLabel:we,emptyStats:ve,summaryLine:Me},Be=new Set(["clientId","placeId","pinnedTarget","recentPriority","globalQueue"]);function tt(t){return typeof t=="string"&&t.length>0?t:void 0}function Pe(t){if(!Array.isArray(t))return;const o=t.filter(c=>typeof c=="string"&&c.length>0);return o.length>0?o:void 0}function Le(t){const o=t.result??{};return{requestedCommand:t.requestedCommand??tt(o.requestedCommand),executedCommand:t.executedCommand??tt(o.executedCommand),alternatives:t.alternatives??Pe(o.alternatives)}}function ot(t,o){switch(t.status){case"fallback":return{label:o("tools.badge.fallback","FALLBACK"),tooltip:o("tools.badge.fallback.tooltip","The requested Pro action succeeded via a Basic fallback."),className:a.statusFallback};case"unsupported":return{label:o("tools.badge.unsupported","UNSUPPORTED"),tooltip:o("tools.badge.unsupported.tooltip","The requested Pro action was blocked and no fallback ran."),className:a.statusUnsupported};case"warning":return{label:o("tools.badge.warn","WARN"),tooltip:o("tools.badge.warn.tooltip","The tool call failed as an expected caller, project, policy, or user-code issue."),className:a.statusWarning};case"error":return{label:o("tools.badge.err","FAILED"),tooltip:o("tools.badge.err.tooltip","The tool run failed."),className:a.statusError};default:return{label:o("tools.status.ok","OK"),tooltip:o("tools.status.ok.tooltip","The tool run completed successfully."),className:a.statusOk}}}function y(t,o){return e.jsxs("div",{className:a.detailItem,children:[e.jsx("span",{className:a.detailLabel,children:t}),e.jsx("span",{className:a.detailValue,children:o})]})}function Ee(t){if(!t||typeof t!="object")return;const o=t;if(typeof o.selectionMode=="string"&&Be.has(o.selectionMode))return o}function et(t){if(!(!t||typeof t!="object"||!("routing"in t)))return Ee(t.routing)}function He(t){return t.routing??et(t.result)??et(t.data)}function Ae(t,o){return t.requestedClientId?t.requestedClientId:t.requestedPlaceId!==void 0?t.requestedPlaceId:o("tools.history.routing.none","No Studio target named")}function Re(t){return t.actualPlaceName?`${t.actualPlaceName} · ${t.actualPlaceId??"-"}`:t.actualClientId??"-"}function Ie({entry:t,onClose:o}){const{t:c}=at(),T=ot(t,c),b=Le(t),l=He(t);return e.jsxs("div",{className:a.detailShell,children:[e.jsxs("header",{className:a.detailHeader,children:[e.jsxs("div",{className:a.detailHeading,children:[e.jsx("span",{className:a.detailTitle,children:c("tools.detail.title","Tool execution")}),e.jsx("span",{className:a.detailRecordName,children:t.command})]}),e.jsxs("div",{className:a.detailHeaderActions,children:[e.jsx(M,{text:T.tooltip,children:e.jsx("span",{className:T.className,children:T.label})}),e.jsx("button",{type:"button",className:a.detailCloseButton,onClick:o,"aria-label":c("common.close","Close"),children:e.jsx(mt,{size:18,"aria-hidden":"true"})})]})]}),e.jsxs("div",{className:a.detailBody,children:[e.jsxs("section",{className:a.detailSection,children:[e.jsx("strong",{children:e.jsx(M,{text:c("tools.detail.params.tooltip","Input parameters passed to this tool run."),children:c("tools.detail.params","Parameters")})}),e.jsx("pre",{className:a.pre,children:JSON.stringify(t.parameters,null,2)})]}),t.result&&e.jsxs("section",{className:a.detailSection,children:[e.jsx("strong",{children:e.jsx(M,{text:c("tools.detail.result.tooltip","Returned result payload for this tool run."),children:c("tools.detail.result","Result")})}),e.jsx("pre",{className:a.pre,children:JSON.stringify(t.result,null,2)})]}),l&&e.jsxs("section",{className:a.detailSection,children:[e.jsx("strong",{children:c("tools.history.routing","Routing")}),e.jsxs("div",{className:a.detailList,children:[y(c("tools.history.routing.mode","Mode"),l.selectionMode),y(c("tools.history.routing.requested","Requested"),Ae(l,c)),y(c("tools.history.routing.actual","Actual"),Re(l))]})]}),(t.status==="fallback"||t.status==="unsupported"||t.status==="warning"||t.status==="error")&&e.jsx("section",{className:a.detailSection,children:e.jsxs("div",{className:a.detailList,children:[t.status==="fallback"&&b.requestedCommand?y(c("tools.detail.requestedCommand","Requested Command"),b.requestedCommand):null,t.status==="fallback"&&b.executedCommand?y(c("tools.detail.executedCommand","Executed Command"),b.executedCommand):null,t.status==="fallback"&&b.alternatives?y(c("tools.detail.alternatives","Alternatives"),b.alternatives.join(", ")):null,t.status==="unsupported"&&t.blockedMessage?y(c("tools.detail.blockedMessage","Blocked Reason"),t.blockedMessage):null,t.status==="unsupported"?y(c("tools.detail.noFallback","No Fallback"),c("tools.detail.noFallback.value","No fallback ran.")):null,t.status==="warning"&&t.warningMessage?y(c("tools.detail.warningMessage","Warning Message"),t.warningMessage):null,t.status==="error"&&t.errorMessage?y(c("tools.detail.errorMessage","Error Message"),t.errorMessage):null,t.status==="error"&&t.blockedMessage?y(c("tools.detail.blockedMessage","Blocked Reason"),t.blockedMessage):null,t.status==="error"&&t.fallbackCommand?y(c("tools.detail.executedCommand","Executed Command"),t.fallbackCommand):null]})})]})]})}const G=50;function Oe(t){const o=new Date(t);return`${String(o.getHours()).padStart(2,"0")}:${String(o.getMinutes()).padStart(2,"0")}:${String(o.getSeconds()).padStart(2,"0")}`}function W(t){return typeof t!="number"||!Number.isFinite(t)?"-":t<1e3?`${t}ms`:`${(t/1e3).toFixed(1)}s`}function R(t,o){return o==="pro"?t("tier.pro","Pro"):o==="mixed"?t("tier.mixed","Mixed"):t("tier.basic","Basic")}function lt(t,o){return o!==t&&o.startsWith(`${t}_`)?o.slice(t.length+1):""}function st(t,o){const c=lt(t,o);return c?`${t}.${c}`:t}function Ge(){const{t}=at(),{trackEvent:o,trackPageView:c}=bt(),[T,b]=i.useState(null),l=Lt({placeId:T}),{show:N}=xt(),[S,h]=i.useState("history"),[w,C]=i.useState(null),_=i.useRef(null),[U,O]=i.useState(null),[m,E]=i.useState(null),[g,F]=i.useState(!1),[B,k]=i.useState("totalCalls"),[x,D]=i.useState("desc"),V=i.useCallback(s=>{k(n=>n===s?(D(r=>r==="asc"?"desc":"asc"),s):(D("desc"),s))},[]),K=i.useMemo(()=>{var n;const s=new Set;return Object.keys(((n=l.statistics)==null?void 0:n.tools)??{}).forEach(r=>s.add(r)),l.history.forEach(r=>{r.tool&&s.add(r.tool)}),l.historyToolFilter&&s.add(l.historyToolFilter),Array.from(s).sort()},[l.history,l.historyToolFilter,l.statistics]),j=i.useMemo(()=>{var s;return(s=l.statistics)!=null&&s.tools?Object.values(l.statistics.tools).map(n=>{var X;const r=Object.entries(n.commands??{}).map(([p,d])=>({toolName:n.tool,commandName:d.command??p,label:lt(n.tool,d.command??p)||(d.command??p),tier:d.tier,totalCalls:d.totalCalls,successCount:d.successCount,fallbackCount:d.fallbackCount,unsupportedCount:d.unsupportedCount,warningCount:d.warningCount??0,failureCount:d.failureCount,totalExecutionTimeMs:d.totalExecutionTimeMs,avgExecutionTimeMs:d.avgExecutionTimeMs})),f=r.reduce((p,d)=>p+d.totalCalls,0),v=r.reduce((p,d)=>p+d.successCount,0),$=r.reduce((p,d)=>p+d.fallbackCount,0),q=r.reduce((p,d)=>p+d.unsupportedCount,0),dt=r.reduce((p,d)=>p+d.warningCount,0),ut=r.reduce((p,d)=>p+d.failureCount,0),Z=r.reduce((p,d)=>p+d.totalExecutionTimeMs,0),pt=new Set(r.map(p=>p.tier)).size>1?"mixed":((X=r[0])==null?void 0:X.tier)??n.tier;return{toolName:n.tool,tier:pt,commands:r,totalCalls:f,successCount:v,fallbackCount:$,unsupportedCount:q,warningCount:dt,failureCount:ut,totalExecutionTimeMs:Z,avgExecutionTimeMs:f>0?Math.round(Z/f):0}}):[]},[l.statistics]),u=i.useCallback((s,n,r,f)=>e.jsx(M,{text:t(r,f),children:t(s,n)}),[t]),P=i.useCallback((s,n)=>{_.current=n,C(s)},[]),H=i.useCallback(()=>{C(null)},[]),z=i.useMemo(()=>[...j].sort((n,r)=>{const f=n[B],v=r[B];if(typeof f=="number"&&typeof v=="number")return x==="asc"?f-v:v-f;const $=String(f??""),q=String(v??"");return x==="asc"?$.localeCompare(q):q.localeCompare($)}),[j,B,x]),rt=i.useMemo(()=>[{key:"timestamp",label:u("tools.col.time","Time","tools.col.time.tooltip","When the tool run was recorded."),width:"80px",render:s=>Oe(s.timestamp)},{key:"toolName",label:u("tools.col.toolAction","Tool.Action","tools.col.toolAction.tooltip","Tool name and action that were executed."),render:s=>e.jsxs("span",{children:[st(s.tool,s.command),s.tier==="pro"&&e.jsx(M,{text:t("tools.badge.pro.tooltip","This entry used a Pro-only tool or action."),children:e.jsx("span",{className:a.proBadge,children:t("tools.badge.pro","PRO")})})]})},{key:"executionTimeMs",label:u("tools.col.duration","Duration","tools.col.duration.tooltip","How long the tool took to finish."),width:"80px",render:s=>W(s.executionTimeMs)},{key:"status",label:u("tools.col.status","Status","tools.col.status.tooltip","Outcome of the recorded tool run."),width:"120px",render:s=>{const n=ot(s,t);return e.jsx(M,{text:n.tooltip,children:e.jsx("span",{className:n.className,children:n.label})})}},{key:"tier",label:u("tools.col.tier","Tier","tools.col.tier.tooltip","License tier required for the tool or action."),width:"60px",render:s=>e.jsx("span",{className:s.tier==="pro"?a.tierPro:a.tierBasic,children:R(t,s.tier)})},{key:"details",label:t("tools.detail.open","Details"),width:"84px",render:s=>{const n=st(s.tool,s.command);return e.jsx("button",{type:"button",className:a.detailsButton,"aria-haspopup":"dialog","aria-label":t("tools.detail.openLabel","View details for {command}").replace("{command}",n),onClick:r=>{r.stopPropagation(),P(s,r.currentTarget)},children:t("tools.detail.open","Details")})}}],[P,t,u]),J=i.useMemo(()=>[{key:"toolName",label:u("tools.col.tool","Tool","tools.col.tool.tooltip","Consolidated tool name in the statistics table."),sortable:!0},{key:"totalCalls",label:u("tools.col.calls","Calls","tools.col.calls.tooltip","Total number of recorded calls for this tool."),sortable:!0,width:"70px"},{key:"successCount",label:u("tools.col.ok","OK","tools.col.ok.tooltip","Number of direct successful runs."),sortable:!0,width:"70px"},{key:"fallbackCount",label:u("tools.col.fallback","FALLBACK","tools.col.fallback.tooltip","Number of runs that succeeded through fallback execution."),sortable:!0,width:"110px"},{key:"unsupportedCount",label:u("tools.col.unsupported","UNSUPPORTED","tools.col.unsupported.tooltip","Number of blocked runs without fallback execution."),sortable:!0,width:"130px"},{key:"warningCount",label:u("tools.col.warn","WARN","tools.col.warn.tooltip","Number of expected failures caused by caller input, project state, Roblox policy, or user code."),sortable:!0,width:"80px"},{key:"failureCount",label:u("tools.col.err","FAILED","tools.col.err.tooltip","Number of runs that failed."),sortable:!0,width:"70px"},{key:"avgExecutionTimeMs",label:u("tools.col.avgTime","Avg Time","tools.col.avgTime.tooltip","Average execution time across recorded calls."),sortable:!0,width:"90px",render:s=>W(s.avgExecutionTimeMs)},{key:"tier",label:u("tools.col.tier","Tier","tools.col.tierStats.tooltip","Basic, Pro, or Mixed summary for the tool statistics row."),sortable:!0,width:"70px",render:s=>e.jsx(M,{text:s.tier==="mixed"?t("tools.tier.mixed.tooltip","This tool includes both Basic and Pro actions."):"",children:e.jsx("span",{className:s.tier==="pro"?a.tierPro:s.tier==="mixed"?a.tierMixed:a.tierBasic,children:R(t,s.tier)})})}],[t,u]),L=i.useMemo(()=>{if(!l.statistics)return null;const s=l.statistics.tierSummary.basic.totalCalls,n=l.statistics.tierSummary.pro.totalCalls,r=s+n;if(r===0)return null;const f=Math.round(s/r*100),v=100-f;return{basic:s,pro:n,basicPct:f,proPct:v}},[l.statistics]),Q=i.useCallback(s=>{O(n=>n===s?null:s)},[]),it=i.useCallback(async()=>{if(m){F(!0);try{m==="history"?await l.clearHistory():await l.clearStatistics(),N(t("toast.clearSuccess","Cleared successfully"),"success"),E(null)}catch{N(t("toast.clearFailed","Failed to clear data"),"error")}finally{F(!1)}}},[m,N,t,l]),nt=i.useCallback(s=>{const n=s==="history"?"tools_history":"tools_statistics";o("dashboard_click_event",{click_target:s==="history"?"tools_tab_history":"tools_tab_statistics",page:"tools",tab:n}),c({page:"tools",tab:n}),C(null),h(s)},[o,c]),ct=["history","statistics"].map(s=>({key:s,label:t(`tools.tab.${s}`,s.charAt(0).toUpperCase()+s.slice(1))}));return e.jsxs("div",{className:a.page,children:[e.jsx(ft,{title:t("page.tools.title","Tools"),description:t("page.tools.description","Inspect tool history, outcomes, fallback details, and usage statistics."),helpTopicId:"tools"}),e.jsx(yt,{surface:"tools",selectable:!0,selectedPlaceId:T,onSelectedPlaceIdChange:s=>{C(null),b(s),l.setHistoryOffset(0)}}),e.jsx(gt,{items:ct,value:S,onChange:nt}),S==="history"&&e.jsxs("div",{className:a.card,children:[e.jsxs("div",{className:a.cardToolbar,children:[e.jsx("div",{className:a.sectionTitle,children:t("tools.tab.history","History")}),e.jsx("button",{className:a.dangerButton,onClick:()=>{o("dashboard_click_event",{click_target:"tools_clear_history",page:"tools",tab:"tools_history"}),E("history")},children:t("common.clear","Clear")})]}),e.jsx("div",{className:a.filterRow,children:e.jsxs("label",{className:a.filterLabel,children:[t("tools.filter.tool","Tool"),":",e.jsxs("select",{className:a.filterSelect,value:l.historyToolFilter,onChange:s=>{C(null),l.setHistoryToolFilter(s.target.value),l.setHistoryOffset(0)},children:[e.jsx("option",{value:"",children:t("tools.filter.all","All")}),K.map(s=>e.jsx("option",{value:s,children:s},s))]})]})}),e.jsx(vt,{columns:rt,data:l.history,rowKey:s=>s.id,onRowClick:(s,n)=>P(s,n),emptyMessage:t("tools.empty.history","No tool history entries for this place")}),e.jsxs("div",{className:a.pagination,children:[e.jsx("button",{className:a.btn,disabled:l.historyOffset===0,title:t("tools.page.prev.tooltip","Go to the previous page of tool history results."),onClick:()=>{C(null),l.setHistoryOffset(Math.max(0,l.historyOffset-G))},children:t("tools.page.prev","Prev")}),e.jsxs("span",{className:a.pageInfo,children:[l.historyOffset+1,"–",Math.min(l.historyOffset+G,l.historyTotal)," / ",l.historyTotal]}),e.jsx("button",{className:a.btn,disabled:!l.historyHasMore,title:t("tools.page.next.tooltip","Go to the next page of tool history results."),onClick:()=>{C(null),l.setHistoryOffset(l.historyOffset+G)},children:t("tools.page.next","Next")})]})]}),S==="statistics"&&e.jsxs("div",{className:a.card,children:[e.jsxs("div",{className:a.cardToolbar,children:[e.jsx("div",{className:a.sectionTitle,children:t("tools.tab.statistics","Statistics")}),e.jsx("button",{className:a.dangerButton,onClick:()=>{o("dashboard_click_event",{click_target:"tools_clear_statistics",page:"tools",tab:"tools_statistics"}),E("statistics")},children:t("common.clear","Clear")})]}),L&&e.jsxs("div",{className:a.tierDistribution,children:[e.jsxs("div",{className:a.tierBarWrap,children:[e.jsx("div",{className:a.tierBarBasic,style:{width:`${L.basicPct}%`}}),e.jsx("div",{className:a.tierBarPro,style:{width:`${L.proPct}%`}})]}),e.jsxs("div",{className:a.tierLabels,children:[e.jsxs("span",{children:[R(t,"basic")," ",L.basicPct,"% (",L.basic,")"]}),e.jsxs("span",{children:[R(t,"pro")," ",L.proPct,"% (",L.pro,")"]})]})]}),e.jsx("div",{className:a.statsTableWrap,children:e.jsxs("table",{className:a.statsTable,children:[e.jsx("thead",{children:e.jsx("tr",{children:J.map(s=>e.jsxs("th",{style:s.width?{width:s.width}:void 0,className:s.sortable?a.sortableHeader:void 0,onClick:s.sortable?()=>V(s.key):void 0,children:[e.jsx("span",{children:s.label}),s.sortable&&B===s.key&&e.jsx("span",{className:a.sortArrow,children:x==="asc"?"▴":"▾"})]},s.key))})}),e.jsx("tbody",{children:z.length===0?e.jsx("tr",{children:e.jsx("td",{colSpan:J.length,className:a.emptyStats,children:t("tools.empty.stats","No tool statistics for this place")})}):z.map(s=>{const n=U===s.toolName;return e.jsxs(i.Fragment,{children:[e.jsxs("tr",{className:a.statsToolRow,onClick:()=>Q(s.toolName),children:[e.jsx("td",{children:e.jsxs("button",{type:"button",className:a.expandButton,"aria-expanded":n,"aria-label":`${s.toolName} ${n?t("common.collapse","Collapse"):t("common.expand","Expand")}`,onClick:r=>{r.stopPropagation(),Q(s.toolName)},children:[e.jsx("span",{className:a.expandIcon,"aria-hidden":"true",children:n?"▾":"▸"}),e.jsx("span",{children:s.toolName})]})}),e.jsx("td",{children:s.totalCalls}),e.jsx("td",{children:s.successCount}),e.jsx("td",{children:s.fallbackCount}),e.jsx("td",{children:s.unsupportedCount}),e.jsx("td",{children:s.warningCount}),e.jsx("td",{children:s.failureCount}),e.jsx("td",{children:W(s.avgExecutionTimeMs)}),e.jsx("td",{children:e.jsx(M,{text:s.tier==="mixed"?t("tools.tier.mixed.tooltip","This tool includes both Basic and Pro actions."):"",children:e.jsx("span",{className:s.tier==="pro"?a.tierPro:s.tier==="mixed"?a.tierMixed:a.tierBasic,children:R(t,s.tier)})})})]}),n&&s.commands.map(r=>e.jsxs("tr",{className:a.statsActionRow,children:[e.jsx("td",{children:e.jsx("span",{className:a.actionLabel,children:r.label})}),e.jsx("td",{children:r.totalCalls}),e.jsx("td",{children:r.successCount}),e.jsx("td",{children:r.fallbackCount}),e.jsx("td",{children:r.unsupportedCount}),e.jsx("td",{children:r.warningCount}),e.jsx("td",{children:r.failureCount}),e.jsx("td",{children:W(r.avgExecutionTimeMs)}),e.jsx("td",{children:e.jsx("span",{className:r.tier==="pro"?a.tierPro:a.tierBasic,children:R(t,r.tier)})})]},`${s.toolName}:${r.commandName}`))]},s.toolName)})})]})}),l.statistics&&e.jsxs("div",{className:a.summaryLine,children:[t("tools.summary.total","Total"),": ",l.statistics.totalCalls," ",t("tools.summary.calls","calls")," | ",t("tools.summary.sessions","Sessions"),": ",l.statistics.totalSessions]})]}),e.jsx(jt,{open:w!==null,ariaLabel:t("tools.detail.dialogLabel","Tool execution detail"),onClose:H,returnFocusTo:_.current,testId:"tools-history-detail-popup-layer",children:w&&e.jsx(Ie,{entry:w,onClose:H})}),e.jsx(_t,{open:m!==null,title:m==="history"?t("tools.clear.history.title","Clear history?"):t("tools.clear.statistics.title","Clear statistics?"),message:m==="history"?t("tools.clear.history.message","This permanently removes the current place tools history."):t("tools.clear.statistics.message","This permanently resets the current place tool statistics."),cancelLabel:t("common.cancel","Cancel"),confirmLabel:t("common.clear","Clear"),loading:g,onCancel:()=>!g&&E(null),onConfirm:it})]})}export{Ge as Component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as r,h as s}from"./index-
|
|
1
|
+
import{j as r,h as s}from"./index-Hgv8iCTe.js";function p({text:o,children:t}){return r.jsx(s,{text:o,children:t})}export{p as T};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{f as Ce,l as W,k as He,r as _,u as I,j as t,a as q,R as Fe,X as Oe,T as we,e as ze,t as Ve}from"./index-Hgv8iCTe.js";import{I as R}from"./InfoLabel-gl5i0JQy.js";import{T as y}from"./TooltipText-BEK9VoiS.js";import{C as We,P as Ke}from"./PageHeader-BkXyqPrA.js";import{D as oe,c as le,e as Ye,g as Qe,h as Je,i as ce,j as ke,k as Xe,l as ue,d as Ze}from"./sample-requests-DafsjfJi.js";import{C as et,T as tt}from"./Tabs-Dy5daI-F.js";import{A as de}from"./AiPromptExamples-CJjCcxg8.js";import{B as it}from"./bot-B06rJuWg.js";import{C as st}from"./CurrentPlaceScope-p_fkZWK9.js";import"./copy-CGFMtAPH.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 at=[["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"}]],rt=Ce("camera",at);/**
|
|
7
|
+
* @license lucide-react v1.8.0 - ISC
|
|
8
|
+
*
|
|
9
|
+
* This source code is licensed under the ISC license.
|
|
10
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
+
*/const nt=[["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"}]],ot=Ce("ellipsis",nt);async function be(e){const i=await fetch(`${W}${e}`);if(!i.ok){let s=null;try{s=await i.json()}catch{}throw new He(i.status,(s==null?void 0:s.message)??i.statusText,(s==null?void 0:s.error)??null,s)}return await i.json()}function U(e){return typeof e=="number"&&Number.isFinite(e)?e:0}const lt=["structure","visual","interaction","primary_view_context","responsive_viewport"];function pe(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 lt){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(a=>typeof a=="string"):[]})}return s}function ct(e,i){return e.readiness==="ready"||e.readiness==="review_required"||e.readiness==="insufficient_evidence"?e.readiness:"insufficient_evidence"}function ut(e){return e==="recompose"||e==="refine"||e==="approved"?e:void 0}function dt(e){return e==="recommended"||e==="required"?e:void 0}function pt(e){if(Array.isArray(e))return e.filter(i=>i==="primary_visual"||i==="functional_safe"||i==="responsive_ready")}function ht(e){if(e.design_check_summary){const n={priority_high:U(e.design_check_summary.priority_high),priority_medium:U(e.design_check_summary.priority_medium),priority_low:U(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:ut(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:dt(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:pt(e.design_check_summary.required_dimensions)},l=pe({...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(a=>typeof a=="string"):[],readiness:ct(e.design_check_summary)}}if(!e.lint_summary)return null;const i={priority_high:U(e.lint_summary.errors),priority_medium:U(e.lint_summary.warnings),priority_low:0,deterministic_status:"completed",visual_status:"not_requested",coverage:"structural_only",skipped_reasons:[]},s=pe(i);return{...i,coverage_dimensions:s,viewport_profiles_tested:[],readiness:"insufficient_evidence"}}function _t(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 Ie(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:ht(e),primary_view_context:e.primary_view_context,image:e.image}}function mt(e){const i=e.check_results??e.lint_results??[];return{...Ie(e),check_results:i.map(_t),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 he(e,i){const s=new URLSearchParams;i!==void 0&&s.set("limit",String(i));const n=s.toString()?`?${s.toString()}`:"",l=await be(`/api/ui-studio/snapshots${n}`);return{...l,snapshots:l.snapshots.map(Ie)}}async function gt(e,i){const s=i!==void 0?`?placeId=${i}`:"",n=await be(`/api/ui-studio/snapshots/${encodeURIComponent(e)}${s}`);return mt(n)}function Ne(e,i){const s=i!==void 0?`?placeId=${i}`:"";return`${W}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image${s}`}const yt=1e4;function Pe(e=50){const[i,s]=_.useState(null),[n,l]=_.useState(!0),[a,o]=_.useState(null),u=_.useCallback(async()=>{try{const d=await he(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 h=await he(void 0,e);d||(s(h),o(null))}catch(h){d||o(h instanceof Error?h.message:String(h))}finally{d||l(!1)}};g();const m=setInterval(()=>{g()},yt);return()=>{d=!0,clearInterval(m)}},[e]),{data:i,loading:n,error:a,refresh:u}}const xt="_page_vrx8j_2",ft="_grid_vrx8j_9",vt="_card_vrx8j_16",St="_cardBodyButton_vrx8j_31",jt="_thumb_vrx8j_48",Ct="_badges_vrx8j_57",wt="_priorityHighBadge_vrx8j_65",kt="_priorityMediumBadge_vrx8j_66",bt="_priorityLowBadge_vrx8j_67",It="_cardMeta_vrx8j_97",Nt="_target_vrx8j_103",Pt="_time_vrx8j_110",Tt="_drawer_vrx8j_115",Bt="_drawerToolbar_vrx8j_132",Rt="_drawerTitleBlock_vrx8j_143",Gt="_drawerEyebrow_vrx8j_150",Dt="_drawerTarget_vrx8j_159",Mt="_drawerToolbarActions_vrx8j_169",At="_closeBtn_vrx8j_177",$t="_detailBody_vrx8j_198",Lt="_screenshotPreviewFrame_vrx8j_205",Et="_fullImg_vrx8j_218",qt="_metaDl_vrx8j_225",Ut="_errorMsg_vrx8j_237",Ht="_suggestionsWrap_vrx8j_242",Ft="_prioritySection_vrx8j_249",Ot="_sectionHighHeader_vrx8j_253",zt="_sectionLowHeader_vrx8j_259",Vt="_sectionMediumHeader_vrx8j_265",Wt="_groupCard_vrx8j_271",Kt="_groupHeader_vrx8j_278",Yt="_groupLabel_vrx8j_294",Qt="_groupCount_vrx8j_299",Jt="_groupChevron_vrx8j_306",Xt="_groupBody_vrx8j_310",Zt="_groupDescription_vrx8j_313",ei="_groupFix_vrx8j_318",ti="_falsePositive_vrx8j_327",ii="_itemList_vrx8j_335",si="_suggestionItem_vrx8j_343",ai="_suggestionInfo_vrx8j_353",ri="_pathBreadcrumb_vrx8j_359",ni="_currentValue_vrx8j_368",oi="_copyFixBtn_vrx8j_372",li="_emptySuggestions_vrx8j_386",ci="_sampleBanner_vrx8j_394",ui="_sampleBannerRow_vrx8j_407",di="_sampleBannerMain_vrx8j_415",pi="_sampleBadge_vrx8j_423",hi="_sampleTitle_vrx8j_433",_i="_sampleMessage_vrx8j_440",mi="_sampleActions_vrx8j_447",gi="_primaryAction_vrx8j_455",yi="_secondaryAction_vrx8j_456",xi="_emptyState_vrx8j_491",fi="_pluginGuideCard_vrx8j_499",vi="_pluginGuideMarker_vrx8j_510",Si="_pluginGuideBody_vrx8j_525",ji="_pluginGuideTitle_vrx8j_529",Ci="_pluginGuideMessage_vrx8j_537",wi="_pluginGuideChecklist_vrx8j_544",ki="_pluginGuideWaiting_vrx8j_567",bi="_pluginGuideDot_vrx8j_576",Ii="_analysisWorkspace_vrx8j_584",Ni="_analysisMainColumn_vrx8j_589",Pi="_analysisSummaryPanel_vrx8j_594",Ti="_recentCapturesHeader_vrx8j_607",Bi="_analysisSummaryText_vrx8j_614",Ri="_recentCapturesMeta_vrx8j_615",Gi="_analysisReportGrid_vrx8j_621",Di="_analysisReportGroup_vrx8j_628",Mi="_analysisReportCard_vrx8j_632",Ai="_analysisReportThumb_vrx8j_654",$i="_analysisReportBody_vrx8j_663",Li="_analysisReportTopline_vrx8j_670",Ei="_analysisVerdict_vrx8j_677",qi="_analysisVerdict_needsFix_vrx8j_688",Ui="_analysisVerdict_review_vrx8j_689",Hi="_analysisVerdict_incomplete_vrx8j_694",Fi="_analysisVerdict_passed_vrx8j_699",Oi="_analysisReportCounts_vrx8j_704",zi="_readinessSummary_vrx8j_709",Vi="_readinessChip_vrx8j_715",Wi="_readinessChipReady_vrx8j_730",Ki="_readinessChipPending_vrx8j_736",Yi="_primaryReadinessBlock_vrx8j_742",Qi="_criticSummary_vrx8j_749",Ji="_analysisReportTarget_vrx8j_768",Xi="_analysisReportIssue_vrx8j_777",Zi="_analysisReportCoverage_vrx8j_783",es="_coverageChips_vrx8j_789",ts="_coverageChip_vrx8j_789",is="_coverageChip_completed_vrx8j_810",ss="_coverageChip_failed_vrx8j_815",as="_coverageChip_skipped_vrx8j_820",rs="_coverageChip_not_requested_vrx8j_821",ns="_analysisReportMeta_vrx8j_826",os="_analysisChildList_vrx8j_833",ls="_analysisChildRow_vrx8j_844",cs="_analysisChildPath_vrx8j_865",us="_analysisChildSummary_vrx8j_874",ds="_analysisChildDetailHint_vrx8j_875",ps="_drawerAnalysisSummary_vrx8j_884",hs="_drawerAnalysisSummaryItem_vrx8j_895",_s="_drawerAnalysisLabel_vrx8j_902",ms="_drawerAnalysisCounts_vrx8j_908",gs="_drawerAnalysisValue_vrx8j_909",ys="_recentCapturesSection_vrx8j_914",xs="_drawerPrimaryActions_vrx8j_926",fs="_drawerActionBtn_vrx8j_933",vs="_drawerMoreMenu_vrx8j_962",Ss="_drawerMoreButton_vrx8j_967",js="_drawerMoreMenuBody_vrx8j_992",Cs="_drawerMenuItem_vrx8j_1005",ws="_drawerMenuItemDanger_vrx8j_1028",ks="_actionErrMsg_vrx8j_1037",bs="_actionStatusMsg_vrx8j_1046",Is="_actionStatus_info_vrx8j_1060",Ns="_actionStatus_success_vrx8j_1066",Ps="_actionStatus_warning_vrx8j_1072",Ts="_actionStatusDetail_vrx8j_1078",Bs="_galleryHeader_vrx8j_1084",Rs="_cardChecked_vrx8j_1101",Gs="_cardCheckbox_vrx8j_1108",Ds="_captureSelectionActions_vrx8j_1123",Ms="_selectionToolbar_vrx8j_1132",As="_selectionBar_vrx8j_1133",$s="_selectionToolbarCount_vrx8j_1152",Ls="_selectionToolbarActions_vrx8j_1159",Es="_selectionBarBtn_vrx8j_1166",qs="_selectionBarBtnDanger_vrx8j_1192",r={page:xt,grid:ft,card:vt,cardBodyButton:St,thumb:jt,badges:Ct,priorityHighBadge:wt,priorityMediumBadge:kt,priorityLowBadge:bt,cardMeta:It,target:Nt,time:Pt,drawer:Tt,drawerToolbar:Bt,drawerTitleBlock:Rt,drawerEyebrow:Gt,drawerTarget:Dt,drawerToolbarActions:Mt,closeBtn:At,detailBody:$t,screenshotPreviewFrame:Lt,fullImg:Et,metaDl:qt,errorMsg:Ut,suggestionsWrap:Ht,prioritySection:Ft,sectionHighHeader:Ot,sectionLowHeader:zt,sectionMediumHeader:Vt,groupCard:Wt,groupHeader:Kt,groupLabel:Yt,groupCount:Qt,groupChevron:Jt,groupBody:Xt,groupDescription:Zt,groupFix:ei,falsePositive:ti,itemList:ii,suggestionItem:si,suggestionInfo:ai,pathBreadcrumb:ri,currentValue:ni,copyFixBtn:oi,emptySuggestions:li,sampleBanner:ci,sampleBannerRow:ui,sampleBannerMain:di,sampleBadge:pi,sampleTitle:hi,sampleMessage:_i,sampleActions:mi,primaryAction:gi,secondaryAction:yi,emptyState:xi,pluginGuideCard:fi,pluginGuideMarker:vi,pluginGuideBody:Si,pluginGuideTitle:ji,pluginGuideMessage:Ci,pluginGuideChecklist:wi,pluginGuideWaiting:ki,pluginGuideDot:bi,analysisWorkspace:Ii,analysisMainColumn:Ni,analysisSummaryPanel:Pi,recentCapturesHeader:Ti,analysisSummaryText:Bi,recentCapturesMeta:Ri,analysisReportGrid:Gi,analysisReportGroup:Di,analysisReportCard:Mi,analysisReportThumb:Ai,analysisReportBody:$i,analysisReportTopline:Li,analysisVerdict:Ei,analysisVerdict_needsFix:qi,analysisVerdict_review:Ui,analysisVerdict_incomplete:Hi,analysisVerdict_passed:Fi,analysisReportCounts:Oi,readinessSummary:zi,readinessChip:Vi,readinessChipReady:Wi,readinessChipPending:Ki,primaryReadinessBlock:Yi,criticSummary:Qi,analysisReportTarget:Ji,analysisReportIssue:Xi,analysisReportCoverage:Zi,coverageChips:es,coverageChip:ts,coverageChip_completed:is,coverageChip_failed:ss,coverageChip_skipped:as,coverageChip_not_requested:rs,analysisReportMeta:ns,analysisChildList:os,analysisChildRow:ls,analysisChildPath:cs,analysisChildSummary:us,analysisChildDetailHint:ds,drawerAnalysisSummary:ps,drawerAnalysisSummaryItem:hs,drawerAnalysisLabel:_s,drawerAnalysisCounts:ms,drawerAnalysisValue:gs,recentCapturesSection:ys,drawerPrimaryActions:xs,drawerActionBtn:fs,drawerMoreMenu:vs,drawerMoreButton:Ss,drawerMoreMenuBody:js,drawerMenuItem:Cs,drawerMenuItemDanger:ws,actionErrMsg:ks,actionStatusMsg:bs,actionStatus_info:Is,actionStatus_success:Ns,actionStatus_warning:Ps,actionStatusDetail:Ts,galleryHeader:Bs,cardChecked:Rs,cardCheckbox:Gs,captureSelectionActions:Ds,selectionToolbar:Ms,selectionBar:As,selectionToolbarCount:$s,selectionToolbarActions:Ls,selectionBarBtn:Es,selectionBarBtnDanger:qs};function Us({snapshot:e,placeId:i,onClick:s,imageUrlOverride:n,selectable:l,selected:a,onToggleSelect:o}){var C,b,G;const{t:u}=I(),d=((C=e.design_check_summary)==null?void 0:C.priority_high)??0,g=((b=e.design_check_summary)==null?void 0:b.priority_medium)??0,m=((G=e.design_check_summary)==null?void 0:G.priority_low)??0,h=new Date(e.captured_at*1e3).toLocaleString(),x=n??Ne(e.snapshot_id,i),j=()=>{o==null||o(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(We,{className:r.cardCheckbox,"aria-label":u("uiStudio.gallery.cardCheckbox","Select screenshot"),checked:!!a,onChange:j})}),t.jsxs("button",{className:r.cardBodyButton,onClick:k=>s(k.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:h})]})]})]})}const Hs={touch_target:"touchTarget",contrast:"contrast",text_scaled:"textScaled",safezone:"safezone",min_text_size:"minTextSize"};function Fs(e){return e.rule==="contrast"&&/\.(Icon|Avatar|EmptyIcon|GoldIcon|[A-Za-z]*Icon)$/.test(e.path)}const Os={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 zs(e,i,s){const n=Hs[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 Vs(e,i){const s=Os[e]??null;return s?i?zs(e,s,i):s:null}function Ws(e){return Fs(e)}function Ks(e,i){const s=new Map;for(const l of e){const a=`${l.displayPriority}::${l.rule}`,o=s.get(a)??[];o.push(l),s.set(a,o)}const n=[];for(const[l,a]of s){const[o,u]=l.split("::"),d=a.filter(Ws).length;n.push({rule:u??"unknown",priority:o,items:a,fixTemplate:Vs(u??"",i),falsePositiveRatio:a.length>0?d/a.length:0})}return n.sort((l,a)=>{const o={priority_high:0,priority_medium:1,priority_low:2};return l.priority!==a.priority?o[l.priority]-o[a.priority]:a.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 Te(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 Be(e){return typeof e=="object"&&e!==null}function _e(e){return Be(e.data)?e.data:{}}function ie(e,i){const s=e[i];return Be(s)?s:{}}function Y(e,i){const s=e[i];return typeof s=="string"?s:null}function Q(e,i){const s=e[i];return typeof s=="number"&&Number.isFinite(s)?s:0}function Ys(e){const i=ie(e,"design_check_summary");return{priority_high:Q(i,"priority_high"),priority_medium:Q(i,"priority_medium"),priority_low:Q(i,"priority_low")}}function me(e){if(!(e.success??e.ok??!e.error))throw new Error(e.error??"UI Studio action failed")}function ge(e,i){return Re(e,Ys(i))}function H(e,i,s,n,l){const a=e(i,s);return l?`${a}: ${l} · ${n}`:`${a}: ${n}`}function Qs(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 Js(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 J(e,i){return`${i}${e("uiStudio.storage.countSuffix","개")}`}function Re(e,i){return`${e("uiStudio.priorityHigh","우선 검토")} ${J(e,(i==null?void 0:i.priority_high)??0)} · ${e("uiStudio.priorityMedium","검토 권장")} ${J(e,(i==null?void 0:i.priority_medium)??0)} · ${e("uiStudio.priorityLow","선택 개선")} ${J(e,(i==null?void 0:i.priority_low)??0)}`}function Xs(e,i){return Re(e,i.design_check_summary)}function Zs(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 ea(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 ta({snapshotId:e,placeId:i,onClose:s,sampleDetail:n,tier:l,onActionDone:a}){const[o,u]=_.useState(n??null),[d,g]=_.useState(null),[m,h]=_.useState(null),[x,j]=_.useState(null),[C,b]=_.useState(null),[G,k]=_.useState(null),{t:p}=I(),{trackEvent:B}=q(),N=l==="pro";_.useEffect(()=>{if(n){u(n),g(null);return}let S=!1;return gt(e,i).then(A=>{S||u(A)}).catch(A=>{S||g(A instanceof Error?A.message:String(A))}),()=>{S=!0}},[e,i,n]);const v=async()=>{if(o!=null&&o.target){B("dashboard_click_event",{click_target:"ui_studio_capture_current",page:"ui-studio",tab:"ui_studio_analysis"}),h(null),b("preview"),j({tone:"info",message:p("uiStudio.actions.previewRunning","캡처 중..."),detail:p("uiStudio.actions.previewRunningDetail","완료되면 새 화면 캡처 파일 ID를 표시합니다.")});try{const S=await le("preview",{targetPath:o.target,placeId:i});me(S);const A=_e(S),L=Y(A,"snapshot_id"),K=ie(A,"screenshot"),f=ie(A,"meta"),$=Y(K,"saved_path"),T=Y(f,"persist_warning"),O=ge(p,A);j(T?{tone:"warning",message:H(p,"uiStudio.actions.previewNeedsSaveCheck","캡처 완료, 저장 확인 필요",O,L),detail:T}:L&&$?{tone:"success",message:H(p,"uiStudio.actions.previewSaved","새 화면 캡처 저장 완료",O,L),detail:p("uiStudio.actions.previewSavedDetail","기존 화면 캡처는 변경하지 않고 새 파일로 저장했습니다.")}:L?{tone:"warning",message:H(p,"uiStudio.actions.previewComplete","캡처 완료",O,L),detail:p("uiStudio.actions.previewSavedPathMissing","새 화면 캡처 ID는 받았지만 저장 경로를 확인하지 못했습니다.")}:{tone:"warning",message:H(p,"uiStudio.actions.previewComplete","캡처 완료",O),detail:p("uiStudio.actions.previewSnapshotIdMissing","새 화면 캡처 ID를 확인하지 못했습니다. 목록을 새로고침해 저장 여부를 확인해 주세요.")}),await(a==null?void 0:a())}catch(S){h(S instanceof Error?S.message:String(S))}finally{b(null)}}},P=async()=>{if(o!=null&&o.target){B("dashboard_click_event",{click_target:"ui_studio_check_again",page:"ui-studio",tab:"ui_studio_analysis"}),h(null),b("check"),j({tone:"info",message:p("uiStudio.actions.designCheckRunning","개선 제안 확인 중..."),detail:p("uiStudio.actions.designCheckRunningDetail","완료되면 우선 검토/검토 권장/선택 개선 항목 수를 표시합니다.")});try{const S=await le("check",{targetPath:o.target,placeId:i});me(S);const A=_e(S),L=ge(p,A);j({tone:"success",message:H(p,"uiStudio.actions.designCheckComplete","개선 제안 확인 완료",L),detail:p("uiStudio.actions.designCheckNoSnapshotSaved","이 작업은 화면 캡처 파일을 새로 저장하지 않습니다.")}),await(a==null?void 0:a())}catch(S){h(S instanceof Error?S.message:String(S))}finally{b(null)}}},M=async()=>{h(null),j(null);try{await Ye(i,e),await(a==null?void 0:a()),k(null),s()}catch(S){throw h(S instanceof Error?S.message:String(S)),S}},D=N?void 0:p("uiStudio.actions.proRequired","Pro에서 사용 가능"),w=o!=null&&o.target?Te(o.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:p("uiStudio.analysis.detailDialog","Analysis detail")}),t.jsx("span",{className:r.drawerTarget,title:(w==null?void 0:w.full)??e,children:(w==null?void 0:w.breadcrumb)??e})]}),t.jsxs("div",{className:r.drawerToolbarActions,children:[o&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:r.drawerPrimaryActions,children:[t.jsx(y,{text:D??p("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 v(),disabled:!N||!o.target||C!==null,type:"button",children:[t.jsx(rt,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:p("uiStudio.actions.captureCurrentState","현재 상태 캡처")})]})}),t.jsx(y,{text:D??p("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||!o.target||C!==null,type:"button",children:[t.jsx(Fe,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:p("uiStudio.actions.checkSuggestionsAgain","개선 제안 다시 확인")})]})})]}),t.jsxs("details",{className:r.drawerMoreMenu,children:[t.jsx("summary",{className:r.drawerMoreButton,title:p("uiStudio.actions.more.tooltip","Open additional actions."),"aria-label":p("uiStudio.actions.more","More"),children:t.jsx(ot,{size:18,"aria-hidden":"true"})}),t.jsx("div",{className:r.drawerMoreMenuBody,children:t.jsx(y,{text:D??p("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:()=>{B("dashboard_click_event",{click_target:"ui_studio_delete_snapshot",page:"ui-studio",tab:"ui_studio_analysis"}),k("deleteSnapshot")},disabled:!N,type:"button",children:p("uiStudio.actions.deleteSnapshot","이 화면 캡처 삭제")})})})]})]}),t.jsx(y,{text:p("uiStudio.detailClose.tooltip","Close this detail panel."),children:t.jsx("button",{className:r.closeBtn,onClick:s,type:"button","aria-label":p("uiStudio.detailClose","Close"),children:t.jsx(Oe,{size:18,"aria-hidden":"true"})})})]})]}),d&&t.jsx("div",{className:r.errorMsg,children:d}),o&&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(ia,{detail:o}),t.jsx("div",{className:r.screenshotPreviewFrame,"data-testid":"analysis-screenshot-preview",children:t.jsx("img",{className:r.fullImg,src:o.image_url,alt:o.snapshot_id})}),t.jsx(ra,{items:o.check_results,summary:o.design_check_summary}),t.jsxs("dl",{className:r.metaDl,children:[t.jsx("dt",{children:t.jsx(R,{label:p("uiStudio.capturedAt","Captured"),tooltip:p("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(R,{label:p("uiStudio.scope","Scope"),tooltip:p("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(R,{label:p("uiStudio.target","Target"),tooltip:p("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(R,{label:p("uiStudio.briefId","Brief"),tooltip:p("uiStudio.briefId.tooltip","Identifier of the design brief that produced this UI.")})}),t.jsx("dd",{children:o.brief_id})]})]})]}),G==="deleteSnapshot"&&t.jsx(oe,{title:p("uiStudio.confirm.deleteSnapshotTitle","화면 캡처 삭제"),message:p("uiStudio.confirm.deleteSnapshotMessage","이 화면 캡처 파일만 삭제됩니다 (Studio 인스턴스 보존)."),danger:!0,confirmLabel:p("common.delete","삭제"),onConfirm:M,onClose:()=>k(null)})]})}function ia({detail:e}){const{t:i}=I(),s=Qs(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(R,{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:Js(i,s)}),t.jsx("span",{className:r.drawerAnalysisCounts,children:Xs(i,e)})]}),t.jsxs("div",{className:r.drawerAnalysisSummaryItem,children:[t.jsx("span",{className:r.drawerAnalysisLabel,children:t.jsx(R,{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(sa,{summary:e.design_check_summary}),t.jsx(aa,{summary:e.design_check_summary})]})}function sa({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: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")," · ",Zs(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")," · ",n]}),t.jsx("span",{className:`${r.readinessChip} ${e.readiness==="ready"?r.readinessChipReady:r.readinessChipPending}`,children:ea(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 aa({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:r.coverageChips,"aria-label":i("uiStudio.analysis.coverageDimensions","검토 범위"),children:n.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 ra({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:n,medium:l,low:a}=Ks(e,s);return t.jsxs("div",{className:r.suggestionsWrap,children:[t.jsx("h3",{children:t.jsx(R,{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:r.prioritySection,children:[t.jsx("h4",{className:r.sectionHighHeader,children:s("uiStudio.highPrioritySection","우선 검토")}),n.map(o=>t.jsx(X,{group:o},`h-${o.rule}`))]}),l.length>0&&t.jsxs("section",{className:r.prioritySection,children:[t.jsx("h4",{className:r.sectionMediumHeader,children:s("uiStudio.mediumPrioritySection","검토 권장")}),l.map(o=>t.jsx(X,{group:o},`m-${o.rule}`))]}),a.length>0&&t.jsxs("section",{className:r.prioritySection,children:[t.jsx("h4",{className:r.sectionLowHeader,children:s("uiStudio.lowPrioritySection","선택 개선")}),a.map(o=>t.jsx(X,{group:o},`l-${o.rule}`))]})]})}function X({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),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:()=>n(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(na,{item:g,group:e},`${g.path}-${m}`))})]})]})}function na({item:e,group:i}){var g;const{t:s}=I(),{trackEvent:n}=q(),[l,a]=_.useState(!1),o=Te(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"}),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")}: ${o.full}`,children:o.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 Z(e,i){return Object.entries(i).reduce((s,[n,l])=>s.split(`{${n}}`).join(String(l)),e)}function oa(e,i){return i.rule==="contrast"?Z(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"?Z(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"?Z(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 Ge="sample_inventory_preview",se=Qe,la=[{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 ca(e){const n={snapshot_id:Ge,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:la.map(o=>({...o,hint:oa(e,o)})),image_url:se};return{list:{placeId:0,snapshots:[n],totalCount:1},detail:l}}const ua=/plugin not connected|sync not started/i;function ae(e){return typeof e=="string"&&ua.test(e)}function De(){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 da(e){return{review:{id:"review-ui",title:e("uiStudio.emptyGuide.ai.reviewTitle","Review an existing UI"),request:e("uiStudio.emptyGuide.ai.reviewRequest","Inspect the game UI and identify a screen to review. If there are several candidates, ask me which one to use first. Capture the actual screen, check text readability, overlapping elements, and content outside the screen, then save the results in UI Studio. Do not modify the existing UI, and clearly separate anything you could not verify.")},create:{id:"create-ui",title:e("uiStudio.emptyGuide.ai.createTitle","Create a new UI"),request:e("uiStudio.emptyGuide.ai.createRequest","Create an inventory UI for this game. Check the existing UI and data structure first, and ask me if the required features or visual direction are unclear. Do not overwrite existing UI. Capture and review the finished screen, then save the results in UI Studio.")}}}const pa="_emptyState_13gyl_1",ha="_header_13gyl_11",_a="_method_13gyl_12",ma="_methodTitle_13gyl_44",ga="_moreExamples_13gyl_57",F={emptyState:pa,header:ha,method:_a,methodTitle:ma,moreExamples:ga};function Me({kind:e}){const{locale:i,t:s}=I(),n=da(s),l=e==="analysis",a={copy:s("guidance.ai.copy","Copy request"),copying:s("guidance.ai.copying","Copying…"),copied:s("guidance.ai.copied","Copied"),copyFailed:s("guidance.ai.copyFailed","Could not copy. Select the request text and copy it manually.")};return t.jsxs("section",{className:F.emptyState,children:[t.jsxs("header",{className:F.header,children:[t.jsx("h3",{children:l?s("uiStudio.emptyGuide.analysis.title","Create or review game UI"):s("uiStudio.emptyGuide.history.title","Start a UI task")}),t.jsx("p",{children:l?s("uiStudio.emptyGuide.analysis.description","Ask AI to create or review UI, then inspect the saved screens and findings here."):s("uiStudio.emptyGuide.history.description","When AI creates or changes UI, the change record will appear here.")})]}),t.jsxs("section",{className:F.method,children:[t.jsxs("div",{className:F.methodTitle,children:[t.jsx(it,{size:16,"aria-hidden":"true"}),t.jsx("h4",{children:s("uiStudio.emptyGuide.ai.title","Ask AI")})]}),t.jsx(de,{examples:[l?n.review:n.create],resetKey:`${i}|ui-studio-${e}`,labels:a,nextStep:s("guidance.ai.nextStep","Paste this request into an AI chat connected to WEPPY.")}),l&&t.jsxs("details",{className:F.moreExamples,children:[t.jsx("summary",{children:s("uiStudio.emptyGuide.ai.more","Other request examples")}),t.jsx(de,{examples:[n.create],resetKey:`${i}|ui-studio-create`,labels:a})]})]})]})}function Ae(e){return e.target??e.scope}function ya(e){const i=Ae(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 $e(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 xa(e){return $e(e.design_check_summary)}function ye(e){return re(e.design_check_summary)}function re(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 fa(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((a,o)=>{const u=o.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=(n=e[0])==null?void 0:n.latest.design_check_summary)==null?void 0:l.coverage_dimensions:void 0}}function va(e){const i=new Map;for(const l of e){const a=Ae(l),o=i.get(a);if(!o){i.set(a,{latest:l,snapshotCount:1});continue}o.snapshotCount+=1,l.captured_at>o.latest.captured_at&&(o.latest=l)}const s=[...i.entries()].map(([l,a])=>({key:l,latest:a.latest,snapshotCount:a.snapshotCount,verdict:xa(a.latest)})),n=new Map;for(const l of s){const a=ya(l.latest),o=n.get(a)??[];o.push(l),n.set(a,o)}return[...n.entries()].map(([l,a])=>{var g;const o=a.sort((m,h)=>{const x=ye(m.latest)-ye(h.latest);return x!==0?x:h.latest.captured_at-m.latest.captured_at}),u=o.reduce((m,h)=>h.latest.captured_at>m.captured_at?h.latest:m,((g=o[0])==null?void 0:g.latest)??a[0].latest),d=fa(o);return{key:l,latest:u,snapshotCount:o.reduce((m,h)=>m+h.snapshotCount,0),children:o,summary:d,verdict:$e(d)}}).sort((l,a)=>{const o=re(l.summary)-re(a.summary);return o!==0?o:a.latest.captured_at-l.latest.captured_at})}function Sa(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(e,i){return`${i}${e("uiStudio.storage.countSuffix","개")}`}function ne(e,i){return`${e("uiStudio.priorityHigh","우선 검토")} ${E(e,(i==null?void 0:i.priority_high)??0)} · ${e("uiStudio.priorityMedium","검토 권장")} ${E(e,(i==null?void 0:i.priority_medium)??0)} · ${e("uiStudio.priorityLow","선택 개선")} ${E(e,(i==null?void 0:i.priority_low)??0)}`}function ja(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 Ca(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 wa(e,i,s){const n=s.evidenceIncomplete>0?` · ${V(e,"incomplete")} ${E(e,s.evidenceIncomplete)}`:"";return`${e("uiStudio.analysis.targetCountLabel","분석 대상")} ${E(e,i)} · ${V(e,"needsFix")} ${E(e,s.hasSuggestions)}${n} · ${V(e,"passed")} ${E(e,s.noSuggestions)}`}function xe(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 ka({tier:e}){const{t:i}=I(),{trackEvent:s}=q(),n=e==="basic",l=Pe(50),a=_.useRef(null),[o,u]=_.useState(null),[d,g]=_.useState(new Set),[m,h]=_.useState(new Set),[x,j]=_.useState(!1),C=_.useCallback((f,$)=>{const T=o===f;T||(a.current=$??null),u(T?null:f)},[o]),b=_.useCallback(()=>{u(null)},[]),G=_.useCallback(f=>{g($=>{const T=new Set($);return T.has(f)?T.delete(f):T.add(f),T})},[]),k=n?ca(i):null,p=(k==null?void 0:k.list)??l.data,B=n?!1:l.loading,N=_.useCallback(f=>{h($=>{const T=new Set($);return T.has(f)?T.delete(f):T.add(f),T})},[]),v=f=>{h(new Set(f))},P=()=>{h(new Set)},M=async()=>{const f=(p==null?void 0:p.placeId)??0;s("dashboard_click_event",{click_target:"ui_studio_delete_selected_snapshots",page:"ui-studio",tab:"ui_studio_analysis"}),await Je(f,{ids:[...m]}),await l.refresh(),j(!1),h(new Set)};if(B)return t.jsx("div",{className:r.page,children:i("uiStudio.loading","Loading...")});if(!n&&ae(l.error))return t.jsx(De,{});if(!n&&l.error)return t.jsxs("div",{className:r.page,children:[i("uiStudio.error","Error"),": ",l.error]});const D=(p==null?void 0:p.snapshots)??[],w=p!==null,S=(p==null?void 0:p.placeId)??0,A=D.map(f=>f.snapshot_id),L=va(D),K=Sa(L);return t.jsxs("div",{children:[t.jsx("div",{className:r.analysisWorkspace,"data-detail-open":o?"true":"false",children:t.jsxs("div",{className:r.analysisMainColumn,"data-testid":"analysis-main-column",children:[n&&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:we.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("h2",{children:t.jsx(R,{label:i("uiStudio.title","UI Studio"),tooltip:i("uiStudio.title.tooltip","A central place to review AI-generated UI screens and improvement suggestions.")})})}),D.length===0?w?t.jsx(Me,{kind:"analysis"}):t.jsx("div",{className:r.emptyState,children:i("uiStudio.empty.unavailable","UI Studio data is not available yet.")}):t.jsxs(t.Fragment,{children:[t.jsx("section",{className:r.analysisSummaryPanel,children:t.jsxs("div",{children:[t.jsx("h2",{children:t.jsx(R,{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:wa(i,L.length,K)})]})}),t.jsx("div",{className:r.analysisReportGrid,"data-testid":"analysis-report-grid",children:L.map(f=>t.jsx(Ia,{report:f,placeId:S,imageUrlOverride:n?se:void 0,expanded:d.has(f.key),onPrimaryClick:$=>{f.children.length>1?G(f.key):C(f.latest.snapshot_id,$)},onChildClick:($,T)=>C($,T)},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(R,{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","화면 캡처")," ",E(i,D.length)]})]}),!n&&D.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:()=>v(A),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:()=>j(!0),type:"button",children:i("common.delete","삭제")})})]})]})]}),t.jsx("div",{className:r.grid,children:D.map(f=>t.jsx(Us,{snapshot:f,placeId:S,onClick:$=>C(f.snapshot_id,$),imageUrlOverride:n?se:void 0,selectable:!n,selected:m.has(f.snapshot_id),onToggleSelect:N},f.snapshot_id))})]})]})]})}),t.jsx(et,{open:o!==null,ariaLabel:i("uiStudio.analysis.detailDialog","Analysis detail"),onClose:b,returnFocusTo:a.current,testId:"analysis-detail-popup-layer",children:o&&t.jsx(ta,{snapshotId:o,placeId:S,onClose:b,sampleDetail:n&&o===Ge?(k==null?void 0:k.detail)??null:null,tier:e,onActionDone:n?void 0:l.refresh})}),x&&t.jsx(oe,{title:i("uiStudio.confirm.deleteBatchTitle","화면 캡처 일괄 삭제"),message:i("uiStudio.confirm.deleteBatchMessage",`선택한 ${m.size}개의 화면 캡처를 삭제합니다. 이 작업은 되돌릴 수 없습니다.`),danger:!0,confirmLabel:i("common.delete","삭제"),onConfirm:M,onClose:()=>j(!1)})]})}function V(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 ba(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?ne(e,i):(i==null?void 0:i.readiness)==="insufficient_evidence"?e("uiStudio.analysis.issueSummary.incomplete","제안은 없지만 interaction·responsive 검토가 남아 있습니다."):e("uiStudio.analysis.issueSummary.passed","현재 검토 기준에서 추가 개선 제안은 없습니다.")}function Ia({report:e,placeId:i,imageUrlOverride:s,expanded:n,onPrimaryClick:l,onChildClick:a}){const{t:o}=I(),u=e.latest,d=s??Ne(u.snapshot_id,i),g=new Date(u.captured_at*1e3).toLocaleString(),m=V(o,e.verdict),h=e.children.length>1;return t.jsxs("div",{className:r.analysisReportGroup,children:[t.jsxs("button",{className:r.analysisReportCard,"aria-expanded":h?n:void 0,"aria-label":`${e.key} ${h?o("uiStudio.analysis.expandChildren","하위 대상 보기"):o("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"?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:`${r.analysisVerdict} ${r[`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:r.analysisReportCounts,children:ne(o,e.summary)})})]}),t.jsx("div",{className:r.analysisReportTarget,children:e.key}),t.jsx(Na,{summary:e.summary}),t.jsx("div",{className:r.analysisReportIssue,children:ba(o,e.summary)}),t.jsx("div",{className:r.analysisReportCoverage,children:xe(o,e.summary)}),t.jsx(Pa,{summary:e.summary}),t.jsxs("div",{className:r.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","캡처")} ${E(o,e.snapshotCount)}`:"",h?` · ${o("uiStudio.analysis.childTargets","하위 대상")} ${E(o,e.children.length)}`:""]})]})]}),h&&n&&t.jsx("div",{className:r.analysisChildList,children:e.children.map(x=>t.jsxs("button",{className:r.analysisChildRow,onClick:j=>a(x.latest.snapshot_id,j.currentTarget),type:"button",children:[t.jsx("span",{className:r.analysisChildPath,children:x.key}),t.jsx("span",{className:r.analysisChildSummary,children:ne(o,x.latest.design_check_summary)}),t.jsx("span",{className:r.analysisChildSummary,children:xe(o,x.latest.design_check_summary)}),t.jsx("span",{className:r.analysisChildDetailHint,children:o("uiStudio.analysis.childDetailHint","하위 대상 상세 보기")})]},x.key))})]})}function Na({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:r.readinessSummary,"aria-label":i("uiStudio.readiness.summary","UI readiness"),children:[t.jsxs("span",{className:r.readinessChip,children:[i("uiStudio.primaryVisual.label","Primary visual")," · ",ja(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")," · ",n]}),t.jsx("span",{className:`${r.readinessChip} ${e.readiness==="ready"?r.readinessChipReady:r.readinessChipPending}`,children:Ca(i,e.readiness)})]})}function Pa({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:r.coverageChips,"aria-label":i("uiStudio.analysis.coverageDimensions","검토 범위"),children:n.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(e,i,s=1e4){const[n,l]=_.useState(null),[a,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 h=await ce(e,i);l(h),d(null)}catch(h){d(h.message)}finally{o(!1)}},[e,g]);return _.useEffect(()=>{let h=!0;if(e===null)return l(null),d(null),o(!1),()=>{h=!1};const x=async()=>{try{const C=await ce(e,i);h&&(l(C),d(null))}catch(C){h&&d(C.message)}finally{h&&o(!1)}};x();const j=setInterval(()=>{x()},s);return()=>{h=!1,clearInterval(j)}},[e,g,s]),{data:n,loading:a,error:u,refresh:m}}const Ba="_filterBar_1203k_4",Ra="_filterGroup_1203k_14",Ga="_filterLabel_1203k_21",Da="_filterCheckbox_1203k_28",Ma="_segmentGroup_1203k_45",Aa="_segmentBtn_1203k_55",$a="_segmentBtnActive_1203k_73",La="_filterInput_1203k_79",Ea="_filterResetBtn_1203k_95",qa="_requestRow_1203k_114",Ua="_requestRowMain_1203k_127",Ha="_requestDetailToggle_1203k_134",Fa="_thumbPair_1203k_156",Oa="_thumbPairButton_1203k_164",za="_thumbSlot_1203k_179",Va="_thumbImg_1203k_204",Wa="_thumbPlaceholder_1203k_211",Ka="_thumbArrow_1203k_219",Ya="_extraPathsBadge_1203k_225",Qa="_requestMeta_1203k_239",Ja="_requestLabel_1203k_247",Xa="_requestTime_1203k_256",Za="_requestStats_1203k_261",er="_statDot_1203k_269",tr="_summaryPill_1203k_273",ir="_requestReadiness_1203k_277",sr="_requestReadinessPill_1203k_283",ar="_requestReadinessReady_1203k_297",rr="_requestReadinessPending_1203k_303",nr="_requestActions_1203k_310",or="_expandHint_1203k_317",lr="_mutationsArea_1203k_330",cr="_mutLoading_1203k_339",ur="_mutEmpty_1203k_340",dr="_mutError_1203k_346",pr="_mutationRow_1203k_352",hr="_mutationLine_1203k_362",_r="_mutTs_1203k_369",mr="_mutCommand_1203k_375",gr="_mutPath_1203k_381",yr="_mutDiff_1203k_391",xr="_mutErr_1203k_346",fr="_changeDetails_1203k_406",vr="_changeDetailRow_1203k_414",Sr="_changeDetailRowNoBefore_1203k_423",jr="_changeDetailBadge_1203k_427",Cr="_changeDetail_text_1203k_444",wr="_changeDetail_color_1203k_449",kr="_changeDetail_size_1203k_454",br="_changeDetail_layout_1203k_459",Ir="_changeDetail_state_1203k_464",Nr="_changeDetail_asset_1203k_469",Pr="_changeDetail_property_1203k_474",Tr="_changeDetailProperty_1203k_478",Br="_changeDetailArrow_1203k_486",Rr="_changeDetailOldValue_1203k_492",Gr="_changeDetailNewValue_1203k_493",Dr="_compareDialogLayer_1203k_511",Mr="_compareDialog_1203k_511",Ar="_beforeAfterDrawer_1203k_542",$r="_drawerHeader_1203k_552",Lr="_drawerTitle_1203k_561",Er="_drawerCloseBtn_1203k_569",qr="_drawerBody_1203k_585",Ur="_pathTabs_1203k_592",Hr="_pathTab_1203k_592",Fr="_pathTabActive_1203k_621",Or="_comparePanel_1203k_627",zr="_compareHalf_1203k_637",Vr="_compareLabel_1203k_644",Wr="_compareImg_1203k_655",Kr="_comparePlaceholder_1203k_663",Yr="_compareDetailsPanel_1203k_675",Qr="_compareDetailsHeader_1203k_684",Jr="_drawerFooter_1203k_702",Xr="_drawerActionBtn_1203k_710",Zr="_historyTabWrap_1203k_728",en="_historyWorkspace_1203k_734",tn="_historyMainColumn_1203k_739",sn="_requestList_1203k_743",an="_emptyHistory_1203k_748",rn="_historyError_1203k_758",nn="_historyLoading_1203k_764",on="_listHeader_1203k_772",ln="_listHeaderTitle_1203k_781",cn="_clearBtn_1203k_788",un="_deleteErrBanner_1203k_812",c={filterBar:Ba,filterGroup:Ra,filterLabel:Ga,filterCheckbox:Da,segmentGroup:Ma,segmentBtn:Aa,segmentBtnActive:$a,filterInput:La,filterResetBtn:Ea,requestRow:qa,requestRowMain:Ua,requestDetailToggle:Ha,thumbPair:Fa,thumbPairButton:Oa,thumbSlot:za,thumbImg:Va,thumbPlaceholder:Wa,thumbArrow:Ka,extraPathsBadge:Ya,requestMeta:Qa,requestLabel:Ja,requestTime:Xa,requestStats:Za,statDot:er,summaryPill:tr,requestReadiness:ir,requestReadinessPill:sr,requestReadinessReady:ar,requestReadinessPending:rr,requestActions:nr,expandHint:or,mutationsArea:lr,mutLoading:cr,mutEmpty:ur,mutError:dr,mutationRow:pr,mutationLine:hr,mutTs:_r,mutCommand:mr,mutPath:gr,mutDiff:yr,mutErr:xr,changeDetails:fr,changeDetailRow:vr,changeDetailRowNoBefore:Sr,changeDetailBadge:jr,changeDetail_text:Cr,changeDetail_color:wr,changeDetail_size:kr,changeDetail_layout:br,changeDetail_state:Ir,changeDetail_asset:Nr,changeDetail_property:Pr,changeDetailProperty:Tr,changeDetailArrow:Br,changeDetailOldValue:Rr,changeDetailNewValue:Gr,compareDialogLayer:Dr,compareDialog:Mr,beforeAfterDrawer:Ar,drawerHeader:$r,drawerTitle:Lr,drawerCloseBtn:Er,drawerBody:qr,pathTabs:Ur,pathTab:Hr,pathTabActive:Fr,comparePanel:Or,compareHalf:zr,compareLabel:Vr,compareImg:Wr,comparePlaceholder:Kr,compareDetailsPanel:Yr,compareDetailsHeader:Qr,drawerFooter:Jr,drawerActionBtn:Xr,historyTabWrap:Zr,historyWorkspace:en,historyMainColumn:tn,requestList:sn,emptyHistory:an,historyError:rn,historyLoading:nn,listHeader:on,listHeaderTitle:ln,clearBtn:cn,deleteErrBanner:un};function dn(e){try{return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}function fe(e){return e==null?"nil":typeof e=="string"?`"${e}"`:typeof e=="object"?JSON.stringify(e):String(e)}function Le({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(pn,{mutation:n},n.mutationId))})}function pn({mutation:e}){return t.jsxs("div",{className:c.mutationRow,children:[t.jsxs("div",{className:c.mutationLine,children:[t.jsx("span",{className:c.mutTs,children:dn(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(hn,{detail:i},`${i.property}:${i.category}`))}),!e.ok&&e.error&&t.jsx("span",{className:c.mutErr,children:e.error})]})}function hn({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:fe(e.before)}),t.jsx("span",{className:c.changeDetailArrow,children:"→"}),t.jsx("span",{className:c.changeDetailNewValue,children:fe(e.after)})]})}function ve(e,i){return`${W}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image?placeId=${i}`}function _n(e){try{return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}function mn(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 ee(e,i){if(i.label)return i.label;const s=mn(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 te(e,i){return`${i}${e("uiStudio.storage.countSuffix","")}`}function gn(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 yn(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")} ${te(e,i.priority_high)}`,l=`${e("uiStudio.priorityMedium","Recommended")} ${te(e,i.priority_medium)}`,a=`${e("uiStudio.priorityLow","Optional")} ${te(e,i.priority_low)}`;return`${e("uiStudio.history.row.designCheck","Suggestions")}: ${n} · ${l} · ${a}`}function xn(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 Ee({req:e,placeId:i,onOpenCompare:s,imageUrlOverride:n,sampleMutations:l}){const{t:a}=I(),[o,u]=_.useState(!1),[d,g]=_.useState(null),[m,h]=_.useState(!1),[x,j]=_.useState(null),C=n!=null,b=e.affectedPaths[0]??null,G=e.affectedPaths.length-1,k=b?e.beforeSnapshots[b]??null:null,p=b?e.afterSnapshots[b]??null:null,B=k?C?n:ve(k,i):null,N=p?C?n:ve(p,i):null,v=gn(a,e.qualityPlanSummary),P=yn(a,e.postChangeDesignCheckSummary,e.readiness),M=e.postChangeDesignCheckSummary,D=async()=>{if(!o&&d===null)if(C&&l!=null)g(l);else{h(!0),j(null);try{const w=await ke(i,e.requestId);g(w.mutations)}catch(w){j(w.message)}finally{h(!1)}}u(w=>!w)};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:w=>s(w.currentTarget),disabled:!b,"aria-label":`${ee(a,e)} ${a("uiStudio.history.row.compare","Before / After")}`,type:"button",children:[t.jsx("div",{className:c.thumbSlot,children:B?t.jsx("img",{className:c.thumbImg,src:B,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":o,"aria-label":`${ee(a,e)} ${a("uiStudio.history.row.toggleDetails","Toggle change details")}`,onClick:()=>void D(),children:[t.jsxs("span",{className:c.requestMeta,children:[t.jsx("span",{className:c.requestLabel,children:ee(a,e)}),t.jsx("span",{className:c.requestTime,children:_n(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","")]})}),v&&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:v})})]}),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})})]})]}),M&&t.jsxs("span",{className:c.requestReadiness,"aria-label":a("uiStudio.readiness.summary","UI readiness"),children:[t.jsx("span",{className:c.requestReadinessPill,children:xn(a,M.primary_visual_verdict)}),t.jsx("span",{className:c.requestReadinessPill,children:M.functional_safe===!0?a("uiStudio.functional.safeCompact","Functional safe"):M.functional_safe===!1?a("uiStudio.functional.riskCompact","Functional risk"):a("uiStudio.functional.unknownCompact","Functional unknown")}),t.jsx("span",{className:c.requestReadinessPill,children:M.responsive_requirement==="required"?a("uiStudio.responsive.requiredCompact","Responsive required"):M.responsive_requirement==="recommended"?a("uiStudio.responsive.recommendedCompact","Responsive recommended"):a("uiStudio.responsive.unknownCompact","Responsive unknown")}),M.readiness==="ready"&&t.jsx("span",{className:`${c.requestReadinessPill} ${c.requestReadinessReady}`,children:a("uiStudio.readiness.ready","Ready")}),M.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:o?a("uiStudio.history.row.collapseDetails","Hide change details"):a("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:a("uiStudio.history.loading","로딩 중...")}),x&&t.jsx("div",{className:c.mutError,children:x}),d&&t.jsx(Le,{mutations:d,emptyLabel:a("uiStudio.history.row.mutationsEmpty","No change details")})]})]})}function Se(e,i){return`${W}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image?placeId=${i}`}function qe({requestId:e,placeId:i,onClose:s,imageUrlOverride:n,sampleDetail:l}){const{t:a}=I(),o=_.useRef(null),u=l!=null,[d,g]=_.useState(u?l:null),[m,h]=_.useState(!u),[x,j]=_.useState(null),[C,b]=_.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 h(!0),j(null),ke(i,e).then(P=>{v&&(g(P),P.affectedPaths.length>0&&b(P.affectedPaths[0]))}).catch(P=>{v&&j(P.message)}).finally(()=>{v&&h(!1)}),()=>{v=!1}},[e,i,u]);const G=C&&d?d.beforeSnapshots[C]??null:null,k=C&&d?d.afterSnapshots[C]??null:null,p=G?n??Se(G,i):null,B=k?n??Se(k,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: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: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(v=>t.jsx(y,{text:`${a("uiStudio.compare.path.tooltip","The UI instance path for this screen.")} ${v}`,children:t.jsx("button",{role:"tab","aria-selected":C===v,className:`${c.pathTab} ${C===v?c.pathTabActive:""}`,onClick:()=>b(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: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")})}),p?t.jsx("img",{className:c.compareImg,src:p,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")})}),B?t.jsx("img",{className:c.compareImg,src:B,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(Le,{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 z(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 je(e,i){const s=e.split("-").map(Number);if(s.length!==3||s.some(o=>Number.isNaN(o)))return;const[n,l,a]=s;return new Date(n,l-1,a,i?23:0,i?59:0,i?59:0,i?999:0).toISOString()}function fn(e){const i={limit:50};if(e.action!=="all"&&(i.action=e.action),e.datePreset==="custom"){const s=e.from?je(e.from,!1):void 0,n=e.to?je(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}=z(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:a}=z(n);i.from=l.toISOString(),i.to=a.toISOString()}else{const n=e.datePreset==="7d"?6:29,l=new Date(s);l.setDate(l.getDate()-n);const{start:a}=z(l),{end:o}=z(s);i.from=a.toISOString(),i.to=o.toISOString()}}return i}function Ue(){return{action:"all",datePreset:"all"}}function vn(e){return e.action==="all"&&e.datePreset==="all"&&e.from===void 0&&e.to===void 0}function Sn(){const{t:e}=I(),{trackEvent:i}=q(),s=Xe(e),[n,l]=_.useState(null),a=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: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:we.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(R,{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(Ee,{req:d,placeId:0,onOpenCompare:g=>o(d.requestId,g),imageUrlOverride:ue,sampleMutations:s.mutationsByRequest[d.requestId]},d.requestId))})]}),n&&a&&t.jsx(qe,{requestId:n,placeId:0,onClose:u,imageUrlOverride:ue,sampleDetail:{...a,mutations:s.mutationsByRequest[a.requestId]??[]}})]})]})}function jn({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(R,{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(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(R,{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(R,{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(R,{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(Ue()),type:"button",children:s("uiStudio.history.filter.reset","Reset")})})]})}function Cn(){var D;const{t:e}=I(),{trackEvent:i}=q(),s=Pe(1),n=((D=s.data)==null?void 0:D.placeId)??null,[l,a]=_.useState(Ue),{data:o,loading:u,error:d,refresh:g}=Ta(n,fn(l)),[m,h]=_.useState(null),[x,j]=_.useState(!1),[C,b]=_.useState(!1),[G,k]=_.useState(null),p=async()=>{if(k(null),n===null){k(e("uiStudio.history.noPlaceAction","Current place is not available yet."));return}try{await Ze(n,{all:!0,alsoSnapshots:C}),await g(),j(!1)}catch(w){throw k(w.message),w}},B=(o==null?void 0:o.requests)??[],N=n===null&&s.loading,v=ae(s.error)||ae(d),P=_.useCallback((w,S)=>{i("dashboard_click_event",{click_target:"ui_studio_compare_before_after",page:"ui-studio",tab:"ui_studio_history"}),h(w)},[i]),M=_.useCallback(()=>{h(null)},[]);return t.jsxs("div",{className:c.historyTabWrap,children:[v?t.jsx(De,{}):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(jn,{filter:l,onChange:a}),t.jsxs("div",{className:c.listHeader,children:[t.jsx("h2",{className:c.listHeaderTitle,children:t.jsx(R,{label:e("uiStudio.history.title","변경 이력"),tooltip:e("uiStudio.history.title.tooltip","A timeline of every UI change made by AI.")})}),B.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"}),j(!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&&B.length===0&&(vn(l)?t.jsx(Me,{kind:"history"}):t.jsxs("div",{className:c.emptyHistory,children:[t.jsx("strong",{children:e("uiStudio.history.filteredEmpty.title","No change history matches these filters")}),t.jsx("span",{children:e("uiStudio.history.filteredEmpty.body","Change the filters or use Reset to show the full history.")})]})),!N&&!u&&n!==null&&B.length>0&&t.jsx("div",{className:c.requestList,children:B.map(w=>t.jsx(Ee,{req:w,placeId:n,onOpenCompare:S=>P(w.requestId,S)},w.requestId))}),G&&t.jsx("div",{className:c.deleteErrBanner,children:G})]}),m&&n!==null&&t.jsx(qe,{requestId:m,placeId:n,onClose:M})]}),x&&t.jsx(oe,{title:e("uiStudio.history.confirm.clearRequestsTitle","변경 이력 삭제"),message:e("uiStudio.history.confirm.clearRequestsMessage","현재 place의 변경 이력을 삭제합니다. Studio 인스턴스에는 영향을 주지 않습니다."),danger:!0,cascadeOption:{label:e("uiStudio.history.confirm.cascadeOption","연결된 화면 캡처도 함께 삭제"),checked:C,onChange:b},confirmLabel:e("common.delete","삭제"),onConfirm:p,onClose:()=>j(!1)})]})}function wn({tier:e}){return e==="basic"?t.jsx(Sn,{}):t.jsx(Cn,{})}const kn=["analysis","history"];function An(){const{t:e}=I(),{trackEvent:i}=q(),{tier:s,loading:n}=ze(),[l,a]=Ve(),o=l.get("tab"),u=o&&kn.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"}),a(h=>{const x=new URLSearchParams(h);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(Ke,{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(st,{surface:"uiStudio"}),t.jsx(tt,{items:g,value:u,onChange:d}),n?t.jsx("div",{className:r.emptyState,children:e("uiStudio.loading","Loading...")}):u==="analysis"?t.jsx(ka,{tier:s}):t.jsx(wn,{tier:s})]})}export{An as Component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
._page_vrx8j_2{display:flex;flex-direction:column;gap:var(--content-gap);max-width:var(--content-max)}._grid_vrx8j_9{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px;margin-top:16px}._card_vrx8j_16{border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;background:var(--bg-card);padding:0;text-align:left;position:relative;color:inherit}._card_vrx8j_16:hover{border-color:var(--accent)}._cardBodyButton_vrx8j_31{display:block;width:100%;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;font:inherit;text-align:left}._cardBodyButton_vrx8j_31:focus-visible{outline:none;box-shadow:inset var(--focus-ring)}._thumb_vrx8j_48{width:100%;aspect-ratio:16 / 9;object-fit:contain;object-position:center;display:block;background:var(--bg-secondary)}._badges_vrx8j_57{position:absolute;top:8px;right:8px;display:flex;gap:4px}._priorityHighBadge_vrx8j_65,._priorityMediumBadge_vrx8j_66,._priorityLowBadge_vrx8j_67{display:inline-flex;align-items:center;min-height:22px;padding:2px 6px;border:1px solid var(--border);border-radius:var(--radius-control);font-size:12px;font-weight:600;cursor:default}._priorityHighBadge_vrx8j_65{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}._priorityMediumBadge_vrx8j_66{background:var(--pro-bg-soft);border-color:var(--pro-border);color:var(--pro-text)}._priorityLowBadge_vrx8j_67{background:var(--bg-secondary);border-color:var(--border);color:var(--text-secondary)}._cardMeta_vrx8j_97{padding:8px 12px;font-size:12px;color:var(--text-primary)}._target_vrx8j_103{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._time_vrx8j_110{color:var(--text-muted);margin-top:4px}._drawer_vrx8j_115{width:100%;flex:1 1 auto;min-height:0;max-height:none;display:flex;flex-direction:column;background:var(--bg-card);border:0;border-radius:0;overflow:hidden;padding:0;box-shadow:none;color:var(--text-primary);box-sizing:border-box}._drawerToolbar_vrx8j_132{flex:0 0 auto;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:16px;padding:14px 16px;border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--bg-card) 92%,var(--bg-secondary))}._drawerTitleBlock_vrx8j_143{min-width:0;display:flex;flex-direction:column;gap:3px}._drawerEyebrow_vrx8j_150{color:var(--text-muted);font-family:var(--font-label);font-size:11px;font-weight:600;letter-spacing:0;text-transform:uppercase}._drawerTarget_vrx8j_159{overflow:hidden;color:var(--text-primary);font-family:var(--font-label);font-size:13px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}._drawerToolbarActions_vrx8j_169{display:flex;align-items:center;justify-content:flex-end;gap:8px;min-width:0}._closeBtn_vrx8j_177{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;cursor:pointer;border:1px solid var(--border);border-radius:7px;background:transparent;color:var(--text-secondary);transition:border-color var(--transition),background var(--transition),color var(--transition)}._closeBtn_vrx8j_177:hover{border-color:var(--accent);background:var(--accent-dim);color:var(--text-primary)}._detailBody_vrx8j_198{flex:1 1 auto;min-height:0;overflow-y:auto;padding:16px 24px 24px}._screenshotPreviewFrame_vrx8j_205{display:flex;align-items:center;justify-content:center;width:100%;height:clamp(180px,32vh,320px);margin-top:12px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-secondary);overflow:hidden}._fullImg_vrx8j_218{display:block;width:100%;height:100%;object-fit:contain}._metaDl_vrx8j_225{display:grid;grid-template-columns:auto 1fr;gap:8px 16px;margin:16px 0;font-size:13px}._metaDl_vrx8j_225 dt{color:var(--text-muted)}._errorMsg_vrx8j_237{color:var(--error-text);padding:12px}._suggestionsWrap_vrx8j_242{margin-top:16px}._suggestionsWrap_vrx8j_242 h3{margin:0 0 12px;font-size:16px}._prioritySection_vrx8j_249{margin-bottom:16px}._sectionHighHeader_vrx8j_253{margin:0 0 8px;font-size:13px;font-weight:600;color:var(--error)}._sectionLowHeader_vrx8j_259{margin:0 0 8px;font-size:13px;font-weight:600;color:var(--warning-text)}._sectionMediumHeader_vrx8j_265{margin:0 0 8px;font-size:13px;font-weight:600;color:var(--warning)}._groupCard_vrx8j_271{border:1px solid var(--border);border-radius:8px;margin-bottom:8px;background:var(--bg-secondary);overflow:hidden}._groupHeader_vrx8j_278{width:100%;display:flex;align-items:center;gap:8px;padding:10px 12px;background:transparent;border:none;cursor:pointer;text-align:left;color:var(--text-primary);font:inherit}._groupHeader_vrx8j_278:hover{background:var(--bg-card)}._groupLabel_vrx8j_294{font-weight:600;font-size:13px;flex:1}._groupCount_vrx8j_299{font-size:12px;color:var(--text-muted);padding:2px 8px;background:var(--bg-card);border-radius:10px}._groupChevron_vrx8j_306{color:var(--text-muted);font-size:12px}._groupBody_vrx8j_310{padding:0 12px 12px}._groupDescription_vrx8j_313{font-size:12px;color:var(--text-muted);margin:8px 0 4px}._groupFix_vrx8j_318{font-size:12px;color:var(--text-primary);margin:4px 0 8px;padding:6px 10px;background:var(--bg-card);border-left:3px solid var(--accent);border-radius:4px}._falsePositive_vrx8j_327{font-size:12px;color:var(--warning-text);margin:4px 0 8px;padding:6px 10px;background:var(--warning-bg);border-radius:4px}._itemList_vrx8j_335{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}._suggestionItem_vrx8j_343{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;background:var(--bg-card);border-radius:6px;font-size:12px}._suggestionInfo_vrx8j_353{display:flex;flex-direction:column;gap:2px;min-width:0}._pathBreadcrumb_vrx8j_359{font-family:monospace;font-size:11px;color:var(--text-primary);background:transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._currentValue_vrx8j_368{font-size:11px;color:var(--text-muted)}._copyFixBtn_vrx8j_372{padding:4px 10px;background:var(--accent);color:var(--bg-card);border:none;border-radius:4px;cursor:pointer;font-size:11px;font-weight:600;flex-shrink:0}._copyFixBtn_vrx8j_372:hover{opacity:.9}._emptySuggestions_vrx8j_386{text-align:center;padding:24px;color:var(--text-muted);font-size:13px}._sampleBanner_vrx8j_394{display:flex;flex-direction:column;gap:12px;padding:18px 20px;border:1px solid var(--pro-border);border-radius:var(--radius);background:linear-gradient(135deg,#f0bd5829,#f0bd5808 55%),var(--bg-card);margin-bottom:16px}._sampleBannerRow_vrx8j_407{display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap}._sampleBannerMain_vrx8j_415{display:flex;flex-direction:column;gap:8px;min-width:0;flex:1}._sampleBadge_vrx8j_423{width:fit-content;color:var(--pro-text);font-family:var(--font-label);font-size:11px;font-weight:600;letter-spacing:.02em;opacity:.92}._sampleTitle_vrx8j_433{font-family:var(--font-label);font-size:16px;font-weight:600;color:var(--text-primary)}._sampleMessage_vrx8j_440{max-width:560px;color:var(--text-secondary);font-size:13px;line-height:1.5}._sampleActions_vrx8j_447{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}._primaryAction_vrx8j_455,._secondaryAction_vrx8j_456{display:inline-flex;align-items:center;justify-content:center;min-height:34px;padding:0 14px;border-radius:8px;font-family:var(--font-label);font-size:12px;text-decoration:none;transition:background var(--transition),border-color var(--transition),opacity var(--transition)}._secondaryAction_vrx8j_456{border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);cursor:pointer}._secondaryAction_vrx8j_456:hover{border-color:var(--accent);background:var(--accent-dim)}._primaryAction_vrx8j_455{border:1px solid var(--pro-badge);background:var(--pro-badge);color:var(--pro-text-on-badge)}._primaryAction_vrx8j_455:hover{opacity:.9}._emptyState_vrx8j_491{text-align:center;padding:48px 20px;color:var(--text-muted);font-size:14px}._pluginGuideCard_vrx8j_499{display:flex;align-items:flex-start;gap:14px;padding:18px 20px;border:1px solid var(--warning);border-radius:var(--radius);background:var(--bg-card);color:var(--text-primary)}._pluginGuideMarker_vrx8j_510{display:flex;align-items:center;justify-content:center;width:28px;height:28px;flex:0 0 28px;border-radius:50%;border:1px solid var(--warning);color:var(--warning);font-family:var(--font-label);font-size:15px;font-weight:700}._pluginGuideBody_vrx8j_525{min-width:0}._pluginGuideTitle_vrx8j_529{margin:0 0 8px;color:var(--text-primary);font-family:var(--font-label);font-size:15px;font-weight:600}._pluginGuideMessage_vrx8j_537{margin:0 0 12px;color:var(--text-secondary);font-size:13px;line-height:1.5}._pluginGuideChecklist_vrx8j_544{display:flex;flex-direction:column;gap:7px;margin:0 0 14px;padding:0;list-style:none}._pluginGuideChecklist_vrx8j_544 li{position:relative;padding-left:20px;color:var(--text-secondary);font-size:13px}._pluginGuideChecklist_vrx8j_544 li:before{content:"○";position:absolute;left:2px;color:var(--text-muted)}._pluginGuideWaiting_vrx8j_567{display:inline-flex;align-items:center;gap:8px;color:var(--text-muted);font-family:var(--font-label);font-size:12px}._pluginGuideDot_vrx8j_576{width:7px;height:7px;border-radius:50%;background:var(--warning)}._analysisWorkspace_vrx8j_584{width:100%;position:relative}._analysisMainColumn_vrx8j_589{min-width:0}._analysisSummaryPanel_vrx8j_594{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-top:16px;padding:16px 18px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-card)}._analysisSummaryPanel_vrx8j_594 h2,._recentCapturesHeader_vrx8j_607 h2{margin:0;font-size:16px;font-family:var(--font-label);color:var(--text-primary)}._analysisSummaryText_vrx8j_614,._recentCapturesMeta_vrx8j_615{margin:6px 0 0;color:var(--text-secondary);font-size:13px}._analysisReportGrid_vrx8j_621{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px;margin-top:14px}._analysisReportGroup_vrx8j_628{min-width:0}._analysisReportCard_vrx8j_632{display:grid;grid-template-columns:112px minmax(0,1fr);gap:12px;width:100%;min-height:128px;padding:12px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-card);color:var(--text-primary);cursor:pointer;text-align:left;font:inherit;transition:border-color var(--transition),background var(--transition)}._analysisReportCard_vrx8j_632:hover{border-color:var(--accent);background:var(--bg-secondary)}._analysisReportThumb_vrx8j_654{width:112px;aspect-ratio:16 / 10;object-fit:contain;object-position:center;border-radius:6px;background:var(--bg-secondary)}._analysisReportBody_vrx8j_663{min-width:0;display:flex;flex-direction:column;gap:7px}._analysisReportTopline_vrx8j_670{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._analysisVerdict_vrx8j_677{display:inline-flex;align-items:center;min-height:22px;padding:0 8px;border-radius:999px;font-family:var(--font-label);font-size:12px;font-weight:600}._analysisVerdict_needsFix_vrx8j_688,._analysisVerdict_review_vrx8j_689{color:var(--accent);background:var(--accent-dim)}._analysisVerdict_incomplete_vrx8j_694{color:var(--warning-text);background:var(--warning-bg)}._analysisVerdict_passed_vrx8j_699{color:var(--text-secondary);background:var(--bg-secondary)}._analysisReportCounts_vrx8j_704{color:var(--text-secondary);font-size:12px}._readinessSummary_vrx8j_709{display:flex;flex-wrap:wrap;gap:5px}._readinessChip_vrx8j_715{display:inline-flex;align-items:center;min-height:22px;padding:2px 7px;border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg-secondary);color:var(--text-secondary);font-family:var(--font-label);font-size:11px;font-weight:600;line-height:1.3}._readinessChipReady_vrx8j_730{border-color:var(--success-border);background:var(--success-bg);color:var(--success-text)}._readinessChipPending_vrx8j_736{border-color:var(--warning-border);background:var(--warning-bg);color:var(--warning-text)}._primaryReadinessBlock_vrx8j_742{display:flex;flex-direction:column;gap:8px;width:100%}._criticSummary_vrx8j_749{display:flex;flex-direction:column;gap:3px;margin:0;padding:8px 10px;border-left:2px solid var(--accent);background:var(--accent-dim);color:var(--text-secondary);font-size:12px;line-height:1.45}._criticSummary_vrx8j_749>span{color:var(--text-primary);font-size:11px;font-weight:600}._analysisReportTarget_vrx8j_768{overflow:hidden;color:var(--text-primary);font-size:13px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}._analysisReportIssue_vrx8j_777{color:var(--text-secondary);font-size:12px;line-height:1.35}._analysisReportCoverage_vrx8j_783{color:var(--text-muted);font-size:12px;line-height:1.4}._coverageChips_vrx8j_789{display:flex;flex-wrap:wrap;gap:5px}._coverageChip_vrx8j_789{display:inline-flex;align-items:center;min-height:20px;padding:1px 6px;border:1px solid var(--border);border-radius:5px;background:var(--bg-card);color:var(--text-muted);font-family:var(--font-label);font-size:11px;font-weight:500;cursor:default}._coverageChip_completed_vrx8j_810{border-color:var(--success-border);color:var(--success-text)}._coverageChip_failed_vrx8j_815{border-color:var(--error-border);color:var(--error-text)}._coverageChip_skipped_vrx8j_820,._coverageChip_not_requested_vrx8j_821{border-color:var(--warning-border);color:var(--warning-text)}._analysisReportMeta_vrx8j_826{margin-top:auto;color:var(--text-muted);font-size:11px;line-height:1.35}._analysisChildList_vrx8j_833{display:flex;flex-direction:column;gap:6px;margin-top:8px;padding:8px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-secondary)}._analysisChildRow_vrx8j_844{display:grid;grid-template-columns:minmax(0,1fr);gap:4px;width:100%;padding:8px 10px;border:1px solid transparent;border-radius:6px;background:var(--bg-card);color:var(--text-primary);cursor:pointer;text-align:left;font:inherit;transition:border-color var(--transition),background var(--transition)}._analysisChildRow_vrx8j_844:hover{border-color:var(--accent);background:var(--accent-dim)}._analysisChildPath_vrx8j_865{overflow:hidden;color:var(--text-primary);font-family:var(--font-code);font-size:11px;text-overflow:ellipsis;white-space:nowrap}._analysisChildSummary_vrx8j_874,._analysisChildDetailHint_vrx8j_875{color:var(--text-secondary);font-size:11px}._analysisChildDetailHint_vrx8j_875{color:var(--text-muted)}._drawerAnalysisSummary_vrx8j_884{display:flex;flex-direction:column;gap:10px;margin-top:14px;padding:12px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-secondary)}._drawerAnalysisSummaryItem_vrx8j_895{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._drawerAnalysisLabel_vrx8j_902{min-width:64px;color:var(--text-muted);font-size:12px}._drawerAnalysisCounts_vrx8j_908,._drawerAnalysisValue_vrx8j_909{color:var(--text-secondary);font-size:12px}._recentCapturesSection_vrx8j_914{margin-top:28px}._recentCapturesHeader_vrx8j_607{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}._drawerPrimaryActions_vrx8j_926{display:flex;align-items:center;gap:8px;min-width:0}._drawerActionBtn_vrx8j_933{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:34px;padding:7px 14px;border-radius:7px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-family:var(--font-label);font-size:12px;line-height:1;white-space:nowrap;cursor:pointer;transition:border-color var(--transition),background var(--transition),color var(--transition)}._drawerActionBtn_vrx8j_933:hover:not(:disabled){border-color:var(--accent);background:var(--accent-dim)}._drawerActionBtn_vrx8j_933:disabled{opacity:.45;cursor:not-allowed}._drawerMoreMenu_vrx8j_962{position:relative;flex:0 0 auto}._drawerMoreButton_vrx8j_967{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:7px;border:1px solid var(--border);background:transparent;color:var(--text-secondary);cursor:pointer;list-style:none;transition:border-color var(--transition),background var(--transition),color var(--transition)}._drawerMoreButton_vrx8j_967:hover{border-color:var(--accent);background:var(--accent-dim);color:var(--text-primary)}._drawerMoreButton_vrx8j_967::-webkit-details-marker{display:none}._drawerMoreMenuBody_vrx8j_992{position:absolute;top:calc(100% + 6px);right:0;z-index:2;min-width:180px;padding:6px;border:1px solid var(--border);border-radius:8px;background:var(--bg-card);box-shadow:0 8px 24px #0000002e}._drawerMenuItem_vrx8j_1005{display:block;width:100%;padding:8px 10px;border:0;border-radius:5px;background:transparent;color:var(--text-primary);text-align:left;font-family:var(--font-label);font-size:12px;cursor:pointer}._drawerMenuItem_vrx8j_1005:hover:not(:disabled){background:var(--bg-secondary)}._drawerMenuItem_vrx8j_1005:disabled{opacity:.45;cursor:not-allowed}._drawerMenuItemDanger_vrx8j_1028{color:var(--danger-text)}._drawerMenuItemDanger_vrx8j_1028:hover:not(:disabled){background:var(--danger-hover-bg)}._actionErrMsg_vrx8j_1037{font-size:12px;color:var(--error-text);padding:6px 10px;background:#e0555514;border-radius:4px;margin-top:10px}._actionStatusMsg_vrx8j_1046{display:inline-flex;flex-direction:column;align-items:flex-start;max-width:100%;font-size:12px;padding:7px 10px;border:1px solid transparent;border-radius:7px;margin-top:0;margin-bottom:10px;line-height:1.45}._actionStatus_info_vrx8j_1060{color:var(--text-secondary);background:var(--bg-secondary);border-color:var(--border)}._actionStatus_success_vrx8j_1066{color:var(--success-text);background:var(--success-bg);border-color:var(--success-border)}._actionStatus_warning_vrx8j_1072{color:var(--warning-text);background:var(--warning-bg);border-color:var(--warning-border)}._actionStatusDetail_vrx8j_1078{margin-top:2px;color:var(--text-muted)}._galleryHeader_vrx8j_1084{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}._galleryHeader_vrx8j_1084 h2{margin:0;color:var(--text-primary);font-size:var(--type-surface-title-size);font-weight:600;line-height:var(--leading-title)}._cardChecked_vrx8j_1101{border-color:var(--accent)!important;box-shadow:0 0 0 2px var(--accent);background:var(--accent-dim)}._cardCheckbox_vrx8j_1108{position:absolute;top:8px;left:8px;opacity:0;z-index:2;transition:opacity var(--transition),background var(--transition),border-color var(--transition)}._card_vrx8j_16:hover ._cardCheckbox_vrx8j_1108,._card_vrx8j_16:focus-within ._cardCheckbox_vrx8j_1108,._cardChecked_vrx8j_1101 ._cardCheckbox_vrx8j_1108{opacity:1}._captureSelectionActions_vrx8j_1123{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}._selectionToolbar_vrx8j_1132,._selectionBar_vrx8j_1133{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:8px 0 12px;padding:12px 16px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius)}._selectionToolbar_vrx8j_1132{position:sticky;top:0;z-index:8;justify-content:space-between}._selectionToolbarCount_vrx8j_1152{color:var(--text-primary);font-family:var(--font-label);font-size:12px;font-weight:600}._selectionToolbarActions_vrx8j_1159{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._selectionBarBtn_vrx8j_1166{padding:6px 14px;border-radius:var(--radius-control);border:1px solid var(--border);background:var(--bg-card);color:var(--text-primary);font-family:var(--font-label);font-size:12px;cursor:pointer;transition:border-color var(--transition),opacity var(--transition)}._selectionBarBtn_vrx8j_1166:hover:not(:disabled){border-color:var(--accent)}._selectionBarBtn_vrx8j_1166:focus-visible{outline:none;box-shadow:var(--focus-ring)}._selectionBarBtn_vrx8j_1166:disabled{opacity:.45;cursor:not-allowed}._selectionBarBtnDanger_vrx8j_1192{border-color:var(--danger-border);background:var(--danger-bg);color:var(--danger-text)}._selectionBarBtnDanger_vrx8j_1192:hover:not(:disabled){border-color:var(--danger);background:var(--danger-hover-bg)}@media(max-width:768px){._drawer_vrx8j_115{padding:0}._drawerToolbar_vrx8j_132{grid-template-columns:minmax(0,1fr);align-items:stretch;gap:10px;padding:12px}._drawerToolbarActions_vrx8j_169{justify-content:flex-start;overflow-x:auto;padding-bottom:2px}._drawerActionBtn_vrx8j_933{padding:7px 10px}._detailBody_vrx8j_198{padding:14px}}._filterBar_2mh91_4{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:12px 0;margin-bottom:8px;border-bottom:1px solid var(--border)}._filterGroup_2mh91_14{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._filterLabel_2mh91_21{font-size:12px;color:var(--text-muted);font-weight:500;white-space:nowrap}._filterCheckbox_2mh91_28{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none}._filterCheckbox_2mh91_28 input[type=checkbox]{width:14px;height:14px;cursor:pointer;accent-color:var(--accent)}._segmentGroup_2mh91_45{display:inline-flex;align-items:center;gap:2px;padding:2px;border:1px solid var(--border);border-radius:7px;background:var(--bg-secondary)}._segmentBtn_2mh91_55{min-height:26px;padding:0 10px;border:0;border-radius:5px;background:transparent;color:var(--text-secondary);font-family:var(--font-label);font-size:12px;cursor:pointer;white-space:nowrap;transition:background var(--transition),color var(--transition)}._segmentBtn_2mh91_55:hover{color:var(--text-primary)}._segmentBtnActive_2mh91_73{background:var(--bg-card);color:var(--text-primary);box-shadow:0 0 0 1px var(--border)}._filterInput_2mh91_79{font-size:12px;padding:4px 8px;border:1px solid var(--border);border-radius:4px;background:var(--bg-secondary);color:var(--text-primary);font-family:inherit;width:130px}._filterInput_2mh91_79:focus{outline:none;border-color:var(--accent)}._filterResetBtn_2mh91_95{min-height:30px;padding:0 12px;border:1px solid var(--border);border-radius:6px;background:var(--bg-card);color:var(--text-secondary);font-family:var(--font-label);font-size:12px;cursor:pointer;transition:border-color var(--transition),color var(--transition)}._filterResetBtn_2mh91_95:hover{border-color:var(--accent);color:var(--text-primary)}._requestRow_2mh91_114{border:1px solid var(--border);border-radius:var(--radius);margin-bottom:8px;background:var(--bg-card);overflow:hidden;transition:border-color var(--transition)}._requestRow_2mh91_114:hover{border-color:var(--accent)}._requestRowMain_2mh91_127{display:flex;align-items:flex-start;gap:12px;padding:12px 14px}._requestDetailToggle_2mh91_134{flex:1;min-width:0;display:flex;align-items:flex-start;gap:12px;padding:0;border:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer}._requestDetailToggle_2mh91_134:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:6px}._thumbPair_2mh91_156{display:flex;align-items:center;gap:4px;flex-shrink:0;position:relative}._thumbPairButton_2mh91_164{padding:0;border:0;background:transparent;color:inherit;cursor:pointer;font:inherit;border-radius:6px}._thumbPairButton_2mh91_164:focus-visible{outline:2px solid var(--accent);outline-offset:3px}._thumbPairButton_2mh91_164:hover ._thumbSlot_2mh91_179{border-color:var(--accent)}._thumbPairButton_2mh91_164:disabled{cursor:not-allowed;opacity:.72}._thumbPairButton_2mh91_164:disabled:hover ._thumbSlot_2mh91_179{border-color:var(--border)}._thumbSlot_2mh91_179{width:72px;height:48px;border:1px solid var(--border);border-radius:4px;overflow:hidden;background:var(--bg-secondary);display:flex;align-items:center;justify-content:center}._thumbImg_2mh91_204{width:100%;height:100%;object-fit:cover;display:block}._thumbPlaceholder_2mh91_211{font-size:10px;color:var(--text-muted);text-align:center;padding:4px;line-height:1.3}._thumbArrow_2mh91_219{font-size:12px;color:var(--text-muted);flex-shrink:0}._extraPathsBadge_2mh91_225{position:absolute;bottom:0;right:0;background:var(--accent);color:#fff;font-size:10px;font-weight:700;padding:1px 4px;border-radius:3px;line-height:1.4}._requestMeta_2mh91_239{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}._requestLabel_2mh91_247{font-size:13px;font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._requestTime_2mh91_256{font-size:11px;color:var(--text-muted)}._requestStats_2mh91_261{font-size:12px;color:var(--text-secondary);display:flex;gap:4px;flex-wrap:wrap}._statDot_2mh91_269{color:var(--text-muted)}._summaryPill_2mh91_273{color:var(--text-secondary)}._requestReadiness_2mh91_277{display:flex;flex-wrap:wrap;gap:5px}._requestReadinessPill_2mh91_283{display:inline-flex;align-items:center;min-height:20px;padding:1px 6px;border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg-secondary);color:var(--text-secondary);font-size:11px;font-weight:600;line-height:1.35}._requestReadinessReady_2mh91_297{border-color:var(--success-border);background:var(--success-bg);color:var(--success-text)}._requestReadinessPending_2mh91_303{border-color:var(--warning-border);background:var(--warning-bg);color:var(--warning-text)}._requestActions_2mh91_310{display:flex;flex-direction:column;gap:6px;flex-shrink:0}._expandHint_2mh91_317{padding:5px 10px;border-radius:5px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);font-family:var(--font-label);font-size:11px;white-space:nowrap;-webkit-user-select:none;user-select:none}._mutationsArea_2mh91_330{border-top:1px solid var(--border);background:var(--bg-secondary);padding:8px 14px;display:flex;flex-direction:column;gap:4px}._mutLoading_2mh91_339,._mutEmpty_2mh91_340{font-size:12px;color:var(--text-muted);padding:4px 0}._mutError_2mh91_346{font-size:12px;color:var(--error-text);padding:4px 0}._mutationRow_2mh91_352{font-size:12px;padding:6px 0;border-bottom:1px solid var(--border)}._mutationRow_2mh91_352:last-child{border-bottom:none}._mutationLine_2mh91_362{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}._mutTs_2mh91_369{color:var(--text-muted);flex-shrink:0;font-size:11px}._mutCommand_2mh91_375{color:var(--accent);font-weight:500;flex-shrink:0}._mutPath_2mh91_381{font-family:monospace;font-size:11px;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:260px}._mutDiff_2mh91_391{color:var(--text-muted);font-size:11px;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._mutErr_2mh91_346{color:var(--error-text);font-size:11px}._changeDetails_2mh91_406{display:flex;flex-direction:column;gap:4px;margin-top:6px;padding-left:88px}._changeDetailRow_2mh91_414{display:grid;grid-template-columns:72px minmax(96px,180px) minmax(0,1fr) 14px minmax(0,1fr);align-items:start;gap:8px;min-height:24px;font-size:11px}._changeDetailRowNoBefore_2mh91_423{grid-template-columns:72px minmax(96px,180px) 14px minmax(0,1fr)}._changeDetailBadge_2mh91_427{justify-self:start;padding:2px 6px;border-radius:4px;border:1px solid var(--border);background:var(--bg-card);color:var(--text-secondary);font-weight:600;line-height:1.4;white-space:nowrap}._changeDetail_text_2mh91_444{color:#2563eb;border-color:#2563eb47}._changeDetail_color_2mh91_449{color:#b45309;border-color:#b4530947}._changeDetail_size_2mh91_454{color:#047857;border-color:#04785747}._changeDetail_layout_2mh91_459{color:#7c3aed;border-color:#7c3aed47}._changeDetail_state_2mh91_464{color:#be123c;border-color:#be123c47}._changeDetail_asset_2mh91_469{color:#0369a1;border-color:#0369a147}._changeDetail_property_2mh91_474{color:var(--text-secondary)}._changeDetailProperty_2mh91_478{font-family:var(--font-code);color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._changeDetailArrow_2mh91_486{color:var(--text-muted);text-align:center;line-height:1.6}._changeDetailOldValue_2mh91_492,._changeDetailNewValue_2mh91_493{font-family:var(--font-code);overflow-wrap:anywhere;word-break:break-word;line-height:1.6}._changeDetailOldValue_2mh91_492{color:var(--error-text);text-decoration:line-through;text-decoration-thickness:1px}._changeDetailNewValue_2mh91_493{color:var(--success-text)}._compareDialogLayer_2mh91_511{position:fixed;top:calc(var(--header-height) + 16px);right:24px;bottom:24px;left:calc(var(--sidebar-width) + 24px);z-index:900;display:flex;align-items:stretch;justify-content:center;padding:clamp(12px,2vw,24px);background:#03071294;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);box-sizing:border-box;overflow:auto}._compareDialog_2mh91_511{width:100%;height:100%;min-height:0;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);display:flex;flex-direction:column;box-shadow:0 24px 60px #0000006b;outline:none;overflow:hidden}._beforeAfterDrawer_2mh91_542{width:100%;height:100%;min-height:0;background:var(--bg-card);display:flex;flex-direction:column;overflow:hidden}._drawerHeader_2mh91_552{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border);flex-shrink:0}._drawerTitle_2mh91_561{margin:0;font-size:var(--type-section-title-size);font-weight:600;line-height:var(--leading-title);color:var(--text-primary)}._drawerCloseBtn_2mh91_569{padding:5px 12px;border-radius:5px;border:1px solid var(--border);background:transparent;color:var(--text-secondary);font-size:12px;cursor:pointer;transition:border-color var(--transition)}._drawerCloseBtn_2mh91_569:hover{border-color:var(--accent);color:var(--text-primary)}._drawerBody_2mh91_585{padding:20px;color:var(--text-muted);font-size:13px}._pathTabs_2mh91_592{display:flex;gap:2px;border-bottom:1px solid var(--border);padding:0 20px;flex-shrink:0;overflow-x:auto}._pathTab_2mh91_592{font-family:var(--font-label);font-size:12px;padding:8px 14px;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-secondary);cursor:pointer;white-space:nowrap;max-width:160px;overflow:hidden;text-overflow:ellipsis;transition:color var(--transition),border-color var(--transition)}._pathTab_2mh91_592:hover{color:var(--text-primary)}._pathTabActive_2mh91_621{color:var(--accent);border-bottom-color:var(--accent)}._comparePanel_2mh91_627{display:grid;grid-template-columns:1fr 1fr;gap:1px;flex:1;min-height:0;background:var(--border);overflow:auto}._compareHalf_2mh91_637{background:var(--bg-card);display:flex;flex-direction:column;min-height:0}._compareLabel_2mh91_644{font-size:11px;font-weight:600;color:var(--text-muted);letter-spacing:.04em;text-transform:uppercase;padding:8px 12px;border-bottom:1px solid var(--border);flex-shrink:0}._compareImg_2mh91_655{width:100%;flex:1;object-fit:contain;background:var(--bg-secondary);display:block}._comparePlaceholder_2mh91_663{flex:1;display:flex;align-items:center;justify-content:center;font-size:13px;color:var(--text-muted);background:var(--bg-secondary);padding:24px;text-align:center}._compareDetailsPanel_2mh91_675{flex-shrink:0;max-height:min(34%,260px);overflow:auto;padding:12px 20px 14px;border-top:1px solid var(--border);background:var(--bg-secondary)}._compareDetailsHeader_2mh91_684{margin-bottom:8px;color:var(--text-primary);font-family:var(--font-label);font-size:12px;font-weight:600}._compareDetailsPanel_2mh91_675 ._changeDetails_2mh91_406{padding-left:0}._compareDetailsPanel_2mh91_675 ._mutPath_2mh91_381,._compareDetailsPanel_2mh91_675 ._mutDiff_2mh91_391{max-width:none}._drawerFooter_2mh91_702{display:flex;justify-content:flex-end;padding:12px 20px;border-top:1px solid var(--border);flex-shrink:0}._drawerActionBtn_2mh91_710{padding:7px 16px;border-radius:6px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-family:var(--font-label);font-size:12px;cursor:pointer;transition:border-color var(--transition),background var(--transition)}._drawerActionBtn_2mh91_710:hover{border-color:var(--accent);background:var(--accent-dim)}._historyTabWrap_2mh91_728{display:flex;flex-direction:column;gap:0}._historyWorkspace_2mh91_734{width:100%;position:relative}._historyMainColumn_2mh91_739{min-width:0}._requestList_2mh91_743{display:flex;flex-direction:column}._emptyHistory_2mh91_748{text-align:center;padding:48px 20px;color:var(--text-muted);font-size:14px}._historyError_2mh91_755{padding:16px 0;color:var(--error-text);font-size:13px}._historyLoading_2mh91_761{padding:48px 20px;text-align:center;color:var(--text-muted);font-size:13px}._listHeader_2mh91_769{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:8px}._listHeaderTitle_2mh91_778{font-size:14px;font-weight:600;color:var(--text-primary);margin:0}._clearBtn_2mh91_785{padding:6px 12px;border:1px solid var(--danger-border);border-radius:var(--radius-control);background:var(--danger-bg);color:var(--danger-text);font-family:var(--font-label);font-size:12px;font-weight:500;cursor:pointer;transition:background var(--transition),border-color var(--transition)}._clearBtn_2mh91_785:hover{background:var(--danger-hover-bg);border-color:var(--danger)}._clearBtn_2mh91_785:focus-visible{outline:none;box-shadow:var(--focus-ring)}._deleteErrBanner_2mh91_809{padding:8px 12px;margin-bottom:8px;border-radius:var(--radius);background:var(--error-bg, rgba(224, 85, 85, .12));border:1px solid var(--error-border, rgba(224, 85, 85, .4));color:var(--error-text);font-size:13px}@media(max-width:1120px){._compareDialogLayer_2mh91_511{left:calc(var(--sidebar-width) + 16px);right:16px;bottom:16px;padding:12px}}@media(max-width:768px){._compareDialogLayer_2mh91_511{top:calc(var(--header-height) + 10px);right:10px;bottom:10px;left:calc(var(--sidebar-collapsed) + 10px);padding:8px}}
|
|
1
|
+
._page_vrx8j_2{display:flex;flex-direction:column;gap:var(--content-gap);max-width:var(--content-max)}._grid_vrx8j_9{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px;margin-top:16px}._card_vrx8j_16{border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;background:var(--bg-card);padding:0;text-align:left;position:relative;color:inherit}._card_vrx8j_16:hover{border-color:var(--accent)}._cardBodyButton_vrx8j_31{display:block;width:100%;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;font:inherit;text-align:left}._cardBodyButton_vrx8j_31:focus-visible{outline:none;box-shadow:inset var(--focus-ring)}._thumb_vrx8j_48{width:100%;aspect-ratio:16 / 9;object-fit:contain;object-position:center;display:block;background:var(--bg-secondary)}._badges_vrx8j_57{position:absolute;top:8px;right:8px;display:flex;gap:4px}._priorityHighBadge_vrx8j_65,._priorityMediumBadge_vrx8j_66,._priorityLowBadge_vrx8j_67{display:inline-flex;align-items:center;min-height:22px;padding:2px 6px;border:1px solid var(--border);border-radius:var(--radius-control);font-size:12px;font-weight:600;cursor:default}._priorityHighBadge_vrx8j_65{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}._priorityMediumBadge_vrx8j_66{background:var(--pro-bg-soft);border-color:var(--pro-border);color:var(--pro-text)}._priorityLowBadge_vrx8j_67{background:var(--bg-secondary);border-color:var(--border);color:var(--text-secondary)}._cardMeta_vrx8j_97{padding:8px 12px;font-size:12px;color:var(--text-primary)}._target_vrx8j_103{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._time_vrx8j_110{color:var(--text-muted);margin-top:4px}._drawer_vrx8j_115{width:100%;flex:1 1 auto;min-height:0;max-height:none;display:flex;flex-direction:column;background:var(--bg-card);border:0;border-radius:0;overflow:hidden;padding:0;box-shadow:none;color:var(--text-primary);box-sizing:border-box}._drawerToolbar_vrx8j_132{flex:0 0 auto;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:16px;padding:14px 16px;border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--bg-card) 92%,var(--bg-secondary))}._drawerTitleBlock_vrx8j_143{min-width:0;display:flex;flex-direction:column;gap:3px}._drawerEyebrow_vrx8j_150{color:var(--text-muted);font-family:var(--font-label);font-size:11px;font-weight:600;letter-spacing:0;text-transform:uppercase}._drawerTarget_vrx8j_159{overflow:hidden;color:var(--text-primary);font-family:var(--font-label);font-size:13px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}._drawerToolbarActions_vrx8j_169{display:flex;align-items:center;justify-content:flex-end;gap:8px;min-width:0}._closeBtn_vrx8j_177{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;cursor:pointer;border:1px solid var(--border);border-radius:7px;background:transparent;color:var(--text-secondary);transition:border-color var(--transition),background var(--transition),color var(--transition)}._closeBtn_vrx8j_177:hover{border-color:var(--accent);background:var(--accent-dim);color:var(--text-primary)}._detailBody_vrx8j_198{flex:1 1 auto;min-height:0;overflow-y:auto;padding:16px 24px 24px}._screenshotPreviewFrame_vrx8j_205{display:flex;align-items:center;justify-content:center;width:100%;height:clamp(180px,32vh,320px);margin-top:12px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-secondary);overflow:hidden}._fullImg_vrx8j_218{display:block;width:100%;height:100%;object-fit:contain}._metaDl_vrx8j_225{display:grid;grid-template-columns:auto 1fr;gap:8px 16px;margin:16px 0;font-size:13px}._metaDl_vrx8j_225 dt{color:var(--text-muted)}._errorMsg_vrx8j_237{color:var(--error-text);padding:12px}._suggestionsWrap_vrx8j_242{margin-top:16px}._suggestionsWrap_vrx8j_242 h3{margin:0 0 12px;font-size:16px}._prioritySection_vrx8j_249{margin-bottom:16px}._sectionHighHeader_vrx8j_253{margin:0 0 8px;font-size:13px;font-weight:600;color:var(--error)}._sectionLowHeader_vrx8j_259{margin:0 0 8px;font-size:13px;font-weight:600;color:var(--warning-text)}._sectionMediumHeader_vrx8j_265{margin:0 0 8px;font-size:13px;font-weight:600;color:var(--warning)}._groupCard_vrx8j_271{border:1px solid var(--border);border-radius:8px;margin-bottom:8px;background:var(--bg-secondary);overflow:hidden}._groupHeader_vrx8j_278{width:100%;display:flex;align-items:center;gap:8px;padding:10px 12px;background:transparent;border:none;cursor:pointer;text-align:left;color:var(--text-primary);font:inherit}._groupHeader_vrx8j_278:hover{background:var(--bg-card)}._groupLabel_vrx8j_294{font-weight:600;font-size:13px;flex:1}._groupCount_vrx8j_299{font-size:12px;color:var(--text-muted);padding:2px 8px;background:var(--bg-card);border-radius:10px}._groupChevron_vrx8j_306{color:var(--text-muted);font-size:12px}._groupBody_vrx8j_310{padding:0 12px 12px}._groupDescription_vrx8j_313{font-size:12px;color:var(--text-muted);margin:8px 0 4px}._groupFix_vrx8j_318{font-size:12px;color:var(--text-primary);margin:4px 0 8px;padding:6px 10px;background:var(--bg-card);border-left:3px solid var(--accent);border-radius:4px}._falsePositive_vrx8j_327{font-size:12px;color:var(--warning-text);margin:4px 0 8px;padding:6px 10px;background:var(--warning-bg);border-radius:4px}._itemList_vrx8j_335{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}._suggestionItem_vrx8j_343{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;background:var(--bg-card);border-radius:6px;font-size:12px}._suggestionInfo_vrx8j_353{display:flex;flex-direction:column;gap:2px;min-width:0}._pathBreadcrumb_vrx8j_359{font-family:monospace;font-size:11px;color:var(--text-primary);background:transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._currentValue_vrx8j_368{font-size:11px;color:var(--text-muted)}._copyFixBtn_vrx8j_372{padding:4px 10px;background:var(--accent);color:var(--bg-card);border:none;border-radius:4px;cursor:pointer;font-size:11px;font-weight:600;flex-shrink:0}._copyFixBtn_vrx8j_372:hover{opacity:.9}._emptySuggestions_vrx8j_386{text-align:center;padding:24px;color:var(--text-muted);font-size:13px}._sampleBanner_vrx8j_394{display:flex;flex-direction:column;gap:12px;padding:18px 20px;border:1px solid var(--pro-border);border-radius:var(--radius);background:linear-gradient(135deg,#f0bd5829,#f0bd5808 55%),var(--bg-card);margin-bottom:16px}._sampleBannerRow_vrx8j_407{display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap}._sampleBannerMain_vrx8j_415{display:flex;flex-direction:column;gap:8px;min-width:0;flex:1}._sampleBadge_vrx8j_423{width:fit-content;color:var(--pro-text);font-family:var(--font-label);font-size:11px;font-weight:600;letter-spacing:.02em;opacity:.92}._sampleTitle_vrx8j_433{font-family:var(--font-label);font-size:16px;font-weight:600;color:var(--text-primary)}._sampleMessage_vrx8j_440{max-width:560px;color:var(--text-secondary);font-size:13px;line-height:1.5}._sampleActions_vrx8j_447{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}._primaryAction_vrx8j_455,._secondaryAction_vrx8j_456{display:inline-flex;align-items:center;justify-content:center;min-height:34px;padding:0 14px;border-radius:8px;font-family:var(--font-label);font-size:12px;text-decoration:none;transition:background var(--transition),border-color var(--transition),opacity var(--transition)}._secondaryAction_vrx8j_456{border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);cursor:pointer}._secondaryAction_vrx8j_456:hover{border-color:var(--accent);background:var(--accent-dim)}._primaryAction_vrx8j_455{border:1px solid var(--pro-badge);background:var(--pro-badge);color:var(--pro-text-on-badge)}._primaryAction_vrx8j_455:hover{opacity:.9}._emptyState_vrx8j_491{text-align:center;padding:48px 20px;color:var(--text-muted);font-size:14px}._pluginGuideCard_vrx8j_499{display:flex;align-items:flex-start;gap:14px;padding:18px 20px;border:1px solid var(--warning);border-radius:var(--radius);background:var(--bg-card);color:var(--text-primary)}._pluginGuideMarker_vrx8j_510{display:flex;align-items:center;justify-content:center;width:28px;height:28px;flex:0 0 28px;border-radius:50%;border:1px solid var(--warning);color:var(--warning);font-family:var(--font-label);font-size:15px;font-weight:700}._pluginGuideBody_vrx8j_525{min-width:0}._pluginGuideTitle_vrx8j_529{margin:0 0 8px;color:var(--text-primary);font-family:var(--font-label);font-size:15px;font-weight:600}._pluginGuideMessage_vrx8j_537{margin:0 0 12px;color:var(--text-secondary);font-size:13px;line-height:1.5}._pluginGuideChecklist_vrx8j_544{display:flex;flex-direction:column;gap:7px;margin:0 0 14px;padding:0;list-style:none}._pluginGuideChecklist_vrx8j_544 li{position:relative;padding-left:20px;color:var(--text-secondary);font-size:13px}._pluginGuideChecklist_vrx8j_544 li:before{content:"○";position:absolute;left:2px;color:var(--text-muted)}._pluginGuideWaiting_vrx8j_567{display:inline-flex;align-items:center;gap:8px;color:var(--text-muted);font-family:var(--font-label);font-size:12px}._pluginGuideDot_vrx8j_576{width:7px;height:7px;border-radius:50%;background:var(--warning)}._analysisWorkspace_vrx8j_584{width:100%;position:relative}._analysisMainColumn_vrx8j_589{min-width:0}._analysisSummaryPanel_vrx8j_594{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-top:16px;padding:16px 18px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-card)}._analysisSummaryPanel_vrx8j_594 h2,._recentCapturesHeader_vrx8j_607 h2{margin:0;font-size:16px;font-family:var(--font-label);color:var(--text-primary)}._analysisSummaryText_vrx8j_614,._recentCapturesMeta_vrx8j_615{margin:6px 0 0;color:var(--text-secondary);font-size:13px}._analysisReportGrid_vrx8j_621{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px;margin-top:14px}._analysisReportGroup_vrx8j_628{min-width:0}._analysisReportCard_vrx8j_632{display:grid;grid-template-columns:112px minmax(0,1fr);gap:12px;width:100%;min-height:128px;padding:12px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-card);color:var(--text-primary);cursor:pointer;text-align:left;font:inherit;transition:border-color var(--transition),background var(--transition)}._analysisReportCard_vrx8j_632:hover{border-color:var(--accent);background:var(--bg-secondary)}._analysisReportThumb_vrx8j_654{width:112px;aspect-ratio:16 / 10;object-fit:contain;object-position:center;border-radius:6px;background:var(--bg-secondary)}._analysisReportBody_vrx8j_663{min-width:0;display:flex;flex-direction:column;gap:7px}._analysisReportTopline_vrx8j_670{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._analysisVerdict_vrx8j_677{display:inline-flex;align-items:center;min-height:22px;padding:0 8px;border-radius:999px;font-family:var(--font-label);font-size:12px;font-weight:600}._analysisVerdict_needsFix_vrx8j_688,._analysisVerdict_review_vrx8j_689{color:var(--accent);background:var(--accent-dim)}._analysisVerdict_incomplete_vrx8j_694{color:var(--warning-text);background:var(--warning-bg)}._analysisVerdict_passed_vrx8j_699{color:var(--text-secondary);background:var(--bg-secondary)}._analysisReportCounts_vrx8j_704{color:var(--text-secondary);font-size:12px}._readinessSummary_vrx8j_709{display:flex;flex-wrap:wrap;gap:5px}._readinessChip_vrx8j_715{display:inline-flex;align-items:center;min-height:22px;padding:2px 7px;border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg-secondary);color:var(--text-secondary);font-family:var(--font-label);font-size:11px;font-weight:600;line-height:1.3}._readinessChipReady_vrx8j_730{border-color:var(--success-border);background:var(--success-bg);color:var(--success-text)}._readinessChipPending_vrx8j_736{border-color:var(--warning-border);background:var(--warning-bg);color:var(--warning-text)}._primaryReadinessBlock_vrx8j_742{display:flex;flex-direction:column;gap:8px;width:100%}._criticSummary_vrx8j_749{display:flex;flex-direction:column;gap:3px;margin:0;padding:8px 10px;border-left:2px solid var(--accent);background:var(--accent-dim);color:var(--text-secondary);font-size:12px;line-height:1.45}._criticSummary_vrx8j_749>span{color:var(--text-primary);font-size:11px;font-weight:600}._analysisReportTarget_vrx8j_768{overflow:hidden;color:var(--text-primary);font-size:13px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}._analysisReportIssue_vrx8j_777{color:var(--text-secondary);font-size:12px;line-height:1.35}._analysisReportCoverage_vrx8j_783{color:var(--text-muted);font-size:12px;line-height:1.4}._coverageChips_vrx8j_789{display:flex;flex-wrap:wrap;gap:5px}._coverageChip_vrx8j_789{display:inline-flex;align-items:center;min-height:20px;padding:1px 6px;border:1px solid var(--border);border-radius:5px;background:var(--bg-card);color:var(--text-muted);font-family:var(--font-label);font-size:11px;font-weight:500;cursor:default}._coverageChip_completed_vrx8j_810{border-color:var(--success-border);color:var(--success-text)}._coverageChip_failed_vrx8j_815{border-color:var(--error-border);color:var(--error-text)}._coverageChip_skipped_vrx8j_820,._coverageChip_not_requested_vrx8j_821{border-color:var(--warning-border);color:var(--warning-text)}._analysisReportMeta_vrx8j_826{margin-top:auto;color:var(--text-muted);font-size:11px;line-height:1.35}._analysisChildList_vrx8j_833{display:flex;flex-direction:column;gap:6px;margin-top:8px;padding:8px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-secondary)}._analysisChildRow_vrx8j_844{display:grid;grid-template-columns:minmax(0,1fr);gap:4px;width:100%;padding:8px 10px;border:1px solid transparent;border-radius:6px;background:var(--bg-card);color:var(--text-primary);cursor:pointer;text-align:left;font:inherit;transition:border-color var(--transition),background var(--transition)}._analysisChildRow_vrx8j_844:hover{border-color:var(--accent);background:var(--accent-dim)}._analysisChildPath_vrx8j_865{overflow:hidden;color:var(--text-primary);font-family:var(--font-code);font-size:11px;text-overflow:ellipsis;white-space:nowrap}._analysisChildSummary_vrx8j_874,._analysisChildDetailHint_vrx8j_875{color:var(--text-secondary);font-size:11px}._analysisChildDetailHint_vrx8j_875{color:var(--text-muted)}._drawerAnalysisSummary_vrx8j_884{display:flex;flex-direction:column;gap:10px;margin-top:14px;padding:12px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-secondary)}._drawerAnalysisSummaryItem_vrx8j_895{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._drawerAnalysisLabel_vrx8j_902{min-width:64px;color:var(--text-muted);font-size:12px}._drawerAnalysisCounts_vrx8j_908,._drawerAnalysisValue_vrx8j_909{color:var(--text-secondary);font-size:12px}._recentCapturesSection_vrx8j_914{margin-top:28px}._recentCapturesHeader_vrx8j_607{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}._drawerPrimaryActions_vrx8j_926{display:flex;align-items:center;gap:8px;min-width:0}._drawerActionBtn_vrx8j_933{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:34px;padding:7px 14px;border-radius:7px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-family:var(--font-label);font-size:12px;line-height:1;white-space:nowrap;cursor:pointer;transition:border-color var(--transition),background var(--transition),color var(--transition)}._drawerActionBtn_vrx8j_933:hover:not(:disabled){border-color:var(--accent);background:var(--accent-dim)}._drawerActionBtn_vrx8j_933:disabled{opacity:.45;cursor:not-allowed}._drawerMoreMenu_vrx8j_962{position:relative;flex:0 0 auto}._drawerMoreButton_vrx8j_967{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:7px;border:1px solid var(--border);background:transparent;color:var(--text-secondary);cursor:pointer;list-style:none;transition:border-color var(--transition),background var(--transition),color var(--transition)}._drawerMoreButton_vrx8j_967:hover{border-color:var(--accent);background:var(--accent-dim);color:var(--text-primary)}._drawerMoreButton_vrx8j_967::-webkit-details-marker{display:none}._drawerMoreMenuBody_vrx8j_992{position:absolute;top:calc(100% + 6px);right:0;z-index:2;min-width:180px;padding:6px;border:1px solid var(--border);border-radius:8px;background:var(--bg-card);box-shadow:0 8px 24px #0000002e}._drawerMenuItem_vrx8j_1005{display:block;width:100%;padding:8px 10px;border:0;border-radius:5px;background:transparent;color:var(--text-primary);text-align:left;font-family:var(--font-label);font-size:12px;cursor:pointer}._drawerMenuItem_vrx8j_1005:hover:not(:disabled){background:var(--bg-secondary)}._drawerMenuItem_vrx8j_1005:disabled{opacity:.45;cursor:not-allowed}._drawerMenuItemDanger_vrx8j_1028{color:var(--danger-text)}._drawerMenuItemDanger_vrx8j_1028:hover:not(:disabled){background:var(--danger-hover-bg)}._actionErrMsg_vrx8j_1037{font-size:12px;color:var(--error-text);padding:6px 10px;background:#e0555514;border-radius:4px;margin-top:10px}._actionStatusMsg_vrx8j_1046{display:inline-flex;flex-direction:column;align-items:flex-start;max-width:100%;font-size:12px;padding:7px 10px;border:1px solid transparent;border-radius:7px;margin-top:0;margin-bottom:10px;line-height:1.45}._actionStatus_info_vrx8j_1060{color:var(--text-secondary);background:var(--bg-secondary);border-color:var(--border)}._actionStatus_success_vrx8j_1066{color:var(--success-text);background:var(--success-bg);border-color:var(--success-border)}._actionStatus_warning_vrx8j_1072{color:var(--warning-text);background:var(--warning-bg);border-color:var(--warning-border)}._actionStatusDetail_vrx8j_1078{margin-top:2px;color:var(--text-muted)}._galleryHeader_vrx8j_1084{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}._galleryHeader_vrx8j_1084 h2{margin:0;color:var(--text-primary);font-size:var(--type-surface-title-size);font-weight:600;line-height:var(--leading-title)}._cardChecked_vrx8j_1101{border-color:var(--accent)!important;box-shadow:0 0 0 2px var(--accent);background:var(--accent-dim)}._cardCheckbox_vrx8j_1108{position:absolute;top:8px;left:8px;opacity:0;z-index:2;transition:opacity var(--transition),background var(--transition),border-color var(--transition)}._card_vrx8j_16:hover ._cardCheckbox_vrx8j_1108,._card_vrx8j_16:focus-within ._cardCheckbox_vrx8j_1108,._cardChecked_vrx8j_1101 ._cardCheckbox_vrx8j_1108{opacity:1}._captureSelectionActions_vrx8j_1123{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}._selectionToolbar_vrx8j_1132,._selectionBar_vrx8j_1133{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:8px 0 12px;padding:12px 16px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius)}._selectionToolbar_vrx8j_1132{position:sticky;top:0;z-index:8;justify-content:space-between}._selectionToolbarCount_vrx8j_1152{color:var(--text-primary);font-family:var(--font-label);font-size:12px;font-weight:600}._selectionToolbarActions_vrx8j_1159{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._selectionBarBtn_vrx8j_1166{padding:6px 14px;border-radius:var(--radius-control);border:1px solid var(--border);background:var(--bg-card);color:var(--text-primary);font-family:var(--font-label);font-size:12px;cursor:pointer;transition:border-color var(--transition),opacity var(--transition)}._selectionBarBtn_vrx8j_1166:hover:not(:disabled){border-color:var(--accent)}._selectionBarBtn_vrx8j_1166:focus-visible{outline:none;box-shadow:var(--focus-ring)}._selectionBarBtn_vrx8j_1166:disabled{opacity:.45;cursor:not-allowed}._selectionBarBtnDanger_vrx8j_1192{border-color:var(--danger-border);background:var(--danger-bg);color:var(--danger-text)}._selectionBarBtnDanger_vrx8j_1192:hover:not(:disabled){border-color:var(--danger);background:var(--danger-hover-bg)}@media(max-width:768px){._drawer_vrx8j_115{padding:0}._drawerToolbar_vrx8j_132{grid-template-columns:minmax(0,1fr);align-items:stretch;gap:10px;padding:12px}._drawerToolbarActions_vrx8j_169{justify-content:flex-start;overflow-x:auto;padding-bottom:2px}._drawerActionBtn_vrx8j_933{padding:7px 10px}._detailBody_vrx8j_198{padding:14px}}._emptyState_13gyl_1{display:flex;flex-direction:column;gap:var(--space-section);padding:20px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-card)}._header_13gyl_11,._method_13gyl_12{display:flex;flex-direction:column;gap:var(--space-related)}._header_13gyl_11 h3,._header_13gyl_11 p,._method_13gyl_12 h4{margin:0}._header_13gyl_11 h3{color:var(--text-primary);font-family:var(--font-label);font-size:var(--type-section-title-size);font-weight:600}._header_13gyl_11 p{color:var(--text-secondary);font-size:var(--type-body-size);line-height:var(--leading-body)}._method_13gyl_12{padding:14px;border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg-secondary)}._methodTitle_13gyl_44{display:flex;align-items:center;gap:var(--space-related);color:var(--text-primary)}._methodTitle_13gyl_44 h4{font-family:var(--font-label);font-size:var(--type-card-title-size);font-weight:600}._moreExamples_13gyl_57{color:var(--text-secondary);font-size:var(--type-body-size)}._moreExamples_13gyl_57 summary{width:fit-content;min-height:34px;color:var(--accent-hover);font-weight:600;line-height:34px;cursor:pointer}._moreExamples_13gyl_57[open] summary{margin-bottom:var(--space-related)}._moreExamples_13gyl_57 summary:focus-visible{outline:none;box-shadow:var(--focus-ring)}._filterBar_1203k_4{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:12px 0;margin-bottom:8px;border-bottom:1px solid var(--border)}._filterGroup_1203k_14{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._filterLabel_1203k_21{font-size:12px;color:var(--text-muted);font-weight:500;white-space:nowrap}._filterCheckbox_1203k_28{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--text-secondary);cursor:pointer;-webkit-user-select:none;user-select:none}._filterCheckbox_1203k_28 input[type=checkbox]{width:14px;height:14px;cursor:pointer;accent-color:var(--accent)}._segmentGroup_1203k_45{display:inline-flex;align-items:center;gap:2px;padding:2px;border:1px solid var(--border);border-radius:7px;background:var(--bg-secondary)}._segmentBtn_1203k_55{min-height:26px;padding:0 10px;border:0;border-radius:5px;background:transparent;color:var(--text-secondary);font-family:var(--font-label);font-size:12px;cursor:pointer;white-space:nowrap;transition:background var(--transition),color var(--transition)}._segmentBtn_1203k_55:hover{color:var(--text-primary)}._segmentBtnActive_1203k_73{background:var(--bg-card);color:var(--text-primary);box-shadow:0 0 0 1px var(--border)}._filterInput_1203k_79{font-size:12px;padding:4px 8px;border:1px solid var(--border);border-radius:4px;background:var(--bg-secondary);color:var(--text-primary);font-family:inherit;width:130px}._filterInput_1203k_79:focus{outline:none;border-color:var(--accent)}._filterResetBtn_1203k_95{min-height:30px;padding:0 12px;border:1px solid var(--border);border-radius:6px;background:var(--bg-card);color:var(--text-secondary);font-family:var(--font-label);font-size:12px;cursor:pointer;transition:border-color var(--transition),color var(--transition)}._filterResetBtn_1203k_95:hover{border-color:var(--accent);color:var(--text-primary)}._requestRow_1203k_114{border:1px solid var(--border);border-radius:var(--radius);margin-bottom:8px;background:var(--bg-card);overflow:hidden;transition:border-color var(--transition)}._requestRow_1203k_114:hover{border-color:var(--accent)}._requestRowMain_1203k_127{display:flex;align-items:flex-start;gap:12px;padding:12px 14px}._requestDetailToggle_1203k_134{flex:1;min-width:0;display:flex;align-items:flex-start;gap:12px;padding:0;border:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer}._requestDetailToggle_1203k_134:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:6px}._thumbPair_1203k_156{display:flex;align-items:center;gap:4px;flex-shrink:0;position:relative}._thumbPairButton_1203k_164{padding:0;border:0;background:transparent;color:inherit;cursor:pointer;font:inherit;border-radius:6px}._thumbPairButton_1203k_164:focus-visible{outline:2px solid var(--accent);outline-offset:3px}._thumbPairButton_1203k_164:hover ._thumbSlot_1203k_179{border-color:var(--accent)}._thumbPairButton_1203k_164:disabled{cursor:not-allowed;opacity:.72}._thumbPairButton_1203k_164:disabled:hover ._thumbSlot_1203k_179{border-color:var(--border)}._thumbSlot_1203k_179{width:72px;height:48px;border:1px solid var(--border);border-radius:4px;overflow:hidden;background:var(--bg-secondary);display:flex;align-items:center;justify-content:center}._thumbImg_1203k_204{width:100%;height:100%;object-fit:cover;display:block}._thumbPlaceholder_1203k_211{font-size:10px;color:var(--text-muted);text-align:center;padding:4px;line-height:1.3}._thumbArrow_1203k_219{font-size:12px;color:var(--text-muted);flex-shrink:0}._extraPathsBadge_1203k_225{position:absolute;bottom:0;right:0;background:var(--accent);color:#fff;font-size:10px;font-weight:700;padding:1px 4px;border-radius:3px;line-height:1.4}._requestMeta_1203k_239{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}._requestLabel_1203k_247{font-size:13px;font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._requestTime_1203k_256{font-size:11px;color:var(--text-muted)}._requestStats_1203k_261{font-size:12px;color:var(--text-secondary);display:flex;gap:4px;flex-wrap:wrap}._statDot_1203k_269{color:var(--text-muted)}._summaryPill_1203k_273{color:var(--text-secondary)}._requestReadiness_1203k_277{display:flex;flex-wrap:wrap;gap:5px}._requestReadinessPill_1203k_283{display:inline-flex;align-items:center;min-height:20px;padding:1px 6px;border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg-secondary);color:var(--text-secondary);font-size:11px;font-weight:600;line-height:1.35}._requestReadinessReady_1203k_297{border-color:var(--success-border);background:var(--success-bg);color:var(--success-text)}._requestReadinessPending_1203k_303{border-color:var(--warning-border);background:var(--warning-bg);color:var(--warning-text)}._requestActions_1203k_310{display:flex;flex-direction:column;gap:6px;flex-shrink:0}._expandHint_1203k_317{padding:5px 10px;border-radius:5px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);font-family:var(--font-label);font-size:11px;white-space:nowrap;-webkit-user-select:none;user-select:none}._mutationsArea_1203k_330{border-top:1px solid var(--border);background:var(--bg-secondary);padding:8px 14px;display:flex;flex-direction:column;gap:4px}._mutLoading_1203k_339,._mutEmpty_1203k_340{font-size:12px;color:var(--text-muted);padding:4px 0}._mutError_1203k_346{font-size:12px;color:var(--error-text);padding:4px 0}._mutationRow_1203k_352{font-size:12px;padding:6px 0;border-bottom:1px solid var(--border)}._mutationRow_1203k_352:last-child{border-bottom:none}._mutationLine_1203k_362{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}._mutTs_1203k_369{color:var(--text-muted);flex-shrink:0;font-size:11px}._mutCommand_1203k_375{color:var(--accent);font-weight:500;flex-shrink:0}._mutPath_1203k_381{font-family:monospace;font-size:11px;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:260px}._mutDiff_1203k_391{color:var(--text-muted);font-size:11px;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._mutErr_1203k_346{color:var(--error-text);font-size:11px}._changeDetails_1203k_406{display:flex;flex-direction:column;gap:4px;margin-top:6px;padding-left:88px}._changeDetailRow_1203k_414{display:grid;grid-template-columns:72px minmax(96px,180px) minmax(0,1fr) 14px minmax(0,1fr);align-items:start;gap:8px;min-height:24px;font-size:11px}._changeDetailRowNoBefore_1203k_423{grid-template-columns:72px minmax(96px,180px) 14px minmax(0,1fr)}._changeDetailBadge_1203k_427{justify-self:start;padding:2px 6px;border-radius:4px;border:1px solid var(--border);background:var(--bg-card);color:var(--text-secondary);font-weight:600;line-height:1.4;white-space:nowrap}._changeDetail_text_1203k_444{color:#2563eb;border-color:#2563eb47}._changeDetail_color_1203k_449{color:#b45309;border-color:#b4530947}._changeDetail_size_1203k_454{color:#047857;border-color:#04785747}._changeDetail_layout_1203k_459{color:#7c3aed;border-color:#7c3aed47}._changeDetail_state_1203k_464{color:#be123c;border-color:#be123c47}._changeDetail_asset_1203k_469{color:#0369a1;border-color:#0369a147}._changeDetail_property_1203k_474{color:var(--text-secondary)}._changeDetailProperty_1203k_478{font-family:var(--font-code);color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._changeDetailArrow_1203k_486{color:var(--text-muted);text-align:center;line-height:1.6}._changeDetailOldValue_1203k_492,._changeDetailNewValue_1203k_493{font-family:var(--font-code);overflow-wrap:anywhere;word-break:break-word;line-height:1.6}._changeDetailOldValue_1203k_492{color:var(--error-text);text-decoration:line-through;text-decoration-thickness:1px}._changeDetailNewValue_1203k_493{color:var(--success-text)}._compareDialogLayer_1203k_511{position:fixed;top:calc(var(--header-height) + 16px);right:24px;bottom:24px;left:calc(var(--sidebar-width) + 24px);z-index:900;display:flex;align-items:stretch;justify-content:center;padding:clamp(12px,2vw,24px);background:#03071294;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);box-sizing:border-box;overflow:auto}._compareDialog_1203k_511{width:100%;height:100%;min-height:0;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);display:flex;flex-direction:column;box-shadow:0 24px 60px #0000006b;outline:none;overflow:hidden}._beforeAfterDrawer_1203k_542{width:100%;height:100%;min-height:0;background:var(--bg-card);display:flex;flex-direction:column;overflow:hidden}._drawerHeader_1203k_552{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border);flex-shrink:0}._drawerTitle_1203k_561{margin:0;font-size:var(--type-section-title-size);font-weight:600;line-height:var(--leading-title);color:var(--text-primary)}._drawerCloseBtn_1203k_569{padding:5px 12px;border-radius:5px;border:1px solid var(--border);background:transparent;color:var(--text-secondary);font-size:12px;cursor:pointer;transition:border-color var(--transition)}._drawerCloseBtn_1203k_569:hover{border-color:var(--accent);color:var(--text-primary)}._drawerBody_1203k_585{padding:20px;color:var(--text-muted);font-size:13px}._pathTabs_1203k_592{display:flex;gap:2px;border-bottom:1px solid var(--border);padding:0 20px;flex-shrink:0;overflow-x:auto}._pathTab_1203k_592{font-family:var(--font-label);font-size:12px;padding:8px 14px;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-secondary);cursor:pointer;white-space:nowrap;max-width:160px;overflow:hidden;text-overflow:ellipsis;transition:color var(--transition),border-color var(--transition)}._pathTab_1203k_592:hover{color:var(--text-primary)}._pathTabActive_1203k_621{color:var(--accent);border-bottom-color:var(--accent)}._comparePanel_1203k_627{display:grid;grid-template-columns:1fr 1fr;gap:1px;flex:1;min-height:0;background:var(--border);overflow:auto}._compareHalf_1203k_637{background:var(--bg-card);display:flex;flex-direction:column;min-height:0}._compareLabel_1203k_644{font-size:11px;font-weight:600;color:var(--text-muted);letter-spacing:.04em;text-transform:uppercase;padding:8px 12px;border-bottom:1px solid var(--border);flex-shrink:0}._compareImg_1203k_655{width:100%;flex:1;object-fit:contain;background:var(--bg-secondary);display:block}._comparePlaceholder_1203k_663{flex:1;display:flex;align-items:center;justify-content:center;font-size:13px;color:var(--text-muted);background:var(--bg-secondary);padding:24px;text-align:center}._compareDetailsPanel_1203k_675{flex-shrink:0;max-height:min(34%,260px);overflow:auto;padding:12px 20px 14px;border-top:1px solid var(--border);background:var(--bg-secondary)}._compareDetailsHeader_1203k_684{margin-bottom:8px;color:var(--text-primary);font-family:var(--font-label);font-size:12px;font-weight:600}._compareDetailsPanel_1203k_675 ._changeDetails_1203k_406{padding-left:0}._compareDetailsPanel_1203k_675 ._mutPath_1203k_381,._compareDetailsPanel_1203k_675 ._mutDiff_1203k_391{max-width:none}._drawerFooter_1203k_702{display:flex;justify-content:flex-end;padding:12px 20px;border-top:1px solid var(--border);flex-shrink:0}._drawerActionBtn_1203k_710{padding:7px 16px;border-radius:6px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);font-family:var(--font-label);font-size:12px;cursor:pointer;transition:border-color var(--transition),background var(--transition)}._drawerActionBtn_1203k_710:hover{border-color:var(--accent);background:var(--accent-dim)}._historyTabWrap_1203k_728{display:flex;flex-direction:column;gap:0}._historyWorkspace_1203k_734{width:100%;position:relative}._historyMainColumn_1203k_739{min-width:0}._requestList_1203k_743{display:flex;flex-direction:column}._emptyHistory_1203k_748{display:flex;flex-direction:column;gap:var(--space-related);text-align:center;padding:48px 20px;color:var(--text-muted);font-size:14px}._historyError_1203k_758{padding:16px 0;color:var(--error-text);font-size:13px}._historyLoading_1203k_764{padding:48px 20px;text-align:center;color:var(--text-muted);font-size:13px}._listHeader_1203k_772{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:8px}._listHeaderTitle_1203k_781{font-size:14px;font-weight:600;color:var(--text-primary);margin:0}._clearBtn_1203k_788{padding:6px 12px;border:1px solid var(--danger-border);border-radius:var(--radius-control);background:var(--danger-bg);color:var(--danger-text);font-family:var(--font-label);font-size:12px;font-weight:500;cursor:pointer;transition:background var(--transition),border-color var(--transition)}._clearBtn_1203k_788:hover{background:var(--danger-hover-bg);border-color:var(--danger)}._clearBtn_1203k_788:focus-visible{outline:none;box-shadow:var(--focus-ring)}._deleteErrBanner_1203k_812{padding:8px 12px;margin-bottom:8px;border-radius:var(--radius);background:var(--error-bg, rgba(224, 85, 85, .12));border:1px solid var(--error-border, rgba(224, 85, 85, .4));color:var(--error-text);font-size:13px}@media(max-width:1120px){._compareDialogLayer_1203k_511{left:calc(var(--sidebar-width) + 16px);right:16px;bottom:16px;padding:12px}}@media(max-width:768px){._compareDialogLayer_1203k_511{top:calc(var(--header-height) + 10px);right:10px;bottom:10px;left:calc(var(--sidebar-collapsed) + 10px);padding:8px}}
|