@jonathanleelx/meddle 0.5.0-beta.17 → 0.5.0-beta.19

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.
Files changed (144) hide show
  1. package/bin/lib/file-access.js +41 -24
  2. package/dist/core/custom-plugin-loader.d.ts.map +1 -1
  3. package/dist/core/custom-plugin-loader.js +2 -0
  4. package/dist/core/custom-plugin-loader.js.map +1 -1
  5. package/dist/core/mock-handler.d.ts +33 -0
  6. package/dist/core/mock-handler.d.ts.map +1 -1
  7. package/dist/core/mock-handler.js +284 -25
  8. package/dist/core/mock-handler.js.map +1 -1
  9. package/dist/core/mock-utils.d.ts +28 -0
  10. package/dist/core/mock-utils.d.ts.map +1 -1
  11. package/dist/core/mock-utils.js +50 -0
  12. package/dist/core/mock-utils.js.map +1 -1
  13. package/dist/core/plugin-bootstrap-runner.d.ts +1 -0
  14. package/dist/core/plugin-bootstrap-runner.d.ts.map +1 -1
  15. package/dist/core/plugin-bootstrap-runner.js +37 -1
  16. package/dist/core/plugin-bootstrap-runner.js.map +1 -1
  17. package/dist/core/plugin-source.d.ts +24 -0
  18. package/dist/core/plugin-source.d.ts.map +1 -0
  19. package/dist/core/plugin-source.js +47 -0
  20. package/dist/core/plugin-source.js.map +1 -0
  21. package/dist/core/types.d.ts +7 -0
  22. package/dist/core/types.d.ts.map +1 -1
  23. package/dist/server/app-info.d.ts +19 -0
  24. package/dist/server/app-info.d.ts.map +1 -0
  25. package/dist/server/app-info.js +84 -0
  26. package/dist/server/app-info.js.map +1 -0
  27. package/dist/server/config.d.ts +1 -0
  28. package/dist/server/config.d.ts.map +1 -1
  29. package/dist/server/config.js +23 -3
  30. package/dist/server/config.js.map +1 -1
  31. package/dist/server/health.d.ts.map +1 -1
  32. package/dist/server/health.js +8 -0
  33. package/dist/server/health.js.map +1 -1
  34. package/dist/server/index.d.ts +14 -0
  35. package/dist/server/index.d.ts.map +1 -1
  36. package/dist/server/index.js +2 -0
  37. package/dist/server/index.js.map +1 -1
  38. package/dist/server/mocks.d.ts +23 -0
  39. package/dist/server/mocks.d.ts.map +1 -1
  40. package/dist/server/mocks.js +107 -13
  41. package/dist/server/mocks.js.map +1 -1
  42. package/dist/server/plugins.d.ts.map +1 -1
  43. package/dist/server/plugins.js +56 -11
  44. package/dist/server/plugins.js.map +1 -1
  45. package/index.js +16 -3
  46. package/package.json +1 -1
  47. package/web/dist/assets/alert-BmsRCcSL.js +1 -0
  48. package/web/dist/assets/arrow-right-BNum_060.js +1 -0
  49. package/web/dist/assets/{body-diff-view-CO4FDdwK.js → body-diff-view-ByCHr9bv.js} +2 -2
  50. package/web/dist/assets/{button-yArHqw81.js → button-BFNlGZ5p.js} +1 -1
  51. package/web/dist/assets/check-BkfHQ6re.js +1 -0
  52. package/web/dist/assets/checkbox-v2kzp7K8.js +1 -0
  53. package/web/dist/assets/chevron-down-DHwUtL4O.js +1 -0
  54. package/web/dist/assets/{circle-alert-DAWy5HuM.js → circle-alert-zMagrFuI.js} +1 -1
  55. package/web/dist/assets/{circle-x-BjSs1hQK.js → circle-x-BEkinhez.js} +1 -1
  56. package/web/dist/assets/code-DD-AYxxu.js +1 -0
  57. package/web/dist/assets/{copy-qMUl4peN.js → copy-BRnscYy1.js} +1 -1
  58. package/web/dist/assets/{detail-panel-Cptbvzot.js → detail-panel-DyvoHlCG.js} +3 -3
  59. package/web/dist/assets/dist-BCvvYbmI.js +1 -0
  60. package/web/dist/assets/dist-BNcjMpca.js +1 -0
  61. package/web/dist/assets/{dist-CjLkNKST.js → dist-C-E2R2jk.js} +1 -1
  62. package/web/dist/assets/{dist-CwP5Ad1_.js → dist-CFZ4xMSF.js} +1 -1
  63. package/web/dist/assets/{dist-DGuRBXW6.js → dist-CRmX_NvH.js} +1 -1
  64. package/web/dist/assets/dist-DD7AvbXP.js +1 -0
  65. package/web/dist/assets/dist-LiAcI8CK.js +1 -0
  66. package/web/dist/assets/dist-UcOFuoN0.js +5 -0
  67. package/web/dist/assets/{dist-D2vbXHYx.js → dist-YM3jbhT-.js} +1 -1
  68. package/web/dist/assets/editor-pane-actions-DN-pxFsl.js +1 -0
  69. package/web/dist/assets/es2015-CRmLuA2o.js +41 -0
  70. package/web/dist/assets/{global-panel-shell-jsVR0yS9.js → global-panel-shell-BJaQ_VLp.js} +4 -4
  71. package/web/dist/assets/health-panel-BnxNCGvw.js +1 -0
  72. package/web/dist/assets/index-Bu3zaxzE.js +18 -0
  73. package/web/dist/assets/index-D9jGD_NA.css +2 -0
  74. package/web/dist/assets/mobile-proxy-panel-BxJ8OmLu.js +8 -0
  75. package/web/dist/assets/mock-config-Dp2D5iiv.js +1 -0
  76. package/web/dist/assets/mock-editor-panel-zqouxTGb.js +20 -0
  77. package/web/dist/assets/mocks-file-missing-note-B8TTBWtG.js +1 -0
  78. package/web/dist/assets/monaco-editor-DeJNlo9k.js +11 -0
  79. package/web/dist/assets/pane-split-Db1aWKUO.js +1 -0
  80. package/web/dist/assets/panel-heading-BAI_lNmT.js +1 -0
  81. package/web/dist/assets/{pencil-line-jiAfwHPx.js → pencil-line-CEZ7D-de.js} +1 -1
  82. package/web/dist/assets/plugin-code-editor-CQqpaaCR.js +2 -0
  83. package/web/dist/assets/plugin-config-CjcRhSZm.js +2 -0
  84. package/web/dist/assets/plugin-generator-Cr_gk3Tp.js +2 -0
  85. package/web/dist/assets/plugin-test-dialog-B5mVM3XE.js +7 -0
  86. package/web/dist/assets/plus-ixZQRprm.js +1 -0
  87. package/web/dist/assets/{refresh-cw-DdzbeDXU.js → refresh-cw-BfLoHqg5.js} +1 -1
  88. package/web/dist/assets/rotate-ccw-CRguJya4.js +1 -0
  89. package/web/dist/assets/route-preview-BZ3vhvsc.js +1 -0
  90. package/web/dist/assets/{rule-ai-assistant-panel-D0nf0ksF.js → rule-ai-assistant-panel-DfivYxZH.js} +2 -2
  91. package/web/dist/assets/rule-config-DSX8bBHe.js +15 -0
  92. package/web/dist/assets/rule-overview-panel-D5gY3akK.js +1 -0
  93. package/web/dist/assets/{server-CktUTlNz.js → server-eYXq3PbE.js} +1 -1
  94. package/web/dist/assets/settings-panel-Bfzfsovk.js +1 -0
  95. package/web/dist/assets/{shield-check-UHsTa1Dy.js → shield-check-hQXjdfZ7.js} +1 -1
  96. package/web/dist/assets/smartphone-D4Q7cQfm.js +1 -0
  97. package/web/dist/assets/switch-DpLnRvOJ.js +1 -0
  98. package/web/dist/assets/{syntax-highlight-DF90eoRG.js → syntax-highlight-EJCxGikd.js} +1 -1
  99. package/web/dist/assets/{table-2-BE3hfnr0.js → table-2-DvGHhMm4.js} +1 -1
  100. package/web/dist/assets/table-C3mgEjkP.js +1 -0
  101. package/web/dist/assets/{textarea-CQWqIFs-.js → textarea-BjWF0pk4.js} +1 -1
  102. package/web/dist/assets/{wand-sparkles-B9ZnNs8E.js → wand-sparkles-DDGjzjnX.js} +1 -1
  103. package/web/dist/assets/{wifi-fTyrNPN8.js → wifi-QkTcTrED.js} +1 -1
  104. package/web/dist/assets/{zap-h2l6wVxY.js → zap-CEVoVkAg.js} +1 -1
  105. package/web/dist/index.html +17 -14
  106. package/web/dist/assets/alert-DO7T3mut.js +0 -1
  107. package/web/dist/assets/arrow-right-DGB2MxsX.js +0 -1
  108. package/web/dist/assets/check-ByTjANaY.js +0 -1
  109. package/web/dist/assets/checkbox-BwiDnRBb.js +0 -1
  110. package/web/dist/assets/chevron-down-vKjBY-BY.js +0 -1
  111. package/web/dist/assets/code-DAB_mRnu.js +0 -1
  112. package/web/dist/assets/dist-BW-gQyc_.js +0 -5
  113. package/web/dist/assets/dist-CymFeFOA.js +0 -1
  114. package/web/dist/assets/es2015-BiaNLfVn.js +0 -41
  115. package/web/dist/assets/health-panel-BlelNpri.js +0 -1
  116. package/web/dist/assets/index-DHO85s04.css +0 -2
  117. package/web/dist/assets/index-qO2TvUmo.js +0 -18
  118. package/web/dist/assets/mobile-proxy-panel-CVK80S9O.js +0 -8
  119. package/web/dist/assets/mock-config-Dhbc1AgO.js +0 -1
  120. package/web/dist/assets/mock-editor-panel-BjhgVrWn.js +0 -20
  121. package/web/dist/assets/monaco-editor-BqDxt08N.js +0 -11
  122. package/web/dist/assets/pane-split-BJpOHSML.js +0 -1
  123. package/web/dist/assets/plugin-code-editor-Bbdqj39s.js +0 -2
  124. package/web/dist/assets/plugin-config-B0QwdqtG.js +0 -1
  125. package/web/dist/assets/plugin-generator-Cmq3dxab.js +0 -2
  126. package/web/dist/assets/plugin-test-dialog-C4m77VMU.js +0 -7
  127. package/web/dist/assets/plus-BdrJey8J.js +0 -1
  128. package/web/dist/assets/rotate-ccw-_UaUgje4.js +0 -1
  129. package/web/dist/assets/route-preview-BMra25Ac.js +0 -1
  130. package/web/dist/assets/rule-config-C8h0ab8H.js +0 -15
  131. package/web/dist/assets/rule-overview-panel-Ddhm3_aw.js +0 -1
  132. package/web/dist/assets/settings-panel-03AFbqGD.js +0 -1
  133. package/web/dist/assets/smartphone-D5HBDIeh.js +0 -1
  134. package/web/dist/assets/switch-Dd7hKJ2O.js +0 -1
  135. package/web/dist/assets/table-BY-pIs96.js +0 -1
  136. package/web/dist/assets/tabs-DnFHv5gb.js +0 -1
  137. /package/web/dist/assets/{ai-config-store-DQXVJVn_.js → ai-config-store-B_VpGvwx.js} +0 -0
  138. /package/web/dist/assets/{babel-DsprIpXZ.js → babel-D1quDdNt.js} +0 -0
  139. /package/web/dist/assets/{clipboard-Dz6MgwV-.js → clipboard-DUgC_tNv.js} +0 -0
  140. /package/web/dist/assets/{dist-DQDFV3o1.js → dist-Bq2klZ3g.js} +0 -0
  141. /package/web/dist/assets/{estree-BP7k0NIt.js → estree--Vq99DGn.js} +0 -0
  142. /package/web/dist/assets/{html-6FIWbqxX.js → html-D2PZBPnP.js} +0 -0
  143. /package/web/dist/assets/{postcss-Dnf30fQU.js → postcss-DfIslWug.js} +0 -0
  144. /package/web/dist/assets/{standalone-CjxtLKw-.js → standalone-D-fjaAIs.js} +0 -0
