@weppy/roblox-mcp 2.9.3 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/dashboard/dist/assets/AssetsPage-Czc93xoU.css +1 -0
- package/dashboard/dist/assets/AssetsPage-D9X2pUea.js +46 -0
- package/dashboard/dist/assets/{ChangelogDetailPage-DTl_Tw_v.js → ChangelogDetailPage-Bc77mNht.js} +1 -1
- package/dashboard/dist/assets/{ChangelogPage-BqASaB-l.js → ChangelogPage-Cvy3ismU.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-knJOxPTQ.js → ConfirmModal-CEmy8izm.js} +1 -1
- package/dashboard/dist/assets/ConfirmModal-izJskKtO.css +1 -0
- package/dashboard/dist/assets/ConfirmModal.module-D1aZY2bQ.js +1 -0
- package/dashboard/dist/assets/ConnectionPage-B5daijue.css +1 -0
- package/dashboard/dist/assets/ConnectionPage-C_XNqIG-.js +11 -0
- package/dashboard/dist/assets/{ControlsPage-da-JrES8.js → ControlsPage-CkTB6mEk.js} +1 -1
- package/dashboard/dist/assets/CurrentPlaceScope-CuZXV9Ku.js +1 -0
- package/dashboard/dist/assets/CurrentPlaceScope-D-0g0WrM.css +1 -0
- package/dashboard/dist/assets/{GameChangeDetail-sTt5o48Z.js → GameChangeDetail-D2QTkbEB.js} +1 -1
- package/dashboard/dist/assets/{InfoLabel-DwsCwdUw.js → InfoLabel-BUXacsTE.js} +1 -1
- package/dashboard/dist/assets/{OverviewPage-9cIh9Q5a.js → OverviewPage-CX5zVj8P.js} +1 -1
- package/dashboard/dist/assets/PageHeader-B0qiATU4.js +6 -0
- package/dashboard/dist/assets/PageHeader-CrhjZjgp.css +1 -0
- package/dashboard/dist/assets/PlaytestPage-CVEtQ4dU.css +1 -0
- package/dashboard/dist/assets/PlaytestPage-folHMgTW.js +11 -0
- package/dashboard/dist/assets/SettingsPage-ByHSUA7b.css +1 -0
- package/dashboard/dist/assets/SettingsPage-nlNo4CBL.js +1 -0
- package/dashboard/dist/assets/{StatusBadge-CYejTjWf.js → StatusBadge-B2VLfqa6.js} +1 -1
- package/dashboard/dist/assets/SyncPage-Bi8xaHnB.js +4 -0
- package/dashboard/dist/assets/SyncPage-CIZWp8Ul.css +1 -0
- package/dashboard/dist/assets/Tabs-CIszXeoU.css +1 -0
- package/dashboard/dist/assets/{Tabs-wK2yL-C6.js → Tabs-DqGYr78-.js} +1 -1
- package/dashboard/dist/assets/ToolsPage-CAaH9fIQ.css +1 -0
- package/dashboard/dist/assets/ToolsPage-DVYql6ES.js +1 -0
- package/dashboard/dist/assets/{TooltipText-LAwR8aaI.js → TooltipText-DaLR7eg1.js} +1 -1
- package/dashboard/dist/assets/UiStudioPage-CHzKSJCc.js +11 -0
- package/dashboard/dist/assets/UiStudioPage-LH2dcLkr.css +1 -0
- package/dashboard/dist/assets/{WhatsNewPage-B9st_b8H.js → WhatsNewPage-D5LMzwyf.js} +1 -1
- package/dashboard/dist/assets/{copy-DwoEPqC3.js → copy-0T6g5IWT.js} +1 -1
- package/dashboard/dist/assets/index-BDJHcdyQ.js +686 -0
- package/dashboard/dist/assets/{index-Dd1aCYFM.css → index-DzkZyWCv.css} +1 -1
- package/dashboard/dist/assets/sample-requests-DmUwqmFE.css +1 -0
- package/dashboard/dist/assets/sample-requests-Fif4AVnz.js +1 -0
- package/dashboard/dist/assets/{useLiveUptime-DM28rhji.js → useLiveUptime-KCA8LzCI.js} +1 -1
- package/dashboard/dist/assets/useSettings-BJSPSJ0b.js +1 -0
- package/dashboard/dist/assets/useSettings-KAiL5E_X.css +1 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/index.js +94 -94
- package/package.json +1 -1
- package/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
- package/dashboard/dist/assets/AssetsPage-Be5aZDhj.css +0 -1
- package/dashboard/dist/assets/AssetsPage-CqgdG2Ni.js +0 -46
- package/dashboard/dist/assets/ConfirmModal-D1kfK31C.css +0 -1
- package/dashboard/dist/assets/ConfirmModal.module-NrFlfTWy.js +0 -1
- package/dashboard/dist/assets/ConnectionPage-BkkqcLRE.js +0 -11
- package/dashboard/dist/assets/ConnectionPage-D1GWlHZP.css +0 -1
- package/dashboard/dist/assets/CurrentPlaceScope-BOfr5n7U.js +0 -1
- package/dashboard/dist/assets/CurrentPlaceScope-v3pl1mLI.css +0 -1
- package/dashboard/dist/assets/PageHeader-2-fusgsY.css +0 -1
- package/dashboard/dist/assets/PageHeader-DwlcGnaB.js +0 -6
- package/dashboard/dist/assets/PlaytestPage-BeRZc6wz.js +0 -11
- package/dashboard/dist/assets/PlaytestPage-DjjsIkke.css +0 -1
- package/dashboard/dist/assets/SettingsPage-BiCf2ur7.js +0 -1
- package/dashboard/dist/assets/SettingsPage-DSipzuEo.css +0 -1
- package/dashboard/dist/assets/SyncPage-CHe2NPfN.js +0 -4
- package/dashboard/dist/assets/SyncPage-COxqxAjv.css +0 -1
- package/dashboard/dist/assets/Tabs-876h0_zB.css +0 -1
- package/dashboard/dist/assets/ToolsPage-Bt9vYA7u.css +0 -1
- package/dashboard/dist/assets/ToolsPage-Cq8crPCz.js +0 -1
- package/dashboard/dist/assets/UiStudioPage-eSinjpOX.css +0 -1
- package/dashboard/dist/assets/UiStudioPage-xZ96a4BR.js +0 -11
- package/dashboard/dist/assets/index-CJJYSnlB.js +0 -606
- package/dashboard/dist/assets/sample-requests-CygerZZ_.css +0 -1
- package/dashboard/dist/assets/sample-requests-tNeuJCdB.js +0 -1
- package/dashboard/dist/assets/useSettings-Bsfu70PT.css +0 -1
- package/dashboard/dist/assets/useSettings-CYVeWZ0i.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as s}from"./index-
|
|
1
|
+
import{j as s}from"./index-BDJHcdyQ.js";const r="_tabBar_jefog_2",_="_tabs_jefog_9",j="_actions_jefog_14",d="_tab_jefog_2",f="_tabActive_jefog_52",a={tabBar:r,tabs:_,actions:j,tab:d,tabActive:f};function u({items:n,value:c,onChange:l,ariaLabel:b,className:i,rightActions:e}){return s.jsxs("div",{className:[a.tabBar,i].filter(Boolean).join(" "),role:"tablist","aria-label":b,children:[s.jsx("div",{className:a.tabs,children:n.map(t=>{const o=t.key===c;return s.jsx("button",{type:"button",role:"tab","aria-selected":o,"data-testid":t.testId,className:[a.tab,o?a.tabActive:""].filter(Boolean).join(" "),onClick:()=>l(t.key),children:t.label},t.key)})}),e?s.jsx("div",{className:a.actions,children:e}):null]})}export{u as T};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._wrapper_hzgda_2{overflow-x:auto}._table_hzgda_7{width:100%;border-collapse:collapse;font-family:var(--font-code);font-size:12px}._table_hzgda_7 th{text-align:left;color:var(--text-muted);font-weight:500;padding:6px 8px;border-bottom:1px solid var(--border);background:var(--bg-secondary);white-space:nowrap;-webkit-user-select:none;user-select:none}._table_hzgda_7 td{padding:6px 8px;color:var(--text-primary);border-bottom:1px solid var(--border-dim, rgba(255, 255, 255, .04))}._sortable_hzgda_32{cursor:pointer;transition:color var(--transition)}._sortable_hzgda_32:hover{color:var(--accent)}._sortArrow_hzgda_41{margin-left:4px;font-size:10px}._table_hzgda_7 tbody tr:hover td{background:var(--accent-dim)}._clickable_hzgda_52{cursor:pointer}._empty_hzgda_57{text-align:center;color:var(--text-muted);font-style:italic;padding:24px 8px}._expandedRow_hzgda_65 td{padding:0!important;border-bottom:1px solid var(--border)}._expandedRow_hzgda_65:hover td{background:transparent!important}._expandedCell_hzgda_74{padding:0!important}._page_1wi3z_2{display:flex;flex-direction:column;gap:var(--content-gap);max-width:var(--content-max)}._card_1wi3z_12{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px 20px}._cardToolbar_1wi3z_19{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}._sectionTitle_1wi3z_27{font-family:var(--font-label);font-size:13px;color:var(--text-primary)}._dangerButton_1wi3z_33{border:1px solid var(--danger-border);background:var(--danger-bg);color:var(--danger-text);border-radius:var(--radius-control);padding:6px 12px;font-family:var(--font-label);font-size:12px;font-weight:500;cursor:pointer;transition:background var(--transition),border-color var(--transition)}._dangerButton_1wi3z_33:hover{background:var(--danger-hover-bg);border-color:var(--danger)}._proBadge_1wi3z_52{display:inline-block;margin-left:6px;padding:1px 5px;font-size:9px;font-weight:600;letter-spacing:.05em;color:var(--pro-text-on-badge);background:var(--pro-badge);border-radius:3px;vertical-align:middle}._statusOk_1wi3z_67{display:inline-flex;align-items:center;min-height:22px;padding:2px 8px;border:1px solid var(--success-border);border-radius:var(--radius-control);background:var(--success-bg);color:var(--success-text);font-weight:500;cursor:default}._statusFallback_1wi3z_80{display:inline-flex;align-items:center;min-height:22px;padding:2px 8px;border:1px solid var(--info-border);border-radius:var(--radius-control);background:var(--info-bg);color:var(--info-text);font-weight:600;cursor:default}._statusUnsupported_1wi3z_93,._statusWarning_1wi3z_106{display:inline-flex;align-items:center;min-height:22px;padding:2px 8px;border:1px solid var(--warning-border);border-radius:var(--radius-control);background:var(--warning-bg);color:var(--warning-text);font-weight:600;cursor:default}._statusError_1wi3z_119{display:inline-flex;align-items:center;min-height:22px;padding:2px 8px;border:1px solid var(--error-border);border-radius:var(--radius-control);background:var(--error-bg);color:var(--error-text);font-weight:600;cursor:default}._tierBasic_1wi3z_133{color:var(--text-secondary)}._tierPro_1wi3z_137{color:var(--pro-badge);font-weight:500}._tierMixed_1wi3z_142{color:var(--text-primary);font-weight:500}._errorText_1wi3z_148{color:var(--error)}._filterRow_1wi3z_153{display:flex;align-items:center;gap:12px;margin-bottom:12px}._filterLabel_1wi3z_160{font-family:var(--font-label);font-size:11px;color:var(--text-secondary);display:flex;align-items:center;gap:6px}._filterSelect_1wi3z_169{font-family:var(--font-code);font-size:12px;padding:3px 8px;border:1px solid var(--border);border-radius:var(--radius-control);background:var(--bg-secondary);color:var(--text-primary)}._filterSelect_1wi3z_169:focus-visible{outline:none;box-shadow:var(--focus-ring)}._expandedRow_1wi3z_185{background:var(--bg-secondary);padding:12px 16px}._expandedSection_1wi3z_190{margin-bottom:8px;font-size:12px;color:var(--text-secondary)}._expandedSection_1wi3z_190:last-child{margin-bottom:0}._detailList_1wi3z_200{display:flex;flex-direction:column;gap:6px}._detailItem_1wi3z_206{display:flex;flex-wrap:wrap;gap:6px}._detailLabel_1wi3z_212{font-family:var(--font-label);color:var(--text-muted)}._detailValue_1wi3z_217{color:var(--text-primary);word-break:break-word}._pre_1wi3z_222{font-family:var(--font-code);font-size:11px;color:var(--text-primary);background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius-control);padding:8px;margin-top:4px;overflow-x:auto;max-height:200px;overflow-y:auto;white-space:pre-wrap;word-break:break-all}._pagination_1wi3z_239{display:flex;align-items:center;justify-content:center;gap:12px;margin-top:12px}._pageInfo_1wi3z_247{font-family:var(--font-code);font-size:12px;color:var(--text-secondary)}._btn_1wi3z_253{font-family:var(--font-label);font-size:12px;padding:4px 12px;border-radius:var(--radius-control);border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);cursor:pointer;transition:background var(--transition),border-color var(--transition)}._btn_1wi3z_253:hover:not(:disabled){border-color:var(--accent);background:var(--accent-dim)}._btn_1wi3z_253:disabled{opacity:.4;cursor:default}._btn_1wi3z_253:focus-visible{outline:none;box-shadow:var(--focus-ring)}._tierDistribution_1wi3z_281{margin-bottom:16px}._tierBarWrap_1wi3z_285{display:flex;height:12px;border-radius:6px;overflow:hidden;background:var(--bg-secondary)}._tierBarBasic_1wi3z_293{background:var(--text-secondary);transition:width .3s ease}._tierBarPro_1wi3z_298{background:var(--accent);transition:width .3s ease}._tierLabels_1wi3z_303{display:flex;justify-content:space-between;margin-top:4px;font-family:var(--font-code);font-size:11px;color:var(--text-secondary)}._statsTableWrap_1wi3z_312{border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}._statsTable_1wi3z_312{width:100%;border-collapse:collapse}._statsTable_1wi3z_312 th,._statsTable_1wi3z_312 td{padding:10px 12px;font-size:12px;text-align:left;border-bottom:1px solid var(--border)}._statsTable_1wi3z_312 th{font-family:var(--font-label);font-size:11px;font-weight:500;color:var(--text-secondary);background:var(--bg-secondary)}._statsTable_1wi3z_312 tbody tr:last-child td{border-bottom:none}._sortableHeader_1wi3z_343{cursor:pointer;-webkit-user-select:none;user-select:none}._sortArrow_1wi3z_348{margin-left:4px}._statsToolRow_1wi3z_352{cursor:pointer}._statsToolRow_1wi3z_352:hover td{background:var(--bg-secondary)}._statsActionRow_1wi3z_360 td{background:color-mix(in srgb,var(--bg-secondary) 72%,transparent)}._expandButton_1wi3z_364{display:inline-flex;align-items:center;gap:8px;padding:0;border:none;background:transparent;color:inherit;font:inherit;cursor:pointer}._expandIcon_1wi3z_376{width:10px;color:var(--text-secondary)}._actionLabel_1wi3z_381{display:inline-block;padding-left:18px;font-family:var(--font-code);color:var(--text-secondary)}._emptyStats_1wi3z_388{text-align:center;color:var(--text-muted)}._summaryLine_1wi3z_394{margin-top:12px;font-family:var(--font-code);font-size:12px;color:var(--text-muted);text-align:right}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as s,r as n,a as O,D as nt,u as ct,e as dt,l as ut}from"./index-BDJHcdyQ.js";import{P as pt}from"./PageHeader-B0qiATU4.js";import{T as M}from"./TooltipText-DaLR7eg1.js";import{C as ht}from"./ConfirmModal-CEmy8izm.js";import{C as mt}from"./CurrentPlaceScope-CuZXV9Ku.js";import{T as bt}from"./Tabs-DqGYr78-.js";import"./ConfirmModal.module-D1aZY2bQ.js";const xt="_wrapper_hzgda_2",ft="_table_hzgda_7",gt="_sortable_hzgda_32",_t="_sortArrow_hzgda_41",wt="_clickable_hzgda_52",yt="_empty_hzgda_57",Ct="_expandedRow_hzgda_65",jt="_expandedCell_hzgda_74",T={wrapper:xt,table:ft,sortable:gt,sortArrow:_t,clickable:wt,empty:yt,expandedRow:Ct,expandedCell:jt};function kt({columns:t,data:a,sortBy:x,sortDir:z="asc",onSort:P,onRowClick:i,rowKey:j,emptyMessage:k,expandedKey:B,renderExpandedRow:N}){return s.jsx("div",{className:T.wrapper,children:s.jsxs("table",{className:T.table,children:[s.jsx("thead",{children:s.jsx("tr",{children:t.map(u=>s.jsxs("th",{style:u.width?{width:u.width}:void 0,className:u.sortable?T.sortable:void 0,onClick:u.sortable&&P?()=>P(u.key):void 0,children:[s.jsx("span",{children:u.label}),u.sortable&&x===u.key&&s.jsx("span",{className:T.sortArrow,children:z==="asc"?"▴":"▾"})]},u.key))})}),s.jsx("tbody",{children:a.length===0?s.jsx("tr",{children:s.jsx("td",{colSpan:t.length,className:T.empty,children:k||"No data"})}):a.map((u,E)=>{const R=j?j(u):String(E),h=B!=null&&R===B&&N?N(u):null;return s.jsxs(n.Fragment,{children:[s.jsx("tr",{className:i?T.clickable:void 0,onClick:i?()=>i(u):void 0,children:t.map(y=>s.jsx("td",{children:y.render?y.render(u):String(u[y.key]??"")},y.key))}),h&&s.jsx("tr",{className:T.expandedRow,children:s.jsx("td",{colSpan:t.length,className:T.expandedCell,children:h})})]},R)})})]})})}function St(t){return{...t,sequenceNumber:typeof t.sequenceNumber=="number"?t.sequenceNumber:void 0,executionTimeMs:typeof t.executionTimeMs=="number"?t.executionTimeMs:void 0}}const Tt=50;function Nt(t){if(typeof t=="number")return{placeId:String(t)}}function Z(t,a){return typeof a!="number"?t:`${t}?placeId=${encodeURIComponent(String(a))}`}function vt(t){const a=(t==null?void 0:t.placeId)??null,[x,z]=n.useState(null),[P,i]=n.useState(!0),[j,k]=n.useState([]),[B,N]=n.useState(0),[u,E]=n.useState(!1),[R,w]=n.useState(!0),[h,y]=n.useState(0),[f,L]=n.useState(""),F=n.useRef(null),m=n.useCallback(async()=>{i(!0);try{const c=Nt(a),C=c?await O.get("/api/dashboard/tool-stats",c):await O.get("/api/dashboard/tool-stats");z(C)}catch{}finally{i(!1)}},[a]),_=n.useCallback(async(c,C)=>{w(!0);try{const H={limit:String(Tt),offset:String(c)};C&&(H.tool=C),typeof a=="number"&&(H.placeId=String(a));const I=await O.get("/api/dashboard/history",H);k(I.entries.map(St)),N(I.total),E(I.hasMore)}catch{k([]),N(0),E(!1)}finally{w(!1)}},[a]),U=n.useCallback(()=>{m(),_(h,f)},[_,m,h,f]),V=n.useCallback(async()=>{await O.post(Z("/api/dashboard/tools/history/clear",a)),_(h,f)},[_,h,f,a]),$=n.useCallback(async()=>{await O.post(Z("/api/dashboard/tools/statistics/clear",a)),m()},[m,a]);return n.useEffect(()=>{m()},[m]),n.useEffect(()=>{_(h,f)},[_,h,f]),n.useEffect(()=>{const c=new nt;F.current=c,c.connect();const C=c.on("command",()=>{m(),_(h,f)});return()=>{C(),c.disconnect(),F.current=null}},[_,m,h,f]),{statistics:x,statsLoading:P,history:j,historyTotal:B,historyHasMore:u,historyLoading:R,historyOffset:h,historyToolFilter:f,setHistoryOffset:y,setHistoryToolFilter:L,refresh:U,clearHistory:V,clearStatistics:$}}const Mt="_page_1wi3z_2",zt="_card_1wi3z_12",Pt="_cardToolbar_1wi3z_19",Bt="_sectionTitle_1wi3z_27",Et="_dangerButton_1wi3z_33",Rt="_proBadge_1wi3z_52",Lt="_statusOk_1wi3z_67",It="_statusFallback_1wi3z_80",At="_statusUnsupported_1wi3z_93",Ht="_statusWarning_1wi3z_106",Ot="_statusError_1wi3z_119",Ft="_tierBasic_1wi3z_133",$t="_tierPro_1wi3z_137",qt="_tierMixed_1wi3z_142",Dt="_filterRow_1wi3z_153",Wt="_filterLabel_1wi3z_160",Ut="_filterSelect_1wi3z_169",Vt="_expandedRow_1wi3z_185",Kt="_expandedSection_1wi3z_190",Gt="_detailList_1wi3z_200",Jt="_detailItem_1wi3z_206",Qt="_detailLabel_1wi3z_212",Zt="_detailValue_1wi3z_217",Xt="_pre_1wi3z_222",Yt="_pagination_1wi3z_239",te="_pageInfo_1wi3z_247",ee="_btn_1wi3z_253",se="_tierDistribution_1wi3z_281",oe="_tierBarWrap_1wi3z_285",ae="_tierBarBasic_1wi3z_293",re="_tierBarPro_1wi3z_298",le="_tierLabels_1wi3z_303",ie="_statsTableWrap_1wi3z_312",ne="_statsTable_1wi3z_312",ce="_sortableHeader_1wi3z_343",de="_sortArrow_1wi3z_348",ue="_statsToolRow_1wi3z_352",pe="_statsActionRow_1wi3z_360",he="_expandButton_1wi3z_364",me="_expandIcon_1wi3z_376",be="_actionLabel_1wi3z_381",xe="_emptyStats_1wi3z_388",fe="_summaryLine_1wi3z_394",o={page:Mt,card:zt,cardToolbar:Pt,sectionTitle:Bt,dangerButton:Et,proBadge:Rt,statusOk:Lt,statusFallback:It,statusUnsupported:At,statusWarning:Ht,statusError:Ot,tierBasic:Ft,tierPro:$t,tierMixed:qt,filterRow:Dt,filterLabel:Wt,filterSelect:Ut,expandedRow:Vt,expandedSection:Kt,detailList:Gt,detailItem:Jt,detailLabel:Qt,detailValue:Zt,pre:Xt,pagination:Yt,pageInfo:te,btn:ee,tierDistribution:se,tierBarWrap:oe,tierBarBasic:ae,tierBarPro:re,tierLabels:le,statsTableWrap:ie,statsTable:ne,sortableHeader:ce,sortArrow:de,statsToolRow:ue,statsActionRow:pe,expandButton:he,expandIcon:me,actionLabel:be,emptyStats:xe,summaryLine:fe},K=50,ge=new Set(["clientId","placeId","pinnedTarget","recentPriority","globalQueue"]);function _e(t){const a=new Date(t);return`${String(a.getHours()).padStart(2,"0")}:${String(a.getMinutes()).padStart(2,"0")}:${String(a.getSeconds()).padStart(2,"0")}`}function W(t){return typeof t!="number"||!Number.isFinite(t)?"-":t<1e3?`${t}ms`:`${(t/1e3).toFixed(1)}s`}function A(t,a){return a==="pro"?t("tier.pro","Pro"):a==="mixed"?t("tier.mixed","Mixed"):t("tier.basic","Basic")}function tt(t,a){return a!==t&&a.startsWith(`${t}_`)?a.slice(t.length+1):""}function we(t,a){const x=tt(t,a);return x?`${t}.${x}`:t}function X(t){return typeof t=="string"&&t.length>0?t:void 0}function ye(t){if(!Array.isArray(t))return;const a=t.filter(x=>typeof x=="string"&&x.length>0);return a.length>0?a:void 0}function Ce(t){const a=t.result??{};return{requestedCommand:t.requestedCommand??X(a.requestedCommand),executedCommand:t.executedCommand??X(a.executedCommand),alternatives:t.alternatives??ye(a.alternatives)}}function je(t,a){switch(t.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"warning":return{label:a("tools.badge.warn","WARN"),tooltip:a("tools.badge.warn.tooltip","The tool call failed as an expected caller, project, policy, or user-code issue."),className:o.statusWarning};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 g(t,a){return s.jsxs("div",{className:o.detailItem,children:[s.jsx("span",{className:o.detailLabel,children:t}),s.jsx("span",{className:o.detailValue,children:a})]})}function ke(t){if(!t||typeof t!="object")return;const a=t;if(typeof a.selectionMode=="string"&&ge.has(a.selectionMode))return a}function Y(t){if(!(!t||typeof t!="object"||!("routing"in t)))return ke(t.routing)}function Se(t){return t.routing??Y(t.result)??Y(t.data)}function Te(t,a){return t.requestedClientId?t.requestedClientId:t.requestedPlaceId!==void 0?t.requestedPlaceId:a("tools.history.routing.none","No Studio target named")}function Ne(t){return t.actualPlaceName?`${t.actualPlaceName} · ${t.actualPlaceId??"-"}`:t.actualClientId??"-"}function Ie(){const{t}=ct(),{trackEvent:a,trackPageView:x}=dt(),[z,P]=n.useState(null),i=vt({placeId:z}),{show:j}=ut(),[k,B]=n.useState("history"),[N,u]=n.useState(null),[E,R]=n.useState(null),[w,h]=n.useState(null),[y,f]=n.useState(!1),[L,F]=n.useState("totalCalls"),[m,_]=n.useState("desc"),U=n.useCallback(e=>{F(r=>r===e?(_(l=>l==="asc"?"desc":"asc"),e):(_("desc"),e))},[]),V=n.useMemo(()=>{var r;const e=new Set;return Object.keys(((r=i.statistics)==null?void 0:r.tools)??{}).forEach(l=>e.add(l)),i.history.forEach(l=>{l.tool&&e.add(l.tool)}),i.historyToolFilter&&e.add(i.historyToolFilter),Array.from(e).sort()},[i.history,i.historyToolFilter,i.statistics]),$=n.useMemo(()=>{var e;return(e=i.statistics)!=null&&e.tools?Object.values(i.statistics.tools).map(r=>{var Q;const l=Object.entries(r.commands??{}).map(([p,d])=>({toolName:r.tool,commandName:d.command??p,label:tt(r.tool,d.command??p)||(d.command??p),tier:d.tier,totalCalls:d.totalCalls,successCount:d.successCount,fallbackCount:d.fallbackCount,unsupportedCount:d.unsupportedCount,warningCount:d.warningCount??0,failureCount:d.failureCount,totalExecutionTimeMs:d.totalExecutionTimeMs,avgExecutionTimeMs:d.avgExecutionTimeMs})),b=l.reduce((p,d)=>p+d.totalCalls,0),S=l.reduce((p,d)=>p+d.successCount,0),q=l.reduce((p,d)=>p+d.fallbackCount,0),D=l.reduce((p,d)=>p+d.unsupportedCount,0),rt=l.reduce((p,d)=>p+d.warningCount,0),lt=l.reduce((p,d)=>p+d.failureCount,0),J=l.reduce((p,d)=>p+d.totalExecutionTimeMs,0),it=new Set(l.map(p=>p.tier)).size>1?"mixed":((Q=l[0])==null?void 0:Q.tier)??r.tier;return{toolName:r.tool,tier:it,commands:l,totalCalls:b,successCount:S,fallbackCount:q,unsupportedCount:D,warningCount:rt,failureCount:lt,totalExecutionTimeMs:J,avgExecutionTimeMs:b>0?Math.round(J/b):0}}):[]},[i.statistics]),c=n.useCallback((e,r,l,b)=>s.jsx(M,{text:t(l,b),children:t(e,r)}),[t]),C=n.useMemo(()=>[...$].sort((r,l)=>{const b=r[L],S=l[L];if(typeof b=="number"&&typeof S=="number")return m==="asc"?b-S:S-b;const q=String(b??""),D=String(S??"");return m==="asc"?q.localeCompare(D):D.localeCompare(q)}),[$,L,m]),H=n.useMemo(()=>[{key:"timestamp",label:c("tools.col.time","Time","tools.col.time.tooltip","When the tool run was recorded."),width:"80px",render:e=>_e(e.timestamp)},{key:"toolName",label:c("tools.col.toolAction","Tool.Action","tools.col.toolAction.tooltip","Tool name and action that were executed."),render:e=>s.jsxs("span",{children:[we(e.tool,e.command),e.tier==="pro"&&s.jsx(M,{text:t("tools.badge.pro.tooltip","This entry used a Pro-only tool or action."),children:s.jsx("span",{className:o.proBadge,children:t("tools.badge.pro","PRO")})})]})},{key:"executionTimeMs",label:c("tools.col.duration","Duration","tools.col.duration.tooltip","How long the tool took to finish."),width:"80px",render:e=>W(e.executionTimeMs)},{key:"status",label:c("tools.col.status","Status","tools.col.status.tooltip","Outcome of the recorded tool run."),width:"120px",render:e=>{const r=je(e,t);return s.jsx(M,{text:r.tooltip,children:s.jsx("span",{className:r.className,children:r.label})})}},{key:"tier",label:c("tools.col.tier","Tier","tools.col.tier.tooltip","License tier required for the tool or action."),width:"60px",render:e=>s.jsx("span",{className:e.tier==="pro"?o.tierPro:o.tierBasic,children:A(t,e.tier)})}],[t,c]),I=n.useMemo(()=>[{key:"toolName",label:c("tools.col.tool","Tool","tools.col.tool.tooltip","Consolidated tool name in the statistics table."),sortable:!0},{key:"totalCalls",label:c("tools.col.calls","Calls","tools.col.calls.tooltip","Total number of recorded calls for this tool."),sortable:!0,width:"70px"},{key:"successCount",label:c("tools.col.ok","OK","tools.col.ok.tooltip","Number of direct successful runs."),sortable:!0,width:"70px"},{key:"fallbackCount",label:c("tools.col.fallback","FALLBACK","tools.col.fallback.tooltip","Number of runs that succeeded through fallback execution."),sortable:!0,width:"110px"},{key:"unsupportedCount",label:c("tools.col.unsupported","UNSUPPORTED","tools.col.unsupported.tooltip","Number of blocked runs without fallback execution."),sortable:!0,width:"130px"},{key:"warningCount",label:c("tools.col.warn","WARN","tools.col.warn.tooltip","Number of expected failures caused by caller input, project state, Roblox policy, or user code."),sortable:!0,width:"80px"},{key:"failureCount",label:c("tools.col.err","FAILED","tools.col.err.tooltip","Number of runs that failed."),sortable:!0,width:"70px"},{key:"avgExecutionTimeMs",label:c("tools.col.avgTime","Avg Time","tools.col.avgTime.tooltip","Average execution time across recorded calls."),sortable:!0,width:"90px",render:e=>W(e.avgExecutionTimeMs)},{key:"tier",label:c("tools.col.tier","Tier","tools.col.tierStats.tooltip","Basic, Pro, or Mixed summary for the tool statistics row."),sortable:!0,width:"70px",render:e=>s.jsx(M,{text:e.tier==="mixed"?t("tools.tier.mixed.tooltip","This tool includes both Basic and Pro actions."):"",children:s.jsx("span",{className:e.tier==="pro"?o.tierPro:e.tier==="mixed"?o.tierMixed:o.tierBasic,children:A(t,e.tier)})})}],[t,c]),v=n.useMemo(()=>{if(!i.statistics)return null;const e=i.statistics.tierSummary.basic.totalCalls,r=i.statistics.tierSummary.pro.totalCalls,l=e+r;if(l===0)return null;const b=Math.round(e/l*100),S=100-b;return{basic:e,pro:r,basicPct:b,proPct:S}},[i.statistics]),G=n.useCallback(e=>{R(r=>r===e?null:e)},[]),et=n.useCallback(async()=>{if(w){f(!0);try{w==="history"?await i.clearHistory():await i.clearStatistics(),j(t("toast.clearSuccess","Cleared successfully"),"success"),h(null)}catch{j(t("toast.clearFailed","Failed to clear data"),"error")}finally{f(!1)}}},[w,j,t,i]),st=n.useCallback(e=>{const r=e==="history"?"tools_history":"tools_statistics";a("dashboard_click_event",{click_target:e==="history"?"tools_tab_history":"tools_tab_statistics",page:"tools",tab:r}),x({page:"tools",tab:r}),B(e)},[a,x]),ot=n.useCallback(e=>{const r=Ce(e),l=Se(e);return s.jsxs("div",{className:o.expandedRow,children:[s.jsxs("div",{className:o.expandedSection,children:[s.jsxs("strong",{children:[s.jsx(M,{text:t("tools.detail.params.tooltip","Input parameters passed to this tool run."),children:t("tools.detail.params","Parameters")}),":"]}),s.jsx("pre",{className:o.pre,children:JSON.stringify(e.parameters,null,2)})]}),e.result&&s.jsxs("div",{className:o.expandedSection,children:[s.jsxs("strong",{children:[s.jsx(M,{text:t("tools.detail.result.tooltip","Returned result payload for this tool run."),children:t("tools.detail.result","Result")}),":"]}),s.jsx("pre",{className:o.pre,children:JSON.stringify(e.result,null,2)})]}),l?s.jsxs("div",{className:o.expandedSection,children:[s.jsx("strong",{children:t("tools.history.routing","Routing")}),s.jsxs("div",{className:o.detailList,children:[g(t("tools.history.routing.mode","Mode"),l.selectionMode),g(t("tools.history.routing.requested","Requested"),Te(l,t)),g(t("tools.history.routing.actual","Actual"),Ne(l))]})]}):null,(e.status==="fallback"||e.status==="unsupported"||e.status==="warning"||e.status==="error")&&s.jsx("div",{className:o.expandedSection,children:s.jsxs("div",{className:o.detailList,children:[e.status==="fallback"&&(r==null?void 0:r.requestedCommand)&&g(t("tools.detail.requestedCommand","Requested Command"),r.requestedCommand),e.status==="fallback"&&(r==null?void 0:r.executedCommand)&&g(t("tools.detail.executedCommand","Executed Command"),r.executedCommand),e.status==="fallback"&&(r==null?void 0:r.alternatives)&&g(t("tools.detail.alternatives","Alternatives"),r.alternatives.join(", ")),e.status==="unsupported"&&e.blockedMessage&&g(t("tools.detail.blockedMessage","Blocked Reason"),e.blockedMessage),e.status==="unsupported"&&g(t("tools.detail.noFallback","No Fallback"),t("tools.detail.noFallback.value","No fallback ran.")),e.status==="warning"&&e.warningMessage&&g(t("tools.detail.warningMessage","Warning Message"),e.warningMessage),e.status==="error"&&e.errorMessage&&g(t("tools.detail.errorMessage","Error Message"),e.errorMessage),e.status==="error"&&e.blockedMessage&&g(t("tools.detail.blockedMessage","Blocked Reason"),e.blockedMessage),e.status==="error"&&e.fallbackCommand&&g(t("tools.detail.executedCommand","Executed Command"),e.fallbackCommand)]})})]})},[t]),at=["history","statistics"].map(e=>({key:e,label:t(`tools.tab.${e}`,e.charAt(0).toUpperCase()+e.slice(1))}));return s.jsxs("div",{className:o.page,children:[s.jsx(pt,{title:t("page.tools.title","Tools"),description:t("page.tools.description","Inspect tool history, outcomes, fallback details, and usage statistics."),helpTopicId:"tools"}),s.jsx(mt,{surface:"tools",selectable:!0,selectedPlaceId:z,onSelectedPlaceIdChange:e=>{P(e),i.setHistoryOffset(0)}}),s.jsx(bt,{items:at,value:k,onChange:st}),k==="history"&&s.jsxs("div",{className:o.card,children:[s.jsxs("div",{className:o.cardToolbar,children:[s.jsx("div",{className:o.sectionTitle,children:t("tools.tab.history","History")}),s.jsx("button",{className:o.dangerButton,onClick:()=>{a("dashboard_click_event",{click_target:"tools_clear_history",page:"tools",tab:"tools_history"}),h("history")},children:t("common.clear","Clear")})]}),s.jsx("div",{className:o.filterRow,children:s.jsxs("label",{className:o.filterLabel,children:[t("tools.filter.tool","Tool"),":",s.jsxs("select",{className:o.filterSelect,value:i.historyToolFilter,onChange:e=>{i.setHistoryToolFilter(e.target.value),i.setHistoryOffset(0)},children:[s.jsx("option",{value:"",children:t("tools.filter.all","All")}),V.map(e=>s.jsx("option",{value:e,children:e},e))]})]})}),s.jsx(kt,{columns:H,data:i.history,rowKey:e=>e.id,onRowClick:e=>u(r=>r===e.id?null:e.id),emptyMessage:t("tools.empty.history","No tool history entries for this place"),expandedKey:N,renderExpandedRow:ot}),s.jsxs("div",{className:o.pagination,children:[s.jsx("button",{className:o.btn,disabled:i.historyOffset===0,title:t("tools.page.prev.tooltip","Go to the previous page of tool history results."),onClick:()=>i.setHistoryOffset(Math.max(0,i.historyOffset-K)),children:t("tools.page.prev","Prev")}),s.jsxs("span",{className:o.pageInfo,children:[i.historyOffset+1,"–",Math.min(i.historyOffset+K,i.historyTotal)," / ",i.historyTotal]}),s.jsx("button",{className:o.btn,disabled:!i.historyHasMore,title:t("tools.page.next.tooltip","Go to the next page of tool history results."),onClick:()=>i.setHistoryOffset(i.historyOffset+K),children:t("tools.page.next","Next")})]})]}),k==="statistics"&&s.jsxs("div",{className:o.card,children:[s.jsxs("div",{className:o.cardToolbar,children:[s.jsx("div",{className:o.sectionTitle,children:t("tools.tab.statistics","Statistics")}),s.jsx("button",{className:o.dangerButton,onClick:()=>{a("dashboard_click_event",{click_target:"tools_clear_statistics",page:"tools",tab:"tools_statistics"}),h("statistics")},children:t("common.clear","Clear")})]}),v&&s.jsxs("div",{className:o.tierDistribution,children:[s.jsxs("div",{className:o.tierBarWrap,children:[s.jsx("div",{className:o.tierBarBasic,style:{width:`${v.basicPct}%`}}),s.jsx("div",{className:o.tierBarPro,style:{width:`${v.proPct}%`}})]}),s.jsxs("div",{className:o.tierLabels,children:[s.jsxs("span",{children:[A(t,"basic")," ",v.basicPct,"% (",v.basic,")"]}),s.jsxs("span",{children:[A(t,"pro")," ",v.proPct,"% (",v.pro,")"]})]})]}),s.jsx("div",{className:o.statsTableWrap,children:s.jsxs("table",{className:o.statsTable,children:[s.jsx("thead",{children:s.jsx("tr",{children:I.map(e=>s.jsxs("th",{style:e.width?{width:e.width}:void 0,className:e.sortable?o.sortableHeader:void 0,onClick:e.sortable?()=>U(e.key):void 0,children:[s.jsx("span",{children:e.label}),e.sortable&&L===e.key&&s.jsx("span",{className:o.sortArrow,children:m==="asc"?"▴":"▾"})]},e.key))})}),s.jsx("tbody",{children:C.length===0?s.jsx("tr",{children:s.jsx("td",{colSpan:I.length,className:o.emptyStats,children:t("tools.empty.stats","No tool statistics for this place")})}):C.map(e=>{const r=E===e.toolName;return s.jsxs(n.Fragment,{children:[s.jsxs("tr",{className:o.statsToolRow,onClick:()=>G(e.toolName),children:[s.jsx("td",{children:s.jsxs("button",{type:"button",className:o.expandButton,"aria-expanded":r,"aria-label":`${e.toolName} ${r?t("common.collapse","Collapse"):t("common.expand","Expand")}`,onClick:l=>{l.stopPropagation(),G(e.toolName)},children:[s.jsx("span",{className:o.expandIcon,"aria-hidden":"true",children:r?"▾":"▸"}),s.jsx("span",{children:e.toolName})]})}),s.jsx("td",{children:e.totalCalls}),s.jsx("td",{children:e.successCount}),s.jsx("td",{children:e.fallbackCount}),s.jsx("td",{children:e.unsupportedCount}),s.jsx("td",{children:e.warningCount}),s.jsx("td",{children:e.failureCount}),s.jsx("td",{children:W(e.avgExecutionTimeMs)}),s.jsx("td",{children:s.jsx(M,{text:e.tier==="mixed"?t("tools.tier.mixed.tooltip","This tool includes both Basic and Pro actions."):"",children:s.jsx("span",{className:e.tier==="pro"?o.tierPro:e.tier==="mixed"?o.tierMixed:o.tierBasic,children:A(t,e.tier)})})})]}),r&&e.commands.map(l=>s.jsxs("tr",{className:o.statsActionRow,children:[s.jsx("td",{children:s.jsx("span",{className:o.actionLabel,children:l.label})}),s.jsx("td",{children:l.totalCalls}),s.jsx("td",{children:l.successCount}),s.jsx("td",{children:l.fallbackCount}),s.jsx("td",{children:l.unsupportedCount}),s.jsx("td",{children:l.warningCount}),s.jsx("td",{children:l.failureCount}),s.jsx("td",{children:W(l.avgExecutionTimeMs)}),s.jsx("td",{children:s.jsx("span",{className:l.tier==="pro"?o.tierPro:o.tierBasic,children:A(t,l.tier)})})]},`${e.toolName}:${l.commandName}`))]},e.toolName)})})]})}),i.statistics&&s.jsxs("div",{className:o.summaryLine,children:[t("tools.summary.total","Total"),": ",i.statistics.totalCalls," ",t("tools.summary.calls","calls")," | ",t("tools.summary.sessions","Sessions"),": ",i.statistics.totalSessions]})]}),s.jsx(ht,{open:w!==null,title:w==="history"?t("tools.clear.history.title","Clear history?"):t("tools.clear.statistics.title","Clear statistics?"),message:w==="history"?t("tools.clear.history.message","This permanently removes the current place tools history."):t("tools.clear.statistics.message","This permanently resets the current place tool statistics."),cancelLabel:t("common.cancel","Cancel"),confirmLabel:t("common.clear","Clear"),loading:y,onCancel:()=>!y&&h(null),onConfirm:et})]})}export{Ie as Component};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{j as r,k as s}from"./index-
|
|
1
|
+
import{j as r,k as s}from"./index-BDJHcdyQ.js";function p({text:o,children:t}){return r.jsx(s,{text:o,children:t})}export{p as T};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import{i as Se,n as q,q as Le,r as m,u as M,j as t,e as H,R as $e,X as Ee,T as fe,h as He,t as Oe}from"./index-BDJHcdyQ.js";import{I as G}from"./InfoLabel-BUXacsTE.js";import{T as y}from"./TooltipText-DaLR7eg1.js";import{C as Fe,P as Ue}from"./PageHeader-B0qiATU4.js";import{D as se,c as ne,e as ze,g as qe,h as Ve,i as le,j as je,k as We,l as ce,d as Ke}from"./sample-requests-Fif4AVnz.js";import{T as Qe}from"./Tabs-DqGYr78-.js";import{C as Ye}from"./CurrentPlaceScope-CuZXV9Ku.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 Je=[["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"}]],Xe=Se("camera",Je);/**
|
|
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 Ze=[["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"}]],et=Se("ellipsis",Ze);async function be(e){const i=await fetch(`${q}${e}`);if(!i.ok){let a=null;try{a=await i.json()}catch{}throw new Le(i.status,(a==null?void 0:a.message)??i.statusText,(a==null?void 0:a.error)??null,a)}return await i.json()}function O(e){return typeof e=="number"&&Number.isFinite(e)?e:0}function tt(e){return e.design_check_summary?{priority_high:O(e.design_check_summary.priority_high),priority_medium:O(e.design_check_summary.priority_medium),priority_low:O(e.design_check_summary.priority_low)}:e.lint_summary?{priority_high:O(e.lint_summary.errors),priority_medium:O(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 ve(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{...ve(e),check_results:i.map(it),image_url:e.image_url,meta:e.meta}}async function ue(e,i){const a=new URLSearchParams;i!==void 0&&a.set("limit",String(i));const o=a.toString()?`?${a.toString()}`:"",l=await be(`/api/ui-studio/snapshots${o}`);return{...l,snapshots:l.snapshots.map(ve)}}async function rt(e,i){const a=i!==void 0?`?placeId=${i}`:"",o=await be(`/api/ui-studio/snapshots/${encodeURIComponent(e)}${a}`);return at(o)}function Ce(e,i){const a=i!==void 0?`?placeId=${i}`:"";return`${q}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image${a}`}const st=1e4;function we(e=50){const[i,a]=m.useState(null),[o,l]=m.useState(!0),[r,n]=m.useState(null),p=m.useCallback(async()=>{try{const u=await ue(void 0,e);a(u),n(null)}catch(u){n(u instanceof Error?u.message:String(u))}finally{l(!1)}},[e]);return m.useEffect(()=>{let u=!1;const g=async()=>{try{const h=await ue(void 0,e);u||(a(h),n(null))}catch(h){u||n(h instanceof Error?h.message:String(h))}finally{u||l(!1)}};g();const _=setInterval(()=>{g()},st);return()=>{u=!0,clearInterval(_)}},[e]),{data:i,loading:o,error:r,refresh:p}}const ot="_page_1aicj_2",nt="_grid_1aicj_9",lt="_card_1aicj_16",ct="_cardBodyButton_1aicj_31",ut="_thumb_1aicj_48",dt="_badges_1aicj_57",ht="_priorityHighBadge_1aicj_65",pt="_priorityMediumBadge_1aicj_66",mt="_priorityLowBadge_1aicj_67",_t="_cardMeta_1aicj_97",gt="_target_1aicj_103",yt="_time_1aicj_110",xt="_drawer_1aicj_115",St="_drawerToolbar_1aicj_132",ft="_drawerTitleBlock_1aicj_143",jt="_drawerEyebrow_1aicj_150",bt="_drawerTarget_1aicj_159",vt="_drawerToolbarActions_1aicj_169",Ct="_closeBtn_1aicj_177",wt="_detailBody_1aicj_198",It="_screenshotPreviewFrame_1aicj_205",Nt="_fullImg_1aicj_218",Pt="_metaDl_1aicj_225",kt="_errorMsg_1aicj_237",Tt="_suggestionsWrap_1aicj_242",Bt="_prioritySection_1aicj_249",Dt="_sectionHighHeader_1aicj_253",Gt="_sectionLowHeader_1aicj_259",Mt="_sectionMediumHeader_1aicj_265",At="_groupCard_1aicj_271",Rt="_groupHeader_1aicj_278",Lt="_groupLabel_1aicj_294",$t="_groupCount_1aicj_299",Et="_groupChevron_1aicj_306",Ht="_groupBody_1aicj_310",Ot="_groupDescription_1aicj_313",Ft="_groupFix_1aicj_318",Ut="_falsePositive_1aicj_327",zt="_itemList_1aicj_335",qt="_suggestionItem_1aicj_343",Vt="_suggestionInfo_1aicj_353",Wt="_pathBreadcrumb_1aicj_359",Kt="_currentValue_1aicj_368",Qt="_copyFixBtn_1aicj_372",Yt="_emptySuggestions_1aicj_386",Jt="_sampleBanner_1aicj_394",Xt="_sampleBannerRow_1aicj_407",Zt="_sampleBannerMain_1aicj_415",ei="_sampleBadge_1aicj_423",ti="_sampleTitle_1aicj_433",ii="_sampleMessage_1aicj_440",ai="_sampleActions_1aicj_447",ri="_primaryAction_1aicj_455",si="_secondaryAction_1aicj_456",oi="_emptyState_1aicj_491",ni="_pluginGuideCard_1aicj_499",li="_pluginGuideMarker_1aicj_510",ci="_pluginGuideBody_1aicj_525",ui="_pluginGuideTitle_1aicj_529",di="_pluginGuideMessage_1aicj_537",hi="_pluginGuideChecklist_1aicj_544",pi="_pluginGuideWaiting_1aicj_567",mi="_pluginGuideDot_1aicj_576",_i="_analysisWorkspace_1aicj_584",gi="_analysisMainColumn_1aicj_589",yi="_analysisDetailPopupLayer_1aicj_593",xi="_analysisDetailDialog_1aicj_610",Si="_analysisSummaryPanel_1aicj_629",fi="_recentCapturesHeader_1aicj_642",ji="_analysisSummaryText_1aicj_649",bi="_recentCapturesMeta_1aicj_650",vi="_analysisReportGrid_1aicj_656",Ci="_analysisReportGroup_1aicj_663",wi="_analysisReportCard_1aicj_667",Ii="_analysisReportThumb_1aicj_689",Ni="_analysisReportBody_1aicj_698",Pi="_analysisReportTopline_1aicj_705",ki="_analysisVerdict_1aicj_712",Ti="_analysisVerdict_needsFix_1aicj_723",Bi="_analysisVerdict_review_1aicj_724",Di="_analysisVerdict_passed_1aicj_729",Gi="_analysisReportCounts_1aicj_734",Mi="_analysisReportTarget_1aicj_739",Ai="_analysisReportIssue_1aicj_748",Ri="_analysisReportMeta_1aicj_754",Li="_analysisChildList_1aicj_761",$i="_analysisChildRow_1aicj_772",Ei="_analysisChildPath_1aicj_793",Hi="_analysisChildSummary_1aicj_802",Oi="_analysisChildDetailHint_1aicj_803",Fi="_drawerAnalysisSummary_1aicj_812",Ui="_drawerAnalysisSummaryItem_1aicj_823",zi="_drawerAnalysisLabel_1aicj_830",qi="_drawerAnalysisCounts_1aicj_836",Vi="_drawerAnalysisValue_1aicj_837",Wi="_recentCapturesSection_1aicj_842",Ki="_drawerPrimaryActions_1aicj_854",Qi="_drawerActionBtn_1aicj_861",Yi="_drawerMoreMenu_1aicj_890",Ji="_drawerMoreButton_1aicj_895",Xi="_drawerMoreMenuBody_1aicj_920",Zi="_drawerMenuItem_1aicj_933",ea="_drawerMenuItemDanger_1aicj_956",ta="_actionErrMsg_1aicj_965",ia="_actionStatusMsg_1aicj_974",aa="_actionStatus_info_1aicj_988",ra="_actionStatus_success_1aicj_994",sa="_actionStatus_warning_1aicj_1000",oa="_actionStatusDetail_1aicj_1006",na="_galleryHeader_1aicj_1012",la="_cardChecked_1aicj_1025",ca="_cardCheckbox_1aicj_1032",ua="_captureSelectionActions_1aicj_1047",da="_selectionToolbar_1aicj_1056",ha="_selectionBar_1aicj_1057",pa="_selectionToolbarCount_1aicj_1076",ma="_selectionToolbarActions_1aicj_1083",_a="_selectionBarBtn_1aicj_1090",ga="_selectionBarBtnDanger_1aicj_1116",s={page:ot,grid:nt,card:lt,cardBodyButton:ct,thumb:ut,badges:dt,priorityHighBadge:ht,priorityMediumBadge:pt,priorityLowBadge:mt,cardMeta:_t,target:gt,time:yt,drawer:xt,drawerToolbar:St,drawerTitleBlock:ft,drawerEyebrow:jt,drawerTarget:bt,drawerToolbarActions:vt,closeBtn:Ct,detailBody:wt,screenshotPreviewFrame:It,fullImg:Nt,metaDl:Pt,errorMsg:kt,suggestionsWrap:Tt,prioritySection:Bt,sectionHighHeader:Dt,sectionLowHeader:Gt,sectionMediumHeader:Mt,groupCard:At,groupHeader:Rt,groupLabel:Lt,groupCount:$t,groupChevron:Et,groupBody:Ht,groupDescription:Ot,groupFix:Ft,falsePositive:Ut,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:ui,pluginGuideMessage:di,pluginGuideChecklist:hi,pluginGuideWaiting:pi,pluginGuideDot:mi,analysisWorkspace:_i,analysisMainColumn:gi,analysisDetailPopupLayer:yi,analysisDetailDialog:xi,analysisSummaryPanel:Si,recentCapturesHeader:fi,analysisSummaryText:ji,recentCapturesMeta:bi,analysisReportGrid:vi,analysisReportGroup:Ci,analysisReportCard:wi,analysisReportThumb:Ii,analysisReportBody:Ni,analysisReportTopline:Pi,analysisVerdict:ki,analysisVerdict_needsFix:Ti,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:Fi,drawerAnalysisSummaryItem:Ui,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:ua,selectionToolbar:da,selectionBar:ha,selectionToolbarCount:pa,selectionToolbarActions:ma,selectionBarBtn:_a,selectionBarBtnDanger:ga};function ya({snapshot:e,placeId:i,onClick:a,imageUrlOverride:o,selectable:l,selected:r,onToggleSelect:n}){var b,C,A;const{t:p}=M(),u=((b=e.design_check_summary)==null?void 0:b.priority_high)??0,g=((C=e.design_check_summary)==null?void 0:C.priority_medium)??0,_=((A=e.design_check_summary)==null?void 0:A.priority_low)??0,h=new Date(e.captured_at*1e3).toLocaleString(),S=o??Ce(e.snapshot_id,i),j=()=>{n==null||n(e.snapshot_id)};return t.jsxs("div",{className:`${s.card} ${r?s.cardChecked:""}`,children:[l&&t.jsx(y,{text:p("uiStudio.gallery.cardCheckbox.tooltip","Select this capture. Pick multiple to delete them together."),children:t.jsx(Fe,{className:s.cardCheckbox,"aria-label":p("uiStudio.gallery.cardCheckbox","Select screenshot"),checked:!!r,onChange:j})}),t.jsxs("button",{className:s.cardBodyButton,onClick:w=>a(w.currentTarget),type:"button",children:[t.jsx("img",{className:s.thumb,src:S,alt:e.snapshot_id,loading:"lazy"}),t.jsxs("div",{className:s.badges,children:[u>0&&t.jsx(y,{text:p("uiStudio.gallery.priorityHighBadge.tooltip","Number of suggestions to review first. Click for details."),children:t.jsx("span",{className:s.priorityHighBadge,children:u})}),g>0&&t.jsx(y,{text:p("uiStudio.gallery.priorityMediumBadge.tooltip","Number of recommended suggestions."),children:t.jsx("span",{className:s.priorityMediumBadge,children:g})}),_>0&&t.jsx(y,{text:p("uiStudio.gallery.priorityLowBadge.tooltip","Number of optional improvements."),children:t.jsx("span",{className:s.priorityLowBadge,children:_})})]}),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:h})]})]})]})}const xa={touch_target:"touchTarget",contrast:"contrast",text_scaled:"textScaled",safezone:"safezone",min_text_size:"minTextSize"};function Sa(e){return e.rule==="contrast"&&/\.(Icon|Avatar|EmptyIcon|GoldIcon|[A-Za-z]*Icon)$/.test(e.path)}const fa={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 o=xa[e];return o?{...i,checkLabel:a(`uiStudio.fix.${o}.label`,i.checkLabel),description:a(`uiStudio.fix.${o}.description`,i.description),howToFix:a(`uiStudio.fix.${o}.howToFix`,i.howToFix),falsePositiveNote:i.falsePositiveNote?a(`uiStudio.fix.${o}.falsePositive`,i.falsePositiveNote):void 0}:i}function ba(e,i){const a=fa[e]??null;return a?i?ja(e,a,i):a:null}function va(e){return Sa(e)}function Ca(e,i){const a=new Map;for(const l of e){const r=`${l.displayPriority}::${l.rule}`,n=a.get(r)??[];n.push(l),a.set(r,n)}const o=[];for(const[l,r]of a){const[n,p]=l.split("::"),u=r.filter(va).length;o.push({rule:p??"unknown",priority:n,items:r,fixTemplate:ba(p??"",i),falsePositiveRatio:r.length>0?u/r.length:0})}return o.sort((l,r)=>{const n={priority_high:0,priority_medium:1,priority_low:2};return l.priority!==r.priority?n[l.priority]-n[r.priority]:r.items.length-l.items.length}),{high:o.filter(l=>l.priority==="priority_high"),medium:o.filter(l=>l.priority==="priority_medium"),low:o.filter(l=>l.priority==="priority_low")}}function Ie(e){const i=e.split("."),a=i[i.length-1]??e,o=i[i.length-2],l=o?`${o} > ${a}`:a;return{full:e,breadcrumb:l,leaf:a}}function Ne(e){return typeof e=="object"&&e!==null}function de(e){return Ne(e.data)?e.data:{}}function Z(e,i){const a=e[i];return Ne(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 wa(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 Pe(e,wa(i))}function F(e,i,a,o,l){const r=e(i,a);return l?`${r}: ${l} · ${o}`:`${r}: ${o}`}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 Pe(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 Pe(e,i.design_check_summary)}function ka({snapshotId:e,placeId:i,onClose:a,sampleDetail:o,tier:l,onActionDone:r}){const[n,p]=m.useState(o??null),[u,g]=m.useState(null),[_,h]=m.useState(null),[S,j]=m.useState(null),[b,C]=m.useState(null),[A,w]=m.useState(null),{t:d}=M(),{trackEvent:T}=H(),N=l==="pro";m.useEffect(()=>{if(o){p(o),g(null);return}let v=!1;return rt(e,i).then(B=>{v||p(B)}).catch(B=>{v||g(B instanceof Error?B.message:String(B))}),()=>{v=!0}},[e,i,o]);const f=async()=>{if(n!=null&&n.target){T("dashboard_click_event",{click_target:"ui_studio_capture_current",page:"ui-studio",tab:"ui_studio_analysis"}),h(null),C("preview"),j({tone:"info",message:d("uiStudio.actions.previewRunning","캡처 중..."),detail:d("uiStudio.actions.previewRunningDetail","완료되면 새 화면 캡처 파일 ID를 표시합니다.")});try{const v=await ne("preview",{targetPath:n.target,placeId:i});he(v);const B=de(v),L=V(B,"snapshot_id"),x=Z(B,"screenshot"),R=Z(B,"meta"),D=V(x,"saved_path"),oe=V(R,"persist_warning"),U=pe(d,B);j(oe?{tone:"warning",message:F(d,"uiStudio.actions.previewNeedsSaveCheck","캡처 완료, 저장 확인 필요",U,L),detail:oe}:L&&D?{tone:"success",message:F(d,"uiStudio.actions.previewSaved","새 화면 캡처 저장 완료",U,L),detail:d("uiStudio.actions.previewSavedDetail","기존 화면 캡처는 변경하지 않고 새 파일로 저장했습니다.")}:L?{tone:"warning",message:F(d,"uiStudio.actions.previewComplete","캡처 완료",U,L),detail:d("uiStudio.actions.previewSavedPathMissing","새 화면 캡처 ID는 받았지만 저장 경로를 확인하지 못했습니다.")}:{tone:"warning",message:F(d,"uiStudio.actions.previewComplete","캡처 완료",U),detail:d("uiStudio.actions.previewSnapshotIdMissing","새 화면 캡처 ID를 확인하지 못했습니다. 목록을 새로고침해 저장 여부를 확인해 주세요.")}),await(r==null?void 0:r())}catch(v){h(v instanceof Error?v.message:String(v))}finally{C(null)}}},k=async()=>{if(n!=null&&n.target){T("dashboard_click_event",{click_target:"ui_studio_check_again",page:"ui-studio",tab:"ui_studio_analysis"}),h(null),C("check"),j({tone:"info",message:d("uiStudio.actions.designCheckRunning","개선 제안 확인 중..."),detail:d("uiStudio.actions.designCheckRunningDetail","완료되면 우선 검토/검토 권장/선택 개선 항목 수를 표시합니다.")});try{const v=await ne("check",{targetPath:n.target,placeId:i});he(v);const B=de(v),L=pe(d,B);j({tone:"success",message:F(d,"uiStudio.actions.designCheckComplete","개선 제안 확인 완료",L),detail:d("uiStudio.actions.designCheckNoSnapshotSaved","이 작업은 화면 캡처 파일을 새로 저장하지 않습니다.")}),await(r==null?void 0:r())}catch(v){h(v instanceof Error?v.message:String(v))}finally{C(null)}}},E=async()=>{h(null),j(null);try{await ze(i,e),await(r==null?void 0:r()),w(null),a()}catch(v){throw h(v instanceof Error?v.message:String(v)),v}},I=N?void 0:d("uiStudio.actions.proRequired","Pro에서 사용 가능"),P=n!=null&&n.target?Ie(n.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:d("uiStudio.analysis.detailDialog","Analysis detail")}),t.jsx("span",{className:s.drawerTarget,title:(P==null?void 0:P.full)??e,children:(P==null?void 0:P.breadcrumb)??e})]}),t.jsxs("div",{className:s.drawerToolbarActions,children:[n&&t.jsxs(t.Fragment,{children:[t.jsxs("div",{className:s.drawerPrimaryActions,children:[t.jsx(y,{text:I??d("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 f(),disabled:!N||!n.target||b!==null,type:"button",children:[t.jsx(Xe,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:d("uiStudio.actions.captureCurrentState","현재 상태 캡처")})]})}),t.jsx(y,{text:I??d("uiStudio.actions.checkSuggestionsAgain.tooltip","Recompute suggestions for this capture without taking a new screenshot."),children:t.jsxs("button",{className:s.drawerActionBtn,onClick:()=>void k(),disabled:!N||!n.target||b!==null,type:"button",children:[t.jsx($e,{size:15,"aria-hidden":"true"}),t.jsx("span",{children:d("uiStudio.actions.checkSuggestionsAgain","개선 제안 다시 확인")})]})})]}),t.jsxs("details",{className:s.drawerMoreMenu,children:[t.jsx("summary",{className:s.drawerMoreButton,title:d("uiStudio.actions.more.tooltip","Open additional actions."),"aria-label":d("uiStudio.actions.more","More"),children:t.jsx(et,{size:18,"aria-hidden":"true"})}),t.jsx("div",{className:s.drawerMoreMenuBody,children:t.jsx(y,{text:I??d("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("dashboard_click_event",{click_target:"ui_studio_delete_snapshot",page:"ui-studio",tab:"ui_studio_analysis"}),w("deleteSnapshot")},disabled:!N,type:"button",children:d("uiStudio.actions.deleteSnapshot","이 화면 캡처 삭제")})})})]})]}),t.jsx(y,{text:d("uiStudio.detailClose.tooltip","Close this detail panel."),children:t.jsx("button",{className:s.closeBtn,onClick:a,type:"button","aria-label":d("uiStudio.detailClose","Close"),children:t.jsx(Ee,{size:18,"aria-hidden":"true"})})})]})]}),u&&t.jsx("div",{className:s.errorMsg,children:u}),n&&t.jsxs("div",{className:s.detailBody,children:[_&&t.jsx("div",{className:s.actionErrMsg,children:_}),S&&t.jsxs("div",{className:`${s.actionStatusMsg} ${s[`actionStatus_${S.tone}`]??""}`,children:[t.jsx("div",{children:S.message}),S.detail&&t.jsx("div",{className:s.actionStatusDetail,children:S.detail})]}),t.jsx(Ta,{detail:n}),t.jsx("div",{className:s.screenshotPreviewFrame,"data-testid":"analysis-screenshot-preview",children:t.jsx("img",{className:s.fullImg,src:n.image_url,alt:n.snapshot_id})}),t.jsx(Ba,{items:n.check_results}),t.jsxs("dl",{className:s.metaDl,children:[t.jsx("dt",{children:t.jsx(G,{label:d("uiStudio.capturedAt","Captured"),tooltip:d("uiStudio.capturedAt.tooltip","When this screen was captured.")})}),t.jsx("dd",{children:new Date(n.captured_at*1e3).toLocaleString()}),t.jsx("dt",{children:t.jsx(G,{label:d("uiStudio.scope","Scope"),tooltip:d("uiStudio.scope.tooltip","Capture scope (full screen or a specific UI).")})}),t.jsx("dd",{children:n.scope}),n.target&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{children:t.jsx(G,{label:d("uiStudio.target","Target"),tooltip:d("uiStudio.target.tooltip","Exact path of the captured UI instance.")})}),t.jsx("dd",{children:n.target})]}),n.brief_id&&t.jsxs(t.Fragment,{children:[t.jsx("dt",{children:t.jsx(G,{label:d("uiStudio.briefId","Brief"),tooltip:d("uiStudio.briefId.tooltip","Identifier of the design brief that produced this UI.")})}),t.jsx("dd",{children:n.brief_id})]})]})]}),A==="deleteSnapshot"&&t.jsx(se,{title:d("uiStudio.confirm.deleteSnapshotTitle","화면 캡처 삭제"),message:d("uiStudio.confirm.deleteSnapshotMessage","이 화면 캡처 파일만 삭제됩니다 (Studio 인스턴스 보존)."),danger:!0,confirmLabel:d("common.delete","삭제"),onConfirm:E,onClose:()=>w(null)})]})}function Ta({detail:e}){const{t:i}=M(),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(G,{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(G,{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}=M();if(e.length===0)return t.jsx("p",{className:s.emptySuggestions,children:i("uiStudio.noSuggestions","현재 개선 제안 없음")});const{high:a,medium:o,low:l}=Ca(e,i);return t.jsxs("div",{className:s.suggestionsWrap,children:[t.jsx("h3",{children:t.jsx(G,{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}`))]}),o.length>0&&t.jsxs("section",{className:s.prioritySection,children:[t.jsx("h4",{className:s.sectionMediumHeader,children:i("uiStudio.mediumPrioritySection","검토 권장")}),o.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 n,p,u;const{t:i}=M(),[a,o]=m.useState(e.priority==="priority_high"&&e.items.length<=5),l=e.falsePositiveRatio>=.5&&!!((n=e.fixTemplate)!=null&&n.falsePositiveNote),r=((p=e.fixTemplate)==null?void 0:p.checkLabel)??e.rule;return t.jsxs("div",{className:s.groupCard,children:[t.jsx(y,{text:i("uiStudio.suggestionGroup.tooltip","Suggestions of the same kind grouped together. Click to expand or collapse."),children:t.jsxs("button",{className:s.groupHeader,onClick:()=>o(g=>!g),type:"button",children:[t.jsx("span",{className:s.groupLabel,children:r}),t.jsx(y,{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(y,{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"),":"," ",(u=e.fixTemplate)==null?void 0:u.falsePositiveNote]})}),t.jsx("ul",{className:s.itemList,children:e.items.map((g,_)=>t.jsx(Da,{item:g,group:e},`${g.path}-${_}`))})]})]})}function Da({item:e,group:i}){var g;const{t:a}=M(),{trackEvent:o}=H(),[l,r]=m.useState(!1),n=Ie(e.path),p=((g=i.fixTemplate)==null?void 0:g.buildUpdateCommand(e))??null,u=async()=>{if(p)try{await navigator.clipboard.writeText(p),o("dashboard_click_event",{click_target:"ui_studio_copy_ai_instruction",page:"ui-studio",tab:"ui_studio_analysis"}),r(!0),setTimeout(()=>r(!1),2e3)}catch{}};return t.jsxs("li",{className:s.suggestionItem,children:[t.jsxs("div",{className:s.suggestionInfo,children:[t.jsx("code",{className:s.pathBreadcrumb,title:`${a("uiStudio.fullPath","Full path")}: ${n.full}`,children:n.breadcrumb}),t.jsxs("span",{className:s.currentValue,children:[t.jsx(y,{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(y,{text:a("uiStudio.colRecommended.tooltip","The recommended value."),children:t.jsx("span",{children:a("uiStudio.colRecommended","Recommended")})}),": ",t.jsx("strong",{children:String(e.expected)})]})]}),p&&t.jsx(y,{text:a("uiStudio.copyFixCommand.tooltip","Copy a prompt that asks the AI to fix this issue."),children:t.jsx("button",{className:s.copyFixBtn,onClick:u,type:"button",children:l?a("uiStudio.copiedToClipboard","Copied"):a("uiStudio.copyFixCommand","Copy AI instruction")})})]})}function Y(e,i){return Object.entries(i).reduce((a,[o,l])=>a.split(`{${o}}`).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=qe,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 o={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={...o,check_results:Ma.map(n=>({...n,hint:Ga(e,n)})),image_url:ee};return{list:{placeId:0,snapshots:[o],totalCount:1},detail:l}}const Ra=/plugin not connected|sync not started/i;function te(e){return typeof e=="string"&&Ra.test(e)}function Te(){const{t:e}=M();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 Be(e){return e.target??e.scope}function La(e){const i=Be(e),a=i.split(".").filter(l=>l.length>0),o=a.findIndex(l=>l==="StarterGui");return o>=0&&a[o+1]?["StarterGui",a[o+1]].join("."):i}function De(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 De(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,o)=>{const l=o.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=Be(l),n=i.get(r);if(!n){i.set(r,{latest:l,snapshotCount:1});continue}n.snapshotCount+=1,l.captured_at>n.latest.captured_at&&(n.latest=l)}const a=[...i.entries()].map(([l,r])=>({key:l,latest:r.latest,snapshotCount:r.snapshotCount,verdict:$a(r.latest)})),o=new Map;for(const l of a){const r=La(l.latest),n=o.get(r)??[];n.push(l),o.set(r,n)}return[...o.entries()].map(([l,r])=>{var g;const n=r.sort((_,h)=>{const S=me(_.latest)-me(h.latest);return S!==0?S:h.latest.captured_at-_.latest.captured_at}),p=n.reduce((_,h)=>h.latest.captured_at>_.captured_at?h.latest:_,((g=n[0])==null?void 0:g.latest)??r[0].latest),u=Ea(n);return{key:l,latest:p,snapshotCount:n.reduce((_,h)=>_+h.snapshotCount,0),children:n,summary:u,verdict:De(u)}}).sort((l,r)=>{const n=ie(l.summary)-ie(r.summary);return n!==0?n: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 Fa(e,i,a){return`${e("uiStudio.analysis.targetCountLabel","분석 대상")} ${$(e,i)} · ${re(e,"needsFix")} ${$(e,a.hasSuggestions)} · ${re(e,"passed")} ${$(e,a.noSuggestions)}`}function Ua({tier:e}){const{t:i}=M(),{trackEvent:a}=H(),o=e==="basic",l=we(50),r=m.useRef(null),[n,p]=m.useState(null),[u,g]=m.useState(new Set),[_,h]=m.useState(new Set),[S,j]=m.useState(!1),b=m.useCallback((x,R)=>{p(n===x?null:x)},[n]),C=m.useCallback(()=>{p(null)},[]),A=m.useCallback(x=>{g(R=>{const D=new Set(R);return D.has(x)?D.delete(x):D.add(x),D})},[]);m.useEffect(()=>{var R;if(!n)return;(R=r.current)==null||R.focus();const x=D=>{D.key==="Escape"&&!document.getElementById("delete-confirm-title")&&C()};return document.addEventListener("keydown",x),()=>document.removeEventListener("keydown",x)},[C,n]);const w=o?Aa(i):null,d=(w==null?void 0:w.list)??l.data,T=o?!1:l.loading,N=m.useCallback(x=>{h(R=>{const D=new Set(R);return D.has(x)?D.delete(x):D.add(x),D})},[]),f=x=>{h(new Set(x))},k=()=>{h(new Set)},E=async()=>{const x=(d==null?void 0:d.placeId)??0;a("dashboard_click_event",{click_target:"ui_studio_delete_selected_snapshots",page:"ui-studio",tab:"ui_studio_analysis"}),await Ve(x,{ids:[..._]}),await l.refresh(),j(!1),h(new Set)};if(T)return t.jsx("div",{className:s.page,children:i("uiStudio.loading","Loading...")});if(!o&&te(l.error))return t.jsx(Te,{});if(!o&&l.error)return t.jsxs("div",{className:s.page,children:[i("uiStudio.error","Error"),": ",l.error]});const I=(d==null?void 0:d.snapshots)??[],P=(d==null?void 0:d.placeId)??0,v=I.map(x=>x.snapshot_id),B=Ha(I),L=Oa(B);return t.jsxs("div",{children:[t.jsxs("div",{className:s.analysisWorkspace,"data-detail-open":n?"true":"false",children:[t.jsxs("div",{className:s.analysisMainColumn,"data-testid":"analysis-main-column",children:[o&&t.jsx("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.jsx("div",{className:s.sampleActions,children:t.jsx("a",{className:s.primaryAction,href:fe.uiStudioAnalysis,target:"_blank",rel:"noreferrer",onClick:()=>a("dashboard_click_event",{click_target:"upgrade_cta",placement:"ui_studio_analysis_banner",page:"ui-studio",tab:"ui_studio_analysis"}),children:i("tier.upgrade","View Pro")})})]})}),t.jsx("div",{className:s.galleryHeader,children:t.jsx("h1",{children:t.jsx(G,{label:i("uiStudio.title","UI Studio"),tooltip:i("uiStudio.title.tooltip","A central place to review AI-generated UI screens and improvement suggestions.")})})}),I.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(G,{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:Fa(i,B.length,L)})]})}),t.jsx("div",{className:s.analysisReportGrid,"data-testid":"analysis-report-grid",children:B.map(x=>t.jsx(qa,{report:x,placeId:P,imageUrlOverride:o?ee:void 0,expanded:u.has(x.key),onPrimaryClick:R=>{x.children.length>1?A(x.key):b(x.latest.snapshot_id,R)},onChildClick:(R,D)=>b(R,D)},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(G,{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,I.length)]})]}),!o&&I.length>0&&t.jsxs("div",{className:s.captureSelectionActions,children:[t.jsx(y,{text:i("uiStudio.gallery.selectAll.tooltip","Select every visible capture at once."),children:t.jsx("button",{className:s.selectionBarBtn,onClick:()=>f(v),type:"button",children:i("uiStudio.gallery.selectAll","모두 선택")})}),_.size>0&&t.jsxs(t.Fragment,{children:[t.jsxs("span",{className:s.selectionToolbarCount,children:[_.size,i("uiStudio.gallery.selection.selectedCount"," selected")]}),t.jsx(y,{text:i("uiStudio.gallery.clearSelection.tooltip","Clear the current selection."),children:t.jsx("button",{className:s.selectionBarBtn,onClick:k,type:"button",children:i("uiStudio.gallery.clearSelection","선택 해제")})}),t.jsx(y,{text:i("uiStudio.gallery.deleteSelected.tooltip","Delete only the selected capture files. The actual UI in Roblox Studio is not affected."),children:t.jsx("button",{className:`${s.selectionBarBtn} ${s.selectionBarBtnDanger}`,onClick:()=>j(!0),type:"button",children:i("common.delete","삭제")})})]})]})]}),t.jsx("div",{className:s.grid,children:I.map(x=>t.jsx(ya,{snapshot:x,placeId:P,onClick:R=>b(x.snapshot_id,R),imageUrlOverride:o?ee:void 0,selectable:!o,selected:_.has(x.snapshot_id),onToggleSelect:N},x.snapshot_id))})]})]})]}),n&&t.jsx("div",{className:s.analysisDetailPopupLayer,"data-testid":"analysis-detail-popup-layer",onClick:C,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(ka,{snapshotId:n,placeId:P,onClose:C,sampleDetail:o&&n===ke?(w==null?void 0:w.detail)??null:null,tier:e,onActionDone:o?void 0:l.refresh})})})]}),S&&t.jsx(se,{title:i("uiStudio.confirm.deleteBatchTitle","화면 캡처 일괄 삭제"),message:i("uiStudio.confirm.deleteBatchMessage",`선택한 ${_.size}개의 화면 캡처를 삭제합니다. 이 작업은 되돌릴 수 없습니다.`),danger:!0,confirmLabel:i("common.delete","삭제"),onConfirm:E,onClose:()=>j(!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:o,onPrimaryClick:l,onChildClick:r}){const{t:n}=M(),p=e.latest,u=a??Ce(p.snapshot_id,i),g=new Date(p.captured_at*1e3).toLocaleString(),_=re(n,e.verdict),h=e.children.length>1;return t.jsxs("div",{className:s.analysisReportGroup,children:[t.jsxs("button",{className:s.analysisReportCard,"aria-expanded":h?o:void 0,"aria-label":`${e.key} ${h?n("uiStudio.analysis.expandChildren","하위 대상 보기"):n("uiStudio.analysis.openDetail","상세 보기")}`,onClick:S=>l(S.currentTarget),type:"button",children:[t.jsx("img",{className:s.analysisReportThumb,src:u,alt:p.snapshot_id,loading:"lazy"}),t.jsxs("div",{className:s.analysisReportBody,children:[t.jsxs("div",{className:s.analysisReportTopline,children:[t.jsx(y,{text:e.verdict==="passed"?n("uiStudio.analysis.verdict.passed.tooltip","No improvements suggested under the current review thresholds."):n("uiStudio.analysis.verdict.hasSuggestions.tooltip","Some improvements were found in this UI. Click the card for details."),children:t.jsx("span",{className:`${s.analysisVerdict} ${s[`analysisVerdict_${e.verdict}`]??""}`,children:_})}),t.jsx(y,{text:n("uiStudio.analysis.counts.tooltip","Shows how many suggestions are marked review first, recommended, or optional."),children:t.jsx("span",{className:s.analysisReportCounts,children:ae(n,e.summary)})})]}),t.jsx("div",{className:s.analysisReportTarget,children:e.key}),t.jsx("div",{className:s.analysisReportIssue,children:za(n,e.summary)}),t.jsxs("div",{className:s.analysisReportMeta,children:[g," ·"," ",t.jsx(y,{text:n("uiStudio.analysis.thresholds.tooltip","The threshold set used for this review (default or custom)."),children:t.jsx("span",{children:n("uiStudio.analysis.thresholds","검토 기준")})}),": ",p.thresholds_source,e.snapshotCount>1?` · ${n("uiStudio.analysis.captureLabel","캡처")} ${$(n,e.snapshotCount)}`:"",h?` · ${n("uiStudio.analysis.childTargets","하위 대상")} ${$(n,e.children.length)}`:""]})]})]}),h&&o&&t.jsx("div",{className:s.analysisChildList,children:e.children.map(S=>t.jsxs("button",{className:s.analysisChildRow,onClick:j=>r(S.latest.snapshot_id,j.currentTarget),type:"button",children:[t.jsx("span",{className:s.analysisChildPath,children:S.key}),t.jsx("span",{className:s.analysisChildSummary,children:ae(n,S.latest.design_check_summary)}),t.jsx("span",{className:s.analysisChildDetailHint,children:n("uiStudio.analysis.childDetailHint","하위 대상 상세 보기")})]},S.key))})]})}function Va(e,i,a=1e4){const[o,l]=m.useState(null),[r,n]=m.useState(!0),[p,u]=m.useState(null),g=JSON.stringify(i),_=m.useCallback(async()=>{if(e===null){l(null),u(null),n(!1);return}try{const h=await le(e,i);l(h),u(null)}catch(h){u(h.message)}finally{n(!1)}},[e,g]);return m.useEffect(()=>{let h=!0;if(e===null)return l(null),u(null),n(!1),()=>{h=!1};const S=async()=>{try{const b=await le(e,i);h&&(l(b),u(null))}catch(b){h&&u(b.message)}finally{h&&n(!1)}};S();const j=setInterval(()=>{S()},a);return()=>{h=!1,clearInterval(j)}},[e,g,a]),{data:o,loading:r,error:p,refresh:_}}const Wa="_filterBar_8budj_4",Ka="_filterGroup_8budj_14",Qa="_filterLabel_8budj_21",Ya="_filterCheckbox_8budj_28",Ja="_segmentGroup_8budj_45",Xa="_segmentBtn_8budj_55",Za="_segmentBtnActive_8budj_73",er="_filterInput_8budj_79",tr="_filterResetBtn_8budj_95",ir="_requestRow_8budj_114",ar="_requestRowMain_8budj_127",rr="_requestDetailToggle_8budj_134",sr="_thumbPair_8budj_156",or="_thumbPairButton_8budj_164",nr="_thumbSlot_8budj_179",lr="_thumbImg_8budj_204",cr="_thumbPlaceholder_8budj_211",ur="_thumbArrow_8budj_219",dr="_extraPathsBadge_8budj_225",hr="_requestMeta_8budj_239",pr="_requestLabel_8budj_247",mr="_requestTime_8budj_256",_r="_requestStats_8budj_261",gr="_statDot_8budj_269",yr="_summaryPill_8budj_273",xr="_requestActions_8budj_278",Sr="_expandHint_8budj_285",fr="_mutationsArea_8budj_298",jr="_mutLoading_8budj_307",br="_mutEmpty_8budj_308",vr="_mutError_8budj_314",Cr="_mutationRow_8budj_320",wr="_mutationLine_8budj_330",Ir="_mutTs_8budj_337",Nr="_mutCommand_8budj_343",Pr="_mutPath_8budj_349",kr="_mutDiff_8budj_359",Tr="_mutErr_8budj_314",Br="_changeDetails_8budj_374",Dr="_changeDetailRow_8budj_382",Gr="_changeDetailRowNoBefore_8budj_391",Mr="_changeDetailBadge_8budj_395",Ar="_changeDetail_text_8budj_412",Rr="_changeDetail_color_8budj_417",Lr="_changeDetail_size_8budj_422",$r="_changeDetail_layout_8budj_427",Er="_changeDetail_state_8budj_432",Hr="_changeDetail_asset_8budj_437",Or="_changeDetail_property_8budj_442",Fr="_changeDetailProperty_8budj_446",Ur="_changeDetailArrow_8budj_454",zr="_changeDetailOldValue_8budj_460",qr="_changeDetailNewValue_8budj_461",Vr="_compareDialogLayer_8budj_479",Wr="_compareDialog_8budj_479",Kr="_beforeAfterDrawer_8budj_510",Qr="_drawerHeader_8budj_520",Yr="_drawerTitle_8budj_529",Jr="_drawerCloseBtn_8budj_536",Xr="_drawerBody_8budj_552",Zr="_pathTabs_8budj_559",es="_pathTab_8budj_559",ts="_pathTabActive_8budj_588",is="_comparePanel_8budj_594",as="_compareHalf_8budj_604",rs="_compareLabel_8budj_611",ss="_compareImg_8budj_622",os="_comparePlaceholder_8budj_630",ns="_compareDetailsPanel_8budj_642",ls="_compareDetailsHeader_8budj_651",cs="_drawerFooter_8budj_669",us="_drawerActionBtn_8budj_677",ds="_historyTabWrap_8budj_695",hs="_historyWorkspace_8budj_701",ps="_historyMainColumn_8budj_706",ms="_requestList_8budj_710",_s="_emptyHistory_8budj_715",gs="_historyError_8budj_722",ys="_historyLoading_8budj_728",xs="_listHeader_8budj_736",Ss="_listHeaderTitle_8budj_745",fs="_clearBtn_8budj_752",js="_deleteErrBanner_8budj_776",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:ur,extraPathsBadge:dr,requestMeta:hr,requestLabel:pr,requestTime:mr,requestStats:_r,statDot:gr,summaryPill:yr,requestActions:xr,expandHint:Sr,mutationsArea:fr,mutLoading:jr,mutEmpty:br,mutError:vr,mutationRow:Cr,mutationLine:wr,mutTs:Ir,mutCommand:Nr,mutPath:Pr,mutDiff:kr,mutErr:Tr,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:Fr,changeDetailArrow:Ur,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:us,historyTabWrap:ds,historyWorkspace:hs,historyMainColumn:ps,requestList:ms,emptyHistory:_s,historyError:gs,historyLoading:ys,listHeader:xs,listHeaderTitle:Ss,clearBtn:fs,deleteErrBanner:js};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 _e(e){return e==null?"nil":typeof e=="string"?`"${e}"`:typeof e=="object"?JSON.stringify(e):String(e)}function Ge({mutations:e,emptyLabel:i}){const{t:a}=M();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(o=>t.jsx(vs,{mutation:o},o.mutationId))})}function vs({mutation:e}){return t.jsxs("div",{className:c.mutationRow,children:[t.jsxs("div",{className:c.mutationLine,children:[t.jsx("span",{className:c.mutTs,children:bs(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(Cs,{detail:i},`${i.property}:${i.category}`))}),!e.ok&&e.error&&t.jsx("span",{className:c.mutErr,children:e.error})]})}function Cs({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:_e(e.before)}),t.jsx("span",{className:c.changeDetailArrow,children:"→"}),t.jsx("span",{className:c.changeDetailNewValue,children:_e(e.after)})]})}function ge(e,i){return`${q}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image?placeId=${i}`}function ws(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(o=>o.length>0);if(i.length===0)return null;const a=i.findIndex(o=>o==="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 o=i.mutationCount===1?"uiStudio.history.row.pathLabelOne":"uiStudio.history.row.pathLabelMany",l=i.mutationCount===1?"{path} · {n} change detail":"{path} · {n} change details";return e(o,l).replace("{path}",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(o=>typeof o=="string"&&o.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)}`,o=`${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} · ${o} · ${l}`}function Me({req:e,placeId:i,onOpenCompare:a,imageUrlOverride:o,sampleMutations:l}){const{t:r}=M(),[n,p]=m.useState(!1),[u,g]=m.useState(null),[_,h]=m.useState(!1),[S,j]=m.useState(null),b=o!=null,C=e.affectedPaths[0]??null,A=e.affectedPaths.length-1,w=C?e.beforeSnapshots[C]??null:null,d=C?e.afterSnapshots[C]??null:null,T=w?b?o:ge(w,i):null,N=d?b?o:ge(d,i):null,f=Ns(r,e.qualityPlanSummary),k=Ps(r,e.postChangeDesignCheckSummary),E=async()=>{if(!n&&u===null)if(b&&l!=null)g(l);else{h(!0),j(null);try{const I=await je(i,e.requestId);g(I.mutations)}catch(I){j(I.message)}finally{h(!1)}}p(I=>!I)};return t.jsxs("div",{className:c.requestRow,children:[t.jsxs("div",{className:c.requestRowMain,children:[t.jsx(y,{text:r("uiStudio.history.row.compare.tooltip","Compare the before and after screens. Click to open the full comparison view."),children:t.jsxs("button",{className:`${c.thumbPair} ${c.thumbPairButton}`,onClick:I=>a(I.currentTarget),disabled:!C,"aria-label":`${J(r,e)} ${r("uiStudio.history.row.compare","Before / After")}`,type:"button",children:[t.jsx("div",{className:c.thumbSlot,children:T?t.jsx("img",{className:c.thumbImg,src:T,alt:r("uiStudio.compare.before","Before"),loading:"lazy"}):t.jsx(y,{text:r("uiStudio.history.row.noBeforeState.tooltip","No capture saved before this change."),children:t.jsx("span",{className:c.thumbPlaceholder,children:r("uiStudio.history.row.noBeforeState","이전 없음")})})}),t.jsx("span",{className:c.thumbArrow,children:"→"}),t.jsx("div",{className:c.thumbSlot,children:N?t.jsx("img",{className:c.thumbImg,src:N,alt:r("uiStudio.compare.after","After"),loading:"lazy"}):t.jsx(y,{text:r("uiStudio.history.row.noAfterState.tooltip","No capture saved after this change."),children:t.jsx("span",{className:c.thumbPlaceholder,children:r("uiStudio.history.row.noAfterState","이후 없음")})})}),A>0&&t.jsx(y,{text:r("uiStudio.history.row.extraPaths.tooltip","Number of additional UIs changed in this action."),children:t.jsxs("span",{className:c.extraPathsBadge,children:["+",A]})})]})}),t.jsxs("button",{className:c.requestDetailToggle,type:"button","aria-expanded":n,"aria-label":`${J(r,e)} ${r("uiStudio.history.row.toggleDetails","Toggle change details")}`,onClick:()=>void E(),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:ws(e.startedAt)}),t.jsxs("span",{className:c.requestStats,children:[t.jsx(y,{text:r("uiStudio.history.row.affectedPaths.tooltip","Number of UIs affected by this action."),children:t.jsxs("span",{children:[r("uiStudio.history.row.affectedPaths","Paths")," ",e.affectedPaths.length,r("uiStudio.storage.countSuffix","")]})}),t.jsx("span",{className:c.statDot,children:"·"}),t.jsx(y,{text:r("uiStudio.history.row.mutations.tooltip","Number of detailed changes (e.g., property edits)."),children:t.jsxs("span",{children:[r("uiStudio.history.row.mutations","Change details")," ",e.mutationCount,r("uiStudio.storage.countSuffix","")]})}),f&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:c.statDot,children:"·"}),t.jsx(y,{text:r("uiStudio.history.row.qualityPlan.tooltip","Brief design direction used for this change."),children:t.jsx("span",{className:c.summaryPill,children:f})})]}),k&&t.jsxs(t.Fragment,{children:[t.jsx("span",{className:c.statDot,children:"·"}),t.jsx(y,{text:r("uiStudio.history.row.designCheck.tooltip","Post-change Design Check suggestion summary."),children:t.jsx("span",{className:c.summaryPill,children:k})})]})]})]}),t.jsx("span",{className:c.requestActions,children:t.jsx(y,{text:r("uiStudio.history.row.toggleDetails.tooltip","Show or hide a per-line breakdown of what changed."),children:t.jsx("span",{className:c.expandHint,children:n?r("uiStudio.history.row.collapseDetails","Hide change details"):r("uiStudio.history.row.expandDetails","Show {n} change details").replace("{n}",String(e.mutationCount))})})})]})]}),n&&t.jsxs("div",{className:c.mutationsArea,children:[_&&t.jsx("div",{className:c.mutLoading,children:r("uiStudio.history.loading","로딩 중...")}),S&&t.jsx("div",{className:c.mutError,children:S}),u&&t.jsx(Ge,{mutations:u,emptyLabel:r("uiStudio.history.row.mutationsEmpty","No change details")})]})]})}function ye(e,i){return`${q}/api/ui-studio/snapshots/${encodeURIComponent(e)}/image?placeId=${i}`}function Ae({requestId:e,placeId:i,onClose:a,imageUrlOverride:o,sampleDetail:l}){const{t:r}=M(),n=m.useRef(null),p=l!=null,[u,g]=m.useState(p?l:null),[_,h]=m.useState(!p),[S,j]=m.useState(null),[b,C]=m.useState(p&&l.affectedPaths.length>0?l.affectedPaths[0]:null);m.useEffect(()=>{var f;(f=n.current)==null||f.focus()},[]),m.useEffect(()=>{const f=k=>{k.key==="Escape"&&(k.preventDefault(),a())};return document.addEventListener("keydown",f),()=>{document.removeEventListener("keydown",f)}},[a]),m.useEffect(()=>{if(p)return;let f=!0;return h(!0),j(null),je(i,e).then(k=>{f&&(g(k),k.affectedPaths.length>0&&C(k.affectedPaths[0]))}).catch(k=>{f&&j(k.message)}).finally(()=>{f&&h(!1)}),()=>{f=!1}},[e,i,p]);const A=b&&u?u.beforeSnapshots[b]??null:null,w=b&&u?u.afterSnapshots[b]??null:null,d=A?o??ye(A,i):null,T=w?o??ye(w,i):null,N=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:n,className:c.compareDialog,role:"dialog","aria-modal":"true","aria-label":N,tabIndex:-1,onClick:f=>f.stopPropagation(),children:t.jsxs("div",{className:c.beforeAfterDrawer,children:[t.jsxs("div",{className:c.drawerHeader,children:[t.jsx("h2",{className:c.drawerTitle,children:N}),t.jsx("button",{className:c.drawerCloseBtn,onClick:a,type:"button",children:r("uiStudio.history.drawer.close","닫기")})]}),_&&t.jsx("div",{className:c.drawerBody,children:r("uiStudio.history.loading","로딩 중...")}),S&&t.jsx("div",{className:c.drawerBody,children:t.jsx("span",{className:c.mutErr,children:S})}),!_&&!S&&u&&t.jsxs(t.Fragment,{children:[u.affectedPaths.length>0&&t.jsx("div",{className:c.pathTabs,role:"tablist",children:u.affectedPaths.map(f=>t.jsx(y,{text:`${r("uiStudio.compare.path.tooltip","The UI instance path for this screen.")} ${f}`,children:t.jsx("button",{role:"tab","aria-selected":b===f,className:`${c.pathTab} ${b===f?c.pathTabActive:""}`,onClick:()=>C(f),type:"button",children:f.split("/").pop()??f})},f))}),t.jsxs("div",{className:c.comparePanel,children:[t.jsxs("div",{className:c.compareHalf,children:[t.jsx(y,{text:r("uiStudio.compare.before.tooltip","The screen saved just before AI made the change."),children:t.jsx("div",{className:c.compareLabel,children:r("uiStudio.compare.before","Before")})}),d?t.jsx("img",{className:c.compareImg,src:d,alt:r("uiStudio.compare.before","Before")}):t.jsx("div",{className:c.comparePlaceholder,children:r("uiStudio.history.row.noBeforeState","이전 상태 없음")})]}),t.jsxs("div",{className:c.compareHalf,children:[t.jsx(y,{text:r("uiStudio.compare.after.tooltip","The screen saved just after AI made the change."),children:t.jsx("div",{className:c.compareLabel,children:r("uiStudio.compare.after","After")})}),T?t.jsx("img",{className:c.compareImg,src:T,alt:r("uiStudio.compare.after","After")}):t.jsx("div",{className:c.comparePlaceholder,children:r("uiStudio.history.row.noAfterState","이후 상태 없음")})]})]}),t.jsxs("section",{className:c.compareDetailsPanel,children:[t.jsx("div",{className:c.compareDetailsHeader,children:r("uiStudio.history.drawer.changeDetails","Change details")}),t.jsx(Ge,{mutations:u.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 z(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(n=>Number.isNaN(n)))return;const[o,l,r]=a;return new Date(o,l-1,r,i?23:0,i?59:0,i?59:0,i?999:0).toISOString()}function ks(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,o=e.to?xe(e.to,!0):void 0;a&&(i.from=a),o&&(i.to=o)}else if(e.datePreset!=="all"){const a=new Date;if(e.datePreset==="today"){const{start:o,end:l}=z(a);i.from=o.toISOString(),i.to=l.toISOString()}else if(e.datePreset==="yesterday"){const o=new Date(a);o.setDate(o.getDate()-1);const{start:l,end:r}=z(o);i.from=l.toISOString(),i.to=r.toISOString()}else{const o=e.datePreset==="7d"?6:29,l=new Date(a);l.setDate(l.getDate()-o);const{start:r}=z(l),{end:n}=z(a);i.from=r.toISOString(),i.to=n.toISOString()}}return i}function Re(){return{action:"all",datePreset:"all"}}function Ts(){const{t:e}=M(),{trackEvent:i}=H(),a=We(e),[o,l]=m.useState(null),r=o?a.requests.find(u=>u.requestId===o)??null:null,n=m.useCallback((u,g)=>{l(u)},[]),p=m.useCallback(()=>{l(null)},[]);return t.jsxs("div",{className:c.historyTabWrap,children:[t.jsx("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:fe.uiStudioHistory,target:"_blank",rel:"noreferrer",title:e("uiStudio.history.sample.tooltip","Full history is available with Pro"),onClick:()=>i("dashboard_click_event",{click_target:"upgrade_cta",placement:"ui_studio_history_banner",page:"ui-studio",tab:"ui_studio_history"}),children:e("tier.upgrade","View Pro")})})]})}),t.jsxs("div",{className:c.historyWorkspace,"data-compare-open":o?"true":"false",children:[t.jsxs("div",{className:c.historyMainColumn,"data-testid":"history-main-column",children:[t.jsx("div",{className:c.listHeader,children:t.jsx("h2",{className:c.listHeaderTitle,children:t.jsx(G,{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(u=>t.jsx(Me,{req:u,placeId:0,onOpenCompare:g=>n(u.requestId,g),imageUrlOverride:ce,sampleMutations:a.mutationsByRequest[u.requestId]},u.requestId))})]}),o&&r&&t.jsx(Ae,{requestId:o,placeId:0,onClose:p,imageUrlOverride:ce,sampleDetail:{...r,mutations:a.mutationsByRequest[r.requestId]??[]}})]})]})}function Bs({filter:e,onChange:i}){const{t:a}=M(),o=[{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(G,{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:o.map(r=>t.jsx(y,{text:r.tooltip,children:t.jsx("button",{className:`${c.segmentBtn} ${e.action===r.value?c.segmentBtnActive:""}`,onClick:()=>i({...e,action:r.value}),"aria-pressed":e.action===r.value,type:"button",children:r.label})},r.value))})]}),t.jsxs("div",{className:c.filterGroup,children:[t.jsx("span",{className:c.filterLabel,children:t.jsx(G,{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(y,{text:r.tooltip,children:t.jsx("button",{className:`${c.segmentBtn} ${e.datePreset===r.value?c.segmentBtnActive:""}`,onClick:()=>i({...e,datePreset:r.value,from:r.value==="custom"?e.from:void 0,to:r.value==="custom"?e.to:void 0}),"aria-pressed":e.datePreset===r.value,type:"button",children:r.label})},r.value))})]}),e.datePreset==="custom"&&t.jsxs("div",{className:c.filterGroup,children:[t.jsx("label",{className:c.filterLabel,htmlFor:"ui-history-from-date",children:t.jsx(G,{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(G,{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(y,{text:a("uiStudio.history.filter.reset.tooltip","Reset all filters to defaults."),children:t.jsx("button",{className:c.filterResetBtn,onClick:()=>i(Re()),type:"button",children:a("uiStudio.history.filter.reset","Reset")})})]})}function Ds(){var I;const{t:e}=M(),{trackEvent:i}=H(),a=we(1),o=((I=a.data)==null?void 0:I.placeId)??null,[l,r]=m.useState(Re),{data:n,loading:p,error:u,refresh:g}=Va(o,ks(l)),[_,h]=m.useState(null),[S,j]=m.useState(!1),[b,C]=m.useState(!1),[A,w]=m.useState(null),d=async()=>{if(w(null),o===null){w(e("uiStudio.history.noPlaceAction","Current place is not available yet."));return}try{await Ke(o,{all:!0,alsoSnapshots:b}),await g(),j(!1)}catch(P){throw w(P.message),P}},T=(n==null?void 0:n.requests)??[],N=o===null&&a.loading,f=te(a.error)||te(u),k=m.useCallback((P,v)=>{i("dashboard_click_event",{click_target:"ui_studio_compare_before_after",page:"ui-studio",tab:"ui_studio_history"}),h(P)},[i]),E=m.useCallback(()=>{h(null)},[]);return t.jsxs("div",{className:c.historyTabWrap,children:[f?t.jsx(Te,{}):t.jsxs("div",{className:c.historyWorkspace,"data-compare-open":_?"true":"false",children:[t.jsxs("div",{className:c.historyMainColumn,"data-testid":"history-main-column",children:[t.jsx(Bs,{filter:l,onChange:r}),t.jsxs("div",{className:c.listHeader,children:[t.jsx("h2",{className:c.listHeaderTitle,children:t.jsx(G,{label:e("uiStudio.history.title","변경 이력"),tooltip:e("uiStudio.history.title.tooltip","A timeline of every UI change made by AI.")})}),T.length>0&&t.jsx(y,{text:e("uiStudio.history.clear.tooltip","Delete every change record for this project. The actual UI in Roblox Studio is not affected."),children:t.jsx("button",{className:c.clearBtn,onClick:()=>{i("dashboard_click_event",{click_target:"ui_studio_clear_history",page:"ui-studio",tab:"ui_studio_history"}),j(!0)},type:"button",children:e("uiStudio.history.clear","Clear")})})]}),N&&t.jsx("div",{className:c.historyLoading,children:e("uiStudio.history.loadingPlace","Loading current place...")}),!N&&p&&t.jsx("div",{className:c.historyLoading,children:e("uiStudio.history.loading","로딩 중...")}),!N&&!p&&u&&t.jsxs("div",{className:c.historyError,children:[e("uiStudio.history.error","오류"),": ",u]}),!N&&!p&&!u&&o===null&&t.jsx("div",{className:c.emptyHistory,children:e("uiStudio.history.noPlace","No current place data is available yet. Connect WEPPY Plugin and sync a place to view UI change history.")}),!N&&!p&&!u&&o!==null&&T.length===0&&t.jsx("div",{className:c.emptyHistory,children:e("uiStudio.history.empty","아직 변경 이력이 없습니다. AI 에이전트가 manage_ui 로 UI 를 수정하면 자동으로 기록됩니다.")}),!N&&!p&&o!==null&&T.length>0&&t.jsx("div",{className:c.requestList,children:T.map(P=>t.jsx(Me,{req:P,placeId:o,onOpenCompare:v=>k(P.requestId,v)},P.requestId))}),A&&t.jsx("div",{className:c.deleteErrBanner,children:A})]}),_&&o!==null&&t.jsx(Ae,{requestId:_,placeId:o,onClose:E})]}),S&&t.jsx(se,{title:e("uiStudio.history.confirm.clearRequestsTitle","변경 이력 삭제"),message:e("uiStudio.history.confirm.clearRequestsMessage","현재 place의 변경 이력을 삭제합니다. Studio 인스턴스에는 영향을 주지 않습니다."),danger:!0,cascadeOption:{label:e("uiStudio.history.confirm.cascadeOption","연결된 화면 캡처도 함께 삭제"),checked:b,onChange:C},confirmLabel:e("common.delete","삭제"),onConfirm:d,onClose:()=>j(!1)})]})}function Gs({tier:e}){return e==="basic"?t.jsx(Ts,{}):t.jsx(Ds,{})}const Ms=["analysis","history"];function Fs(){const{t:e}=M(),{trackEvent:i}=H(),{tier:a,loading:o}=He(),[l,r]=Oe(),n=l.get("tab"),p=n&&Ms.includes(n)?n:"analysis",u=_=>{i("dashboard_click_event",{click_target:_==="analysis"?"ui_studio_tab_analysis":"ui_studio_tab_history",page:"ui-studio",tab:_==="analysis"?"ui_studio_analysis":"ui_studio_history"}),r(h=>{const S=new URLSearchParams(h);return S.set("tab",_),S})},g=[{key:"analysis",label:t.jsx(y,{text:e("uiStudio.tabs.analysis.tooltip","Browse AI-captured UI screens and quickly find which UIs need improvement."),children:e("uiStudio.tabs.analysis","Analysis")})},{key:"history",label:t.jsx(y,{text:e("uiStudio.tabs.history.tooltip","Every UI change AI made, in order. Compare before and after screens."),children:e("uiStudio.tabs.history","History")})}];return t.jsxs("div",{className:s.page,children:[t.jsx(Ue,{title:e("page.uiStudio.title","UI Studio"),description:e("page.uiStudio.description","Review UI captures, improvement suggestions, and before/after change history."),helpTopicId:"uiStudio",helpState:{tier:a}}),!o&&a==="pro"&&t.jsx(Ye,{surface:"uiStudio"}),t.jsx(Qe,{items:g,value:p,onChange:u}),o?t.jsx("div",{className:s.emptyState,children:e("uiStudio.loading","Loading...")}):p==="analysis"?t.jsx(Ua,{tier:a}):t.jsx(Gs,{tier:a})]})}export{Fs as Component};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._page_1aicj_2{display:flex;flex-direction:column;gap:var(--content-gap);max-width:var(--content-max)}._grid_1aicj_9{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px;margin-top:16px}._card_1aicj_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_1aicj_16:hover{border-color:var(--accent)}._cardBodyButton_1aicj_31{display:block;width:100%;padding:0;border:0;background:transparent;color:inherit;cursor:pointer;font:inherit;text-align:left}._cardBodyButton_1aicj_31:focus-visible{outline:none;box-shadow:inset var(--focus-ring)}._thumb_1aicj_48{width:100%;aspect-ratio:16 / 9;object-fit:contain;object-position:center;display:block;background:var(--bg-secondary)}._badges_1aicj_57{position:absolute;top:8px;right:8px;display:flex;gap:4px}._priorityHighBadge_1aicj_65,._priorityMediumBadge_1aicj_66,._priorityLowBadge_1aicj_67{display:inline-flex;align-items:center;min-height:22px;padding:2px 6px;border:1px solid var(--border);border-radius:var(--radius-control);font-size:12px;font-weight:600;cursor:default}._priorityHighBadge_1aicj_65{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}._priorityMediumBadge_1aicj_66{background:var(--pro-bg-soft);border-color:var(--pro-border);color:var(--pro-text)}._priorityLowBadge_1aicj_67{background:var(--bg-secondary);border-color:var(--border);color:var(--text-secondary)}._cardMeta_1aicj_97{padding:8px 12px;font-size:12px;color:var(--text-primary)}._target_1aicj_103{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._time_1aicj_110{color:var(--text-muted);margin-top:4px}._drawer_1aicj_115{width:100%;flex:1 1 auto;min-height:0;max-height:none;display:flex;flex-direction:column;background:var(--bg-card);border:0;border-radius:0;overflow:hidden;padding:0;box-shadow:none;color:var(--text-primary);box-sizing:border-box}._drawerToolbar_1aicj_132{flex:0 0 auto;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:16px;padding:14px 16px;border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--bg-card) 92%,var(--bg-secondary))}._drawerTitleBlock_1aicj_143{min-width:0;display:flex;flex-direction:column;gap:3px}._drawerEyebrow_1aicj_150{color:var(--text-muted);font-family:var(--font-label);font-size:11px;font-weight:600;letter-spacing:0;text-transform:uppercase}._drawerTarget_1aicj_159{overflow:hidden;color:var(--text-primary);font-family:var(--font-label);font-size:13px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}._drawerToolbarActions_1aicj_169{display:flex;align-items:center;justify-content:flex-end;gap:8px;min-width:0}._closeBtn_1aicj_177{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;padding:0;cursor:pointer;border:1px solid var(--border);border-radius:7px;background:transparent;color:var(--text-secondary);transition:border-color var(--transition),background var(--transition),color var(--transition)}._closeBtn_1aicj_177:hover{border-color:var(--accent);background:var(--accent-dim);color:var(--text-primary)}._detailBody_1aicj_198{flex:1 1 auto;min-height:0;overflow-y:auto;padding:16px 24px 24px}._screenshotPreviewFrame_1aicj_205{display:flex;align-items:center;justify-content:center;width:100%;height:clamp(180px,32vh,320px);margin-top:12px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-secondary);overflow:hidden}._fullImg_1aicj_218{display:block;width:100%;height:100%;object-fit:contain}._metaDl_1aicj_225{display:grid;grid-template-columns:auto 1fr;gap:8px 16px;margin:16px 0;font-size:13px}._metaDl_1aicj_225 dt{color:var(--text-muted)}._errorMsg_1aicj_237{color:var(--error-text);padding:12px}._suggestionsWrap_1aicj_242{margin-top:16px}._suggestionsWrap_1aicj_242 h3{margin:0 0 12px;font-size:16px}._prioritySection_1aicj_249{margin-bottom:16px}._sectionHighHeader_1aicj_253{margin:0 0 8px;font-size:13px;font-weight:600;color:var(--error)}._sectionLowHeader_1aicj_259{margin:0 0 8px;font-size:13px;font-weight:600;color:var(--warning-text)}._sectionMediumHeader_1aicj_265{margin:0 0 8px;font-size:13px;font-weight:600;color:var(--warning)}._groupCard_1aicj_271{border:1px solid var(--border);border-radius:8px;margin-bottom:8px;background:var(--bg-secondary);overflow:hidden}._groupHeader_1aicj_278{width:100%;display:flex;align-items:center;gap:8px;padding:10px 12px;background:transparent;border:none;cursor:pointer;text-align:left;color:var(--text-primary);font:inherit}._groupHeader_1aicj_278:hover{background:var(--bg-card)}._groupLabel_1aicj_294{font-weight:600;font-size:13px;flex:1}._groupCount_1aicj_299{font-size:12px;color:var(--text-muted);padding:2px 8px;background:var(--bg-card);border-radius:10px}._groupChevron_1aicj_306{color:var(--text-muted);font-size:12px}._groupBody_1aicj_310{padding:0 12px 12px}._groupDescription_1aicj_313{font-size:12px;color:var(--text-muted);margin:8px 0 4px}._groupFix_1aicj_318{font-size:12px;color:var(--text-primary);margin:4px 0 8px;padding:6px 10px;background:var(--bg-card);border-left:3px solid var(--accent);border-radius:4px}._falsePositive_1aicj_327{font-size:12px;color:var(--warning-text);margin:4px 0 8px;padding:6px 10px;background:var(--warning-bg);border-radius:4px}._itemList_1aicj_335{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px}._suggestionItem_1aicj_343{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;background:var(--bg-card);border-radius:6px;font-size:12px}._suggestionInfo_1aicj_353{display:flex;flex-direction:column;gap:2px;min-width:0}._pathBreadcrumb_1aicj_359{font-family:monospace;font-size:11px;color:var(--text-primary);background:transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._currentValue_1aicj_368{font-size:11px;color:var(--text-muted)}._copyFixBtn_1aicj_372{padding:4px 10px;background:var(--accent);color:var(--bg-card);border:none;border-radius:4px;cursor:pointer;font-size:11px;font-weight:600;flex-shrink:0}._copyFixBtn_1aicj_372:hover{opacity:.9}._emptySuggestions_1aicj_386{text-align:center;padding:24px;color:var(--text-muted);font-size:13px}._sampleBanner_1aicj_394{display:flex;flex-direction:column;gap:12px;padding:18px 20px;border:1px solid var(--pro-border);border-radius:var(--radius);background:linear-gradient(135deg,#f0bd5829,#f0bd5808 55%),var(--bg-card);margin-bottom:16px}._sampleBannerRow_1aicj_407{display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap}._sampleBannerMain_1aicj_415{display:flex;flex-direction:column;gap:8px;min-width:0;flex:1}._sampleBadge_1aicj_423{width:fit-content;color:var(--pro-text);font-family:var(--font-label);font-size:11px;font-weight:600;letter-spacing:.02em;opacity:.92}._sampleTitle_1aicj_433{font-family:var(--font-label);font-size:16px;font-weight:600;color:var(--text-primary)}._sampleMessage_1aicj_440{max-width:560px;color:var(--text-secondary);font-size:13px;line-height:1.5}._sampleActions_1aicj_447{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end}._primaryAction_1aicj_455,._secondaryAction_1aicj_456{display:inline-flex;align-items:center;justify-content:center;min-height:34px;padding:0 14px;border-radius:8px;font-family:var(--font-label);font-size:12px;text-decoration:none;transition:background var(--transition),border-color var(--transition),opacity var(--transition)}._secondaryAction_1aicj_456{border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);cursor:pointer}._secondaryAction_1aicj_456:hover{border-color:var(--accent);background:var(--accent-dim)}._primaryAction_1aicj_455{border:1px solid var(--pro-badge);background:var(--pro-badge);color:var(--pro-text-on-badge)}._primaryAction_1aicj_455:hover{opacity:.9}._emptyState_1aicj_491{text-align:center;padding:48px 20px;color:var(--text-muted);font-size:14px}._pluginGuideCard_1aicj_499{display:flex;align-items:flex-start;gap:14px;padding:18px 20px;border:1px solid var(--warning);border-radius:var(--radius);background:var(--bg-card);color:var(--text-primary)}._pluginGuideMarker_1aicj_510{display:flex;align-items:center;justify-content:center;width:28px;height:28px;flex:0 0 28px;border-radius:50%;border:1px solid var(--warning);color:var(--warning);font-family:var(--font-label);font-size:15px;font-weight:700}._pluginGuideBody_1aicj_525{min-width:0}._pluginGuideTitle_1aicj_529{margin:0 0 8px;color:var(--text-primary);font-family:var(--font-label);font-size:15px;font-weight:600}._pluginGuideMessage_1aicj_537{margin:0 0 12px;color:var(--text-secondary);font-size:13px;line-height:1.5}._pluginGuideChecklist_1aicj_544{display:flex;flex-direction:column;gap:7px;margin:0 0 14px;padding:0;list-style:none}._pluginGuideChecklist_1aicj_544 li{position:relative;padding-left:20px;color:var(--text-secondary);font-size:13px}._pluginGuideChecklist_1aicj_544 li:before{content:"○";position:absolute;left:2px;color:var(--text-muted)}._pluginGuideWaiting_1aicj_567{display:inline-flex;align-items:center;gap:8px;color:var(--text-muted);font-family:var(--font-label);font-size:12px}._pluginGuideDot_1aicj_576{width:7px;height:7px;border-radius:50%;background:var(--warning)}._analysisWorkspace_1aicj_584{width:100%;position:relative}._analysisMainColumn_1aicj_589{min-width:0}._analysisDetailPopupLayer_1aicj_593{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_1aicj_610{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_1aicj_610 ._drawer_1aicj_115{min-height:0;max-height:100%}._analysisSummaryPanel_1aicj_629{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_1aicj_629 h2,._recentCapturesHeader_1aicj_642 h2{margin:0;font-size:16px;font-family:var(--font-label);color:var(--text-primary)}._analysisSummaryText_1aicj_649,._recentCapturesMeta_1aicj_650{margin:6px 0 0;color:var(--text-secondary);font-size:13px}._analysisReportGrid_1aicj_656{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px;margin-top:14px}._analysisReportGroup_1aicj_663{min-width:0}._analysisReportCard_1aicj_667{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_1aicj_667:hover{border-color:var(--accent);background:var(--bg-secondary)}._analysisReportThumb_1aicj_689{width:112px;aspect-ratio:16 / 10;object-fit:contain;object-position:center;border-radius:6px;background:var(--bg-secondary)}._analysisReportBody_1aicj_698{min-width:0;display:flex;flex-direction:column;gap:7px}._analysisReportTopline_1aicj_705{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._analysisVerdict_1aicj_712{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_1aicj_723,._analysisVerdict_review_1aicj_724{color:var(--accent);background:var(--accent-dim)}._analysisVerdict_passed_1aicj_729{color:var(--text-secondary);background:var(--bg-secondary)}._analysisReportCounts_1aicj_734{color:var(--text-secondary);font-size:12px}._analysisReportTarget_1aicj_739{overflow:hidden;color:var(--text-primary);font-size:13px;font-weight:600;text-overflow:ellipsis;white-space:nowrap}._analysisReportIssue_1aicj_748{color:var(--text-secondary);font-size:12px;line-height:1.35}._analysisReportMeta_1aicj_754{margin-top:auto;color:var(--text-muted);font-size:11px;line-height:1.35}._analysisChildList_1aicj_761{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_1aicj_772{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_1aicj_772:hover{border-color:var(--accent);background:var(--accent-dim)}._analysisChildPath_1aicj_793{overflow:hidden;color:var(--text-primary);font-family:var(--font-code);font-size:11px;text-overflow:ellipsis;white-space:nowrap}._analysisChildSummary_1aicj_802,._analysisChildDetailHint_1aicj_803{color:var(--text-secondary);font-size:11px}._analysisChildDetailHint_1aicj_803{color:var(--text-muted)}._drawerAnalysisSummary_1aicj_812{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_1aicj_823{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._drawerAnalysisLabel_1aicj_830{min-width:64px;color:var(--text-muted);font-size:12px}._drawerAnalysisCounts_1aicj_836,._drawerAnalysisValue_1aicj_837{color:var(--text-secondary);font-size:12px}._recentCapturesSection_1aicj_842{margin-top:28px}._recentCapturesHeader_1aicj_642{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}._drawerPrimaryActions_1aicj_854{display:flex;align-items:center;gap:8px;min-width:0}._drawerActionBtn_1aicj_861{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_1aicj_861:hover:not(:disabled){border-color:var(--accent);background:var(--accent-dim)}._drawerActionBtn_1aicj_861:disabled{opacity:.45;cursor:not-allowed}._drawerMoreMenu_1aicj_890{position:relative;flex:0 0 auto}._drawerMoreButton_1aicj_895{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_1aicj_895:hover{border-color:var(--accent);background:var(--accent-dim);color:var(--text-primary)}._drawerMoreButton_1aicj_895::-webkit-details-marker{display:none}._drawerMoreMenuBody_1aicj_920{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_1aicj_933{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_1aicj_933:hover:not(:disabled){background:var(--bg-secondary)}._drawerMenuItem_1aicj_933:disabled{opacity:.45;cursor:not-allowed}._drawerMenuItemDanger_1aicj_956{color:var(--danger-text)}._drawerMenuItemDanger_1aicj_956:hover:not(:disabled){background:var(--danger-hover-bg)}._actionErrMsg_1aicj_965{font-size:12px;color:var(--error-text);padding:6px 10px;background:#e0555514;border-radius:4px;margin-top:10px}._actionStatusMsg_1aicj_974{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_1aicj_988{color:var(--text-secondary);background:var(--bg-secondary);border-color:var(--border)}._actionStatus_success_1aicj_994{color:var(--success-text);background:var(--success-bg);border-color:var(--success-border)}._actionStatus_warning_1aicj_1000{color:var(--warning-text);background:var(--warning-bg);border-color:var(--warning-border)}._actionStatusDetail_1aicj_1006{margin-top:2px;color:var(--text-muted)}._galleryHeader_1aicj_1012{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}._galleryHeader_1aicj_1012 h1{margin:0}._cardChecked_1aicj_1025{border-color:var(--accent)!important;box-shadow:0 0 0 2px var(--accent);background:var(--accent-dim)}._cardCheckbox_1aicj_1032{position:absolute;top:8px;left:8px;opacity:0;z-index:2;transition:opacity var(--transition),background var(--transition),border-color var(--transition)}._card_1aicj_16:hover ._cardCheckbox_1aicj_1032,._card_1aicj_16:focus-within ._cardCheckbox_1aicj_1032,._cardChecked_1aicj_1025 ._cardCheckbox_1aicj_1032{opacity:1}._captureSelectionActions_1aicj_1047{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}._selectionToolbar_1aicj_1056,._selectionBar_1aicj_1057{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_1aicj_1056{position:sticky;top:0;z-index:8;justify-content:space-between}._selectionToolbarCount_1aicj_1076{color:var(--text-primary);font-family:var(--font-label);font-size:12px;font-weight:600}._selectionToolbarActions_1aicj_1083{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._selectionBarBtn_1aicj_1090{padding:6px 14px;border-radius:var(--radius-control);border:1px solid var(--border);background:var(--bg-card);color:var(--text-primary);font-family:var(--font-label);font-size:12px;cursor:pointer;transition:border-color var(--transition),opacity var(--transition)}._selectionBarBtn_1aicj_1090:hover:not(:disabled){border-color:var(--accent)}._selectionBarBtn_1aicj_1090:focus-visible{outline:none;box-shadow:var(--focus-ring)}._selectionBarBtn_1aicj_1090:disabled{opacity:.45;cursor:not-allowed}._selectionBarBtnDanger_1aicj_1116{border-color:var(--danger-border);background:var(--danger-bg);color:var(--danger-text)}._selectionBarBtnDanger_1aicj_1116:hover:not(:disabled){border-color:var(--danger);background:var(--danger-hover-bg)}@media(max-width:1120px){._analysisDetailPopupLayer_1aicj_593{left:calc(var(--sidebar-width) + 16px);right:16px;bottom:16px;padding:12px}}@media(max-width:768px){._analysisDetailPopupLayer_1aicj_593{top:calc(var(--header-height) + 10px);right:10px;bottom:10px;left:calc(var(--sidebar-collapsed) + 10px);padding:8px}._analysisDetailDialog_1aicj_610{width:100%}._drawer_1aicj_115{padding:0}._drawerToolbar_1aicj_132{grid-template-columns:minmax(0,1fr);align-items:stretch;gap:10px;padding:12px}._drawerToolbarActions_1aicj_169{justify-content:flex-start;overflow-x:auto;padding-bottom:2px}._drawerActionBtn_1aicj_861{padding:7px 10px}._detailBody_1aicj_198{padding:14px}}._filterBar_8budj_4{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:12px 0;margin-bottom:8px;border-bottom:1px solid var(--border)}._filterGroup_8budj_14{display:flex;align-items:center;gap:8px;flex-wrap:wrap}._filterLabel_8budj_21{font-size:12px;color:var(--text-muted);font-weight:500;white-space:nowrap}._filterCheckbox_8budj_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_8budj_28 input[type=checkbox]{width:14px;height:14px;cursor:pointer;accent-color:var(--accent)}._segmentGroup_8budj_45{display:inline-flex;align-items:center;gap:2px;padding:2px;border:1px solid var(--border);border-radius:7px;background:var(--bg-secondary)}._segmentBtn_8budj_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_8budj_55:hover{color:var(--text-primary)}._segmentBtnActive_8budj_73{background:var(--bg-card);color:var(--text-primary);box-shadow:0 0 0 1px var(--border)}._filterInput_8budj_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_8budj_79:focus{outline:none;border-color:var(--accent)}._filterResetBtn_8budj_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_8budj_95:hover{border-color:var(--accent);color:var(--text-primary)}._requestRow_8budj_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_8budj_114:hover{border-color:var(--accent)}._requestRowMain_8budj_127{display:flex;align-items:flex-start;gap:12px;padding:12px 14px}._requestDetailToggle_8budj_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_8budj_134:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:6px}._thumbPair_8budj_156{display:flex;align-items:center;gap:4px;flex-shrink:0;position:relative}._thumbPairButton_8budj_164{padding:0;border:0;background:transparent;color:inherit;cursor:pointer;font:inherit;border-radius:6px}._thumbPairButton_8budj_164:focus-visible{outline:2px solid var(--accent);outline-offset:3px}._thumbPairButton_8budj_164:hover ._thumbSlot_8budj_179{border-color:var(--accent)}._thumbPairButton_8budj_164:disabled{cursor:not-allowed;opacity:.72}._thumbPairButton_8budj_164:disabled:hover ._thumbSlot_8budj_179{border-color:var(--border)}._thumbSlot_8budj_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_8budj_204{width:100%;height:100%;object-fit:cover;display:block}._thumbPlaceholder_8budj_211{font-size:10px;color:var(--text-muted);text-align:center;padding:4px;line-height:1.3}._thumbArrow_8budj_219{font-size:12px;color:var(--text-muted);flex-shrink:0}._extraPathsBadge_8budj_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_8budj_239{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}._requestLabel_8budj_247{font-size:13px;font-weight:500;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._requestTime_8budj_256{font-size:11px;color:var(--text-muted)}._requestStats_8budj_261{font-size:12px;color:var(--text-secondary);display:flex;gap:4px;flex-wrap:wrap}._statDot_8budj_269{color:var(--text-muted)}._summaryPill_8budj_273{color:var(--text-secondary)}._requestActions_8budj_278{display:flex;flex-direction:column;gap:6px;flex-shrink:0}._expandHint_8budj_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_8budj_298{border-top:1px solid var(--border);background:var(--bg-secondary);padding:8px 14px;display:flex;flex-direction:column;gap:4px}._mutLoading_8budj_307,._mutEmpty_8budj_308{font-size:12px;color:var(--text-muted);padding:4px 0}._mutError_8budj_314{font-size:12px;color:var(--error-text);padding:4px 0}._mutationRow_8budj_320{font-size:12px;padding:6px 0;border-bottom:1px solid var(--border)}._mutationRow_8budj_320:last-child{border-bottom:none}._mutationLine_8budj_330{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}._mutTs_8budj_337{color:var(--text-muted);flex-shrink:0;font-size:11px}._mutCommand_8budj_343{color:var(--accent);font-weight:500;flex-shrink:0}._mutPath_8budj_349{font-family:monospace;font-size:11px;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:260px}._mutDiff_8budj_359{color:var(--text-muted);font-size:11px;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._mutErr_8budj_314{color:var(--error-text);font-size:11px}._changeDetails_8budj_374{display:flex;flex-direction:column;gap:4px;margin-top:6px;padding-left:88px}._changeDetailRow_8budj_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_8budj_391{grid-template-columns:72px minmax(96px,180px) 14px minmax(0,1fr)}._changeDetailBadge_8budj_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_8budj_412{color:#2563eb;border-color:#2563eb47}._changeDetail_color_8budj_417{color:#b45309;border-color:#b4530947}._changeDetail_size_8budj_422{color:#047857;border-color:#04785747}._changeDetail_layout_8budj_427{color:#7c3aed;border-color:#7c3aed47}._changeDetail_state_8budj_432{color:#be123c;border-color:#be123c47}._changeDetail_asset_8budj_437{color:#0369a1;border-color:#0369a147}._changeDetail_property_8budj_442{color:var(--text-secondary)}._changeDetailProperty_8budj_446{font-family:var(--font-code);color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}._changeDetailArrow_8budj_454{color:var(--text-muted);text-align:center;line-height:1.6}._changeDetailOldValue_8budj_460,._changeDetailNewValue_8budj_461{font-family:var(--font-code);overflow-wrap:anywhere;word-break:break-word;line-height:1.6}._changeDetailOldValue_8budj_460{color:var(--error-text);text-decoration:line-through;text-decoration-thickness:1px}._changeDetailNewValue_8budj_461{color:var(--success-text)}._compareDialogLayer_8budj_479{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_8budj_479{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_8budj_510{width:100%;height:100%;min-height:0;background:var(--bg-card);display:flex;flex-direction:column;overflow:hidden}._drawerHeader_8budj_520{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border);flex-shrink:0}._drawerTitle_8budj_529{margin:0;font-size:16px;font-weight:600;color:var(--text-primary)}._drawerCloseBtn_8budj_536{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_8budj_536:hover{border-color:var(--accent);color:var(--text-primary)}._drawerBody_8budj_552{padding:20px;color:var(--text-muted);font-size:13px}._pathTabs_8budj_559{display:flex;gap:2px;border-bottom:1px solid var(--border);padding:0 20px;flex-shrink:0;overflow-x:auto}._pathTab_8budj_559{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_8budj_559:hover{color:var(--text-primary)}._pathTabActive_8budj_588{color:var(--accent);border-bottom-color:var(--accent)}._comparePanel_8budj_594{display:grid;grid-template-columns:1fr 1fr;gap:1px;flex:1;min-height:0;background:var(--border);overflow:auto}._compareHalf_8budj_604{background:var(--bg-card);display:flex;flex-direction:column;min-height:0}._compareLabel_8budj_611{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_8budj_622{width:100%;flex:1;object-fit:contain;background:var(--bg-secondary);display:block}._comparePlaceholder_8budj_630{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_8budj_642{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_8budj_651{margin-bottom:8px;color:var(--text-primary);font-family:var(--font-label);font-size:12px;font-weight:600}._compareDetailsPanel_8budj_642 ._changeDetails_8budj_374{padding-left:0}._compareDetailsPanel_8budj_642 ._mutPath_8budj_349,._compareDetailsPanel_8budj_642 ._mutDiff_8budj_359{max-width:none}._drawerFooter_8budj_669{display:flex;justify-content:flex-end;padding:12px 20px;border-top:1px solid var(--border);flex-shrink:0}._drawerActionBtn_8budj_677{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_8budj_677:hover{border-color:var(--accent);background:var(--accent-dim)}._historyTabWrap_8budj_695{display:flex;flex-direction:column;gap:0}._historyWorkspace_8budj_701{width:100%;position:relative}._historyMainColumn_8budj_706{min-width:0}._requestList_8budj_710{display:flex;flex-direction:column}._emptyHistory_8budj_715{text-align:center;padding:48px 20px;color:var(--text-muted);font-size:14px}._historyError_8budj_722{padding:16px 0;color:var(--error-text);font-size:13px}._historyLoading_8budj_728{padding:48px 20px;text-align:center;color:var(--text-muted);font-size:13px}._listHeader_8budj_736{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:8px}._listHeaderTitle_8budj_745{font-size:14px;font-weight:600;color:var(--text-primary);margin:0}._clearBtn_8budj_752{padding:6px 12px;border:1px solid var(--danger-border);border-radius:var(--radius-control);background:var(--danger-bg);color:var(--danger-text);font-family:var(--font-label);font-size:12px;font-weight:500;cursor:pointer;transition:background var(--transition),border-color var(--transition)}._clearBtn_8budj_752:hover{background:var(--danger-hover-bg);border-color:var(--danger)}._clearBtn_8budj_752:focus-visible{outline:none;box-shadow:var(--focus-ring)}._deleteErrBanner_8budj_776{padding:8px 12px;margin-bottom:8px;border-radius:var(--radius);background:var(--error-bg, rgba(224, 85, 85, .12));border:1px solid var(--error-border, rgba(224, 85, 85, .4));color:var(--error-text);font-size:13px}@media(max-width:1120px){._compareDialogLayer_8budj_479{left:calc(var(--sidebar-width) + 16px);right:16px;bottom:16px;padding:12px}}@media(max-width:768px){._compareDialogLayer_8budj_479{top:calc(var(--header-height) + 10px);right:10px;bottom:10px;left:calc(var(--sidebar-collapsed) + 10px);padding:8px}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{u,j as e,G as y,r as N,H as w}from"./index-
|
|
1
|
+
import{u,j as e,G as y,r as N,H as w}from"./index-BDJHcdyQ.js";import{P as x}from"./PageHeader-B0qiATU4.js";const j="_card_f20gt_2",C="_cardUnread_f20gt_15",R="_cardRead_f20gt_20",k="_topRow_f20gt_25",v="_categoryChip_f20gt_32",b="_versionChip_f20gt_45",S="_date_f20gt_57",T="_title_f20gt_65",E="_body_f20gt_74",A="_linkList_f20gt_82",U="_link_f20gt_82",B="_newBadge_f20gt_104",a={card:j,cardUnread:C,cardRead:R,topRow:k,categoryChip:v,versionChip:b,date:S,title:T,body:E,linkList:A,link:U,newBadge:B},L={release:"whatsNew.category.release",notice:"whatsNew.category.notice",deprecation:"whatsNew.category.deprecation",tip:"whatsNew.category.tip"};function f({announcement:s,isNew:p}){const{locale:r,t:o}=u(),i=p?a.cardUnread:a.cardRead,g=s.title[r]??s.title.en,l=s.body[r]??s.body.en,d=s.links??(s.link?[s.link]:[]),h=n=>typeof n=="string"?n:n[r]??n.en;return e.jsxs("div",{className:`${a.card} ${i}`,children:[e.jsxs("div",{className:a.topRow,children:[e.jsx("span",{className:a.categoryChip,children:o(L[s.category])}),s.version&&e.jsx("span",{className:a.versionChip,children:s.version}),p&&e.jsx("span",{className:a.newBadge,children:o("whatsNew.newBadge","NEW")}),e.jsx("span",{className:a.date,children:s.date})]}),e.jsx("h3",{className:a.title,children:g}),e.jsx("p",{className:a.body,children:l}),d.length>0&&e.jsx("div",{className:a.linkList,children:d.map(n=>{const _=h(n.url),t=h(n.label);return e.jsxs("a",{className:a.link,href:_,target:"_blank",rel:"noopener noreferrer",children:["↗"," ",t]},_)})})]})}const $="_page_1talg_2",M="_section_1talg_10",z="_sectionTitle_1talg_16",H="_unreadCount_1talg_28",P="_empty_1talg_43",W="_divider_1talg_51",c={page:$,section:M,sectionTitle:z,unreadCount:H,empty:P,divider:W};function O(){const{t:s}=u(),{readSet:p,markRead:r}=y(),o=N.useMemo(()=>{const t=[];for(const m of w)p.has(m.id)||t.push(m.id);return t},[]),i=N.useRef(o);i.current=o,N.useEffect(()=>()=>{i.current.length>0&&r(i.current)},[]);const g=N.useMemo(()=>new Set(o),[o]),l=w.filter(t=>g.has(t.id)),d=w.filter(t=>!g.has(t.id)),h=l.length>0,n=d.length>0,_=e.jsx(x,{title:s("whatsNew.pageTitle","What's New"),description:s("whatsNew.pageSubtitle","Stay up to date with MCP changes"),helpTopicId:"whatsNew"});return w.length===0?e.jsxs("div",{className:c.page,children:[_,e.jsx("p",{className:c.empty,children:s("whatsNew.empty","No announcements yet")})]}):e.jsxs("div",{className:c.page,children:[_,h&&e.jsxs("section",{className:c.section,children:[e.jsxs("h2",{className:c.sectionTitle,children:[s("whatsNew.unreadSection","Unread"),e.jsx("span",{className:c.unreadCount,children:l.length})]}),l.map(t=>e.jsx(f,{announcement:t,isNew:!0},`unread-${t.id}`))]}),h&&n&&e.jsx("hr",{className:c.divider}),n&&e.jsxs("section",{className:c.section,children:[e.jsx("h2",{className:c.sectionTitle,children:s("whatsNew.allSection","All Announcements")}),d.map(t=>e.jsx(f,{announcement:t,isNew:!1},`all-${t.id}`))]})]})}export{O as Component};
|