@weppy/roblox-mcp 2.6.4 → 2.7.1
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/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +24 -0
- package/README.md +22 -11
- package/install.ps1 +85 -19
- package/install.sh +60 -15
- package/llms-full.txt +1 -2
- package/llms.txt +4 -3
- package/package.json +1 -1
- package/plugins/weppy-roblox-mcp/.claude-plugin/plugin.json +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ChangelogDetailPage-DYQthxhC.js → ChangelogDetailPage-DxktONbL.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogPage-CNxAGfwG.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogPage-DOY-SmWM.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ConfirmModal-CM3ElkBC.js → ConfirmModal-CmJCz5rg.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ConnectionPage-DdKcJZt6.js → ConnectionPage-BiiIQs7f.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{GameChangeDetail-DGphCFbI.js → GameChangeDetail-D1kE2L_v.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{InfoLabel-CMSu30c4.js → InfoLabel-B9KT3kfU.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{OverviewPage-DM74adCU.js → OverviewPage-T2WCTHpo.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PlaytestPage-CW8Xfp6b.js +11 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-Cc9Wnj8M.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-DcUt5qjG.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{StatusBadge-BhRLY0yK.js → StatusBadge-Bxe88ki2.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{SyncPage-Col3nhBp.js → SyncPage-C09YF6D5.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/Tabs-876h0_zB.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/Tabs-BNtOqYlc.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/TierComparison-Dyf-knpe.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ToolsPage-B3fMk-22.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ToolsPage-HKbmsKMQ.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{TooltipText-Bnvm1FcC.js → TooltipText-Baw38jOU.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/UiStudioPage-Cbgl7xIC.js +16 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/UiStudioPage-DQOd5VrU.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{WhatsNewPage-M1EeHSH-.js → WhatsNewPage-BlOSWgSn.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-FfT2oWAB.js +343 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-Gu7et1DX.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/sample-requests-Bx1zpYdG.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/sample-requests-X_hsWdLX.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ui-studio-sample-DrNTD6yi.png +0 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{useLiveUptime-Dc2iJiFi.js → useLiveUptime-DhJz484L.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/index.html +2 -2
- package/plugins/weppy-roblox-mcp/dist/index.js +450 -85
- package/plugins/weppy-roblox-mcp/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
- package/.gitattributes +0 -1
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -60
- package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -30
- package/.github/ISSUE_TEMPLATE/install_help.yml +0 -48
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -16
- package/.github/workflows/install-test.yml +0 -140
- package/Dockerfile +0 -13
- package/docs/assets/screenshots/antigravity/antigravity_mcp_raw.png +0 -0
- package/docs/assets/screenshots/antigravity/antigravity_mcp_services_menu.png +0 -0
- package/docs/assets/screenshots/antigravity/antigravity_raw_config_menu.png +0 -0
- package/docs/assets/screenshots/dashboard/dashboard_changelog1.png +0 -0
- package/docs/assets/screenshots/dashboard/dashboard_changelog2.png +0 -0
- package/docs/assets/screenshots/dashboard/dashboard_connection.png +0 -0
- package/docs/assets/screenshots/dashboard/dashboard_overview.png +0 -0
- package/docs/assets/screenshots/dashboard/dashboard_playtest.png +0 -0
- package/docs/assets/screenshots/dashboard/dashboard_sync.png +0 -0
- package/docs/assets/screenshots/dashboard/dashboard_tools.png +0 -0
- package/docs/assets/screenshots/plugin/connection/connection-guide.png +0 -0
- package/docs/assets/screenshots/plugin/installation/main-screen.png +0 -0
- package/docs/assets/screenshots/plugin/installation/plugins-menu.png +0 -0
- package/docs/assets/screenshots/plugin/installation/settings-screen.png +0 -0
- package/docs/assets/screenshots/plugin/installation/toolbar-button.png +0 -0
- package/docs/assets/screenshots/plugin/license/dashboard-license-screen.png +0 -0
- package/docs/assets/screenshots/plugin/license/plugin-license-screen.png +0 -0
- package/docs/assets/screenshots/plugin/sync/sync-conflict.png +0 -0
- package/docs/assets/screenshots/plugin/sync/sync-main.png +0 -0
- package/docs/assets/screenshots/plugin/sync/sync-overview.png +0 -0
- package/docs/assets/screenshots/roblox-explorer/roblox-explorer-property-window.png +0 -0
- package/docs/assets/screenshots/roblox-explorer/roblox-explorer-screen.png +0 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogPage-BH87M2hn.css +0 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogPage-WFqQ5h8e.js +0 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PlaytestPage-Dq3kV_rX.js +0 -11
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-DTv0NbEY.css +0 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-QQd8aPdd.js +0 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/TierComparison-CYfIb0tr.js +0 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ToolsPage-54vIMfZg.css +0 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ToolsPage-Ba_6GnUZ.js +0 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-B-nqZCE3.js +0 -380
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-COXUWuq2.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as s,r,a as D,D as tt,u as et,m as st}from"./index-FfT2oWAB.js";import{T as B}from"./TooltipText-Baw38jOU.js";import{C as at}from"./ConfirmModal-CmJCz5rg.js";import{T as ot}from"./Tabs-BNtOqYlc.js";const lt="_wrapper_hzgda_2",rt="_table_hzgda_7",it="_sortable_hzgda_32",nt="_sortArrow_hzgda_41",ct="_clickable_hzgda_52",dt="_empty_hzgda_57",ut="_expandedRow_hzgda_65",pt="_expandedCell_hzgda_74",S={wrapper:lt,table:rt,sortable:it,sortArrow:nt,clickable:ct,empty:dt,expandedRow:ut,expandedCell:pt};function ht({columns:e,data:a,sortBy:m,sortDir:j="asc",onSort:M,onRowClick:k,rowKey:E,emptyMessage:L,expandedKey:A,renderExpandedRow:b}){return s.jsx("div",{className:S.wrapper,children:s.jsxs("table",{className:S.table,children:[s.jsx("thead",{children:s.jsx("tr",{children:e.map(c=>s.jsxs("th",{style:c.width?{width:c.width}:void 0,className:c.sortable?S.sortable:void 0,onClick:c.sortable&&M?()=>M(c.key):void 0,children:[s.jsx("span",{children:c.label}),c.sortable&&m===c.key&&s.jsx("span",{className:S.sortArrow,children:j==="asc"?"▴":"▾"})]},c.key))})}),s.jsx("tbody",{children:a.length===0?s.jsx("tr",{children:s.jsx("td",{colSpan:e.length,className:S.empty,children:L||"No data"})}):a.map((c,w)=>{const p=E?E(c):String(w),h=A!=null&&p===A&&b?b(c):null;return s.jsxs(r.Fragment,{children:[s.jsx("tr",{className:k?S.clickable:void 0,onClick:k?()=>k(c):void 0,children:e.map(f=>s.jsx("td",{children:f.render?f.render(c):String(c[f.key]??"")},f.key))}),h&&s.jsx("tr",{className:S.expandedRow,children:s.jsx("td",{colSpan:e.length,className:S.expandedCell,children:h})})]},p)})})]})})}function mt(e){return{...e,sequenceNumber:typeof e.sequenceNumber=="number"?e.sequenceNumber:void 0,executionTimeMs:typeof e.executionTimeMs=="number"?e.executionTimeMs:void 0}}const xt=50;function bt(){const[e,a]=r.useState(null),[m,j]=r.useState(!0),[M,k]=r.useState([]),[E,L]=r.useState(0),[A,b]=r.useState(!1),[c,w]=r.useState(!0),[p,v]=r.useState(0),[h,f]=r.useState(""),H=r.useRef(null),_=r.useCallback(async()=>{j(!0);try{const y=await D.get("/api/dashboard/tool-stats");a(y)}catch{}finally{j(!1)}},[]),g=r.useCallback(async(y,z)=>{w(!0);try{const C={limit:String(xt),offset:String(y)};z&&(C.tool=z);const P=await D.get("/api/dashboard/history",C);k(P.entries.map(mt)),L(P.total),b(P.hasMore)}catch{k([]),L(0),b(!1)}finally{w(!1)}},[]),F=r.useCallback(()=>{_(),g(p,h)},[g,_,p,h]),d=r.useCallback(async()=>{await D.post("/api/dashboard/tools/history/clear"),g(p,h)},[g,p,h]),O=r.useCallback(async()=>{await D.post("/api/dashboard/tools/statistics/clear"),_()},[_]);return r.useEffect(()=>{_()},[_]),r.useEffect(()=>{g(p,h)},[g,p,h]),r.useEffect(()=>{const y=new tt;H.current=y,y.connect();const z=y.on("command",()=>{_(),g(p,h)});return()=>{z(),y.disconnect(),H.current=null}},[g,_,p,h]),{statistics:e,statsLoading:m,history:M,historyTotal:E,historyHasMore:A,historyLoading:c,historyOffset:p,historyToolFilter:h,setHistoryOffset:v,setHistoryToolFilter:f,refresh:F,clearHistory:d,clearStatistics:O}}const ft="_page_z41at_2",_t="_card_z41at_12",gt="_cardToolbar_z41at_19",yt="_sectionTitle_z41at_27",Ct="_dangerButton_z41at_33",jt="_proBadge_z41at_52",kt="_statusOk_z41at_66",Tt="_statusFallback_z41at_75",St="_statusUnsupported_z41at_84",Nt="_statusError_z41at_93",wt="_tierBasic_z41at_103",vt="_tierPro_z41at_107",zt="_tierMixed_z41at_112",Bt="_filterRow_z41at_123",Mt="_filterLabel_z41at_130",Et="_filterSelect_z41at_139",Lt="_expandedRow_z41at_150",At="_expandedSection_z41at_155",Pt="_detailList_z41at_165",Rt="_detailItem_z41at_171",Ht="_detailLabel_z41at_177",Ft="_detailValue_z41at_182",Ot="_pre_z41at_187",It="_pagination_z41at_204",$t="_pageInfo_z41at_212",Dt="_btn_z41at_218",qt="_tierDistribution_z41at_241",Wt="_tierBarWrap_z41at_245",Ut="_tierBarBasic_z41at_253",Kt="_tierBarPro_z41at_258",Vt="_tierLabels_z41at_263",Gt="_statsTableWrap_z41at_272",Jt="_statsTable_z41at_272",Zt="_sortableHeader_z41at_303",Qt="_sortArrow_z41at_308",Xt="_statsToolRow_z41at_312",Yt="_statsActionRow_z41at_320",te="_expandButton_z41at_324",ee="_expandIcon_z41at_336",se="_actionLabel_z41at_341",ae="_emptyStats_z41at_348",oe="_summaryLine_z41at_354",o={page:ft,card:_t,cardToolbar:gt,sectionTitle:yt,dangerButton:Ct,proBadge:jt,statusOk:kt,statusFallback:Tt,statusUnsupported:St,statusError:Nt,tierBasic:wt,tierPro:vt,tierMixed:zt,filterRow:Bt,filterLabel:Mt,filterSelect:Et,expandedRow:Lt,expandedSection:At,detailList:Pt,detailItem:Rt,detailLabel:Ht,detailValue:Ft,pre:Ot,pagination:It,pageInfo:$t,btn:Dt,tierDistribution:qt,tierBarWrap:Wt,tierBarBasic:Ut,tierBarPro:Kt,tierLabels:Vt,statsTableWrap:Gt,statsTable:Jt,sortableHeader:Zt,sortArrow:Qt,statsToolRow:Xt,statsActionRow:Yt,expandButton:te,expandIcon:ee,actionLabel:se,emptyStats:ae,summaryLine:oe},W=50;function le(e){const a=new Date(e);return`${String(a.getHours()).padStart(2,"0")}:${String(a.getMinutes()).padStart(2,"0")}:${String(a.getSeconds()).padStart(2,"0")}`}function q(e){return typeof e!="number"||!Number.isFinite(e)?"-":e<1e3?`${e}ms`:`${(e/1e3).toFixed(1)}s`}function R(e,a){return a==="pro"?e("tier.pro","Pro"):a==="mixed"?e("tier.mixed","Mixed"):e("tier.basic","Basic")}function G(e,a){return a!==e&&a.startsWith(`${e}_`)?a.slice(e.length+1):""}function re(e,a){const m=G(e,a);return m?`${e}.${m}`:e}function V(e){return typeof e=="string"&&e.length>0?e:void 0}function ie(e){if(!Array.isArray(e))return;const a=e.filter(m=>typeof m=="string"&&m.length>0);return a.length>0?a:void 0}function ne(e){const a=e.result??{};return{requestedCommand:e.requestedCommand??V(a.requestedCommand),executedCommand:e.executedCommand??V(a.executedCommand),alternatives:e.alternatives??ie(a.alternatives)}}function ce(e,a){switch(e.status){case"fallback":return{label:a("tools.badge.fallback","FALLBACK"),tooltip:a("tools.badge.fallback.tooltip","The requested Pro action succeeded via a Basic fallback."),className:o.statusFallback};case"unsupported":return{label:a("tools.badge.unsupported","UNSUPPORTED"),tooltip:a("tools.badge.unsupported.tooltip","The requested Pro action was blocked and no fallback ran."),className:o.statusUnsupported};case"error":return{label:a("tools.badge.err","FAILED"),tooltip:a("tools.badge.err.tooltip","The tool run failed."),className:o.statusError};default:return{label:a("tools.status.ok","OK"),tooltip:a("tools.status.ok.tooltip","The tool run completed successfully."),className:o.statusOk}}}function N(e,a){return s.jsxs("div",{className:o.detailItem,children:[s.jsx("span",{className:o.detailLabel,children:e}),s.jsx("span",{className:o.detailValue,children:a})]})}function xe(){const{t:e}=et(),a=bt(),{show:m}=st(),[j,M]=r.useState("history"),[k,E]=r.useState(null),[L,A]=r.useState(null),[b,c]=r.useState(null),[w,p]=r.useState(!1),[v,h]=r.useState("totalCalls"),[f,H]=r.useState("desc"),_=r.useCallback(t=>{h(l=>l===t?(H(i=>i==="asc"?"desc":"asc"),t):(H("desc"),t))},[]),g=r.useMemo(()=>{var l;const t=new Set;return Object.keys(((l=a.statistics)==null?void 0:l.tools)??{}).forEach(i=>t.add(i)),a.history.forEach(i=>{i.tool&&t.add(i.tool)}),a.historyToolFilter&&t.add(a.historyToolFilter),Array.from(t).sort()},[a.history,a.historyToolFilter,a.statistics]),F=r.useMemo(()=>{var t;return(t=a.statistics)!=null&&t.tools?Object.values(a.statistics.tools).map(l=>{var K;const i=Object.entries(l.commands??{}).map(([u,n])=>({toolName:l.tool,commandName:n.command??u,label:G(l.tool,n.command??u)||(n.command??u),tier:n.tier,totalCalls:n.totalCalls,successCount:n.successCount,fallbackCount:n.fallbackCount,unsupportedCount:n.unsupportedCount,failureCount:n.failureCount,totalExecutionTimeMs:n.totalExecutionTimeMs,avgExecutionTimeMs:n.avgExecutionTimeMs})),x=i.reduce((u,n)=>u+n.totalCalls,0),T=i.reduce((u,n)=>u+n.successCount,0),I=i.reduce((u,n)=>u+n.fallbackCount,0),$=i.reduce((u,n)=>u+n.unsupportedCount,0),X=i.reduce((u,n)=>u+n.failureCount,0),U=i.reduce((u,n)=>u+n.totalExecutionTimeMs,0),Y=new Set(i.map(u=>u.tier)).size>1?"mixed":((K=i[0])==null?void 0:K.tier)??l.tier;return{toolName:l.tool,tier:Y,commands:i,totalCalls:x,successCount:T,fallbackCount:I,unsupportedCount:$,failureCount:X,totalExecutionTimeMs:U,avgExecutionTimeMs:x>0?Math.round(U/x):0}}):[]},[a.statistics]),d=r.useCallback((t,l,i,x)=>s.jsx(B,{text:e(i,x),children:e(t,l)}),[e]),O=r.useMemo(()=>[...F].sort((l,i)=>{const x=l[v],T=i[v];if(typeof x=="number"&&typeof T=="number")return f==="asc"?x-T:T-x;const I=String(x??""),$=String(T??"");return f==="asc"?I.localeCompare($):$.localeCompare(I)}),[F,v,f]),y=r.useMemo(()=>[{key:"timestamp",label:d("tools.col.time","Time","tools.col.time.tooltip","When the tool run was recorded."),width:"80px",render:t=>le(t.timestamp)},{key:"toolName",label:d("tools.col.toolAction","Tool.Action","tools.col.toolAction.tooltip","Tool name and action that were executed."),render:t=>s.jsxs("span",{children:[re(t.tool,t.command),t.tier==="pro"&&s.jsx(B,{text:e("tools.badge.pro.tooltip","This entry used a Pro-only tool or action."),children:s.jsx("span",{className:o.proBadge,children:e("tools.badge.pro","PRO")})})]})},{key:"executionTimeMs",label:d("tools.col.duration","Duration","tools.col.duration.tooltip","How long the tool took to finish."),width:"80px",render:t=>q(t.executionTimeMs)},{key:"status",label:d("tools.col.status","Status","tools.col.status.tooltip","Outcome of the recorded tool run."),width:"120px",render:t=>{const l=ce(t,e);return s.jsx(B,{text:l.tooltip,children:s.jsx("span",{className:l.className,children:l.label})})}},{key:"tier",label:d("tools.col.tier","Tier","tools.col.tier.tooltip","License tier required for the tool or action."),width:"60px",render:t=>s.jsx("span",{className:t.tier==="pro"?o.tierPro:o.tierBasic,children:R(e,t.tier)})}],[e,d]),z=r.useMemo(()=>[{key:"toolName",label:d("tools.col.tool","Tool","tools.col.tool.tooltip","Consolidated tool name in the statistics table."),sortable:!0},{key:"totalCalls",label:d("tools.col.calls","Calls","tools.col.calls.tooltip","Total number of recorded calls for this tool."),sortable:!0,width:"70px"},{key:"successCount",label:d("tools.col.ok","OK","tools.col.ok.tooltip","Number of direct successful runs."),sortable:!0,width:"70px"},{key:"fallbackCount",label:d("tools.col.fallback","FALLBACK","tools.col.fallback.tooltip","Number of runs that succeeded through fallback execution."),sortable:!0,width:"110px"},{key:"unsupportedCount",label:d("tools.col.unsupported","UNSUPPORTED","tools.col.unsupported.tooltip","Number of blocked runs without fallback execution."),sortable:!0,width:"130px"},{key:"failureCount",label:d("tools.col.err","FAILED","tools.col.err.tooltip","Number of runs that failed."),sortable:!0,width:"70px"},{key:"avgExecutionTimeMs",label:d("tools.col.avgTime","Avg Time","tools.col.avgTime.tooltip","Average execution time across recorded calls."),sortable:!0,width:"90px",render:t=>q(t.avgExecutionTimeMs)},{key:"tier",label:d("tools.col.tier","Tier","tools.col.tierStats.tooltip","Basic, Pro, or Mixed summary for the tool statistics row."),sortable:!0,width:"70px",render:t=>s.jsx(B,{text:t.tier==="mixed"?e("tools.tier.mixed.tooltip","This tool includes both Basic and Pro actions."):"",children:s.jsx("span",{className:t.tier==="pro"?o.tierPro:t.tier==="mixed"?o.tierMixed:o.tierBasic,children:R(e,t.tier)})})}],[e,d]),C=r.useMemo(()=>{if(!a.statistics)return null;const t=a.statistics.tierSummary.basic.totalCalls,l=a.statistics.tierSummary.pro.totalCalls,i=t+l;if(i===0)return null;const x=Math.round(t/i*100),T=100-x;return{basic:t,pro:l,basicPct:x,proPct:T}},[a.statistics]),P=r.useCallback(t=>{A(l=>l===t?null:t)},[]),J=r.useCallback(async()=>{if(b){p(!0);try{b==="history"?await a.clearHistory():await a.clearStatistics(),m(e("toast.clearSuccess","Cleared successfully"),"success"),c(null)}catch{m(e("toast.clearFailed","Failed to clear data"),"error")}finally{p(!1)}}},[b,m,e,a]),Z=r.useCallback(t=>{const l=ne(t);return s.jsxs("div",{className:o.expandedRow,children:[s.jsxs("div",{className:o.expandedSection,children:[s.jsxs("strong",{children:[s.jsx(B,{text:e("tools.detail.params.tooltip","Input parameters passed to this tool run."),children:e("tools.detail.params","Parameters")}),":"]}),s.jsx("pre",{className:o.pre,children:JSON.stringify(t.parameters,null,2)})]}),t.result&&s.jsxs("div",{className:o.expandedSection,children:[s.jsxs("strong",{children:[s.jsx(B,{text:e("tools.detail.result.tooltip","Returned result payload for this tool run."),children:e("tools.detail.result","Result")}),":"]}),s.jsx("pre",{className:o.pre,children:JSON.stringify(t.result,null,2)})]}),(t.status==="fallback"||t.status==="unsupported"||t.status==="error")&&s.jsx("div",{className:o.expandedSection,children:s.jsxs("div",{className:o.detailList,children:[t.status==="fallback"&&(l==null?void 0:l.requestedCommand)&&N(e("tools.detail.requestedCommand","Requested Command"),l.requestedCommand),t.status==="fallback"&&(l==null?void 0:l.executedCommand)&&N(e("tools.detail.executedCommand","Executed Command"),l.executedCommand),t.status==="fallback"&&(l==null?void 0:l.alternatives)&&N(e("tools.detail.alternatives","Alternatives"),l.alternatives.join(", ")),t.status==="unsupported"&&t.blockedMessage&&N(e("tools.detail.blockedMessage","Blocked Reason"),t.blockedMessage),t.status==="unsupported"&&N(e("tools.detail.noFallback","No Fallback"),e("tools.detail.noFallback.value","No fallback ran.")),t.status==="error"&&t.errorMessage&&N(e("tools.detail.errorMessage","Error Message"),t.errorMessage),t.status==="error"&&t.blockedMessage&&N(e("tools.detail.blockedMessage","Blocked Reason"),t.blockedMessage),t.status==="error"&&t.fallbackCommand&&N(e("tools.detail.executedCommand","Executed Command"),t.fallbackCommand)]})})]})},[e]),Q=["history","statistics"].map(t=>({key:t,label:e(`tools.tab.${t}`,t.charAt(0).toUpperCase()+t.slice(1))}));return s.jsxs("div",{className:o.page,children:[s.jsx(ot,{items:Q,value:j,onChange:M}),j==="history"&&s.jsxs("div",{className:o.card,children:[s.jsxs("div",{className:o.cardToolbar,children:[s.jsx("div",{className:o.sectionTitle,children:e("tools.tab.history","History")}),s.jsx("button",{className:o.dangerButton,onClick:()=>c("history"),children:e("common.clear","Clear")})]}),s.jsx("div",{className:o.filterRow,children:s.jsxs("label",{className:o.filterLabel,children:[e("tools.filter.tool","Tool"),":",s.jsxs("select",{className:o.filterSelect,value:a.historyToolFilter,onChange:t=>{a.setHistoryToolFilter(t.target.value),a.setHistoryOffset(0)},children:[s.jsx("option",{value:"",children:e("tools.filter.all","All")}),g.map(t=>s.jsx("option",{value:t,children:t},t))]})]})}),s.jsx(ht,{columns:y,data:a.history,rowKey:t=>t.id,onRowClick:t=>E(l=>l===t.id?null:t.id),emptyMessage:e("tools.empty.history","No history entries"),expandedKey:k,renderExpandedRow:Z}),s.jsxs("div",{className:o.pagination,children:[s.jsx("button",{className:o.btn,disabled:a.historyOffset===0,title:e("tools.page.prev.tooltip","Go to the previous page of tool history results."),onClick:()=>a.setHistoryOffset(Math.max(0,a.historyOffset-W)),children:e("tools.page.prev","Prev")}),s.jsxs("span",{className:o.pageInfo,children:[a.historyOffset+1,"–",Math.min(a.historyOffset+W,a.historyTotal)," / ",a.historyTotal]}),s.jsx("button",{className:o.btn,disabled:!a.historyHasMore,title:e("tools.page.next.tooltip","Go to the next page of tool history results."),onClick:()=>a.setHistoryOffset(a.historyOffset+W),children:e("tools.page.next","Next")})]})]}),j==="statistics"&&s.jsxs("div",{className:o.card,children:[s.jsxs("div",{className:o.cardToolbar,children:[s.jsx("div",{className:o.sectionTitle,children:e("tools.tab.statistics","Statistics")}),s.jsx("button",{className:o.dangerButton,onClick:()=>c("statistics"),children:e("common.clear","Clear")})]}),C&&s.jsxs("div",{className:o.tierDistribution,children:[s.jsxs("div",{className:o.tierBarWrap,children:[s.jsx("div",{className:o.tierBarBasic,style:{width:`${C.basicPct}%`}}),s.jsx("div",{className:o.tierBarPro,style:{width:`${C.proPct}%`}})]}),s.jsxs("div",{className:o.tierLabels,children:[s.jsxs("span",{children:[R(e,"basic")," ",C.basicPct,"% (",C.basic,")"]}),s.jsxs("span",{children:[R(e,"pro")," ",C.proPct,"% (",C.pro,")"]})]})]}),s.jsx("div",{className:o.statsTableWrap,children:s.jsxs("table",{className:o.statsTable,children:[s.jsx("thead",{children:s.jsx("tr",{children:z.map(t=>s.jsxs("th",{style:t.width?{width:t.width}:void 0,className:t.sortable?o.sortableHeader:void 0,onClick:t.sortable?()=>_(t.key):void 0,children:[s.jsx("span",{children:t.label}),t.sortable&&v===t.key&&s.jsx("span",{className:o.sortArrow,children:f==="asc"?"▴":"▾"})]},t.key))})}),s.jsx("tbody",{children:O.length===0?s.jsx("tr",{children:s.jsx("td",{colSpan:z.length,className:o.emptyStats,children:e("tools.empty.stats","No tool statistics")})}):O.map(t=>{const l=L===t.toolName;return s.jsxs(r.Fragment,{children:[s.jsxs("tr",{className:o.statsToolRow,onClick:()=>P(t.toolName),children:[s.jsx("td",{children:s.jsxs("button",{type:"button",className:o.expandButton,"aria-expanded":l,"aria-label":`${t.toolName} ${l?e("common.collapse","Collapse"):e("common.expand","Expand")}`,onClick:i=>{i.stopPropagation(),P(t.toolName)},children:[s.jsx("span",{className:o.expandIcon,"aria-hidden":"true",children:l?"▾":"▸"}),s.jsx("span",{children:t.toolName})]})}),s.jsx("td",{children:t.totalCalls}),s.jsx("td",{children:t.successCount}),s.jsx("td",{children:t.fallbackCount}),s.jsx("td",{children:t.unsupportedCount}),s.jsx("td",{children:t.failureCount}),s.jsx("td",{children:q(t.avgExecutionTimeMs)}),s.jsx("td",{children:s.jsx(B,{text:t.tier==="mixed"?e("tools.tier.mixed.tooltip","This tool includes both Basic and Pro actions."):"",children:s.jsx("span",{className:t.tier==="pro"?o.tierPro:t.tier==="mixed"?o.tierMixed:o.tierBasic,children:R(e,t.tier)})})})]}),l&&t.commands.map(i=>s.jsxs("tr",{className:o.statsActionRow,children:[s.jsx("td",{children:s.jsx("span",{className:o.actionLabel,children:i.label})}),s.jsx("td",{children:i.totalCalls}),s.jsx("td",{children:i.successCount}),s.jsx("td",{children:i.fallbackCount}),s.jsx("td",{children:i.unsupportedCount}),s.jsx("td",{children:i.failureCount}),s.jsx("td",{children:q(i.avgExecutionTimeMs)}),s.jsx("td",{children:s.jsx("span",{className:i.tier==="pro"?o.tierPro:o.tierBasic,children:R(e,i.tier)})})]},`${t.toolName}:${i.commandName}`))]},t.toolName)})})]})}),a.statistics&&s.jsxs("div",{className:o.summaryLine,children:[e("tools.summary.total","Total"),": ",a.statistics.totalCalls," ",e("tools.summary.calls","calls")," | ",e("tools.summary.sessions","Sessions"),": ",a.statistics.totalSessions]})]}),s.jsx(at,{open:b!==null,title:b==="history"?e("tools.clear.history.title","Clear history?"):e("tools.clear.statistics.title","Clear statistics?"),message:b==="history"?e("tools.clear.history.message","This permanently removes the current place tools history."):e("tools.clear.statistics.message","This permanently resets the current place tool statistics."),cancelLabel:e("common.cancel","Cancel"),confirmLabel:e("common.clear","Clear"),loading:w,onCancel:()=>!w&&c(null),onConfirm:J})]})}export{xe as Component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as r,T as s}from"./index-
|
|
1
|
+
import{j as r,T as s}from"./index-FfT2oWAB.js";function p({text:o,children:t}){return r.jsx(s,{text:o,children:t})}export{p as T};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import{p as se,q as F,s as $e,r as u,u as A,j as t,R as Ee,k as fe,o as Se,l as He,t as Oe}from"./index-FfT2oWAB.js";import{D as je,T as Ue}from"./TierComparison-Dyf-knpe.js";import{I as M}from"./InfoLabel-B9KT3kfU.js";import{T as _}from"./TooltipText-Baw38jOU.js";import{D as oe,c as ne,e as Fe,g as ze,h as qe,i as le,j as ve,k as Ve,l as ce,d as We}from"./sample-requests-X_hsWdLX.js";import{T as Ke}from"./Tabs-BNtOqYlc.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 Qe=[["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"}]],Ye=se("camera",Qe);/**
|
|
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 Je=[["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"}]],Xe=se("ellipsis",Je);/**
|
|
12
|
+
* @license lucide-react v1.8.0 - ISC
|
|
13
|
+
*
|
|
14
|
+
* This source code is licensed under the ISC license.
|
|
15
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
+
*/const Ze=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],et=se("x",Ze);async function Ce(e){const i=await fetch(`${F}${e}`);if(!i.ok){let a=null;try{a=await i.json()}catch{}throw new $e(i.status,(a==null?void 0:a.message)??i.statusText,(a==null?void 0:a.error)??null,a)}return await i.json()}function H(e){return typeof e=="number"&&Number.isFinite(e)?e:0}function tt(e){return e.design_check_summary?{priority_high:H(e.design_check_summary.priority_high),priority_medium:H(e.design_check_summary.priority_medium),priority_low:H(e.design_check_summary.priority_low)}:e.lint_summary?{priority_high:H(e.lint_summary.errors),priority_medium:H(e.lint_summary.warnings),priority_low:0}:null}function it(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 we(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:tt(e),image:e.image}}function at(e){const i=e.check_results??e.lint_results??[];return{...we(e),check_results:i.map(it),image_url:e.image_url,meta:e.meta}}async function de(e,i){const a=new URLSearchParams;i!==void 0&&a.set("limit",String(i));const n=a.toString()?`?${a.toString()}`:"",l=await Ce(`/api/ui-studio/snapshots${n}`);return{...l,snapshots:l.snapshots.map(we)}}async function rt(e,i){const a=i!==void 0?`?placeId=${i}`:"",n=await Ce(`/api/ui-studio/snapshots/${encodeURIComponent(e)}${a}`);return at(n)}function be(e,i){const a=i!==void 0?`?placeId=${i}`:"";return`${F}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image${a}`}const st=1e4;function Ie(e=50){const[i,a]=u.useState(null),[n,l]=u.useState(!0),[r,o]=u.useState(null),m=u.useCallback(async()=>{try{const d=await de(void 0,e);a(d),o(null)}catch(d){o(d instanceof Error?d.message:String(d))}finally{l(!1)}},[e]);return u.useEffect(()=>{let d=!1;const y=async()=>{try{const p=await de(void 0,e);d||(a(p),o(null))}catch(p){d||o(p instanceof Error?p.message:String(p))}finally{d||l(!1)}};y();const f=setInterval(()=>{y()},st);return()=>{d=!0,clearInterval(f)}},[e]),{data:i,loading:n,error:r,refresh:m}}const ot="_page_1c56j_2",nt="_grid_1c56j_9",lt="_card_1c56j_16",ct="_cardBodyButton_1c56j_31",dt="_thumb_1c56j_43",ut="_badges_1c56j_52",ht="_priorityHighBadge_1c56j_60",pt="_priorityMediumBadge_1c56j_69",mt="_priorityLowBadge_1c56j_78",gt="_cardMeta_1c56j_87",yt="_target_1c56j_93",_t="_time_1c56j_100",xt="_drawer_1c56j_105",ft="_drawerToolbar_1c56j_122",St="_drawerTitleBlock_1c56j_133",jt="_drawerEyebrow_1c56j_140",vt="_drawerTarget_1c56j_149",Ct="_drawerToolbarActions_1c56j_159",wt="_closeBtn_1c56j_167",bt="_detailBody_1c56j_188",It="_screenshotPreviewFrame_1c56j_195",Nt="_fullImg_1c56j_208",Pt="_metaDl_1c56j_215",Tt="_errorMsg_1c56j_227",kt="_suggestionsWrap_1c56j_232",Bt="_prioritySection_1c56j_239",Dt="_sectionHighHeader_1c56j_242",Gt="_sectionLowHeader_1c56j_248",Mt="_sectionMediumHeader_1c56j_254",At="_groupCard_1c56j_260",Rt="_groupHeader_1c56j_267",Lt="_groupLabel_1c56j_283",$t="_groupCount_1c56j_288",Et="_groupChevron_1c56j_295",Ht="_groupBody_1c56j_299",Ot="_groupDescription_1c56j_302",Ut="_groupFix_1c56j_307",Ft="_falsePositive_1c56j_316",zt="_itemList_1c56j_324",qt="_suggestionItem_1c56j_332",Vt="_suggestionInfo_1c56j_342",Wt="_pathBreadcrumb_1c56j_348",Kt="_currentValue_1c56j_357",Qt="_copyFixBtn_1c56j_361",Yt="_emptySuggestions_1c56j_375",Jt="_sampleBanner_1c56j_383",Xt="_sampleBannerRow_1c56j_396",Zt="_sampleBannerMain_1c56j_404",ei="_sampleBadge_1c56j_412",ti="_sampleTitle_1c56j_422",ii="_sampleMessage_1c56j_429",ai="_sampleActions_1c56j_436",ri="_primaryAction_1c56j_444",si="_secondaryAction_1c56j_445",oi="_emptyState_1c56j_480",ni="_pluginGuideCard_1c56j_488",li="_pluginGuideMarker_1c56j_499",ci="_pluginGuideBody_1c56j_514",di="_pluginGuideTitle_1c56j_518",ui="_pluginGuideMessage_1c56j_526",hi="_pluginGuideChecklist_1c56j_533",pi="_pluginGuideWaiting_1c56j_556",mi="_pluginGuideDot_1c56j_565",gi="_analysisWorkspace_1c56j_573",yi="_analysisMainColumn_1c56j_578",_i="_analysisDetailPopupLayer_1c56j_582",xi="_analysisDetailDialog_1c56j_599",fi="_analysisSummaryPanel_1c56j_618",Si="_recentCapturesHeader_1c56j_631",ji="_analysisSummaryText_1c56j_638",vi="_recentCapturesMeta_1c56j_639",Ci="_analysisReportGrid_1c56j_645",wi="_analysisReportGroup_1c56j_652",bi="_analysisReportCard_1c56j_656",Ii="_analysisReportThumb_1c56j_678",Ni="_analysisReportBody_1c56j_687",Pi="_analysisReportTopline_1c56j_694",Ti="_analysisVerdict_1c56j_701",ki="_analysisVerdict_needsFix_1c56j_712",Bi="_analysisVerdict_review_1c56j_713",Di="_analysisVerdict_passed_1c56j_718",Gi="_analysisReportCounts_1c56j_723",Mi="_analysisReportTarget_1c56j_728",Ai="_analysisReportIssue_1c56j_737",Ri="_analysisReportMeta_1c56j_743",Li="_analysisChildList_1c56j_750",$i="_analysisChildRow_1c56j_761",Ei="_analysisChildPath_1c56j_782",Hi="_analysisChildSummary_1c56j_791",Oi="_analysisChildDetailHint_1c56j_792",Ui="_drawerAnalysisSummary_1c56j_801",Fi="_drawerAnalysisSummaryItem_1c56j_812",zi="_drawerAnalysisLabel_1c56j_819",qi="_drawerAnalysisCounts_1c56j_825",Vi="_drawerAnalysisValue_1c56j_826",Wi="_recentCapturesSection_1c56j_831",Ki="_drawerPrimaryActions_1c56j_843",Qi="_drawerActionBtn_1c56j_850",Yi="_drawerMoreMenu_1c56j_879",Ji="_drawerMoreButton_1c56j_884",Xi="_drawerMoreMenuBody_1c56j_909",Zi="_drawerMenuItem_1c56j_922",ea="_drawerMenuItemDanger_1c56j_945",ta="_actionErrMsg_1c56j_954",ia="_actionStatusMsg_1c56j_963",aa="_actionStatus_info_1c56j_977",ra="_actionStatus_success_1c56j_983",sa="_actionStatus_warning_1c56j_989",oa="_actionStatusDetail_1c56j_995",na="_galleryHeader_1c56j_1001",la="_cardChecked_1c56j_1014",ca="_cardCheckbox_1c56j_1021",da="_captureSelectionActions_1c56j_1061",ua="_selectionToolbar_1c56j_1070",ha="_selectionBar_1c56j_1071",pa="_selectionToolbarCount_1c56j_1090",ma="_selectionToolbarActions_1c56j_1097",ga="_selectionBarBtn_1c56j_1104",ya="_selectionBarBtnDanger_1c56j_1125",s={page:ot,grid:nt,card:lt,cardBodyButton:ct,thumb:dt,badges:ut,priorityHighBadge:ht,priorityMediumBadge:pt,priorityLowBadge:mt,cardMeta:gt,target:yt,time:_t,drawer:xt,drawerToolbar:ft,drawerTitleBlock:St,drawerEyebrow:jt,drawerTarget:vt,drawerToolbarActions:Ct,closeBtn:wt,detailBody:bt,screenshotPreviewFrame:It,fullImg:Nt,metaDl:Pt,errorMsg:Tt,suggestionsWrap:kt,prioritySection:Bt,sectionHighHeader:Dt,sectionLowHeader:Gt,sectionMediumHeader:Mt,groupCard:At,groupHeader:Rt,groupLabel:Lt,groupCount:$t,groupChevron:Et,groupBody:Ht,groupDescription:Ot,groupFix:Ut,falsePositive:Ft,itemList:zt,suggestionItem:qt,suggestionInfo:Vt,pathBreadcrumb:Wt,currentValue:Kt,copyFixBtn:Qt,emptySuggestions:Yt,sampleBanner:Jt,sampleBannerRow:Xt,sampleBannerMain:Zt,sampleBadge:ei,sampleTitle:ti,sampleMessage:ii,sampleActions:ai,primaryAction:ri,secondaryAction:si,emptyState:oi,pluginGuideCard:ni,pluginGuideMarker:li,pluginGuideBody:ci,pluginGuideTitle:di,pluginGuideMessage:ui,pluginGuideChecklist:hi,pluginGuideWaiting:pi,pluginGuideDot:mi,analysisWorkspace:gi,analysisMainColumn:yi,analysisDetailPopupLayer:_i,analysisDetailDialog:xi,analysisSummaryPanel:fi,recentCapturesHeader:Si,analysisSummaryText:ji,recentCapturesMeta:vi,analysisReportGrid:Ci,analysisReportGroup:wi,analysisReportCard:bi,analysisReportThumb:Ii,analysisReportBody:Ni,analysisReportTopline:Pi,analysisVerdict:Ti,analysisVerdict_needsFix:ki,analysisVerdict_review:Bi,analysisVerdict_passed:Di,analysisReportCounts:Gi,analysisReportTarget:Mi,analysisReportIssue:Ai,analysisReportMeta:Ri,analysisChildList:Li,analysisChildRow:$i,analysisChildPath:Ei,analysisChildSummary:Hi,analysisChildDetailHint:Oi,drawerAnalysisSummary:Ui,drawerAnalysisSummaryItem:Fi,drawerAnalysisLabel:zi,drawerAnalysisCounts:qi,drawerAnalysisValue:Vi,recentCapturesSection:Wi,drawerPrimaryActions:Ki,drawerActionBtn:Qi,drawerMoreMenu:Yi,drawerMoreButton:Ji,drawerMoreMenuBody:Xi,drawerMenuItem:Zi,drawerMenuItemDanger:ea,actionErrMsg:ta,actionStatusMsg:ia,actionStatus_info:aa,actionStatus_success:ra,actionStatus_warning:sa,actionStatusDetail:oa,galleryHeader:na,cardChecked:la,cardCheckbox:ca,captureSelectionActions:da,selectionToolbar:ua,selectionBar:ha,selectionToolbarCount:pa,selectionToolbarActions:ma,selectionBarBtn:ga,selectionBarBtnDanger:ya};function _a({snapshot:e,placeId:i,onClick:a,imageUrlOverride:n,selectable:l,selected:r,onToggleSelect:o}){var v,w,D;const{t:m}=A(),d=((v=e.design_check_summary)==null?void 0:v.priority_high)??0,y=((w=e.design_check_summary)==null?void 0:w.priority_medium)??0,f=((D=e.design_check_summary)==null?void 0:D.priority_low)??0,p=new Date(e.captured_at*1e3).toLocaleString(),g=n??be(e.snapshot_id,i),j=()=>{o==null||o(e.snapshot_id)};return t.jsxs("div",{className:`${s.card} ${r?s.cardChecked:""}`,children:[l&&t.jsx(_,{text:m("uiStudio.gallery.cardCheckbox.tooltip","Select this capture. Pick multiple to delete them together."),children:t.jsx("input",{className:s.cardCheckbox,type:"checkbox","aria-label":"화면 캡처 선택",checked:!!r,onChange:j})}),t.jsxs("button",{className:s.cardBodyButton,onClick:T=>a(T.currentTarget),type:"button",children:[t.jsx("img",{className:s.thumb,src:g,alt:e.snapshot_id,loading:"lazy"}),t.jsxs("div",{className:s.badges,children:[d>0&&t.jsx(_,{text:m("uiStudio.gallery.priorityHighBadge.tooltip","Number of suggestions to review first. Click for details."),children:t.jsx("span",{className:s.priorityHighBadge,children:d})}),y>0&&t.jsx(_,{text:m("uiStudio.gallery.priorityMediumBadge.tooltip","Number of recommended suggestions."),children:t.jsx("span",{className:s.priorityMediumBadge,children:y})}),f>0&&t.jsx(_,{text:m("uiStudio.gallery.priorityLowBadge.tooltip","Number of optional improvements."),children:t.jsx("span",{className:s.priorityLowBadge,children:f})})]}),t.jsxs("div",{className:s.cardMeta,children:[t.jsx("div",{className:s.target,children:e.target??e.scope}),t.jsx("div",{className:s.time,children:p})]})]})]})}const xa={touch_target:"touchTarget",contrast:"contrast",text_scaled:"textScaled",safezone:"safezone",min_text_size:"minTextSize"};function fa(e){return e.rule==="contrast"&&/\.(Icon|Avatar|EmptyIcon|GoldIcon|[A-Za-z]*Icon)$/.test(e.path)}const Sa={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 ja(e,i,a){const n=xa[e];return n?{...i,checkLabel:a(`uiStudio.fix.${n}.label`,i.checkLabel),description:a(`uiStudio.fix.${n}.description`,i.description),howToFix:a(`uiStudio.fix.${n}.howToFix`,i.howToFix),falsePositiveNote:i.falsePositiveNote?a(`uiStudio.fix.${n}.falsePositive`,i.falsePositiveNote):void 0}:i}function va(e,i){const a=Sa[e]??null;return a?i?ja(e,a,i):a:null}function Ca(e){return fa(e)}function wa(e,i){const a=new Map;for(const l of e){const r=`${l.displayPriority}::${l.rule}`,o=a.get(r)??[];o.push(l),a.set(r,o)}const n=[];for(const[l,r]of a){const[o,m]=l.split("::"),d=r.filter(Ca).length;n.push({rule:m??"unknown",priority:o,items:r,fixTemplate:va(m??"",i),falsePositiveRatio:r.length>0?d/r.length:0})}return n.sort((l,r)=>{const o={priority_high:0,priority_medium:1,priority_low:2};return l.priority!==r.priority?o[l.priority]-o[r.priority]:r.items.length-l.items.length}),{high:n.filter(l=>l.priority==="priority_high"),medium:n.filter(l=>l.priority==="priority_medium"),low:n.filter(l=>l.priority==="priority_low")}}function Ne(e){const i=e.split("."),a=i[i.length-1]??e,n=i[i.length-2],l=n?`${n} > ${a}`:a;return{full:e,breadcrumb:l,leaf:a}}function Pe(e){return typeof e=="object"&&e!==null}function ue(e){return Pe(e.data)?e.data:{}}function Z(e,i){const a=e[i];return Pe(a)?a:{}}function V(e,i){const a=e[i];return typeof a=="string"?a:null}function W(e,i){const a=e[i];return typeof a=="number"&&Number.isFinite(a)?a:0}function ba(e){const i=Z(e,"design_check_summary");return{priority_high:W(i,"priority_high"),priority_medium:W(i,"priority_medium"),priority_low:W(i,"priority_low")}}function he(e){if(!(e.success??e.ok??!e.error))throw new Error(e.error??"UI Studio action failed")}function pe(e,i){return Te(e,ba(i))}function O(e,i,a,n,l){const r=e(i,a);return l?`${r}: ${l} · ${n}`:`${r}: ${n}`}function Ia(e){const i=e.design_check_summary;return((i==null?void 0:i.priority_high)??0)>0?"needsFix":((i==null?void 0:i.priority_medium)??0)>0||((i==null?void 0:i.priority_low)??0)>0?"review":"passed"}function Na(e,i){return i==="needsFix"||i==="review"?e("uiStudio.analysis.verdict.hasSuggestions","개선 제안 있음"):e("uiStudio.analysis.verdict.passed","현재 개선 제안 없음")}function K(e,i){return`${i}${e("uiStudio.storage.countSuffix","개")}`}function Te(e,i){return`${e("uiStudio.priorityHigh","우선 검토")} ${K(e,(i==null?void 0:i.priority_high)??0)} · ${e("uiStudio.priorityMedium","검토 권장")} ${K(e,(i==null?void 0:i.priority_medium)??0)} · ${e("uiStudio.priorityLow","선택 개선")} ${K(e,(i==null?void 0:i.priority_low)??0)}`}function Pa(e,i){return Te(e,i.design_check_summary)}function Ta({snapshotId:e,placeId:i,onClose:a,sampleDetail:n,tier:l,onActionDone:r}){const[o,m]=u.useState(n??null),[d,y]=u.useState(null),[f,p]=u.useState(null),[g,j]=u.useState(null),[v,w]=u.useState(null),[D,T]=u.useState(null),{t:h}=A(),b=l==="pro";u.useEffect(()=>{if(n){m(n),y(null);return}let C=!1;return rt(e,i).then(P=>{C||m(P)}).catch(P=>{C||y(P instanceof Error?P.message:String(P))}),()=>{C=!0}},[e,i,n]);const I=async()=>{if(o!=null&&o.target){p(null),w("preview"),j({tone:"info",message:h("uiStudio.actions.previewRunning","캡처 중..."),detail:h("uiStudio.actions.previewRunningDetail","완료되면 새 화면 캡처 파일 ID를 표시합니다.")});try{const C=await ne("preview",{targetPath:o.target});he(C);const P=ue(C),L=V(P,"snapshot_id"),z=Z(P,"screenshot"),E=Z(P,"meta"),q=V(z,"saved_path"),x=V(E,"persist_warning"),B=pe(h,P);j(x?{tone:"warning",message:O(h,"uiStudio.actions.previewNeedsSaveCheck","캡처 완료, 저장 확인 필요",B,L),detail:x}:L&&q?{tone:"success",message:O(h,"uiStudio.actions.previewSaved","새 화면 캡처 저장 완료",B,L),detail:h("uiStudio.actions.previewSavedDetail","기존 화면 캡처는 변경하지 않고 새 파일로 저장했습니다.")}:L?{tone:"warning",message:O(h,"uiStudio.actions.previewComplete","캡처 완료",B,L),detail:h("uiStudio.actions.previewSavedPathMissing","새 화면 캡처 ID는 받았지만 저장 경로를 확인하지 못했습니다.")}:{tone:"warning",message:O(h,"uiStudio.actions.previewComplete","캡처 완료",B),detail:h("uiStudio.actions.previewSnapshotIdMissing","새 화면 캡처 ID를 확인하지 못했습니다. 목록을 새로고침해 저장 여부를 확인해 주세요.")}),await(r==null?void 0:r())}catch(C){p(C instanceof Error?C.message:String(C))}finally{w(null)}}},S=async()=>{if(o!=null&&o.target){p(null),w("check"),j({tone:"info",message:h("uiStudio.actions.designCheckRunning","개선 제안 확인 중..."),detail:h("uiStudio.actions.designCheckRunningDetail","완료되면 우선 검토/검토 권장/선택 개선 항목 수를 표시합니다.")});try{const C=await ne("check",{targetPath:o.target});he(C);const P=ue(C),L=pe(h,P);j({tone:"success",message:O(h,"uiStudio.actions.designCheckComplete","개선 제안 확인 완료",L),detail:h("uiStudio.actions.designCheckNoSnapshotSaved","이 작업은 화면 캡처 파일을 새로 저장하지 않습니다.")}),await(r==null?void 0:r())}catch(C){p(C instanceof Error?C.message:String(C))}finally{w(null)}}},k=async()=>{p(null),j(null);try{await Fe(i,e),await(r==null?void 0:r()),T(null),a()}catch(C){throw p(C instanceof Error?C.message:String(C)),C}},G=b?void 0:h("uiStudio.actions.proRequired","Pro 업그레이드 후 사용 가능"),N=o!=null&&o.target?Ne(o.target):null;return t.jsxs("div",{className:s.drawer,children:[t.jsxs("div",{className:s.drawerToolbar,"data-testid":"snapshot-detail-toolbar",children:[t.jsxs("div",{className:s.drawerTitleBlock,children:[t.jsx("span",{className:s.drawerEyebrow,children:h("uiStudio.analysis.detailDialog","Analysis detail")}),t.jsx("span",{className:s.drawerTarget,title:(N==null?void 0:N.full)??e,children:(N==null?void 0:N.breadcrumb)??e})]}),t.jsxs("div",{className:s.drawerToolbarActions,children:[o&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:s.drawerPrimaryActions,children:[t.jsx(_,{text:G??h("uiStudio.actions.captureCurrentState.tooltip","Save the UI currently shown in Studio as a new capture. Existing captures are kept."),children:t.jsxs("button",{className:s.drawerActionBtn,onClick:()=>void I(),disabled:!b||!o.target||v!==null,type:"button",children:[t.jsx(Ye,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:h("uiStudio.actions.captureCurrentState","현재 상태 캡처")})]})}),t.jsx(_,{text:G??h("uiStudio.actions.checkSuggestionsAgain.tooltip","Recompute suggestions for this capture without taking a new screenshot."),children:t.jsxs("button",{className:s.drawerActionBtn,onClick:()=>void S(),disabled:!b||!o.target||v!==null,type:"button",children:[t.jsx(Ee,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:h("uiStudio.actions.checkSuggestionsAgain","개선 제안 다시 확인")})]})})]}),t.jsxs("details",{className:s.drawerMoreMenu,children:[t.jsx("summary",{className:s.drawerMoreButton,title:h("uiStudio.actions.more.tooltip","Open additional actions."),"aria-label":h("uiStudio.actions.more","More"),children:t.jsx(Xe,{size:18,"aria-hidden":"true"})}),t.jsx("div",{className:s.drawerMoreMenuBody,children:t.jsx(_,{text:G??h("uiStudio.actions.deleteSnapshot.tooltip","Delete only this capture file. The actual UI in Roblox Studio is not affected."),children:t.jsx("button",{className:`${s.drawerMenuItem} ${s.drawerMenuItemDanger}`,onClick:()=>T("deleteSnapshot"),disabled:!b,type:"button",children:h("uiStudio.actions.deleteSnapshot","이 화면 캡처 삭제")})})})]})]}),t.jsx(_,{text:h("uiStudio.detailClose.tooltip","Close this detail panel."),children:t.jsx("button",{className:s.closeBtn,onClick:a,type:"button","aria-label":h("uiStudio.detailClose","Close"),children:t.jsx(et,{size:18,"aria-hidden":"true"})})})]})]}),d&&t.jsx("div",{className:s.errorMsg,children:d}),o&&t.jsxs("div",{className:s.detailBody,children:[f&&t.jsx("div",{className:s.actionErrMsg,children:f}),g&&t.jsxs("div",{className:`${s.actionStatusMsg} ${s[`actionStatus_${g.tone}`]??""}`,children:[t.jsx("div",{children:g.message}),g.detail&&t.jsx("div",{className:s.actionStatusDetail,children:g.detail})]}),t.jsx(ka,{detail:o}),t.jsx("div",{className:s.screenshotPreviewFrame,"data-testid":"analysis-screenshot-preview",children:t.jsx("img",{className:s.fullImg,src:o.image_url,alt:o.snapshot_id})}),t.jsx(Ba,{items:o.check_results}),t.jsxs("dl",{className:s.metaDl,children:[t.jsx("dt",{children:t.jsx(M,{label:h("uiStudio.capturedAt","Captured"),tooltip:h("uiStudio.capturedAt.tooltip","When this screen was captured.")})}),t.jsx("dd",{children:new Date(o.captured_at*1e3).toLocaleString()}),t.jsx("dt",{children:t.jsx(M,{label:h("uiStudio.scope","Scope"),tooltip:h("uiStudio.scope.tooltip","Capture scope (full screen or a specific UI).")})}),t.jsx("dd",{children:o.scope}),o.target&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{children:t.jsx(M,{label:h("uiStudio.target","Target"),tooltip:h("uiStudio.target.tooltip","Exact path of the captured UI instance.")})}),t.jsx("dd",{children:o.target})]}),o.brief_id&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{children:t.jsx(M,{label:h("uiStudio.briefId","Brief"),tooltip:h("uiStudio.briefId.tooltip","Identifier of the design brief that produced this UI.")})}),t.jsx("dd",{children:o.brief_id})]})]})]}),D==="deleteSnapshot"&&t.jsx(oe,{title:h("uiStudio.confirm.deleteSnapshotTitle","화면 캡처 삭제"),message:h("uiStudio.confirm.deleteSnapshotMessage","이 화면 캡처 파일만 삭제됩니다 (Studio 인스턴스 보존)."),danger:!0,confirmLabel:h("common.delete","삭제"),onConfirm:k,onClose:()=>T(null)})]})}function ka({detail:e}){const{t:i}=A(),a=Ia(e);return t.jsxs("section",{className:s.drawerAnalysisSummary,children:[t.jsxs("div",{className:s.drawerAnalysisSummaryItem,children:[t.jsx("span",{className:s.drawerAnalysisLabel,children:t.jsx(M,{label:i("uiStudio.analysis.verdictLabel","개선 요약"),tooltip:i("uiStudio.analysis.verdictLabel.tooltip","Overall improvement verdict for this capture.")})}),t.jsx("span",{className:`${s.analysisVerdict} ${s[`analysisVerdict_${a}`]??""}`,children:Na(i,a)}),t.jsx("span",{className:s.drawerAnalysisCounts,children:Pa(i,e)})]}),t.jsxs("div",{className:s.drawerAnalysisSummaryItem,children:[t.jsx("span",{className:s.drawerAnalysisLabel,children:t.jsx(M,{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:s.drawerAnalysisValue,children:e.thresholds_source})]})]})}function Ba({items:e}){const{t:i}=A();if(e.length===0)return t.jsx("p",{className:s.emptySuggestions,children:i("uiStudio.noSuggestions","현재 개선 제안 없음")});const{high:a,medium:n,low:l}=wa(e,i);return t.jsxs("div",{className:s.suggestionsWrap,children:[t.jsx("h3",{children:t.jsx(M,{label:i("uiStudio.designCheckResultsTitle","Design Check suggestions"),tooltip:i("uiStudio.designCheckResultsTitle.tooltip","All improvement suggestions found in this capture.")})}),a.length>0&&t.jsxs("section",{className:s.prioritySection,children:[t.jsx("h4",{className:s.sectionHighHeader,children:i("uiStudio.highPrioritySection","우선 검토")}),a.map(r=>t.jsx(Q,{group:r},`h-${r.rule}`))]}),n.length>0&&t.jsxs("section",{className:s.prioritySection,children:[t.jsx("h4",{className:s.sectionMediumHeader,children:i("uiStudio.mediumPrioritySection","검토 권장")}),n.map(r=>t.jsx(Q,{group:r},`m-${r.rule}`))]}),l.length>0&&t.jsxs("section",{className:s.prioritySection,children:[t.jsx("h4",{className:s.sectionLowHeader,children:i("uiStudio.lowPrioritySection","선택 개선")}),l.map(r=>t.jsx(Q,{group:r},`l-${r.rule}`))]})]})}function Q({group:e}){var o,m,d;const{t:i}=A(),[a,n]=u.useState(e.priority==="priority_high"&&e.items.length<=5),l=e.falsePositiveRatio>=.5&&!!((o=e.fixTemplate)!=null&&o.falsePositiveNote),r=((m=e.fixTemplate)==null?void 0:m.checkLabel)??e.rule;return t.jsxs("div",{className:s.groupCard,children:[t.jsx(_,{text:i("uiStudio.suggestionGroup.tooltip","Suggestions of the same kind grouped together. Click to expand or collapse."),children:t.jsxs("button",{className:s.groupHeader,onClick:()=>n(y=>!y),type:"button",children:[t.jsx("span",{className:s.groupLabel,children:r}),t.jsx(_,{text:i("uiStudio.groupSummary.tooltip","Number of UI elements matching this group."),children:t.jsxs("span",{className:s.groupCount,children:[e.items.length," ",i("uiStudio.groupSummary","items")]})}),t.jsx("span",{className:s.groupChevron,children:a?"▾":"▸"})]})}),a&&t.jsxs("div",{className:s.groupBody,children:[e.fixTemplate&&t.jsxs(t.Fragment,{children:[t.jsx("p",{className:s.groupDescription,children:e.fixTemplate.description}),t.jsx("p",{className:s.groupFix,children:e.fixTemplate.howToFix})]}),l&&t.jsx(_,{text:i("uiStudio.falsePositiveWarning.tooltip","This check can produce false positives — verify before applying."),children:t.jsxs("p",{className:s.falsePositive,children:[i("uiStudio.falsePositiveWarning","May contain false positives"),":"," ",(d=e.fixTemplate)==null?void 0:d.falsePositiveNote]})}),t.jsx("ul",{className:s.itemList,children:e.items.map((y,f)=>t.jsx(Da,{item:y,group:e},`${y.path}-${f}`))})]})]})}function Da({item:e,group:i}){var d;const{t:a}=A(),[n,l]=u.useState(!1),r=Ne(e.path),o=((d=i.fixTemplate)==null?void 0:d.buildUpdateCommand(e))??null,m=async()=>{if(o)try{await navigator.clipboard.writeText(o),l(!0),setTimeout(()=>l(!1),2e3)}catch{}};return t.jsxs("li",{className:s.suggestionItem,children:[t.jsxs("div",{className:s.suggestionInfo,children:[t.jsx("code",{className:s.pathBreadcrumb,title:`${a("uiStudio.fullPath","Full path")}: ${r.full}`,children:r.breadcrumb}),t.jsxs("span",{className:s.currentValue,children:[t.jsx(_,{text:a("uiStudio.colCurrent.tooltip","The currently applied value."),children:t.jsx("span",{children:a("uiStudio.colCurrent","Current")})}),": ",t.jsx("strong",{children:String(e.actual)})," → ",t.jsx(_,{text:a("uiStudio.colRecommended.tooltip","The recommended value."),children:t.jsx("span",{children:a("uiStudio.colRecommended","Recommended")})}),": ",t.jsx("strong",{children:String(e.expected)})]})]}),o&&t.jsx(_,{text:a("uiStudio.copyFixCommand.tooltip","Copy a prompt that asks the AI to fix this issue."),children:t.jsx("button",{className:s.copyFixBtn,onClick:m,type:"button",children:n?a("uiStudio.copiedToClipboard","Copied"):a("uiStudio.copyFixCommand","Copy AI instruction")})})]})}function Y(e,i){return Object.entries(i).reduce((a,[n,l])=>a.split(`{${n}}`).join(String(l)),e)}function Ga(e,i){return i.rule==="contrast"?Y(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"?Y(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"?Y(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 ke="sample_inventory_preview",ee=ze,Ma=[{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 Aa(e){const n={snapshot_id:ke,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:Ma.map(o=>({...o,hint:Ga(e,o)})),image_url:ee};return{list:{placeId:0,snapshots:[n],totalCount:1},detail:l}}const Ra=/plugin not connected|sync not started/i;function te(e){return typeof e=="string"&&Ra.test(e)}function Be(){const{t:e}=A();return t.jsxs("section",{className:s.pluginGuideCard,role:"status","aria-live":"polite",children:[t.jsx("div",{className:s.pluginGuideMarker,"aria-hidden":"true",children:"!"}),t.jsxs("div",{className:s.pluginGuideBody,children:[t.jsx("h2",{className:s.pluginGuideTitle,children:e("uiStudio.pluginGuide.title","Roblox Studio 플러그인이 연결되지 않았습니다")}),t.jsx("p",{className:s.pluginGuideMessage,children:e("uiStudio.pluginGuide.message","UI Studio는 연결된 Studio place의 화면 캡처와 변경 이력을 표시합니다. Studio와 WEPPY Plugin을 연결하면 자동으로 갱신됩니다.")}),t.jsxs("ul",{className:s.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:s.pluginGuideWaiting,children:[t.jsx("span",{className:s.pluginGuideDot,"aria-hidden":"true"}),e("uiStudio.pluginGuide.waiting","플러그인 연결을 기다리는 중...")]})]})]})}function De(e){return e.target??e.scope}function La(e){const i=De(e),a=i.split(".").filter(l=>l.length>0),n=a.findIndex(l=>l==="StarterGui");return n>=0&&a[n+1]?["StarterGui",a[n+1]].join("."):i}function Ge(e){return((e==null?void 0:e.priority_high)??0)>0?"needsFix":((e==null?void 0:e.priority_medium)??0)>0||((e==null?void 0:e.priority_low)??0)>0?"review":"passed"}function $a(e){return Ge(e.design_check_summary)}function me(e){return ie(e.design_check_summary)}function ie(e){return((e==null?void 0:e.priority_high)??0)>0?0:((e==null?void 0:e.priority_medium)??0)>0?1:((e==null?void 0:e.priority_low)??0)>0?2:3}function Ea(e){return e.length===0?null:{...e.reduce((a,n)=>{const l=n.latest.design_check_summary;return a.priority_high+=(l==null?void 0:l.priority_high)??0,a.priority_medium+=(l==null?void 0:l.priority_medium)??0,a.priority_low+=(l==null?void 0:l.priority_low)??0,a},{priority_high:0,priority_medium:0,priority_low:0})}}function Ha(e){const i=new Map;for(const l of e){const r=De(l),o=i.get(r);if(!o){i.set(r,{latest:l,snapshotCount:1});continue}o.snapshotCount+=1,l.captured_at>o.latest.captured_at&&(o.latest=l)}const a=[...i.entries()].map(([l,r])=>({key:l,latest:r.latest,snapshotCount:r.snapshotCount,verdict:$a(r.latest)})),n=new Map;for(const l of a){const r=La(l.latest),o=n.get(r)??[];o.push(l),n.set(r,o)}return[...n.entries()].map(([l,r])=>{var y;const o=r.sort((f,p)=>{const g=me(f.latest)-me(p.latest);return g!==0?g:p.latest.captured_at-f.latest.captured_at}),m=o.reduce((f,p)=>p.latest.captured_at>f.captured_at?p.latest:f,((y=o[0])==null?void 0:y.latest)??r[0].latest),d=Ea(o);return{key:l,latest:m,snapshotCount:o.reduce((f,p)=>f+p.snapshotCount,0),children:o,summary:d,verdict:Ge(d)}}).sort((l,r)=>{const o=ie(l.summary)-ie(r.summary);return o!==0?o:r.latest.captured_at-l.latest.captured_at})}function Oa(e){return e.reduce((i,a)=>(a.verdict==="passed"?i.noSuggestions+=1:i.hasSuggestions+=1,i),{hasSuggestions:0,noSuggestions:0})}function $(e,i){return`${i}${e("uiStudio.storage.countSuffix","개")}`}function ae(e,i){return`${e("uiStudio.priorityHigh","우선 검토")} ${$(e,(i==null?void 0:i.priority_high)??0)} · ${e("uiStudio.priorityMedium","검토 권장")} ${$(e,(i==null?void 0:i.priority_medium)??0)} · ${e("uiStudio.priorityLow","선택 개선")} ${$(e,(i==null?void 0:i.priority_low)??0)}`}function Ua(e,i,a){return`${e("uiStudio.analysis.targetCountLabel","분석 대상")} ${$(e,i)} · ${re(e,"needsFix")} ${$(e,a.hasSuggestions)} · ${re(e,"passed")} ${$(e,a.noSuggestions)}`}function Fa({tier:e}){const{t:i}=A(),{trackEvent:a}=fe(),n=e==="basic",l=Ie(50),r=u.useRef(null),[o,m]=u.useState(null),[d,y]=u.useState(!1),[f,p]=u.useState(new Set),[g,j]=u.useState(new Set),[v,w]=u.useState(!1),D=u.useCallback((x,B)=>{m(o===x?null:x)},[o]),T=u.useCallback(()=>{m(null)},[]),h=u.useCallback(x=>{p(B=>{const R=new Set(B);return R.has(x)?R.delete(x):R.add(x),R})},[]);u.useEffect(()=>{var B;if(!o)return;(B=r.current)==null||B.focus();const x=R=>{R.key==="Escape"&&!document.getElementById("delete-confirm-title")&&T()};return document.addEventListener("keydown",x),()=>document.removeEventListener("keydown",x)},[T,o]);const b=n?Aa(i):null,I=(b==null?void 0:b.list)??l.data,S=n?!1:l.loading,k=u.useCallback(x=>{j(B=>{const R=new Set(B);return R.has(x)?R.delete(x):R.add(x),R})},[]),G=x=>{j(new Set(x))},N=()=>{j(new Set)},C=async()=>{const x=(I==null?void 0:I.placeId)??0;await qe(x,{ids:[...g]}),await l.refresh(),w(!1),j(new Set)};if(S)return t.jsx("div",{className:s.page,children:i("uiStudio.loading","Loading...")});if(!n&&te(l.error))return t.jsx(Be,{});if(!n&&l.error)return t.jsxs("div",{className:s.page,children:["Error: ",l.error]});const P=(I==null?void 0:I.snapshots)??[],L=(I==null?void 0:I.placeId)??0,z=P.map(x=>x.snapshot_id),E=Ha(P),q=Oa(E);return t.jsxs("div",{children:[t.jsxs("div",{className:s.analysisWorkspace,"data-detail-open":o?"true":"false",children:[t.jsxs("div",{className:s.analysisMainColumn,"data-testid":"analysis-main-column",children:[n&&t.jsxs("div",{className:s.sampleBanner,children:[t.jsxs("div",{className:s.sampleBannerRow,children:[t.jsxs("div",{className:s.sampleBannerMain,children:[t.jsx("div",{className:s.sampleBadge,children:i("uiStudio.sample.badge","Preview of the Pro UI gallery")}),t.jsx("div",{className:s.sampleTitle,children:i("uiStudio.sample.title","You are previewing the UI screenshot gallery that unlocks after upgrading to Pro.")}),t.jsx("div",{className:s.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.jsxs("div",{className:s.sampleActions,children:[t.jsx("button",{className:s.secondaryAction,onClick:()=>{a("dashboard_click_event",{click_target:"tier_compare",placement:"ui_studio_analysis_banner",page:"ui-studio"}),y(!0)},type:"button",children:i("tier.compare","Basic vs Pro")}),t.jsx("a",{className:s.primaryAction,href:Se.uiStudio,target:"_blank",rel:"noreferrer",onClick:()=>a("dashboard_click_event",{click_target:"upgrade_cta",placement:"ui_studio_analysis_banner",page:"ui-studio"}),children:i("tier.upgrade","Upgrade to Pro")})]})]}),t.jsx(je,{variant:"centered"})]}),t.jsx("div",{className:s.galleryHeader,children:t.jsx("h1",{children:t.jsx(M,{label:i("uiStudio.title","UI Studio"),tooltip:i("uiStudio.title.tooltip","A central place to review AI-generated UI screens and improvement suggestions.")})})}),P.length===0?t.jsx("div",{className:s.emptyState,children:i("uiStudio.empty","No screenshots saved yet. They are created automatically when an AI agent captures the current UI state.")}):t.jsxs(t.Fragment,{children:[t.jsx("section",{className:s.analysisSummaryPanel,children:t.jsxs("div",{children:[t.jsx("h2",{children:t.jsx(M,{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:s.analysisSummaryText,children:Ua(i,E.length,q)})]})}),t.jsx("div",{className:s.analysisReportGrid,"data-testid":"analysis-report-grid",children:E.map(x=>t.jsx(qa,{report:x,placeId:L,imageUrlOverride:n?ee:void 0,expanded:f.has(x.key),onPrimaryClick:B=>{x.children.length>1?h(x.key):D(x.latest.snapshot_id,B)},onChildClick:(B,R)=>D(B,R)},x.key))}),t.jsxs("section",{className:s.recentCapturesSection,children:[t.jsxs("div",{className:s.recentCapturesHeader,children:[t.jsxs("div",{children:[t.jsx("h2",{children:t.jsx(M,{label:i("uiStudio.analysis.recentCapturesTitle","최근 캡처"),tooltip:i("uiStudio.analysis.recentCapturesTitle.tooltip","All recently saved captures in chronological order.")})}),t.jsxs("p",{className:s.recentCapturesMeta,children:[i("uiStudio.storage.snapshotCount","화면 캡처")," ",$(i,P.length)]})]}),!n&&P.length>0&&t.jsxs("div",{className:s.captureSelectionActions,children:[t.jsx(_,{text:i("uiStudio.gallery.selectAll.tooltip","Select every visible capture at once."),children:t.jsx("button",{className:s.selectionBarBtn,onClick:()=>G(z),type:"button",children:i("uiStudio.gallery.selectAll","모두 선택")})}),g.size>0&&t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:s.selectionToolbarCount,children:[g.size,i("uiStudio.gallery.selection.selectedCount"," selected")]}),t.jsx(_,{text:i("uiStudio.gallery.clearSelection.tooltip","Clear the current selection."),children:t.jsx("button",{className:s.selectionBarBtn,onClick:N,type:"button",children:i("uiStudio.gallery.clearSelection","선택 해제")})}),t.jsx(_,{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:`${s.selectionBarBtn} ${s.selectionBarBtnDanger}`,onClick:()=>w(!0),type:"button",children:i("common.delete","삭제")})})]})]})]}),t.jsx("div",{className:s.grid,children:P.map(x=>t.jsx(_a,{snapshot:x,placeId:L,onClick:B=>D(x.snapshot_id,B),imageUrlOverride:n?ee:void 0,selectable:!n,selected:g.has(x.snapshot_id),onToggleSelect:k},x.snapshot_id))})]})]})]}),o&&t.jsx("div",{className:s.analysisDetailPopupLayer,"data-testid":"analysis-detail-popup-layer",onClick:T,role:"presentation",children:t.jsx("section",{ref:r,className:s.analysisDetailDialog,role:"dialog","aria-modal":"true","aria-label":i("uiStudio.analysis.detailDialog","Analysis detail"),tabIndex:-1,onClick:x=>x.stopPropagation(),children:t.jsx(Ta,{snapshotId:o,placeId:L,onClose:T,sampleDetail:n&&o===ke?(b==null?void 0:b.detail)??null:null,tier:e,onActionDone:n?void 0:l.refresh})})})]}),v&&t.jsx(oe,{title:i("uiStudio.confirm.deleteBatchTitle","화면 캡처 일괄 삭제"),message:i("uiStudio.confirm.deleteBatchMessage",`선택한 ${g.size}개의 화면 캡처를 삭제합니다. 이 작업은 되돌릴 수 없습니다.`),danger:!0,confirmLabel:i("common.delete","삭제"),onConfirm:C,onClose:()=>w(!1)}),d&&t.jsx(Ue,{onClose:()=>y(!1)})]})}function re(e,i){return i==="needsFix"||i==="review"?e("uiStudio.analysis.verdict.hasSuggestions","개선 제안 있음"):e("uiStudio.analysis.verdict.passed","현재 개선 제안 없음")}function za(e,i){return((i==null?void 0:i.priority_high)??0)>0||((i==null?void 0:i.priority_medium)??0)>0||((i==null?void 0:i.priority_low)??0)>0?ae(e,i):e("uiStudio.analysis.issueSummary.passed","현재 검토 기준에서 추가 개선 제안은 없습니다.")}function qa({report:e,placeId:i,imageUrlOverride:a,expanded:n,onPrimaryClick:l,onChildClick:r}){const{t:o}=A(),m=e.latest,d=a??be(m.snapshot_id,i),y=new Date(m.captured_at*1e3).toLocaleString(),f=re(o,e.verdict),p=e.children.length>1;return t.jsxs("div",{className:s.analysisReportGroup,children:[t.jsxs("button",{className:s.analysisReportCard,"aria-expanded":p?n:void 0,"aria-label":`${e.key} ${p?o("uiStudio.analysis.expandChildren","하위 대상 보기"):o("uiStudio.analysis.openDetail","상세 보기")}`,onClick:g=>l(g.currentTarget),type:"button",children:[t.jsx("img",{className:s.analysisReportThumb,src:d,alt:m.snapshot_id,loading:"lazy"}),t.jsxs("div",{className:s.analysisReportBody,children:[t.jsxs("div",{className:s.analysisReportTopline,children:[t.jsx(_,{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:`${s.analysisVerdict} ${s[`analysisVerdict_${e.verdict}`]??""}`,children:f})}),t.jsx(_,{text:o("uiStudio.analysis.counts.tooltip","Shows how many suggestions are marked review first, recommended, or optional."),children:t.jsx("span",{className:s.analysisReportCounts,children:ae(o,e.summary)})})]}),t.jsx("div",{className:s.analysisReportTarget,children:e.key}),t.jsx("div",{className:s.analysisReportIssue,children:za(o,e.summary)}),t.jsxs("div",{className:s.analysisReportMeta,children:[y," ·"," ",t.jsx(_,{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","검토 기준")})}),": ",m.thresholds_source,e.snapshotCount>1?` · ${o("uiStudio.analysis.captureLabel","캡처")} ${$(o,e.snapshotCount)}`:"",p?` · ${o("uiStudio.analysis.childTargets","하위 대상")} ${$(o,e.children.length)}`:""]})]})]}),p&&n&&t.jsx("div",{className:s.analysisChildList,children:e.children.map(g=>t.jsxs("button",{className:s.analysisChildRow,onClick:j=>r(g.latest.snapshot_id,j.currentTarget),type:"button",children:[t.jsx("span",{className:s.analysisChildPath,children:g.key}),t.jsx("span",{className:s.analysisChildSummary,children:ae(o,g.latest.design_check_summary)}),t.jsx("span",{className:s.analysisChildDetailHint,children:o("uiStudio.analysis.childDetailHint","하위 대상 상세 보기")})]},g.key))})]})}function Va(e,i,a=1e4){const[n,l]=u.useState(null),[r,o]=u.useState(!0),[m,d]=u.useState(null),y=JSON.stringify(i),f=u.useCallback(async()=>{try{const p=await le(e,i);l(p),d(null)}catch(p){d(p.message)}finally{o(!1)}},[e,y]);return u.useEffect(()=>{let p=!0;const g=async()=>{try{const v=await le(e,i);p&&(l(v),d(null))}catch(v){p&&d(v.message)}finally{p&&o(!1)}};g();const j=setInterval(()=>{g()},a);return()=>{p=!1,clearInterval(j)}},[e,y,a]),{data:n,loading:r,error:m,refresh:f}}const Wa="_filterBar_9toem_4",Ka="_filterGroup_9toem_14",Qa="_filterLabel_9toem_21",Ya="_filterCheckbox_9toem_28",Ja="_segmentGroup_9toem_45",Xa="_segmentBtn_9toem_55",Za="_segmentBtnActive_9toem_73",er="_filterInput_9toem_79",tr="_filterResetBtn_9toem_95",ir="_requestRow_9toem_114",ar="_requestRowMain_9toem_127",rr="_requestDetailToggle_9toem_134",sr="_thumbPair_9toem_156",or="_thumbPairButton_9toem_164",nr="_thumbSlot_9toem_179",lr="_thumbImg_9toem_204",cr="_thumbPlaceholder_9toem_211",dr="_thumbArrow_9toem_219",ur="_extraPathsBadge_9toem_225",hr="_requestMeta_9toem_239",pr="_requestLabel_9toem_247",mr="_requestTime_9toem_256",gr="_requestStats_9toem_261",yr="_statDot_9toem_269",_r="_summaryPill_9toem_273",xr="_requestActions_9toem_278",fr="_expandHint_9toem_285",Sr="_mutationsArea_9toem_298",jr="_mutLoading_9toem_307",vr="_mutEmpty_9toem_308",Cr="_mutError_9toem_314",wr="_mutationRow_9toem_320",br="_mutationLine_9toem_330",Ir="_mutTs_9toem_337",Nr="_mutCommand_9toem_343",Pr="_mutPath_9toem_349",Tr="_mutDiff_9toem_359",kr="_mutErr_9toem_314",Br="_changeDetails_9toem_374",Dr="_changeDetailRow_9toem_382",Gr="_changeDetailRowNoBefore_9toem_391",Mr="_changeDetailBadge_9toem_395",Ar="_changeDetail_text_9toem_407",Rr="_changeDetail_color_9toem_412",Lr="_changeDetail_size_9toem_417",$r="_changeDetail_layout_9toem_422",Er="_changeDetail_state_9toem_427",Hr="_changeDetail_asset_9toem_432",Or="_changeDetail_property_9toem_437",Ur="_changeDetailProperty_9toem_441",Fr="_changeDetailArrow_9toem_449",zr="_changeDetailOldValue_9toem_455",qr="_changeDetailNewValue_9toem_456",Vr="_compareDialogLayer_9toem_474",Wr="_compareDialog_9toem_474",Kr="_beforeAfterDrawer_9toem_505",Qr="_drawerHeader_9toem_515",Yr="_drawerTitle_9toem_524",Jr="_drawerCloseBtn_9toem_531",Xr="_drawerBody_9toem_547",Zr="_pathTabs_9toem_554",es="_pathTab_9toem_554",ts="_pathTabActive_9toem_583",is="_comparePanel_9toem_589",as="_compareHalf_9toem_599",rs="_compareLabel_9toem_606",ss="_compareImg_9toem_617",os="_comparePlaceholder_9toem_625",ns="_compareDetailsPanel_9toem_637",ls="_compareDetailsHeader_9toem_646",cs="_drawerFooter_9toem_664",ds="_drawerActionBtn_9toem_672",us="_historyTabWrap_9toem_690",hs="_historyWorkspace_9toem_696",ps="_historyMainColumn_9toem_701",ms="_requestList_9toem_705",gs="_emptyHistory_9toem_710",ys="_historyError_9toem_717",_s="_historyLoading_9toem_723",xs="_listHeader_9toem_731",fs="_listHeaderTitle_9toem_740",Ss="_clearBtn_9toem_747",js="_deleteErrBanner_9toem_766",c={filterBar:Wa,filterGroup:Ka,filterLabel:Qa,filterCheckbox:Ya,segmentGroup:Ja,segmentBtn:Xa,segmentBtnActive:Za,filterInput:er,filterResetBtn:tr,requestRow:ir,requestRowMain:ar,requestDetailToggle:rr,thumbPair:sr,thumbPairButton:or,thumbSlot:nr,thumbImg:lr,thumbPlaceholder:cr,thumbArrow:dr,extraPathsBadge:ur,requestMeta:hr,requestLabel:pr,requestTime:mr,requestStats:gr,statDot:yr,summaryPill:_r,requestActions:xr,expandHint:fr,mutationsArea:Sr,mutLoading:jr,mutEmpty:vr,mutError:Cr,mutationRow:wr,mutationLine:br,mutTs:Ir,mutCommand:Nr,mutPath:Pr,mutDiff:Tr,mutErr:kr,changeDetails:Br,changeDetailRow:Dr,changeDetailRowNoBefore:Gr,changeDetailBadge:Mr,changeDetail_text:Ar,changeDetail_color:Rr,changeDetail_size:Lr,changeDetail_layout:$r,changeDetail_state:Er,changeDetail_asset:Hr,changeDetail_property:Or,changeDetailProperty:Ur,changeDetailArrow:Fr,changeDetailOldValue:zr,changeDetailNewValue:qr,compareDialogLayer:Vr,compareDialog:Wr,beforeAfterDrawer:Kr,drawerHeader:Qr,drawerTitle:Yr,drawerCloseBtn:Jr,drawerBody:Xr,pathTabs:Zr,pathTab:es,pathTabActive:ts,comparePanel:is,compareHalf:as,compareLabel:rs,compareImg:ss,comparePlaceholder:os,compareDetailsPanel:ns,compareDetailsHeader:ls,drawerFooter:cs,drawerActionBtn:ds,historyTabWrap:us,historyWorkspace:hs,historyMainColumn:ps,requestList:ms,emptyHistory:gs,historyError:ys,historyLoading:_s,listHeader:xs,listHeaderTitle:fs,clearBtn:Ss,deleteErrBanner:js};function vs(e){try{return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}function ge(e){return e==null?"nil":typeof e=="string"?`"${e}"`:typeof e=="object"?JSON.stringify(e):String(e)}function Me({mutations:e,emptyLabel:i}){const{t:a}=A();return e.length===0?t.jsx("div",{className:c.mutEmpty,children:i??a("uiStudio.history.row.mutationsEmpty","No change details")}):t.jsx(t.Fragment,{children:e.map(n=>t.jsx(Cs,{mutation:n},n.mutationId))})}function Cs({mutation:e}){return t.jsxs("div",{className:c.mutationRow,children:[t.jsxs("div",{className:c.mutationLine,children:[t.jsx("span",{className:c.mutTs,children:vs(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(ws,{detail:i},`${i.property}:${i.category}`))}),!e.ok&&e.error&&t.jsx("span",{className:c.mutErr,children:e.error})]})}function ws({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:ge(e.before)}),t.jsx("span",{className:c.changeDetailArrow,children:"→"}),t.jsx("span",{className:c.changeDetailNewValue,children:ge(e.after)})]})}function ye(e,i){return`${F}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image?placeId=${i}`}function bs(e){try{return new Date(e).toLocaleString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return e}}function Is(e){if(!e)return null;const i=e.split(/[./]/).filter(n=>n.length>0);if(i.length===0)return null;const a=i.findIndex(n=>n==="StarterGui");return a>=0&&i[a+1]?i[a+1]:i[i.length-1]??null}function J(e,i){if(i.label)return i.label;const a=Is(i.affectedPaths[0]);if(a){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}",a).replace("{n}",String(i.mutationCount))}return e("uiStudio.history.row.toolLabel","UI changes ({n})").replace("{n}",String(i.mutationCount))}function X(e,i){return`${i}${e("uiStudio.storage.countSuffix","")}`}function Ns(e,i){if(!i)return null;const a=[i.style_family,i.layout_family,i.device_policy,i.safe_area_policy].filter(n=>typeof n=="string"&&n.length>0);return a.length===0?null:`${e("uiStudio.history.row.qualityPlan","Design direction")}: ${a.join(" · ")}`}function Ps(e,i){if(!i)return null;if(i.source==="unavailable")return e("uiStudio.history.row.designCheckUnavailable","Suggestions: unavailable");if(i.total===0)return e("uiStudio.history.row.designCheckNone","Suggestions: none");const a=`${e("uiStudio.priorityHigh","Priority")} ${X(e,i.priority_high)}`,n=`${e("uiStudio.priorityMedium","Recommended")} ${X(e,i.priority_medium)}`,l=`${e("uiStudio.priorityLow","Optional")} ${X(e,i.priority_low)}`;return`${e("uiStudio.history.row.designCheck","Suggestions")}: ${a} · ${n} · ${l}`}function Ae({req:e,placeId:i,onOpenCompare:a,imageUrlOverride:n,sampleMutations:l}){const{t:r}=A(),[o,m]=u.useState(!1),[d,y]=u.useState(null),[f,p]=u.useState(!1),[g,j]=u.useState(null),v=n!=null,w=e.affectedPaths[0]??null,D=e.affectedPaths.length-1,T=w?e.beforeSnapshots[w]??null:null,h=w?e.afterSnapshots[w]??null:null,b=T?v?n:ye(T,i):null,I=h?v?n:ye(h,i):null,S=Ns(r,e.qualityPlanSummary),k=Ps(r,e.postChangeDesignCheckSummary),G=async()=>{if(!o&&d===null)if(v&&l!=null)y(l);else{p(!0),j(null);try{const N=await ve(i,e.requestId);y(N.mutations)}catch(N){j(N.message)}finally{p(!1)}}m(N=>!N)};return t.jsxs("div",{className:c.requestRow,children:[t.jsxs("div",{className:c.requestRowMain,children:[t.jsx(_,{text:r("uiStudio.history.row.compare.tooltip","Compare the before and after screens. Click to open the full comparison view."),children:t.jsxs("button",{className:`${c.thumbPair} ${c.thumbPairButton}`,onClick:N=>a(N.currentTarget),disabled:!w,"aria-label":`${J(r,e)} ${r("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:"before",loading:"lazy"}):t.jsx(_,{text:r("uiStudio.history.row.noBeforeState.tooltip","No capture saved before this change."),children:t.jsx("span",{className:c.thumbPlaceholder,children:r("uiStudio.history.row.noBeforeState","이전 없음")})})}),t.jsx("span",{className:c.thumbArrow,children:"→"}),t.jsx("div",{className:c.thumbSlot,children:I?t.jsx("img",{className:c.thumbImg,src:I,alt:"after",loading:"lazy"}):t.jsx(_,{text:r("uiStudio.history.row.noAfterState.tooltip","No capture saved after this change."),children:t.jsx("span",{className:c.thumbPlaceholder,children:r("uiStudio.history.row.noAfterState","이후 없음")})})}),D>0&&t.jsx(_,{text:r("uiStudio.history.row.extraPaths.tooltip","Number of additional UIs changed in this action."),children:t.jsxs("span",{className:c.extraPathsBadge,children:["+",D]})})]})}),t.jsxs("button",{className:c.requestDetailToggle,type:"button","aria-expanded":o,"aria-label":`${J(r,e)} ${r("uiStudio.history.row.toggleDetails","Toggle change details")}`,onClick:()=>void G(),children:[t.jsxs("span",{className:c.requestMeta,children:[t.jsx("span",{className:c.requestLabel,children:J(r,e)}),t.jsx("span",{className:c.requestTime,children:bs(e.startedAt)}),t.jsxs("span",{className:c.requestStats,children:[t.jsx(_,{text:r("uiStudio.history.row.affectedPaths.tooltip","Number of UIs affected by this action."),children:t.jsxs("span",{children:[r("uiStudio.history.row.affectedPaths","Paths")," ",e.affectedPaths.length,r("uiStudio.storage.countSuffix","")]})}),t.jsx("span",{className:c.statDot,children:"·"}),t.jsx(_,{text:r("uiStudio.history.row.mutations.tooltip","Number of detailed changes (e.g., property edits)."),children:t.jsxs("span",{children:[r("uiStudio.history.row.mutations","Change details")," ",e.mutationCount,r("uiStudio.storage.countSuffix","")]})}),S&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:c.statDot,children:"·"}),t.jsx(_,{text:r("uiStudio.history.row.qualityPlan.tooltip","Brief design direction used for this change."),children:t.jsx("span",{className:c.summaryPill,children:S})})]}),k&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:c.statDot,children:"·"}),t.jsx(_,{text:r("uiStudio.history.row.designCheck.tooltip","Post-change Design Check suggestion summary."),children:t.jsx("span",{className:c.summaryPill,children:k})})]})]})]}),t.jsx("span",{className:c.requestActions,children:t.jsx(_,{text:r("uiStudio.history.row.toggleDetails.tooltip","Show or hide a per-line breakdown of what changed."),children:t.jsx("span",{className:c.expandHint,children:o?r("uiStudio.history.row.collapseDetails","Hide change details"):r("uiStudio.history.row.expandDetails","Show {n} change details").replace("{n}",String(e.mutationCount))})})})]})]}),o&&t.jsxs("div",{className:c.mutationsArea,children:[f&&t.jsx("div",{className:c.mutLoading,children:r("uiStudio.history.loading","로딩 중...")}),g&&t.jsx("div",{className:c.mutError,children:g}),d&&t.jsx(Me,{mutations:d,emptyLabel:r("uiStudio.history.row.mutationsEmpty","No change details")})]})]})}function _e(e,i){return`${F}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image?placeId=${i}`}function Re({requestId:e,placeId:i,onClose:a,imageUrlOverride:n,sampleDetail:l}){const{t:r}=A(),o=u.useRef(null),m=l!=null,[d,y]=u.useState(m?l:null),[f,p]=u.useState(!m),[g,j]=u.useState(null),[v,w]=u.useState(m&&l.affectedPaths.length>0?l.affectedPaths[0]:null);u.useEffect(()=>{var S;(S=o.current)==null||S.focus()},[]),u.useEffect(()=>{const S=k=>{k.key==="Escape"&&(k.preventDefault(),a())};return document.addEventListener("keydown",S),()=>{document.removeEventListener("keydown",S)}},[a]),u.useEffect(()=>{if(m)return;let S=!0;return p(!0),j(null),ve(i,e).then(k=>{S&&(y(k),k.affectedPaths.length>0&&w(k.affectedPaths[0]))}).catch(k=>{S&&j(k.message)}).finally(()=>{S&&p(!1)}),()=>{S=!1}},[e,i,m]);const D=v&&d?d.beforeSnapshots[v]??null:null,T=v&&d?d.afterSnapshots[v]??null:null,h=D?n??_e(D,i):null,b=T?n??_e(T,i):null,I=r("uiStudio.history.row.compare","전후 비교");return t.jsx("div",{className:c.compareDialogLayer,"data-testid":"history-compare-dialog-layer",onClick:a,role:"presentation",children:t.jsx("section",{ref:o,className:c.compareDialog,role:"dialog","aria-modal":"true","aria-label":I,tabIndex:-1,onClick:S=>S.stopPropagation(),children:t.jsxs("div",{className:c.beforeAfterDrawer,children:[t.jsxs("div",{className:c.drawerHeader,children:[t.jsx("h2",{className:c.drawerTitle,children:I}),t.jsx("button",{className:c.drawerCloseBtn,onClick:a,type:"button",children:r("uiStudio.history.drawer.close","닫기")})]}),f&&t.jsx("div",{className:c.drawerBody,children:r("uiStudio.history.loading","로딩 중...")}),g&&t.jsx("div",{className:c.drawerBody,children:t.jsx("span",{className:c.mutErr,children:g})}),!f&&!g&&d&&t.jsxs(t.Fragment,{children:[d.affectedPaths.length>0&&t.jsx("div",{className:c.pathTabs,role:"tablist",children:d.affectedPaths.map(S=>t.jsx(_,{text:`${r("uiStudio.compare.path.tooltip","The UI instance path for this screen.")} ${S}`,children:t.jsx("button",{role:"tab","aria-selected":v===S,className:`${c.pathTab} ${v===S?c.pathTabActive:""}`,onClick:()=>w(S),type:"button",children:S.split("/").pop()??S})},S))}),t.jsxs("div",{className:c.comparePanel,children:[t.jsxs("div",{className:c.compareHalf,children:[t.jsx(_,{text:r("uiStudio.compare.before.tooltip","The screen saved just before AI made the change."),children:t.jsx("div",{className:c.compareLabel,children:"Before"})}),h?t.jsx("img",{className:c.compareImg,src:h,alt:"before"}):t.jsx("div",{className:c.comparePlaceholder,children:r("uiStudio.history.row.noBeforeState","이전 상태 없음")})]}),t.jsxs("div",{className:c.compareHalf,children:[t.jsx(_,{text:r("uiStudio.compare.after.tooltip","The screen saved just after AI made the change."),children:t.jsx("div",{className:c.compareLabel,children:"After"})}),b?t.jsx("img",{className:c.compareImg,src:b,alt:"after"}):t.jsx("div",{className:c.comparePlaceholder,children:r("uiStudio.history.row.noAfterState","이후 상태 없음")})]})]}),t.jsxs("section",{className:c.compareDetailsPanel,children:[t.jsx("div",{className:c.compareDetailsHeader,children:r("uiStudio.history.drawer.changeDetails","Change details")}),t.jsx(Me,{mutations:d.mutations,emptyLabel:r("uiStudio.history.row.mutationsEmpty","No change details")})]})]}),t.jsx("div",{className:c.drawerFooter,children:t.jsx("button",{className:c.drawerActionBtn,onClick:a,type:"button",children:r("uiStudio.history.drawer.close","닫기")})})]})})})}function U(e){const i=new Date(e.getFullYear(),e.getMonth(),e.getDate(),0,0,0,0),a=new Date(e.getFullYear(),e.getMonth(),e.getDate(),23,59,59,999);return{start:i,end:a}}function xe(e,i){const a=e.split("-").map(Number);if(a.length!==3||a.some(o=>Number.isNaN(o)))return;const[n,l,r]=a;return new Date(n,l-1,r,i?23:0,i?59:0,i?59:0,i?999:0).toISOString()}function Ts(e){const i={limit:50};if(e.action!=="all"&&(i.action=e.action),e.datePreset==="custom"){const a=e.from?xe(e.from,!1):void 0,n=e.to?xe(e.to,!0):void 0;a&&(i.from=a),n&&(i.to=n)}else if(e.datePreset!=="all"){const a=new Date;if(e.datePreset==="today"){const{start:n,end:l}=U(a);i.from=n.toISOString(),i.to=l.toISOString()}else if(e.datePreset==="yesterday"){const n=new Date(a);n.setDate(n.getDate()-1);const{start:l,end:r}=U(n);i.from=l.toISOString(),i.to=r.toISOString()}else{const n=e.datePreset==="7d"?6:29,l=new Date(a);l.setDate(l.getDate()-n);const{start:r}=U(l),{end:o}=U(a);i.from=r.toISOString(),i.to=o.toISOString()}}return i}function Le(){return{action:"all",datePreset:"all"}}function ks(){const{t:e}=A(),{trackEvent:i}=fe(),a=Ve(e),[n,l]=u.useState(null),r=n?a.requests.find(d=>d.requestId===n)??null:null,o=u.useCallback((d,y)=>{l(d)},[]),m=u.useCallback(()=>{l(null)},[]);return t.jsxs("div",{className:c.historyTabWrap,children:[t.jsxs("div",{className:s.sampleBanner,children:[t.jsxs("div",{className:s.sampleBannerRow,children:[t.jsxs("div",{className:s.sampleBannerMain,children:[t.jsx("div",{className:s.sampleBadge,children:e("uiStudio.history.sample.bannerBadge","Preview of the Pro change history")}),t.jsx("div",{className:s.sampleTitle,children:e("uiStudio.history.sample.bannerTitle","You are previewing the UI change history that unlocks after upgrading to Pro.")}),t.jsx("div",{className:s.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:s.sampleActions,children:t.jsx("a",{className:s.primaryAction,href:Se.uiStudio,target:"_blank",rel:"noreferrer",title:e("uiStudio.history.sample.tooltip","Upgrade to Pro to unlock full history"),onClick:()=>i("dashboard_click_event",{click_target:"upgrade_cta",placement:"ui_studio_history_banner",page:"ui-studio"}),children:e("tier.upgrade","Upgrade to Pro")})})]}),t.jsx(je,{variant:"centered"})]}),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(M,{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:a.requests.map(d=>t.jsx(Ae,{req:d,placeId:0,onOpenCompare:y=>o(d.requestId,y),imageUrlOverride:ce,sampleMutations:a.mutationsByRequest[d.requestId]},d.requestId))})]}),n&&r&&t.jsx(Re,{requestId:n,placeId:0,onClose:m,imageUrlOverride:ce,sampleDetail:{...r,mutations:a.mutationsByRequest[r.requestId]??[]}})]})]})}function Bs({filter:e,onChange:i}){const{t:a}=A(),n=[{value:"all",label:a("uiStudio.history.filter.actionAll","All"),tooltip:a("uiStudio.history.filter.actionAll.tooltip","Show every kind of action.")},{value:"create_tree",label:a("uiStudio.history.filter.actionCreate","Create"),tooltip:a("uiStudio.history.filter.actionCreate.tooltip","Show only actions that created a new UI.")},{value:"update",label:a("uiStudio.history.filter.actionUpdate","Update"),tooltip:a("uiStudio.history.filter.actionUpdate.tooltip","Show only actions that updated an existing UI.")},{value:"delete",label:a("uiStudio.history.filter.actionDelete","Delete"),tooltip:a("uiStudio.history.filter.actionDelete.tooltip","Show only actions that deleted a UI.")}],l=[{value:"all",label:a("uiStudio.history.filter.dateAll","All"),tooltip:a("uiStudio.history.filter.dateAll.tooltip","Show the full history.")},{value:"today",label:a("uiStudio.history.filter.today","Today"),tooltip:a("uiStudio.history.filter.today.tooltip","Show only changes from today.")},{value:"yesterday",label:a("uiStudio.history.filter.yesterday","Yesterday"),tooltip:a("uiStudio.history.filter.yesterday.tooltip","Show only changes from yesterday.")},{value:"7d",label:a("uiStudio.history.filter.last7Days","Last 7 days"),tooltip:a("uiStudio.history.filter.last7Days.tooltip","Show changes from the last 7 days.")},{value:"30d",label:a("uiStudio.history.filter.last30Days","Last 30 days"),tooltip:a("uiStudio.history.filter.last30Days.tooltip","Show changes from the last 30 days.")},{value:"custom",label:a("uiStudio.history.filter.customRange","Custom range"),tooltip:a("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(M,{label:a("uiStudio.history.filter.actions","작업 유형"),tooltip:a("uiStudio.history.filter.actions.tooltip","Filter records by the kind of change AI made.")})}),t.jsx("div",{className:c.segmentGroup,children:n.map(r=>t.jsx(_,{text:r.tooltip,children:t.jsx("button",{className:`${c.segmentBtn} ${e.action===r.value?c.segmentBtnActive:""}`,onClick:()=>i({...e,action:r.value}),"aria-pressed":e.action===r.value,type:"button",children:r.label})},r.value))})]}),t.jsxs("div",{className:c.filterGroup,children:[t.jsx("span",{className:c.filterLabel,children:t.jsx(M,{label:a("uiStudio.history.filter.period","Period"),tooltip:a("uiStudio.history.filter.period.tooltip","Filter records by time range.")})}),t.jsx("div",{className:c.segmentGroup,children:l.map(r=>t.jsx(_,{text:r.tooltip,children:t.jsx("button",{className:`${c.segmentBtn} ${e.datePreset===r.value?c.segmentBtnActive:""}`,onClick:()=>i({...e,datePreset:r.value,from:r.value==="custom"?e.from:void 0,to:r.value==="custom"?e.to:void 0}),"aria-pressed":e.datePreset===r.value,type:"button",children:r.label})},r.value))})]}),e.datePreset==="custom"&&t.jsxs("div",{className:c.filterGroup,children:[t.jsx("label",{className:c.filterLabel,htmlFor:"ui-history-from-date",children:t.jsx(M,{label:a("uiStudio.history.filter.from","시작일"),tooltip:a("uiStudio.history.filter.from.tooltip","Start date for the query.")})}),t.jsx("input",{id:"ui-history-from-date",type:"date",className:c.filterInput,value:e.from??"",onChange:r=>i({...e,from:r.target.value||void 0})}),t.jsx("label",{className:c.filterLabel,htmlFor:"ui-history-to-date",children:t.jsx(M,{label:a("uiStudio.history.filter.to","종료일"),tooltip:a("uiStudio.history.filter.to.tooltip","End date for the query.")})}),t.jsx("input",{id:"ui-history-to-date",type:"date",className:c.filterInput,value:e.to??"",onChange:r=>i({...e,to:r.target.value||void 0})})]}),t.jsx(_,{text:a("uiStudio.history.filter.reset.tooltip","Reset all filters to defaults."),children:t.jsx("button",{className:c.filterResetBtn,onClick:()=>i(Le()),type:"button",children:a("uiStudio.history.filter.reset","Reset")})})]})}function Ds(){var k;const{t:e}=A(),i=Ie(1),a=((k=i.data)==null?void 0:k.placeId)??0,[n,l]=u.useState(Le),{data:r,loading:o,error:m,refresh:d}=Va(a,Ts(n)),[y,f]=u.useState(null),[p,g]=u.useState(!1),[j,v]=u.useState(!1),[w,D]=u.useState(null),T=async()=>{D(null);try{await We(a,{all:!0,alsoSnapshots:j}),await d(),g(!1)}catch(G){throw D(G.message),G}},h=(r==null?void 0:r.requests)??[],b=te(i.error)||te(m),I=u.useCallback((G,N)=>{f(G)},[]),S=u.useCallback(()=>{f(null)},[]);return t.jsxs("div",{className:c.historyTabWrap,children:[b?t.jsx(Be,{}):t.jsxs("div",{className:c.historyWorkspace,"data-compare-open":y?"true":"false",children:[t.jsxs("div",{className:c.historyMainColumn,"data-testid":"history-main-column",children:[t.jsx(Bs,{filter:n,onChange:l}),t.jsxs("div",{className:c.listHeader,children:[t.jsx("h2",{className:c.listHeaderTitle,children:t.jsx(M,{label:e("uiStudio.history.title","변경 이력"),tooltip:e("uiStudio.history.title.tooltip","A timeline of every UI change made by AI.")})}),h.length>0&&t.jsx(_,{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:()=>g(!0),type:"button",children:e("uiStudio.history.clear","Clear")})})]}),o&&t.jsx("div",{className:c.historyLoading,children:e("uiStudio.history.loading","로딩 중...")}),!o&&m&&t.jsxs("div",{className:c.historyError,children:[e("uiStudio.history.error","오류"),": ",m]}),!o&&!m&&h.length===0&&t.jsx("div",{className:c.emptyHistory,children:e("uiStudio.history.empty","아직 변경 이력이 없습니다. AI 에이전트가 manage_ui 로 UI 를 수정하면 자동으로 기록됩니다.")}),!o&&h.length>0&&t.jsx("div",{className:c.requestList,children:h.map(G=>t.jsx(Ae,{req:G,placeId:a,onOpenCompare:N=>I(G.requestId,N)},G.requestId))}),w&&t.jsx("div",{className:c.deleteErrBanner,children:w})]}),y&&t.jsx(Re,{requestId:y,placeId:a,onClose:S})]}),p&&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:j,onChange:v},confirmLabel:e("common.delete","삭제"),onConfirm:T,onClose:()=>g(!1)})]})}function Gs({tier:e}){return e==="basic"?t.jsx(ks,{}):t.jsx(Ds,{})}const Ms=["analysis","history"];function Os(){const{t:e}=A(),{tier:i,loading:a}=He(),[n,l]=Oe(),r=n.get("tab"),o=r&&Ms.includes(r)?r:"analysis",m=f=>{l(p=>{const g=new URLSearchParams(p);return g.set("tab",f),g})},d=!a&&i==="pro"?"pro":"basic",y=[{key:"analysis",label:t.jsx(_,{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(_,{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:s.page,children:[t.jsx(Ke,{items:y,value:o,onChange:m}),o==="analysis"?t.jsx(Fa,{tier:d}):t.jsx(Gs,{tier:d})]})}export{Os as Component};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._page_1c56j_2{display:flex;flex-direction:column;gap:var(--content-gap);max-width:var(--content-max)}._grid_1c56j_9{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px;margin-top:16px}._card_1c56j_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_1c56j_16:hover{border-color:var(--accent)}._cardBodyButton_1c56j_31{display:block;width:100%;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;font:inherit;text-align:left}._thumb_1c56j_43{width:100%;aspect-ratio:16 / 9;object-fit:contain;object-position:center;display:block;background:var(--bg-secondary)}._badges_1c56j_52{position:absolute;top:8px;right:8px;display:flex;gap:4px}._priorityHighBadge_1c56j_60{background:var(--error);color:#fff;padding:2px 6px;border-radius:4px;font-size:12px;font-weight:600}._priorityMediumBadge_1c56j_69{background:var(--pro-badge);color:#000;padding:2px 6px;border-radius:4px;font-size:12px;font-weight:600}._priorityLowBadge_1c56j_78{background:var(--bg-tertiary);color:var(--text-primary);padding:2px 6px;border-radius:4px;font-size:12px;font-weight:600}._cardMeta_1c56j_87{padding:8px 12px;font-size:12px;color:var(--text-primary)}._target_1c56j_93{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._time_1c56j_100{color:var(--text-muted);margin-top:4px}._drawer_1c56j_105{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_1c56j_122{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_1c56j_133{min-width:0;display:flex;flex-direction:column;gap:3px}._drawerEyebrow_1c56j_140{color:var(--text-muted);font-family:var(--font-label);font-size:11px;font-weight:600;letter-spacing:0;text-transform:uppercase}._drawerTarget_1c56j_149{overflow:hidden;color:var(--text-primary);font-family:var(--font-label);font-size:13px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}._drawerToolbarActions_1c56j_159{display:flex;align-items:center;justify-content:flex-end;gap:8px;min-width:0}._closeBtn_1c56j_167{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_1c56j_167:hover{border-color:var(--accent);background:var(--accent-dim);color:var(--text-primary)}._detailBody_1c56j_188{flex:1 1 auto;min-height:0;overflow-y:auto;padding:16px 24px 24px}._screenshotPreviewFrame_1c56j_195{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_1c56j_208{display:block;width:100%;height:100%;object-fit:contain}._metaDl_1c56j_215{display:grid;grid-template-columns:auto 1fr;gap:8px 16px;margin:16px 0;font-size:13px}._metaDl_1c56j_215 dt{color:var(--text-muted)}._errorMsg_1c56j_227{color:var(--error-text);padding:12px}._suggestionsWrap_1c56j_232{margin-top:16px}._suggestionsWrap_1c56j_232 h3{margin:0 0 12px;font-size:16px}._prioritySection_1c56j_239{margin-bottom:16px}._sectionHighHeader_1c56j_242{margin:0 0 8px;font-size:13px;font-weight:600;color:#d15454}._sectionLowHeader_1c56j_248{margin:0 0 8px;font-size:13px;font-weight:600;color:#e8b854}._sectionMediumHeader_1c56j_254{margin:0 0 8px;font-size:13px;font-weight:600;color:#b7831f}._groupCard_1c56j_260{border:1px solid var(--border);border-radius:8px;margin-bottom:8px;background:var(--bg-secondary);overflow:hidden}._groupHeader_1c56j_267{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_1c56j_267:hover{background:var(--bg-card)}._groupLabel_1c56j_283{font-weight:600;font-size:13px;flex:1}._groupCount_1c56j_288{font-size:12px;color:var(--text-muted);padding:2px 8px;background:var(--bg-card);border-radius:10px}._groupChevron_1c56j_295{color:var(--text-muted);font-size:12px}._groupBody_1c56j_299{padding:0 12px 12px}._groupDescription_1c56j_302{font-size:12px;color:var(--text-muted);margin:8px 0 4px}._groupFix_1c56j_307{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_1c56j_316{font-size:12px;color:#e8b854;margin:4px 0 8px;padding:6px 10px;background:#e8b85414;border-radius:4px}._itemList_1c56j_324{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}._suggestionItem_1c56j_332{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_1c56j_342{display:flex;flex-direction:column;gap:2px;min-width:0}._pathBreadcrumb_1c56j_348{font-family:monospace;font-size:11px;color:var(--text-primary);background:transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._currentValue_1c56j_357{font-size:11px;color:var(--text-muted)}._copyFixBtn_1c56j_361{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_1c56j_361:hover{opacity:.9}._emptySuggestions_1c56j_375{text-align:center;padding:24px;color:var(--text-muted);font-size:13px}._sampleBanner_1c56j_383{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_1c56j_396{display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap}._sampleBannerMain_1c56j_404{display:flex;flex-direction:column;gap:8px;min-width:0;flex:1}._sampleBadge_1c56j_412{width:fit-content;color:var(--pro-text);font-family:var(--font-label);font-size:11px;font-weight:600;letter-spacing:.02em;opacity:.92}._sampleTitle_1c56j_422{font-family:var(--font-label);font-size:16px;font-weight:600;color:var(--text-primary)}._sampleMessage_1c56j_429{max-width:560px;color:var(--text-secondary);font-size:13px;line-height:1.5}._sampleActions_1c56j_436{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}._primaryAction_1c56j_444,._secondaryAction_1c56j_445{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_1c56j_445{border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);cursor:pointer}._secondaryAction_1c56j_445:hover{border-color:var(--accent);background:var(--accent-dim)}._primaryAction_1c56j_444{border:1px solid var(--pro-badge);background:var(--pro-badge);color:#1a1407}._primaryAction_1c56j_444:hover{opacity:.9}._emptyState_1c56j_480{text-align:center;padding:48px 20px;color:var(--text-muted);font-size:14px}._pluginGuideCard_1c56j_488{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_1c56j_499{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_1c56j_514{min-width:0}._pluginGuideTitle_1c56j_518{margin:0 0 8px;color:var(--text-primary);font-family:var(--font-label);font-size:15px;font-weight:600}._pluginGuideMessage_1c56j_526{margin:0 0 12px;color:var(--text-secondary);font-size:13px;line-height:1.5}._pluginGuideChecklist_1c56j_533{display:flex;flex-direction:column;gap:7px;margin:0 0 14px;padding:0;list-style:none}._pluginGuideChecklist_1c56j_533 li{position:relative;padding-left:20px;color:var(--text-secondary);font-size:13px}._pluginGuideChecklist_1c56j_533 li:before{content:"○";position:absolute;left:2px;color:var(--text-muted)}._pluginGuideWaiting_1c56j_556{display:inline-flex;align-items:center;gap:8px;color:var(--text-muted);font-family:var(--font-label);font-size:12px}._pluginGuideDot_1c56j_565{width:7px;height:7px;border-radius:50%;background:var(--warning)}._analysisWorkspace_1c56j_573{width:100%;position:relative}._analysisMainColumn_1c56j_578{min-width:0}._analysisDetailPopupLayer_1c56j_582{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}._analysisDetailDialog_1c56j_599{width:100%;height:100%;min-height:0;display:flex;flex-direction:column;overflow:hidden;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-card);box-shadow:0 24px 60px #0000006b}._analysisDetailDialog_1c56j_599 ._drawer_1c56j_105{min-height:0;max-height:100%}._analysisSummaryPanel_1c56j_618{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_1c56j_618 h2,._recentCapturesHeader_1c56j_631 h2{margin:0;font-size:16px;font-family:var(--font-label);color:var(--text-primary)}._analysisSummaryText_1c56j_638,._recentCapturesMeta_1c56j_639{margin:6px 0 0;color:var(--text-secondary);font-size:13px}._analysisReportGrid_1c56j_645{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px;margin-top:14px}._analysisReportGroup_1c56j_652{min-width:0}._analysisReportCard_1c56j_656{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_1c56j_656:hover{border-color:var(--accent);background:var(--bg-secondary)}._analysisReportThumb_1c56j_678{width:112px;aspect-ratio:16 / 10;object-fit:contain;object-position:center;border-radius:6px;background:var(--bg-secondary)}._analysisReportBody_1c56j_687{min-width:0;display:flex;flex-direction:column;gap:7px}._analysisReportTopline_1c56j_694{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._analysisVerdict_1c56j_701{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_1c56j_712,._analysisVerdict_review_1c56j_713{color:var(--accent);background:var(--accent-dim)}._analysisVerdict_passed_1c56j_718{color:var(--text-secondary);background:var(--bg-secondary)}._analysisReportCounts_1c56j_723{color:var(--text-secondary);font-size:12px}._analysisReportTarget_1c56j_728{overflow:hidden;color:var(--text-primary);font-size:13px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}._analysisReportIssue_1c56j_737{color:var(--text-secondary);font-size:12px;line-height:1.35}._analysisReportMeta_1c56j_743{margin-top:auto;color:var(--text-muted);font-size:11px;line-height:1.35}._analysisChildList_1c56j_750{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_1c56j_761{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_1c56j_761:hover{border-color:var(--accent);background:var(--accent-dim)}._analysisChildPath_1c56j_782{overflow:hidden;color:var(--text-primary);font-family:var(--font-code);font-size:11px;text-overflow:ellipsis;white-space:nowrap}._analysisChildSummary_1c56j_791,._analysisChildDetailHint_1c56j_792{color:var(--text-secondary);font-size:11px}._analysisChildDetailHint_1c56j_792{color:var(--text-muted)}._drawerAnalysisSummary_1c56j_801{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_1c56j_812{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._drawerAnalysisLabel_1c56j_819{min-width:64px;color:var(--text-muted);font-size:12px}._drawerAnalysisCounts_1c56j_825,._drawerAnalysisValue_1c56j_826{color:var(--text-secondary);font-size:12px}._recentCapturesSection_1c56j_831{margin-top:28px}._recentCapturesHeader_1c56j_631{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}._drawerPrimaryActions_1c56j_843{display:flex;align-items:center;gap:8px;min-width:0}._drawerActionBtn_1c56j_850{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_1c56j_850:hover:not(:disabled){border-color:var(--accent);background:var(--accent-dim)}._drawerActionBtn_1c56j_850:disabled{opacity:.45;cursor:not-allowed}._drawerMoreMenu_1c56j_879{position:relative;flex:0 0 auto}._drawerMoreButton_1c56j_884{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_1c56j_884:hover{border-color:var(--accent);background:var(--accent-dim);color:var(--text-primary)}._drawerMoreButton_1c56j_884::-webkit-details-marker{display:none}._drawerMoreMenuBody_1c56j_909{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_1c56j_922{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_1c56j_922:hover:not(:disabled){background:var(--bg-secondary)}._drawerMenuItem_1c56j_922:disabled{opacity:.45;cursor:not-allowed}._drawerMenuItemDanger_1c56j_945{color:var(--error-text, #e05555)}._drawerMenuItemDanger_1c56j_945:hover:not(:disabled){background:#e055551a}._actionErrMsg_1c56j_954{font-size:12px;color:var(--error-text, #e05555);padding:6px 10px;background:#e0555514;border-radius:4px;margin-top:10px}._actionStatusMsg_1c56j_963{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_1c56j_977{color:var(--text-secondary);background:var(--bg-secondary);border-color:var(--border)}._actionStatus_success_1c56j_983{color:var(--success-text, #22c55e);background:#22c55e14;border-color:#22c55e2e}._actionStatus_warning_1c56j_989{color:#e8b854;background:#e8b8541a;border-color:#e8b85438}._actionStatusDetail_1c56j_995{margin-top:2px;color:var(--text-muted)}._galleryHeader_1c56j_1001{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}._galleryHeader_1c56j_1001 h1{margin:0}._cardChecked_1c56j_1014{border-color:var(--accent)!important;box-shadow:0 0 0 2px var(--accent);background:var(--accent-dim)}._cardCheckbox_1c56j_1021{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;top:8px;left:8px;width:18px;height:18px;border-radius:4px;border:2px solid rgba(255,255,255,.7);background:#0006;cursor:pointer;opacity:0;z-index:2;transition:opacity var(--transition),background var(--transition),border-color var(--transition)}._card_1c56j_16:hover ._cardCheckbox_1c56j_1021,._card_1c56j_16:focus-within ._cardCheckbox_1c56j_1021,._cardChecked_1c56j_1014 ._cardCheckbox_1c56j_1021{opacity:1}._cardCheckbox_1c56j_1021:checked{background:var(--accent);border-color:var(--accent)}._cardCheckbox_1c56j_1021:checked:after{content:"✓";display:flex;align-items:center;justify-content:center;width:100%;height:100%;color:#fff;font-size:11px;font-weight:700;line-height:1}._captureSelectionActions_1c56j_1061{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}._selectionToolbar_1c56j_1070,._selectionBar_1c56j_1071{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_1c56j_1070{position:sticky;top:0;z-index:8;justify-content:space-between}._selectionToolbarCount_1c56j_1090{color:var(--text-primary);font-family:var(--font-label);font-size:12px;font-weight:600}._selectionToolbarActions_1c56j_1097{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._selectionBarBtn_1c56j_1104{padding:6px 14px;border-radius:6px;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_1c56j_1104:hover:not(:disabled){border-color:var(--accent)}._selectionBarBtn_1c56j_1104:disabled{opacity:.45;cursor:not-allowed}._selectionBarBtnDanger_1c56j_1125{border-color:var(--error-text, #e05555);color:var(--error-text, #e05555)}._selectionBarBtnDanger_1c56j_1125:hover:not(:disabled){background:#e055551a}@media(max-width:1120px){._analysisDetailPopupLayer_1c56j_582{left:calc(var(--sidebar-width) + 16px);right:16px;bottom:16px;padding:12px}}@media(max-width:768px){._analysisDetailPopupLayer_1c56j_582{top:calc(var(--header-height) + 10px);right:10px;bottom:10px;left:calc(var(--sidebar-collapsed) + 10px);padding:8px}._analysisDetailDialog_1c56j_599{width:100%}._drawer_1c56j_105{padding:0}._drawerToolbar_1c56j_122{grid-template-columns:minmax(0,1fr);align-items:stretch;gap:10px;padding:12px}._drawerToolbarActions_1c56j_159{justify-content:flex-start;overflow-x:auto;padding-bottom:2px}._drawerActionBtn_1c56j_850{padding:7px 10px}._detailBody_1c56j_188{padding:14px}}._filterBar_9toem_4{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:12px 0;margin-bottom:8px;border-bottom:1px solid var(--border)}._filterGroup_9toem_14{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._filterLabel_9toem_21{font-size:12px;color:var(--text-muted);font-weight:500;white-space:nowrap}._filterCheckbox_9toem_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_9toem_28 input[type=checkbox]{width:14px;height:14px;cursor:pointer;accent-color:var(--accent)}._segmentGroup_9toem_45{display:inline-flex;align-items:center;gap:2px;padding:2px;border:1px solid var(--border);border-radius:7px;background:var(--bg-secondary)}._segmentBtn_9toem_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_9toem_55:hover{color:var(--text-primary)}._segmentBtnActive_9toem_73{background:var(--bg-card);color:var(--text-primary);box-shadow:0 0 0 1px var(--border)}._filterInput_9toem_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_9toem_79:focus{outline:none;border-color:var(--accent)}._filterResetBtn_9toem_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_9toem_95:hover{border-color:var(--accent);color:var(--text-primary)}._requestRow_9toem_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_9toem_114:hover{border-color:var(--accent)}._requestRowMain_9toem_127{display:flex;align-items:flex-start;gap:12px;padding:12px 14px}._requestDetailToggle_9toem_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_9toem_134:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:6px}._thumbPair_9toem_156{display:flex;align-items:center;gap:4px;flex-shrink:0;position:relative}._thumbPairButton_9toem_164{padding:0;border:0;background:transparent;color:inherit;cursor:pointer;font:inherit;border-radius:6px}._thumbPairButton_9toem_164:focus-visible{outline:2px solid var(--accent);outline-offset:3px}._thumbPairButton_9toem_164:hover ._thumbSlot_9toem_179{border-color:var(--accent)}._thumbPairButton_9toem_164:disabled{cursor:not-allowed;opacity:.72}._thumbPairButton_9toem_164:disabled:hover ._thumbSlot_9toem_179{border-color:var(--border)}._thumbSlot_9toem_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_9toem_204{width:100%;height:100%;object-fit:cover;display:block}._thumbPlaceholder_9toem_211{font-size:10px;color:var(--text-muted);text-align:center;padding:4px;line-height:1.3}._thumbArrow_9toem_219{font-size:12px;color:var(--text-muted);flex-shrink:0}._extraPathsBadge_9toem_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_9toem_239{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}._requestLabel_9toem_247{font-size:13px;font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._requestTime_9toem_256{font-size:11px;color:var(--text-muted)}._requestStats_9toem_261{font-size:12px;color:var(--text-secondary);display:flex;gap:4px;flex-wrap:wrap}._statDot_9toem_269{color:var(--text-muted)}._summaryPill_9toem_273{color:var(--text-secondary)}._requestActions_9toem_278{display:flex;flex-direction:column;gap:6px;flex-shrink:0}._expandHint_9toem_285{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_9toem_298{border-top:1px solid var(--border);background:var(--bg-secondary);padding:8px 14px;display:flex;flex-direction:column;gap:4px}._mutLoading_9toem_307,._mutEmpty_9toem_308{font-size:12px;color:var(--text-muted);padding:4px 0}._mutError_9toem_314{font-size:12px;color:var(--error-text, #e05555);padding:4px 0}._mutationRow_9toem_320{font-size:12px;padding:6px 0;border-bottom:1px solid var(--border)}._mutationRow_9toem_320:last-child{border-bottom:none}._mutationLine_9toem_330{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}._mutTs_9toem_337{color:var(--text-muted);flex-shrink:0;font-size:11px}._mutCommand_9toem_343{color:var(--accent);font-weight:500;flex-shrink:0}._mutPath_9toem_349{font-family:monospace;font-size:11px;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:260px}._mutDiff_9toem_359{color:var(--text-muted);font-size:11px;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._mutErr_9toem_314{color:var(--error-text, #e05555);font-size:11px}._changeDetails_9toem_374{display:flex;flex-direction:column;gap:4px;margin-top:6px;padding-left:88px}._changeDetailRow_9toem_382{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_9toem_391{grid-template-columns:72px minmax(96px,180px) 14px minmax(0,1fr)}._changeDetailBadge_9toem_395{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_9toem_407{color:#2563eb;border-color:#2563eb47}._changeDetail_color_9toem_412{color:#b45309;border-color:#b4530947}._changeDetail_size_9toem_417{color:#047857;border-color:#04785747}._changeDetail_layout_9toem_422{color:#7c3aed;border-color:#7c3aed47}._changeDetail_state_9toem_427{color:#be123c;border-color:#be123c47}._changeDetail_asset_9toem_432{color:#0369a1;border-color:#0369a147}._changeDetail_property_9toem_437{color:var(--text-secondary)}._changeDetailProperty_9toem_441{font-family:var(--font-code);color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._changeDetailArrow_9toem_449{color:var(--text-muted);text-align:center;line-height:1.6}._changeDetailOldValue_9toem_455,._changeDetailNewValue_9toem_456{font-family:var(--font-code);overflow-wrap:anywhere;word-break:break-word;line-height:1.6}._changeDetailOldValue_9toem_455{color:var(--error-text, #e05555);text-decoration:line-through;text-decoration-thickness:1px}._changeDetailNewValue_9toem_456{color:var(--success-text, #22c55e)}._compareDialogLayer_9toem_474{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_9toem_474{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_9toem_505{width:100%;height:100%;min-height:0;background:var(--bg-card);display:flex;flex-direction:column;overflow:hidden}._drawerHeader_9toem_515{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border);flex-shrink:0}._drawerTitle_9toem_524{margin:0;font-size:16px;font-weight:600;color:var(--text-primary)}._drawerCloseBtn_9toem_531{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_9toem_531:hover{border-color:var(--accent);color:var(--text-primary)}._drawerBody_9toem_547{padding:20px;color:var(--text-muted);font-size:13px}._pathTabs_9toem_554{display:flex;gap:2px;border-bottom:1px solid var(--border);padding:0 20px;flex-shrink:0;overflow-x:auto}._pathTab_9toem_554{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_9toem_554:hover{color:var(--text-primary)}._pathTabActive_9toem_583{color:var(--accent);border-bottom-color:var(--accent)}._comparePanel_9toem_589{display:grid;grid-template-columns:1fr 1fr;gap:1px;flex:1;min-height:0;background:var(--border);overflow:auto}._compareHalf_9toem_599{background:var(--bg-card);display:flex;flex-direction:column;min-height:0}._compareLabel_9toem_606{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_9toem_617{width:100%;flex:1;object-fit:contain;background:var(--bg-secondary);display:block}._comparePlaceholder_9toem_625{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_9toem_637{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_9toem_646{margin-bottom:8px;color:var(--text-primary);font-family:var(--font-label);font-size:12px;font-weight:600}._compareDetailsPanel_9toem_637 ._changeDetails_9toem_374{padding-left:0}._compareDetailsPanel_9toem_637 ._mutPath_9toem_349,._compareDetailsPanel_9toem_637 ._mutDiff_9toem_359{max-width:none}._drawerFooter_9toem_664{display:flex;justify-content:flex-end;padding:12px 20px;border-top:1px solid var(--border);flex-shrink:0}._drawerActionBtn_9toem_672{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_9toem_672:hover{border-color:var(--accent);background:var(--accent-dim)}._historyTabWrap_9toem_690{display:flex;flex-direction:column;gap:0}._historyWorkspace_9toem_696{width:100%;position:relative}._historyMainColumn_9toem_701{min-width:0}._requestList_9toem_705{display:flex;flex-direction:column}._emptyHistory_9toem_710{text-align:center;padding:48px 20px;color:var(--text-muted);font-size:14px}._historyError_9toem_717{padding:16px 0;color:var(--error-text, #e05555);font-size:13px}._historyLoading_9toem_723{padding:48px 20px;text-align:center;color:var(--text-muted);font-size:13px}._listHeader_9toem_731{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:8px}._listHeaderTitle_9toem_740{font-size:14px;font-weight:600;color:var(--text-primary);margin:0}._clearBtn_9toem_747{padding:6px 12px;border:1px solid var(--danger-border);border-radius:var(--radius-sm);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_9toem_747:hover{background:var(--danger-hover-bg);border-color:var(--danger)}._deleteErrBanner_9toem_766{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, #e05555);font-size:13px}@media(max-width:1120px){._compareDialogLayer_9toem_474{left:calc(var(--sidebar-width) + 16px);right:16px;bottom:16px;padding:12px}}@media(max-width:768px){._compareDialogLayer_9toem_474{top:calc(var(--header-height) + 10px);right:10px;bottom:10px;left:calc(var(--sidebar-collapsed) + 10px);padding:8px}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u as w,j as e,
|
|
1
|
+
import{u as w,j as e,x as m,r as p,y as h,T as j,L as v}from"./index-FfT2oWAB.js";const T="_card_1vaoq_2",b="_cardUnread_1vaoq_15",C="_cardRead_1vaoq_20",f="_topRow_1vaoq_25",S="_categoryChip_1vaoq_32",R="_versionChip_1vaoq_45",k="_date_1vaoq_57",q="_title_1vaoq_65",H="_body_1vaoq_74",E="_link_1vaoq_83",A="_newBadge_1vaoq_98",n={card:T,cardUnread:b,cardRead:C,topRow:f,categoryChip:S,versionChip:R,date:k,title:q,body:H,link:E,newBadge:A},U={release:"whatsNew.category.release",notice:"whatsNew.category.notice",deprecation:"whatsNew.category.deprecation",tip:"whatsNew.category.tip"};function u({announcement:s,isNew:d}){const{locale:i,t:c}=w(),o=d?n.cardUnread:n.cardRead,_=s.title[i]??s.title.en,l=s.body[i]??s.body.en,r=s.link?s.link.label[i]??s.link.label.en:null;return e.jsxs("div",{className:`${n.card} ${o}`,children:[e.jsxs("div",{className:n.topRow,children:[e.jsx("span",{className:n.categoryChip,children:c(U[s.category])}),s.version&&e.jsx("span",{className:n.versionChip,children:s.version}),d&&e.jsx("span",{className:n.newBadge,children:c("whatsNew.newBadge","NEW")}),e.jsx("span",{className:n.date,children:s.date})]}),e.jsx("h3",{className:n.title,children:_}),e.jsx("p",{className:n.body,children:l}),s.link&&r&&e.jsxs("a",{className:n.link,href:s.link.url,target:"_blank",rel:"noopener noreferrer",children:["↗"," ",r]})]})}const B="_page_19yl3_2",I="_pageHeader_19yl3_10",$="_pageHeaderText_19yl3_17",L="_pageTitle_19yl3_24",M="_pageSubtitle_19yl3_31",W="_settingsIcon_19yl3_38",z="_section_19yl3_67",O="_sectionTitle_19yl3_73",Y="_unreadCount_19yl3_85",G="_empty_19yl3_100",K="_divider_19yl3_108",t={page:B,pageHeader:I,pageHeaderText:$,pageTitle:L,pageSubtitle:M,settingsIcon:W,section:z,sectionTitle:O,unreadCount:Y,empty:G,divider:K};function D(){const{t:s}=w(),{readSet:d,markRead:i}=m(),c=p.useMemo(()=>{const a=[];for(const x of h)d.has(x.id)||a.push(x.id);return a},[]),o=p.useRef(c);o.current=c,p.useEffect(()=>()=>{o.current.length>0&&i(o.current)},[]);const _=p.useMemo(()=>new Set(c),[c]),l=h.filter(a=>_.has(a.id)),r=h.filter(a=>!_.has(a.id)),g=l.length>0,N=r.length>0,y=e.jsxs("div",{className:t.pageHeader,children:[e.jsxs("div",{className:t.pageHeaderText,children:[e.jsx("h1",{className:t.pageTitle,children:s("whatsNew.pageTitle","What's New")}),e.jsx("p",{className:t.pageSubtitle,children:s("whatsNew.pageSubtitle","Stay up to date with MCP changes")})]}),e.jsx(j,{text:s("sidebar.settings","Settings"),children:e.jsx(v,{to:"/settings","aria-label":s("sidebar.settings","Settings"),className:t.settingsIcon,children:"⚙️"})})]});return h.length===0?e.jsxs("div",{className:t.page,children:[y,e.jsx("p",{className:t.empty,children:s("whatsNew.empty","No announcements yet")})]}):e.jsxs("div",{className:t.page,children:[y,g&&e.jsxs("section",{className:t.section,children:[e.jsxs("h2",{className:t.sectionTitle,children:[s("whatsNew.unreadSection","Unread"),e.jsx("span",{className:t.unreadCount,children:l.length})]}),l.map(a=>e.jsx(u,{announcement:a,isNew:!0},`unread-${a.id}`))]}),g&&N&&e.jsx("hr",{className:t.divider}),N&&e.jsxs("section",{className:t.section,children:[e.jsx("h2",{className:t.sectionTitle,children:s("whatsNew.allSection","All Announcements")}),r.map(a=>e.jsx(u,{announcement:a,isNew:!1},`all-${a.id}`))]})]})}export{D as Component};
|