@@ -1 +0,0 @@
1
- import{f as e,s as t,t as n,u as r}from"./button-yArHqw81.js";import"./dist-CwP5Ad1_.js";import{t as i}from"./refresh-cw-DdzbeDXU.js";import{t as a}from"./table-2-BE3hfnr0.js";import{A as o,B as s,D as c,E as l,O as u,R as d,T as f,U as ee,W as p,Z as m,at as h,j as g,k as _,lt as v,mt as te,o as y,z as b}from"./index-qO2TvUmo.js";import{a as x,i as S,n as C,o as w,r as T,t as E}from"./table-BY-pIs96.js";var D=e(r(),1),O=t(),k=`border-l-2 border-l-transparent`,A=`text-muted-foreground opacity-75`;function j(e){return e.length>0?e.map(e=>`!${e}`).join(` `):`—`}function M({rules:e,activeFileName:t,onLocateRule:r,onSelectFile:M}){let[N,ne]=(0,D.useState)(null),[P,F]=(0,D.useState)(!0),[I,L]=(0,D.useState)(null),[R,z]=(0,D.useState)(`merged`),[B,V]=(0,D.useState)(``),H=(0,D.useDeferredValue)(B),U=(0,D.useCallback)(async()=>{F(!0),L(null);try{let e=await fetch(`/api/rule-files/overview`);if(!e.ok)throw Error(`加载失败(${e.status})`);ne(await e.json())}catch(e){L(e instanceof Error?e.message:`加载失败`)}finally{F(!1)}},[]);(0,D.useEffect)(()=>{U()},[U]);let W=(0,D.useMemo)(()=>N?.perFileRules.find(e=>e.name===t)??null,[N,t]),G=(0,D.useMemo)(()=>{if(!W||W.error)return!1;let t=W.rules.map(e=>({rule:e.rawRule,target:e.rawTarget,enabled:e.enabled,exclusions:e.exclusions}));return y(e)!==y(t)},[W,e]),K=(0,D.useMemo)(()=>{let e=new Map;for(let t of N?.conflicts??[])e.set(t.pattern,t);return e},[N]),q=(0,D.useCallback)(e=>{let t=H.trim().toLowerCase();return t?e.some(e=>e&&e.toLowerCase().includes(t)):!0},[H]),J=(0,D.useMemo)(()=>(N?.mergedRules??[]).map(e=>({winner:e,shadowed:K.get(e.pattern)?.shadowed??[]})).filter(({winner:e,shadowed:t})=>q([e.rawRule,e.rawTarget,e.file])||t.some(e=>q([e.rawRule,e.rawTarget,e.file]))),[N,K,q]),Y=N?.mergedRules.length??0,X=N?.conflicts.reduce((e,t)=>e+t.shadowed.length,0)??0,Z=(0,D.useMemo)(()=>(N?.perFileRules??[]).map(e=>({...e,matched:e.rules.filter(t=>q([t.rawRule,t.rawTarget,e.name]))})).filter(e=>e.error!=null||q([e.name])||e.matched.length>0),[N,q]),re=N?.perFileRules.reduce((e,t)=>e+t.rules.length,0)??0,ie=Z.reduce((e,t)=>e+t.matched.length,0),Q=(0,D.useCallback)((e,t,n)=>{r(e,t,n)},[r]),ae=(0,D.useCallback)((e,t)=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),M(t))},[M]),oe=()=>{if(P)return(0,O.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col gap-2 p-2`,children:[(0,O.jsx)(p,{className:`h-8 w-full`}),(0,O.jsx)(p,{className:`h-8 w-full`}),(0,O.jsx)(p,{className:`h-8 w-3/4`})]});if(I)return(0,O.jsxs)(l,{className:`min-h-0 flex-1`,children:[(0,O.jsxs)(_,{children:[(0,O.jsx)(o,{variant:`icon`,children:(0,O.jsx)(m,{})}),(0,O.jsx)(g,{children:`加载失败`}),(0,O.jsx)(u,{children:I})]}),(0,O.jsx)(c,{children:(0,O.jsxs)(n,{variant:`outline`,onClick:()=>void U(),children:[(0,O.jsx)(i,{"data-icon":`inline-start`}),`重试`]})})]});let e=(N?.files.length??0)>0,t=N?.perFileRules.some(e=>e.rules.length>0||e.error!=null)??!1,r=H.trim().length>0;return e?t?R===`merged`&&!r&&(N?.mergedRules.length??0)===0?(0,O.jsx)(l,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(_,{children:[(0,O.jsx)(o,{variant:`icon`,children:(0,O.jsx)(v,{})}),(0,O.jsx)(g,{children:`没有生效中的规则`}),(0,O.jsx)(u,{children:`规则全部被禁用,或没有启用任何规则文件;切换到「按文件」查看全部规则`})]})}):r&&R===`merged`&&J.length===0||r&&R===`files`&&Z.every(e=>e.matched.length===0&&e.error==null)?$():R===`merged`?se():ce():(0,O.jsx)(l,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(_,{children:[(0,O.jsx)(o,{variant:`icon`,children:(0,O.jsx)(te,{})}),(0,O.jsx)(g,{children:`所有规则文件都是空的`}),(0,O.jsx)(u,{children:`还没有任何路由规则,先去路由规则页添加一条吧`})]})}):(0,O.jsx)(l,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(_,{children:[(0,O.jsx)(o,{variant:`icon`,children:(0,O.jsx)(a,{})}),(0,O.jsx)(g,{children:`还没有规则文件`}),(0,O.jsx)(u,{children:`在路由规则页点击「+」创建第一个规则文件`})]})})},$=()=>(0,O.jsxs)(l,{className:`min-h-0 flex-1`,children:[(0,O.jsxs)(_,{children:[(0,O.jsx)(o,{variant:`icon`,children:(0,O.jsx)(h,{})}),(0,O.jsx)(g,{children:`无匹配结果`}),(0,O.jsxs)(u,{children:[`没有找到符合「`,H.trim(),`」的规则`]})]}),(0,O.jsx)(c,{children:(0,O.jsx)(n,{variant:`outline`,onClick:()=>V(``),children:`清空筛选`})})]}),se=()=>(0,O.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden rounded-md border`,children:[(0,O.jsx)(`div`,{className:`meddle-thin-scroll shrink-0 overflow-x-auto bg-card`,children:(0,O.jsxs)(E,{className:`table-fixed`,children:[(0,O.jsxs)(`colgroup`,{children:[(0,O.jsx)(`col`,{style:{width:`6rem`}}),(0,O.jsx)(`col`,{}),(0,O.jsx)(`col`,{style:{width:`8rem`}}),(0,O.jsx)(`col`,{})]}),(0,O.jsx)(x,{children:(0,O.jsxs)(w,{children:[(0,O.jsx)(S,{children:`来源`}),(0,O.jsx)(S,{children:`规则`}),(0,O.jsx)(S,{className:`hidden md:table-cell`,children:`排除`}),(0,O.jsx)(S,{children:`目标`})]})})]})}),(0,O.jsx)(f,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(E,{className:`table-fixed`,children:[(0,O.jsxs)(`colgroup`,{children:[(0,O.jsx)(`col`,{style:{width:`6rem`}}),(0,O.jsx)(`col`,{}),(0,O.jsx)(`col`,{style:{width:`8rem`}}),(0,O.jsx)(`col`,{})]}),(0,O.jsx)(C,{children:J.map(({winner:e,shadowed:t})=>(0,O.jsxs)(D.Fragment,{children:[(0,O.jsxs)(w,{className:`${k} cursor-pointer`,onClick:()=>Q(e.file,e.rawRule,e.rawTarget),title:`点击定位到该规则`,children:[(0,O.jsx)(T,{className:`truncate text-xs text-muted-foreground`,children:e.file}),(0,O.jsxs)(T,{className:`break-all font-mono text-xs`,children:[e.rawRule,t.length>0&&(0,O.jsx)(s,{variant:`default`,className:`ml-2 px-1 py-0 text-[10px]`,title:`同名规则最终生效的定义`,children:`生效`})]}),(0,O.jsx)(T,{className:`hidden break-all font-mono text-xs text-muted-foreground md:table-cell`,children:j(e.exclusions)}),(0,O.jsx)(T,{className:`break-all font-mono text-xs`,children:e.rawTarget})]}),t.map((t,n)=>(0,O.jsxs)(w,{className:`${k} cursor-pointer ${A}`,onClick:()=>Q(t.file,t.rawRule,t.rawTarget),title:`点击定位到该规则`,children:[(0,O.jsx)(T,{className:`truncate text-xs`,children:t.file}),(0,O.jsx)(T,{className:`break-all font-mono text-xs`,children:(0,O.jsxs)(`span`,{className:`inline-flex flex-wrap items-center gap-1.5`,children:[t.rawRule,(0,O.jsx)(s,{variant:`destructive`,className:`px-1 py-0 text-[10px]`,title:`已被 ${e.file} 中的同名规则覆盖,实际不生效`,children:`已被覆盖`})]})}),(0,O.jsx)(T,{className:`hidden break-all font-mono text-xs md:table-cell`,children:`—`}),(0,O.jsx)(T,{className:`break-all font-mono text-xs`,children:t.rawTarget})]},`merged-shadowed-${n}`))]},`merged-group-${e.pattern}`))})]})})]}),ce=()=>(0,O.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden rounded-md border`,children:[(0,O.jsx)(`div`,{className:`meddle-thin-scroll shrink-0 overflow-x-auto bg-card`,children:(0,O.jsxs)(E,{className:`table-fixed`,children:[(0,O.jsxs)(`colgroup`,{children:[(0,O.jsx)(`col`,{style:{width:`3.5rem`}}),(0,O.jsx)(`col`,{}),(0,O.jsx)(`col`,{style:{width:`8rem`}}),(0,O.jsx)(`col`,{})]}),(0,O.jsx)(x,{children:(0,O.jsxs)(w,{children:[(0,O.jsx)(S,{children:`状态`}),(0,O.jsx)(S,{children:`规则`}),(0,O.jsx)(S,{className:`hidden md:table-cell`,children:`排除`}),(0,O.jsx)(S,{children:`目标`})]})})]})}),(0,O.jsx)(f,{className:`min-h-0 flex-1`,children:(0,O.jsxs)(E,{className:`table-fixed`,children:[(0,O.jsxs)(`colgroup`,{children:[(0,O.jsx)(`col`,{style:{width:`3.5rem`}}),(0,O.jsx)(`col`,{}),(0,O.jsx)(`col`,{style:{width:`8rem`}}),(0,O.jsx)(`col`,{})]}),(0,O.jsx)(C,{children:Z.map(e=>(0,O.jsxs)(D.Fragment,{children:[(0,O.jsx)(w,{className:`hover:bg-accent/60`,children:(0,O.jsx)(T,{colSpan:4,className:`cursor-pointer bg-muted/50 p-2 align-middle`,role:`button`,tabIndex:0,onClick:()=>M(e.name),onKeyDown:t=>ae(t,e.name),title:`点击切换到该规则文件`,children:(0,O.jsxs)(`span`,{className:`flex flex-wrap items-center gap-2 font-medium`,children:[e.name,(0,O.jsx)(s,{variant:e.enabled?`default`:`secondary`,className:`px-1 py-0 text-[10px]`,children:e.enabled?`启用`:`禁用`}),(0,O.jsx)(s,{variant:`secondary`,className:`px-1 py-0 text-[10px]`,children:e.rules.length})]})})}),e.error&&(0,O.jsx)(w,{className:`text-destructive`,children:(0,O.jsx)(T,{colSpan:4,className:`p-2 text-xs`,children:(0,O.jsxs)(`span`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(m,{className:`h-3.5 w-3.5 shrink-0`}),`读取失败:`,e.error]})})}),e.matched.map((t,n)=>(0,O.jsxs)(w,{className:`cursor-pointer ${t.enabled?``:`opacity-60`}`,onClick:()=>Q(e.name,t.rawRule,t.rawTarget),title:`点击定位到该规则`,children:[(0,O.jsx)(T,{children:(0,O.jsx)(s,{variant:t.enabled?`default`:`secondary`,className:`px-1 py-0 text-[10px]`,children:t.enabled?`启用`:`禁用`})}),(0,O.jsx)(T,{className:`break-all font-mono text-xs`,children:t.rawRule}),(0,O.jsx)(T,{className:`hidden break-all font-mono text-xs text-muted-foreground md:table-cell`,children:j(t.exclusions)}),(0,O.jsx)(T,{className:`break-all font-mono text-xs ${t.enabled?``:`line-through`}`,children:t.rawTarget})]},`file-rule-${n}`))]},`file-group-${e.name}`))})]})})]}),le=R===`merged`?Y+X:re,ue=R===`merged`?J.reduce((e,t)=>e+1+t.shadowed.length,0):ie;return(0,O.jsxs)(`div`,{className:`app-panel-content flex h-full flex-col gap-3`,children:[(0,O.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,O.jsxs)(d,{type:`single`,value:R,onValueChange:e=>{e&&z(e)},variant:`outline`,size:`sm`,className:`bg-background`,"aria-label":`总览视图`,children:[(0,O.jsx)(b,{value:`merged`,children:`生效规则`}),(0,O.jsx)(b,{value:`files`,children:`按文件`})]}),(0,O.jsxs)(`div`,{className:`relative min-w-40 flex-1`,children:[(0,O.jsx)(h,{className:`pointer-events-none absolute top-1/2 left-2 h-4 w-4 -translate-y-1/2 text-muted-foreground`}),(0,O.jsx)(ee,{value:B,onChange:e=>V(e.target.value),placeholder:`搜索规则 / 目标 / 文件名`,className:`h-8 pl-8`,"aria-label":`搜索规则`})]}),(0,O.jsx)(n,{type:`button`,variant:`ghost`,size:`icon-sm`,onClick:()=>void U(),disabled:P,"aria-label":`刷新总览`,title:`刷新`,children:(0,O.jsx)(i,{})})]}),G&&(0,O.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border border-amber-200 bg-amber-50 px-3 py-2 text-xs text-amber-800`,children:[(0,O.jsx)(m,{className:`h-3.5 w-3.5 shrink-0`}),(0,O.jsxs)(`span`,{children:[`「`,t,`」有未保存修改,此处展示的是代理当前使用的`,(0,O.jsx)(`b`,{children:`已保存内容`})]})]}),!P&&!I&&(N?.files.length??0)>0&&(0,O.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2 text-xs text-muted-foreground`,children:[(0,O.jsxs)(`span`,{children:[ue,` / `,le,` 条`,R===`merged`&&H.trim()===``&&X>0?`,其中 ${X} 条被同名规则覆盖`:``]}),R===`merged`&&(0,O.jsx)(`span`,{children:`按代理实际生效顺序排列(后定义覆盖先定义)`}),R===`files`&&(0,O.jsx)(`span`,{children:`点击文件名切换到该文件`})]}),oe()]})}export{M as RuleOverviewPanel};
@@ -1 +0,0 @@
1
- import{f as e,l as t,s as n,t as r,u as i}from"./button-yArHqw81.js";import"./dist-CwP5Ad1_.js";import{t as ee}from"./check-ByTjANaY.js";import{t as a}from"./circle-alert-DAWy5HuM.js";import{t as o}from"./circle-x-BjSs1hQK.js";import{t as s}from"./plus-BdrJey8J.js";import{t as te}from"./refresh-cw-DdzbeDXU.js";import{t as ne}from"./rotate-ccw-_UaUgje4.js";import{t as c}from"./smartphone-D5HBDIeh.js";import"./es2015-BiaNLfVn.js";import{t as re}from"./switch-Dd7hKJ2O.js";import{i as l,n as u,r as ie,t as ae}from"./tabs-DnFHv5gb.js";import{a as d,c as oe,l as se,n as ce,o as f,r as p,s as le,t as ue}from"./ai-config-store-DQXVJVn_.js";import{B as de,F as m,I as fe,L as pe,M as me,N as he,P as ge,Q as _e,R as h,St as g,U as _,_ as ve,b as ye,c as be,d as v,dt as xe,f as Se,ft as Ce,g as we,h as y,it as Te,l as Ee,m as b,ot as x,p as De,rt as Oe,s as ke,tt as Ae,u as S,v as je,vt as C,x as w,y as Me,z as T}from"./index-qO2TvUmo.js";import{n as Ne,r as Pe,t as Fe}from"./alert-DO7T3mut.js";var Ie=t(`eye-off`,[[`path`,{d:`M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49`,key:`ct8e1f`}],[`path`,{d:`M14.084 14.158a3 3 0 0 1-4.242-4.242`,key:`151rxh`}],[`path`,{d:`M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143`,key:`13bj9a`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}]]),Le=t(`eye`,[[`path`,{d:`M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0`,key:`1nclc0`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),E=t(`stethoscope`,[[`path`,{d:`M11 2v2`,key:`1539x4`}],[`path`,{d:`M5 2v2`,key:`1yf1q8`}],[`path`,{d:`M5 3H4a2 2 0 0 0-2 2v4a6 6 0 0 0 12 0V5a2 2 0 0 0-2-2h-1`,key:`rb5t3r`}],[`path`,{d:`M8 15a6 6 0 0 0 12 0v-3`,key:`x18d4x`}],[`circle`,{cx:`20`,cy:`10`,r:`2`,key:`ts1r5v`}]]),D=e(i(),1),O=n(),Re=[{value:`75`,label:`75%`,scale:.75},{value:`90`,label:`90%`,scale:.9},{value:`100`,label:`100%`,scale:1},{value:`110`,label:`110%`,scale:1.1},{value:`125`,label:`125%`,scale:1.25},{value:`150`,label:`150%`,scale:1.5}],ze=[{value:`auto`,label:`自动`,color:`linear-gradient(135deg, oklch(0.623 0.214 259.815), oklch(0.606 0.25 292.717))`},{value:`neutral`,label:`中性`,color:`oklch(0.556 0 0)`},{value:`blue`,label:`蓝色`,color:`oklch(0.623 0.214 259.815)`},{value:`violet`,label:`紫色`,color:`oklch(0.606 0.25 292.717)`},{value:`green`,label:`绿色`,color:`oklch(0.627 0.194 149.214)`},{value:`orange`,label:`橙色`,color:`oklch(0.646 0.222 41.116)`},{value:`rose`,label:`玫红`,color:`oklch(0.645 0.246 16.439)`}],k=`app-panel-content mt-0`,A=`app-field-group`,j=`app-section`,M=e=>{if(!e)return`100`;let t={small:`90`,medium:`100`,large:`110`};return e in t?t[e]:Re.some(t=>t.value===e)?e:`100`};function Be({open:e=!1,onOpenChange:t,embedded:n=!1}){let{theme:i,accentColor:Be,setTheme:Ve,setAccentColor:He,setZoom:N}=ke(),[P,Ue]=(0,D.useState)(`preferences`),[F,I]=(0,D.useState)(()=>p()),[L,We]=(0,D.useState)(!1),[R,z]=(0,D.useState)(!1),[B,V]=(0,D.useState)(null),[Ge,H]=(0,D.useState)(``),[U,W]=(0,D.useState)(null),[G,Ke]=(0,D.useState)(``),[qe,Je]=(0,D.useState)([]),[K,q]=(0,D.useState)({}),[J,Ye]=(0,D.useState)(``),[Y,Xe]=(0,D.useState)(``),[X,Z]=(0,D.useState)(null),[Ze,Qe]=(0,D.useState)(!1),[Q,$e]=(0,D.useState)(()=>M(be().fontSize)),[et,tt]=(0,D.useState)(!1);(0,D.useEffect)(()=>{Ee().then(e=>{let t=M(e.fontSize);$e(t),N(parseInt(t,10)/100),tt(!0)}).catch(()=>{tt(!0)})},[N]),(0,D.useEffect)(()=>{if(!et)return;let e=M(Q);N(parseInt(e,10)/100),S({fontSize:e}).catch(console.error)},[N,et,Q]),(0,D.useEffect)(()=>{(e||n)&&(Ee().then(e=>{I(e.aiConfig),Ke(e.mocksFilePath||``),q(e.clientAliases||{})}).catch(()=>{I(p())}),V(null),H(``),fetch(`/api/rule-files`).then(e=>e.json()).then(e=>{Array.isArray(e)&&Je(e)}).catch(()=>{}))},[e,n]);let nt=e=>{let t=d(e);I({...F,provider:e,baseUrl:t.baseUrl,model:t.model})},rt=async()=>{z(!0);try{await S({aiConfig:F}),oe(F),V(`success`),H(`AI 配置保存成功`),v.success(`AI 配置保存成功`)}catch(e){let t=e instanceof Error?e.message:`保存失败`;V(`error`),H(t),v.error(t)}finally{z(!1)}},it=()=>{le(),I(p()),V(null),H(``)},at=async()=>{if(!f(F)){V(`error`),H(`请填写完整的配置信息`);return}z(!0),V(null),H(`测试中...`);try{let e=F.baseUrl,t={"Content-Type":`application/json`},n;F.provider===`anthropic`?(t[`x-api-key`]=F.apiKey,t[`anthropic-version`]=`2023-06-01`,n={model:F.model,max_tokens:100,system:`You are a helpful assistant.`,messages:[{role:`user`,content:`Say "test successful"`}],temperature:.3}):(t.Authorization=`Bearer ${F.apiKey}`,n={model:F.model,messages:[{role:`system`,content:`You are a helpful assistant.`},{role:`user`,content:`Say "test successful"`}],temperature:.3,max_tokens:100});let r=await fetch(e,{method:`POST`,headers:t,body:JSON.stringify(n)});if(!r.ok){let e=await r.text();throw Error(`API错误 (${r.status}): ${e}`)}let i=await r.json();if(F.provider===`anthropic`){if(!i.content?.[0]?.text)throw Error(`API响应格式不正确`)}else if(!i.choices?.[0]?.message?.content)throw Error(`API响应格式不正确`);V(`success`),H(`连接测试成功! API配置正常`)}catch(e){V(`error`),H(e instanceof Error?e.message:`测试失败`)}finally{z(!1)}},ot=(0,D.useCallback)(async()=>{try{let e=await fetch(`/api/refresh-config`,{method:`POST`});if(e.ok){let t=await e.json();V(`success`),H(t.message||`配置已刷新`),setTimeout(()=>{V(null),H(``)},2e3)}else{let t=await e.json();V(`error`),H(t.error||`刷新配置失败`),setTimeout(()=>{V(null),H(``)},2e3)}}catch(e){console.error(`刷新配置失败:`,e),V(`error`),H(`刷新配置失败`),setTimeout(()=>{V(null),H(``)},2e3)}},[]),st=(0,D.useCallback)(async()=>{Qe(!0),Z(null);try{let e=await fetch(`/api/config-doctor`);e.ok?Z(await e.json()):(V(`error`),H(`诊断失败`),setTimeout(()=>{V(null),H(``)},2e3))}catch(e){console.error(`诊断失败:`,e),V(`error`),H(`诊断失败`),setTimeout(()=>{V(null),H(``)},2e3)}finally{Qe(!1)}},[]),ct=()=>{let e=J.trim(),t=Y.trim();!e||!t||(q(n=>({...n,[e]:t})),Ye(``),Xe(``))},lt=async()=>{z(!0);try{await S({clientAliases:K}),V(`success`),H(`客户端名称已保存,新请求立即生效`),v.success(`客户端名称保存成功`)}catch(e){let t=e instanceof Error?e.message:`保存失败`;V(`error`),H(t),v.error(t)}finally{z(!1)}},ut=async()=>{z(!0);try{await S({mocksFilePath:G}),V(`success`),H(`Mock 文件路径已更新,刷新页面后生效`),v.success(`Mock 文件路径保存成功`),setTimeout(()=>{V(null),H(``)},3e3)}catch(e){let t=e instanceof Error?e.message:`保存失败`;V(`error`),H(t),v.error(t)}finally{z(!1)}};Se({active:(e||n)&&P!==`preferences`,enabled:!R,priority:De.panel,onSave:()=>{if(P===`config`)return ut();if(P===`clients`)return lt();if(P===`ai`)return rt()}});let $=(0,O.jsxs)(O.Fragment,{children:[!n&&(0,O.jsxs)(Me,{className:`px-6 pt-6 pb-4`,children:[(0,O.jsxs)(ye,{className:`flex items-center gap-2`,children:[(0,O.jsx)(Te,{className:`h-5 w-5`}),`系统设置`]}),(0,O.jsx)(je,{children:`管理系统偏好、配置和 AI 功能`})]}),(0,O.jsxs)(ae,{value:P,onValueChange:e=>Ue(e),orientation:`vertical`,className:`min-h-0 flex-1 gap-0`,children:[(0,O.jsxs)(ie,{"aria-label":`设置分类`,className:`h-full w-14 shrink-0 self-stretch justify-start gap-1 rounded-none border-r bg-muted/25 p-2 group-data-[orientation=vertical]/tabs:!h-full sm:w-44 sm:p-3`,children:[(0,O.jsxs)(l,{value:`preferences`,className:`h-9 w-full flex-none justify-start px-2.5 sm:px-3`,children:[(0,O.jsx)(Te,{}),(0,O.jsx)(`span`,{className:`hidden sm:inline`,children:`偏好设置`})]}),(0,O.jsxs)(l,{value:`config`,className:`h-9 w-full flex-none justify-start px-2.5 sm:px-3`,children:[(0,O.jsx)(C,{}),(0,O.jsx)(`span`,{className:`hidden sm:inline`,children:`配置文件`})]}),(0,O.jsxs)(l,{value:`clients`,className:`h-9 w-full flex-none justify-start px-2.5 sm:px-3`,children:[(0,O.jsx)(c,{}),(0,O.jsx)(`span`,{className:`hidden sm:inline`,children:`客户端`})]}),(0,O.jsxs)(l,{value:`ai`,className:`h-9 w-full flex-none justify-start px-2.5 sm:px-3`,children:[(0,O.jsx)(Oe,{}),(0,O.jsx)(`span`,{className:`hidden sm:inline`,children:`AI 配置`})]})]}),(0,O.jsxs)(u,{value:`preferences`,className:k,children:[(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(w,{className:`text-sm`,children:`主题`}),(0,O.jsxs)(me,{value:i,onValueChange:e=>Ve(e),children:[(0,O.jsx)(fe,{children:(0,O.jsx)(pe,{placeholder:`选择主题`})}),(0,O.jsx)(he,{children:(0,O.jsxs)(ge,{children:[(0,O.jsx)(m,{value:`system`,children:(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(Ce,{className:`size-4`}),`跟随系统`]})}),(0,O.jsx)(m,{value:`light`,children:(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(Ae,{className:`size-4`}),`浅色模式`]})}),(0,O.jsx)(m,{value:`dark`,children:(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(xe,{className:`size-4`}),`深色模式`]})})]})})]})]}),(0,O.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[(0,O.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,O.jsx)(w,{className:`text-sm`,children:`强调色`}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`统一按钮、状态、选中项和焦点样式。自动模式会根据明暗主题选择合适的颜色。`})]}),(0,O.jsx)(h,{type:`single`,value:Be,onValueChange:e=>{e&&He(e)},variant:`outline`,spacing:1,className:`flex-wrap justify-start`,"aria-label":`强调色`,children:ze.map(e=>(0,O.jsxs)(T,{value:e.value,"aria-label":e.label,children:[e.value===`auto`?(0,O.jsx)(Oe,{"data-icon":`inline-start`}):(0,O.jsx)(`span`,{className:`size-3 rounded-full border border-foreground/10`,style:{background:e.color}}),e.label]},e.value))})]}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(w,{className:`text-sm`,children:`缩放比例`}),(0,O.jsxs)(me,{value:Q,onValueChange:$e,children:[(0,O.jsx)(fe,{children:(0,O.jsx)(pe,{placeholder:`选择缩放比例`})}),(0,O.jsx)(he,{children:(0,O.jsx)(ge,{children:Re.map(e=>(0,O.jsx)(m,{value:e.value,children:e.label},e.value))})})]})]}),(0,O.jsx)(y,{}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(`h3`,{className:`text-sm font-medium`,children:`关于`}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Meddle - HTTP 调试代理工具`}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`版本: 1.0.0`})]})]}),(0,O.jsxs)(u,{value:`config`,className:k,children:[(0,O.jsxs)(`div`,{className:j,children:[(0,O.jsx)(w,{className:`text-sm font-medium`,children:`路由规则文件`}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsxs)(`div`,{className:`flex items-center gap-2 p-3 bg-muted rounded-md`,children:[(0,O.jsx)(C,{className:`h-4 w-4 text-muted-foreground shrink-0`}),(0,O.jsx)(`span`,{className:`text-xs font-mono truncate flex-1`,children:`~/.meddle/route-rules/`})]}),qe.length>0?(0,O.jsx)(`div`,{className:`space-y-2`,children:qe.map(e=>(0,O.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border px-3 py-2.5 text-sm`,children:[(0,O.jsx)(de,{variant:e.enabled?`default`:`secondary`,className:`text-[10px]`,children:e.enabled?`已启用`:`未启用`}),(0,O.jsxs)(`span`,{className:`flex-1 truncate text-xs`,children:[e.name,`.txt`]}),(0,O.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[e.ruleCount,` 条规则`]})]},e.name))}):(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`暂无规则文件`}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`规则文件存放于 ~/.meddle/route-rules/ 目录,纯文本格式。在"路由规则"页面管理。`})]})]}),(0,O.jsx)(y,{}),(0,O.jsxs)(`div`,{className:j,children:[(0,O.jsx)(w,{className:`text-sm font-medium`,children:`Mock 规则文件`}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsxs)(`div`,{className:`flex items-center gap-2 p-3 bg-muted rounded-md`,children:[(0,O.jsx)(C,{className:`h-4 w-4 text-muted-foreground shrink-0`}),(0,O.jsx)(`span`,{className:`text-xs font-mono truncate flex-1`,children:G||`默认: ~/.meddle/mocks.json`})]}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(w,{htmlFor:`mocksPath`,className:`text-xs text-muted-foreground`,children:`自定义 Mock 规则文件路径(留空使用默认)`}),(0,O.jsxs)(`div`,{className:`flex gap-2`,children:[(0,O.jsx)(_,{id:`mocksPath`,value:G,onChange:e=>Ke(e.target.value),placeholder:`如: /path/to/my-mocks.json`,className:`flex-1 h-8 text-sm font-mono`}),(0,O.jsxs)(b,{variant:`outline`,size:`sm`,onClick:ut,disabled:R,className:`h-8`,children:[(0,O.jsx)(x,{"data-icon":`inline-start`,className:`h-3 w-3`}),`应用`]})]}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`必须是 JSON 格式的 Mock 规则文件`})]})]})]}),(0,O.jsx)(y,{}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(`h3`,{className:`text-sm font-medium`,children:`操作`}),(0,O.jsxs)(`div`,{className:`flex gap-2`,children:[(0,O.jsxs)(r,{variant:`outline`,size:`sm`,onClick:ot,children:[(0,O.jsx)(te,{className:`h-4 w-4 mr-1`}),`重新加载配置`]}),(0,O.jsxs)(r,{variant:`outline`,size:`sm`,onClick:st,disabled:Ze,children:[(0,O.jsx)(E,{className:`h-4 w-4 mr-1`}),Ze?`诊断中...`:`诊断配置`]})]}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`点击重新加载可应用修改后的配置文件,点击诊断配置可检查配置有效性`})]}),X&&(0,O.jsxs)(`div`,{className:j,children:[(0,O.jsx)(y,{}),(0,O.jsxs)(`div`,{children:[(0,O.jsxs)(`h3`,{className:`mb-4 flex items-center gap-2 text-sm font-medium`,children:[(0,O.jsx)(E,{className:`h-4 w-4`}),`诊断结果`]}),(0,O.jsxs)(`div`,{className:`mb-3 p-3 rounded-md border ${X.status===`ok`?`bg-green-50 dark:bg-green-950/20 border-green-200 dark:border-green-900`:X.status===`warning`?`bg-yellow-50 dark:bg-yellow-950/20 border-yellow-200 dark:border-yellow-900`:`bg-red-50 dark:bg-red-950/20 border-red-200 dark:border-red-900`}`,children:[X.status===`ok`&&(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(g,{className:`h-5 w-5 text-green-600 dark:text-green-400`}),(0,O.jsx)(`span`,{className:`text-sm font-medium text-green-700 dark:text-green-300`,children:`所有检查通过!配置正常。`})]}),X.status===`warning`&&(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(a,{className:`h-5 w-5 text-yellow-600 dark:text-yellow-400`}),(0,O.jsxs)(`span`,{className:`text-sm font-medium text-yellow-700 dark:text-yellow-300`,children:[`发现 `,X.warnings.length,` 个警告`]})]}),X.status===`error`&&(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(o,{className:`h-5 w-5 text-red-600 dark:text-red-400`}),(0,O.jsxs)(`span`,{className:`text-sm font-medium text-red-700 dark:text-red-300`,children:[`发现 `,X.errors.length,` 个错误`]})]})]}),(0,O.jsx)(`div`,{className:A,children:X.checks.map((e,t)=>(0,O.jsx)(`div`,{className:`p-2 rounded border bg-card`,children:(0,O.jsxs)(`div`,{className:`flex items-start gap-2`,children:[(0,O.jsx)(g,{className:`h-4 w-4 text-green-600 dark:text-green-400 mt-0.5 shrink-0`}),(0,O.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,O.jsx)(`div`,{className:`text-sm font-medium`,children:e.name}),(0,O.jsx)(`div`,{className:`text-xs text-muted-foreground font-mono truncate`,children:e.path}),e.details&&(0,O.jsxs)(`div`,{className:`text-xs text-muted-foreground mt-1`,children:[e.details.totalFiles!==void 0&&`${e.details.enabledFiles}/${e.details.totalFiles} 个文件已启用`,e.details.totalRules!==void 0&&` · ${e.details.totalRules} 条规则`,e.details.rules!==void 0&&`${e.details.rules} 条规则`,e.details.total!==void 0&&`${e.details.total} 条规则 (${e.details.enabled} 已启用)`,e.details.size!==void 0&&` · ${e.details.size} bytes`]})]})]})},t))}),X.warnings&&X.warnings.length>0&&(0,O.jsxs)(`div`,{className:`mt-3 space-y-1`,children:[(0,O.jsx)(`div`,{className:`text-xs font-medium text-yellow-700 dark:text-yellow-300`,children:`警告:`}),X.warnings.map((e,t)=>(0,O.jsxs)(`div`,{className:`flex items-start gap-2 text-xs text-yellow-600 dark:text-yellow-400`,children:[(0,O.jsx)(a,{className:`h-3 w-3 mt-0.5 shrink-0`}),(0,O.jsx)(`span`,{children:e})]},t))]}),X.errors&&X.errors.length>0&&(0,O.jsxs)(`div`,{className:`mt-3 space-y-1`,children:[(0,O.jsx)(`div`,{className:`text-xs font-medium text-red-700 dark:text-red-300`,children:`错误:`}),X.errors.map((e,t)=>(0,O.jsxs)(`div`,{className:`flex items-start gap-2 text-xs text-red-600 dark:text-red-400`,children:[(0,O.jsx)(o,{className:`h-3 w-3 mt-0.5 shrink-0`}),(0,O.jsx)(`span`,{children:e})]},t))]})]})]})]}),(0,O.jsxs)(u,{value:`clients`,className:k,children:[(0,O.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,O.jsxs)(`h3`,{className:`text-sm font-medium flex items-center gap-2`,children:[(0,O.jsx)(c,{className:`h-4 w-4`}),`远程客户端名称`]}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`将日志中的客户端 IP 映射为设备名称。保存后新请求立即生效,无需重启代理。`})]}),(0,O.jsx)(`div`,{className:A,children:Object.entries(K).length===0?(0,O.jsx)(`div`,{className:`rounded-md border border-dashed p-4 text-center text-xs text-muted-foreground`,children:`尚未配置设备名称`}):Object.entries(K).map(([e,t])=>(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(_,{value:e,readOnly:!0,className:`h-8 flex-1 font-mono text-xs bg-muted/40`,"aria-label":`客户端 IP ${e}`}),(0,O.jsx)(_,{value:t,onChange:t=>{let n=t.target.value;q(t=>({...t,[e]:n}))},className:`h-8 flex-1 text-sm`,"aria-label":`${e} 的设备名称`}),(0,O.jsx)(r,{variant:`ghost`,size:`icon-sm`,className:`text-muted-foreground hover:text-destructive`,onClick:()=>{q(t=>{let n={...t};return delete n[e],n})},title:`删除设备名称`,"aria-label":`删除设备名称`,children:(0,O.jsx)(_e,{className:`h-4 w-4`})})]},e))}),(0,O.jsx)(y,{}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(w,{className:`text-sm`,children:`添加设备`}),(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(_,{value:J,onChange:e=>Ye(e.target.value),placeholder:`客户端 IP,例如 10.13.232.187`,className:`h-8 flex-1 font-mono text-xs`}),(0,O.jsx)(_,{value:Y,onChange:e=>Xe(e.target.value),onKeyDown:e=>{e.key===`Enter`&&ct()},placeholder:`设备名称,例如 iPhone`,className:`h-8 flex-1 text-sm`}),(0,O.jsxs)(r,{variant:`outline`,size:`sm`,className:`h-8`,onClick:ct,disabled:!J.trim()||!Y.trim(),children:[(0,O.jsx)(s,{className:`h-4 w-4 mr-1`}),`添加`]})]})]}),(0,O.jsxs)(b,{onClick:lt,disabled:R,children:[(0,O.jsx)(x,{"data-icon":`inline-start`,className:`h-4 w-4`}),R?`保存中...`:`保存客户端名称`]})]}),(0,O.jsxs)(u,{value:`ai`,className:k,children:[(0,O.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,O.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,O.jsx)(w,{className:`text-sm`,children:`启用 AI 功能`}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`启用智能代码修复功能`})]}),(0,O.jsx)(re,{checked:F.enabled,onCheckedChange:e=>I({...F,enabled:e}),"aria-label":`启用 AI 功能`})]}),(0,O.jsx)(y,{}),(0,O.jsxs)(`div`,{className:j,children:[(0,O.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,O.jsx)(w,{className:`text-sm`,children:`AI 模型配置`}),(0,O.jsxs)(r,{variant:`outline`,size:`sm`,onClick:()=>{W({name:``,provider:`openai`,apiKey:``,baseUrl:`https://api.openai.com/v1/chat/completions`,model:`gpt-4o-mini`})},children:[(0,O.jsx)(s,{className:`h-4 w-4 mr-1`}),`添加模型`]})]}),(0,O.jsx)(`div`,{className:A,children:F.models&&F.models.length>0?F.models.map(e=>(0,O.jsx)(`div`,{className:`p-3 rounded-md border ${F.activeModelId===e.id?`border-primary bg-primary/5`:`border-border`}`,children:(0,O.jsxs)(`div`,{className:`flex items-start justify-between`,children:[(0,O.jsxs)(`div`,{className:`flex-1`,children:[(0,O.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,O.jsx)(`span`,{className:`font-medium text-sm`,children:e.name}),F.activeModelId===e.id&&(0,O.jsx)(de,{variant:`default`,className:`text-xs`,children:`当前使用`})]}),(0,O.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:[e.provider===`openai`?`OpenAI`:`Anthropic`,` - `,e.model]})]}),(0,O.jsxs)(`div`,{className:`flex gap-1`,children:[F.activeModelId!==e.id&&(0,O.jsxs)(r,{variant:`ghost`,size:`xs`,onClick:()=>I(se(F,e.id)),children:[(0,O.jsx)(ee,{className:`h-3 w-3 mr-1`}),`使用`]}),(0,O.jsx)(r,{variant:`ghost`,size:`icon-sm`,onClick:()=>I(ce(F,e.id)),className:`text-destructive`,"aria-label":`删除模型`,children:(0,O.jsx)(_e,{className:`h-3 w-3`})})]})]})},e.id)):(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground italic py-4 text-center`,children:`暂无模型配置,点击"添加模型"创建`})}),U&&(0,O.jsxs)(`div`,{className:`space-y-5 rounded-md border border-primary bg-primary/5 p-4`,children:[(0,O.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,O.jsx)(w,{className:`text-sm font-medium`,children:`新增模型`}),(0,O.jsx)(r,{variant:`ghost`,size:`icon-xs`,onClick:()=>W(null),"aria-label":`关闭新增模型表单`,children:(0,O.jsx)(o,{className:`h-4 w-4`})})]}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(w,{htmlFor:`newModelName`,className:`text-xs`,children:`模型名称`}),(0,O.jsx)(_,{id:`newModelName`,value:U.name||``,onChange:e=>W({...U,name:e.target.value}),placeholder:`如:GPT-4o Mini`,className:`h-8 text-sm`})]}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(w,{className:`text-xs`,children:`服务商`}),(0,O.jsxs)(h,{type:`single`,value:U.provider,onValueChange:e=>{if(e===`openai`){let e=d(`openai`);W({...U,provider:`openai`,baseUrl:e.baseUrl,model:e.model})}else if(e===`anthropic`){let e=d(`anthropic`);W({...U,provider:`anthropic`,baseUrl:e.baseUrl,model:e.model})}},variant:`outline`,size:`sm`,spacing:0,children:[(0,O.jsx)(T,{value:`openai`,children:`OpenAI`}),(0,O.jsx)(T,{value:`anthropic`,children:`Anthropic`})]})]}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(w,{htmlFor:`newModelApiKey`,className:`text-xs`,children:`API Key`}),(0,O.jsx)(_,{id:`newModelApiKey`,type:L?`text`:`password`,value:U.apiKey||``,onChange:e=>W({...U,apiKey:e.target.value}),placeholder:`输入 API Key`,className:`h-8 text-sm`})]}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(w,{htmlFor:`newModelModel`,className:`text-xs`,children:`模型`}),(0,O.jsx)(_,{id:`newModelModel`,value:U.model||``,onChange:e=>W({...U,model:e.target.value}),placeholder:`模型名称`,className:`h-8 text-sm`})]}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(w,{htmlFor:`newModelBaseUrl`,className:`text-xs`,children:`API 端点`}),(0,O.jsx)(_,{id:`newModelBaseUrl`,value:U.baseUrl||``,onChange:e=>W({...U,baseUrl:e.target.value}),placeholder:`API 端点`,className:`h-8 text-sm`})]}),(0,O.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2`,children:[(0,O.jsx)(r,{variant:`outline`,size:`xs`,onClick:()=>W(null),children:`取消`}),(0,O.jsxs)(r,{size:`xs`,onClick:()=>{U.name&&U.apiKey&&U.model&&U.baseUrl&&(I(ue(F,U)),W(null))},disabled:!U.name||!U.apiKey||!U.model||!U.baseUrl,children:[(0,O.jsx)(s,{className:`h-3 w-3 mr-1`}),`添加`]})]})]})]}),(0,O.jsx)(y,{}),(0,O.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,O.jsx)(w,{className:`text-sm`,children:`传统配置(向后兼容)`}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`如果未配置多模型,将使用此配置`})]}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(w,{className:`text-xs`,children:`AI 服务商`}),(0,O.jsxs)(h,{type:`single`,value:F.provider,onValueChange:e=>{(e===`openai`||e===`anthropic`)&&nt(e)},variant:`outline`,size:`sm`,spacing:0,children:[(0,O.jsx)(T,{value:`openai`,children:`OpenAI`}),(0,O.jsx)(T,{value:`anthropic`,children:`Anthropic`})]})]}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(w,{htmlFor:`apiKey`,className:`text-xs`,children:`API Key`}),(0,O.jsxs)(`div`,{className:`flex gap-2`,children:[(0,O.jsx)(_,{id:`apiKey`,type:L?`text`:`password`,value:F.apiKey,onChange:e=>I({...F,apiKey:e.target.value}),placeholder:`输入 API Key`,className:`flex-1 h-8 text-sm`}),(0,O.jsx)(r,{variant:`outline`,size:`icon-sm`,onClick:()=>We(!L),"aria-label":L?`隐藏 API Key`:`显示 API Key`,children:L?(0,O.jsx)(Ie,{className:`h-4 w-4`}):(0,O.jsx)(Le,{className:`h-4 w-4`})})]})]}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(w,{htmlFor:`model`,className:`text-xs`,children:`模型`}),(0,O.jsx)(_,{id:`model`,value:F.model,onChange:e=>I({...F,model:e.target.value}),placeholder:`模型名称`,className:`h-8 text-sm`})]}),(0,O.jsxs)(`div`,{className:A,children:[(0,O.jsx)(w,{htmlFor:`baseUrl`,className:`text-xs`,children:`API 端点`}),(0,O.jsx)(_,{id:`baseUrl`,value:F.baseUrl,onChange:e=>I({...F,baseUrl:e.target.value}),placeholder:F.provider===`openai`?`https://api.openai.com/v1/chat/completions`:`https://api.anthropic.com/v1/messages`,className:`h-8 text-sm`})]}),Ge&&(0,O.jsxs)(Fe,{variant:B===`error`?`destructive`:`default`,children:[B===`success`?(0,O.jsx)(g,{}):B===`error`?(0,O.jsx)(o,{}):(0,O.jsx)(a,{}),(0,O.jsx)(Pe,{children:B===`success`?`操作成功`:B===`error`?`操作失败`:`处理中`}),(0,O.jsx)(Ne,{children:Ge})]}),(0,O.jsx)(y,{}),(0,O.jsxs)(`div`,{className:`flex justify-between`,children:[(0,O.jsxs)(r,{variant:`outline`,size:`sm`,onClick:it,children:[(0,O.jsx)(ne,{className:`h-4 w-4 mr-1`}),`重置`]}),(0,O.jsxs)(`div`,{className:`flex gap-2`,children:[(0,O.jsx)(r,{variant:`outline`,size:`sm`,onClick:at,disabled:!f(F)||R,children:`测试连接`}),(0,O.jsxs)(b,{size:`sm`,onClick:rt,disabled:R,children:[(0,O.jsx)(x,{"data-icon":`inline-start`,className:`h-4 w-4`}),R?`保存中...`:`保存`]})]})]})]})]})]});return n?(0,O.jsx)(`div`,{"data-testid":`settings-fullwidth`,className:`app-workspace-content flex h-full min-h-0 w-full flex-col overflow-hidden p-0`,children:(0,O.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden rounded-md border bg-card`,children:$})}):(0,O.jsx)(we,{open:e,onOpenChange:t,children:(0,O.jsx)(ve,{className:`p-0 flex flex-col`,resizable:!0,defaultWidth:600,storageKey:`settings-panel`,children:$})})}export{Be as SettingsPanel};
@@ -1 +0,0 @@
1
- import{l as e}from"./button-yArHqw81.js";var t=e(`smartphone`,[[`rect`,{width:`14`,height:`20`,x:`5`,y:`2`,rx:`2`,ry:`2`,key:`1yt0o3`}],[`path`,{d:`M12 18h.01`,key:`mhygvu`}]]);export{t};
@@ -1 +0,0 @@
1
- import{a as e,c as t,f as n,s as r,u as i}from"./button-yArHqw81.js";import{a,o,r as s,t as c}from"./dist-CwP5Ad1_.js";import{H as l,V as u}from"./index-qO2TvUmo.js";var d=n(i(),1),f=r(),p=`Switch`,[m,h]=a(p),[g,_]=m(p),v=d.forwardRef((t,n)=>{let{__scopeSwitch:r,name:i,checked:a,defaultChecked:l,required:u,disabled:m,value:h=`on`,onCheckedChange:_,form:v,...y}=t,[b,x]=d.useState(null),w=e(n,e=>x(e)),T=d.useRef(!1),E=b?v||!!b.closest(`form`):!0,[D,O]=c({prop:a,defaultProp:l??!1,onChange:_,caller:p});return(0,f.jsxs)(g,{scope:r,checked:D,disabled:m,children:[(0,f.jsx)(o.button,{type:`button`,role:`switch`,"aria-checked":D,"aria-required":u,"data-state":C(D),"data-disabled":m?``:void 0,disabled:m,value:h,...y,ref:w,onClick:s(t.onClick,e=>{O(e=>!e),E&&(T.current=e.isPropagationStopped(),T.current||e.stopPropagation())})}),E&&(0,f.jsx)(S,{control:b,bubbles:!T.current,name:i,value:h,checked:D,required:u,disabled:m,form:v,style:{transform:`translateX(-100%)`}})]})});v.displayName=p;var y=`SwitchThumb`,b=d.forwardRef((e,t)=>{let{__scopeSwitch:n,...r}=e,i=_(y,n);return(0,f.jsx)(o.span,{"data-state":C(i.checked),"data-disabled":i.disabled?``:void 0,...r,ref:t})});b.displayName=y;var x=`SwitchBubbleInput`,S=d.forwardRef(({__scopeSwitch:t,control:n,checked:r,bubbles:i=!0,...a},o)=>{let s=d.useRef(null),c=e(s,o),p=l(r),m=u(n);return d.useEffect(()=>{let e=s.current;if(!e)return;let t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,`checked`).set;if(p!==r&&n){let t=new Event(`click`,{bubbles:i});n.call(e,r),e.dispatchEvent(t)}},[p,r,i]),(0,f.jsx)(`input`,{type:`checkbox`,"aria-hidden":!0,defaultChecked:r,...a,tabIndex:-1,ref:c,style:{...a.style,...m,position:`absolute`,pointerEvents:`none`,opacity:0,margin:0}})});S.displayName=x;function C(e){return e?`checked`:`unchecked`}var w=v,T=b;function E({className:e,...n}){return(0,f.jsx)(w,{"data-slot":`switch`,className:t(`peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 inline-flex h-5 w-9 shrink-0 items-center rounded-full border-2 border-transparent shadow-xs transition-colors outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50`,e),...n,children:(0,f.jsx)(T,{"data-slot":`switch-thumb`,className:t(`bg-background pointer-events-none block size-4 rounded-full ring-0 shadow-lg transition-transform data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0`)})})}export{E as t};
@@ -1 +0,0 @@
1
- import{c as e,f as t,s as n,u as r}from"./button-yArHqw81.js";t(r(),1);var i=n();function a({className:t,...n}){return(0,i.jsx)(`div`,{"data-slot":`table-container`,className:`meddle-thin-scroll relative w-full overflow-x-auto`,children:(0,i.jsx)(`table`,{"data-slot":`table`,className:e(`w-full caption-bottom text-sm`,t),...n})})}function o({className:t,...n}){return(0,i.jsx)(`thead`,{"data-slot":`table-header`,className:e(`[&_tr]:border-b`,t),...n})}function s({className:t,...n}){return(0,i.jsx)(`tbody`,{"data-slot":`table-body`,className:e(`[&_tr:last-child]:border-0`,t),...n})}function c({className:t,...n}){return(0,i.jsx)(`tr`,{"data-slot":`table-row`,className:e(`hover:bg-accent/60 hover:text-accent-foreground data-[state=selected]:bg-accent data-[state=selected]:text-accent-foreground border-b transition-colors`,t),...n})}function l({className:t,...n}){return(0,i.jsx)(`th`,{"data-slot":`table-head`,className:e(`text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,t),...n})}function u({className:t,...n}){return(0,i.jsx)(`td`,{"data-slot":`table-cell`,className:e(`p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]`,t),...n})}export{o as a,l as i,s as n,c as o,u as r,a as t};
@@ -1 +0,0 @@
1
- import{c as e,f as t,o as n,s as r,u as i}from"./button-yArHqw81.js";import{a,o,r as s,t as c}from"./dist-CwP5Ad1_.js";import{t as l}from"./dist-CymFeFOA.js";import{t as u}from"./dist-DGuRBXW6.js";import{n as d}from"./dist-CjLkNKST.js";import{n as f,r as p,t as m}from"./dist-D2vbXHYx.js";var h=t(i(),1),g=r(),_=`Tabs`,[v,y]=a(_,[p]),b=p(),[x,S]=v(_),C=h.forwardRef((e,t)=>{let{__scopeTabs:n,value:r,onValueChange:i,defaultValue:a,orientation:s=`horizontal`,dir:u,activationMode:f=`automatic`,...p}=e,m=l(u),[h,v]=c({prop:r,onChange:i,defaultProp:a??``,caller:_});return(0,g.jsx)(x,{scope:n,baseId:d(),value:h,onValueChange:v,orientation:s,dir:m,activationMode:f,children:(0,g.jsx)(o.div,{dir:m,"data-orientation":s,...p,ref:t})})});C.displayName=_;var w=`TabsList`,T=h.forwardRef((e,t)=>{let{__scopeTabs:n,loop:r=!0,...i}=e,a=S(w,n),s=b(n);return(0,g.jsx)(f,{asChild:!0,...s,orientation:a.orientation,dir:a.dir,loop:r,children:(0,g.jsx)(o.div,{role:`tablist`,"aria-orientation":a.orientation,...i,ref:t})})});T.displayName=w;var E=`TabsTrigger`,D=h.forwardRef((e,t)=>{let{__scopeTabs:n,value:r,disabled:i=!1,...a}=e,c=S(E,n),l=b(n),u=A(c.baseId,r),d=j(c.baseId,r),f=r===c.value;return(0,g.jsx)(m,{asChild:!0,...l,focusable:!i,active:f,children:(0,g.jsx)(o.button,{type:`button`,role:`tab`,"aria-selected":f,"aria-controls":d,"data-state":f?`active`:`inactive`,"data-disabled":i?``:void 0,disabled:i,id:u,...a,ref:t,onMouseDown:s(e.onMouseDown,e=>{!i&&e.button===0&&e.ctrlKey===!1?c.onValueChange(r):e.preventDefault()}),onKeyDown:s(e.onKeyDown,e=>{[` `,`Enter`].includes(e.key)&&c.onValueChange(r)}),onFocus:s(e.onFocus,()=>{let e=c.activationMode!==`manual`;!f&&!i&&e&&c.onValueChange(r)})})})});D.displayName=E;var O=`TabsContent`,k=h.forwardRef((e,t)=>{let{__scopeTabs:n,value:r,forceMount:i,children:a,...s}=e,c=S(O,n),l=A(c.baseId,r),d=j(c.baseId,r),f=r===c.value,p=h.useRef(f);return h.useEffect(()=>{let e=requestAnimationFrame(()=>p.current=!1);return()=>cancelAnimationFrame(e)},[]),(0,g.jsx)(u,{present:i||f,children:({present:n})=>(0,g.jsx)(o.div,{"data-state":f?`active`:`inactive`,"data-orientation":c.orientation,role:`tabpanel`,"aria-labelledby":l,hidden:!n,id:d,tabIndex:0,...s,ref:t,style:{...e.style,animationDuration:p.current?`0s`:void 0},children:n&&a})})});k.displayName=O;function A(e,t){return`${e}-trigger-${t}`}function j(e,t){return`${e}-content-${t}`}var M=C,N=T,P=D,F=k;function I({className:t,orientation:n=`horizontal`,...r}){return(0,g.jsx)(M,{"data-slot":`tabs`,"data-orientation":n,orientation:n,className:e(`group/tabs flex gap-2 data-[orientation=horizontal]:flex-col`,t),...r})}var L=n(`rounded-lg p-[3px] group-data-[orientation=horizontal]/tabs:h-9 data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col`,{variants:{variant:{default:`bg-muted`,line:`gap-1 bg-transparent`}},defaultVariants:{variant:`default`}});function R({className:t,variant:n=`default`,...r}){return(0,g.jsx)(N,{"data-slot":`tabs-list`,"data-variant":n,className:e(L({variant:n}),t),...r})}function z({className:t,...n}){return(0,g.jsx)(P,{"data-slot":`tabs-trigger`,className:e(`focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring text-foreground/60 hover:text-foreground dark:text-muted-foreground dark:hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,`group-data-[variant=default]/tabs-list:data-[state=active]:border-primary/20 group-data-[variant=default]/tabs-list:data-[state=active]:bg-accent group-data-[variant=default]/tabs-list:data-[state=active]:text-accent-foreground`,`group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:text-primary dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent`,`after:bg-primary after:absolute after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100`,t),...n})}function B({className:t,...n}){return(0,g.jsx)(F,{"data-slot":`tabs-content`,className:e(`flex-1 outline-none`,t),...n})}export{z as i,B as n,R as r,I as t};