@jonathanleelx/meddle 0.5.0-beta.8 → 0.5.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.
Files changed (208) hide show
  1. package/CONFIG_STRUCTURE.md +9 -2
  2. package/README.md +18 -0
  3. package/bin/commands/mock/add.js +37 -21
  4. package/bin/commands/mock/delete.js +16 -24
  5. package/bin/commands/mock/index.js +8 -4
  6. package/bin/commands/mock/list.js +35 -18
  7. package/bin/commands/mock/toggle.js +17 -27
  8. package/bin/commands/mock/update.js +39 -30
  9. package/bin/commands/route/active.js +20 -3
  10. package/bin/commands/route/add.js +113 -94
  11. package/bin/commands/route/create.js +8 -1
  12. package/bin/commands/route/delete.js +85 -51
  13. package/bin/commands/route/index.js +20 -2
  14. package/bin/commands/route/list.js +2 -2
  15. package/bin/commands/route/show.js +10 -1
  16. package/bin/commands/route/update.js +135 -92
  17. package/bin/commands/update.js +4 -0
  18. package/bin/index.js +7 -3
  19. package/bin/lib/api-client.js +14 -2
  20. package/bin/lib/file-access.js +217 -35
  21. package/bin/lib/output.js +24 -3
  22. package/bin/lib/proxy-detect.js +99 -20
  23. package/bin/lib/proxy-or-file.js +90 -0
  24. package/bin/lib/route-write-args.js +150 -0
  25. package/bin/lib/rule-file-edit.js +263 -0
  26. package/bin/lib/ruleset-readonly.js +61 -0
  27. package/bin/lib/update-check.js +67 -6
  28. package/dist/cert.d.ts.map +1 -1
  29. package/dist/cert.js +43 -0
  30. package/dist/cert.js.map +1 -1
  31. package/dist/core/browser.d.ts +8 -1
  32. package/dist/core/browser.d.ts.map +1 -1
  33. package/dist/core/browser.js +239 -36
  34. package/dist/core/browser.js.map +1 -1
  35. package/dist/core/config-diagnostics.d.ts.map +1 -1
  36. package/dist/core/config-diagnostics.js +6 -1
  37. package/dist/core/config-diagnostics.js.map +1 -1
  38. package/dist/core/custom-plugin-loader.d.ts.map +1 -1
  39. package/dist/core/custom-plugin-loader.js +2 -0
  40. package/dist/core/custom-plugin-loader.js.map +1 -1
  41. package/dist/core/h2-pool.d.ts +1 -0
  42. package/dist/core/h2-pool.d.ts.map +1 -1
  43. package/dist/core/h2-pool.js +17 -1
  44. package/dist/core/h2-pool.js.map +1 -1
  45. package/dist/core/mock-handler.d.ts +59 -0
  46. package/dist/core/mock-handler.d.ts.map +1 -1
  47. package/dist/core/mock-handler.js +627 -29
  48. package/dist/core/mock-handler.js.map +1 -1
  49. package/dist/core/mock-utils.d.ts +58 -0
  50. package/dist/core/mock-utils.d.ts.map +1 -0
  51. package/dist/core/mock-utils.js +167 -0
  52. package/dist/core/mock-utils.js.map +1 -0
  53. package/dist/core/plugin-bootstrap-runner.d.ts +1 -0
  54. package/dist/core/plugin-bootstrap-runner.d.ts.map +1 -1
  55. package/dist/core/plugin-bootstrap-runner.js +37 -1
  56. package/dist/core/plugin-bootstrap-runner.js.map +1 -1
  57. package/dist/core/plugin-source.d.ts +24 -0
  58. package/dist/core/plugin-source.d.ts.map +1 -0
  59. package/dist/core/plugin-source.js +47 -0
  60. package/dist/core/plugin-source.js.map +1 -0
  61. package/dist/core/rule-file-edit.d.ts +81 -0
  62. package/dist/core/rule-file-edit.d.ts.map +1 -0
  63. package/dist/core/rule-file-edit.js +243 -0
  64. package/dist/core/rule-file-edit.js.map +1 -0
  65. package/dist/core/static-server.d.ts.map +1 -1
  66. package/dist/core/static-server.js +15 -13
  67. package/dist/core/static-server.js.map +1 -1
  68. package/dist/core/types.d.ts +13 -1
  69. package/dist/core/types.d.ts.map +1 -1
  70. package/dist/plugins/builtin/mock-plugin.d.ts.map +1 -1
  71. package/dist/plugins/builtin/mock-plugin.js +6 -5
  72. package/dist/plugins/builtin/mock-plugin.js.map +1 -1
  73. package/dist/server/agent/tools.d.ts.map +1 -1
  74. package/dist/server/agent/tools.js +24 -18
  75. package/dist/server/agent/tools.js.map +1 -1
  76. package/dist/server/app-info.d.ts +33 -0
  77. package/dist/server/app-info.d.ts.map +1 -0
  78. package/dist/server/app-info.js +116 -0
  79. package/dist/server/app-info.js.map +1 -0
  80. package/dist/server/config.d.ts +1 -0
  81. package/dist/server/config.d.ts.map +1 -1
  82. package/dist/server/config.js +101 -9
  83. package/dist/server/config.js.map +1 -1
  84. package/dist/server/health.d.ts.map +1 -1
  85. package/dist/server/health.js +8 -0
  86. package/dist/server/health.js.map +1 -1
  87. package/dist/server/index.d.ts +15 -0
  88. package/dist/server/index.d.ts.map +1 -1
  89. package/dist/server/index.js +3 -0
  90. package/dist/server/index.js.map +1 -1
  91. package/dist/server/mocks.d.ts +26 -0
  92. package/dist/server/mocks.d.ts.map +1 -1
  93. package/dist/server/mocks.js +110 -13
  94. package/dist/server/mocks.js.map +1 -1
  95. package/dist/server/plugins.d.ts.map +1 -1
  96. package/dist/server/plugins.js +56 -11
  97. package/dist/server/plugins.js.map +1 -1
  98. package/dist/server/rule-files.d.ts +36 -0
  99. package/dist/server/rule-files.d.ts.map +1 -1
  100. package/dist/server/rule-files.js +395 -107
  101. package/dist/server/rule-files.js.map +1 -1
  102. package/dist/server/ruleset-lock.d.ts +62 -0
  103. package/dist/server/ruleset-lock.d.ts.map +1 -0
  104. package/dist/server/ruleset-lock.js +234 -0
  105. package/dist/server/ruleset-lock.js.map +1 -0
  106. package/index.js +36 -7
  107. package/mcp-server.js +90 -88
  108. package/package.json +1 -1
  109. package/plugins/builtin/mock-plugin.ts +9 -5
  110. package/web/dist/assets/alert-B514Frte.js +1 -0
  111. package/web/dist/assets/arrow-right-BNum_060.js +1 -0
  112. package/web/dist/assets/{body-diff-view-B-4XWmL6.js → body-diff-view-SfLCLzs9.js} +2 -2
  113. package/web/dist/assets/button-BFNlGZ5p.js +1 -0
  114. package/web/dist/assets/check-BkfHQ6re.js +1 -0
  115. package/web/dist/assets/checkbox-CQyFsZzS.js +1 -0
  116. package/web/dist/assets/chevron-down-DHwUtL4O.js +1 -0
  117. package/web/dist/assets/{circle-alert-Q8cZk9Rv.js → circle-alert-zMagrFuI.js} +1 -1
  118. package/web/dist/assets/{circle-x-C9USji_R.js → circle-x-BEkinhez.js} +1 -1
  119. package/web/dist/assets/code-DD-AYxxu.js +1 -0
  120. package/web/dist/assets/{copy-BYjq1hdN.js → copy-BRnscYy1.js} +1 -1
  121. package/web/dist/assets/detail-panel-BtgWWeu3.js +4 -0
  122. package/web/dist/assets/dist-BQN0rzUS.js +1 -0
  123. package/web/dist/assets/{dist-CEd_wnRC.js → dist-C-E2R2jk.js} +1 -1
  124. package/web/dist/assets/{dist-C6eaYCUo.js → dist-CFZ4xMSF.js} +1 -1
  125. package/web/dist/assets/{dist-DWmDaXVN.js → dist-CRmX_NvH.js} +1 -1
  126. package/web/dist/assets/{dist-C8RHq5At.js → dist-DLQKRjuW.js} +1 -1
  127. package/web/dist/assets/{dist-Blyulj4_.js → dist-LiAcI8CK.js} +1 -1
  128. package/web/dist/assets/{dist-Ce4ujolc.js → dist-fzPL-8F9.js} +1 -1
  129. package/web/dist/assets/{dist-DoE7uybN.js → dist-wv9ebJK_.js} +1 -1
  130. package/web/dist/assets/editor-pane-actions-_ckwcCII.js +1 -0
  131. package/web/dist/assets/{es2015-DG46NGN7.js → es2015-DPJTBYa9.js} +1 -1
  132. package/web/dist/assets/{global-panel-shell-5cJneeis.js → global-panel-shell-NaUhzX7J.js} +3 -3
  133. package/web/dist/assets/health-panel-DhXLqcOU.js +1 -0
  134. package/web/dist/assets/index-B-6nUrqW.js +21 -0
  135. package/web/dist/assets/index-EWNlAdFB.css +2 -0
  136. package/web/dist/assets/mobile-proxy-panel-BY8Oi-qC.js +8 -0
  137. package/web/dist/assets/mock-config-TPmfJwAt.js +1 -0
  138. package/web/dist/assets/mock-editor-panel-WQwcHSTD.js +20 -0
  139. package/web/dist/assets/mocks-file-missing-note-BR5oWFLh.js +1 -0
  140. package/web/dist/assets/monaco-editor-BGLPrb0C.js +11 -0
  141. package/web/dist/assets/pane-bar-gFRISZLD.js +1 -0
  142. package/web/dist/assets/pane-split-B6aLmY7G.js +1 -0
  143. package/web/dist/assets/panel-heading-DT_nXayM.js +1 -0
  144. package/web/dist/assets/{pencil-line-Cqe41E4h.js → pencil-line-CEZ7D-de.js} +1 -1
  145. package/web/dist/assets/plugin-code-editor--Gf4ZwGb.js +2 -0
  146. package/web/dist/assets/plugin-config-DsX9xCW_.js +2 -0
  147. package/web/dist/assets/plugin-generator-Bj4f6dxo.js +2 -0
  148. package/web/dist/assets/plugin-test-dialog-DICuykBK.js +7 -0
  149. package/web/dist/assets/plus-ixZQRprm.js +1 -0
  150. package/web/dist/assets/{refresh-cw-CG3HaiQT.js → refresh-cw-BfLoHqg5.js} +1 -1
  151. package/web/dist/assets/rotate-ccw-CRguJya4.js +1 -0
  152. package/web/dist/assets/route-preview-C-LzS1lT.js +1 -0
  153. package/web/dist/assets/{rule-ai-assistant-panel-DMh0F9dr.js → rule-ai-assistant-panel-BEfPNBbx.js} +2 -2
  154. package/web/dist/assets/rule-config-Dw9pcuah.js +15 -0
  155. package/web/dist/assets/rule-overview-panel-C4QQ7U3S.js +1 -0
  156. package/web/dist/assets/{server-Cpj4KNwN.js → server-eYXq3PbE.js} +1 -1
  157. package/web/dist/assets/settings-panel-D8DEH8aH.js +1 -0
  158. package/web/dist/assets/{shield-check-OqUmVLQt.js → shield-check-hQXjdfZ7.js} +1 -1
  159. package/web/dist/assets/smartphone-D4Q7cQfm.js +1 -0
  160. package/web/dist/assets/switch-94vgsMHm.js +1 -0
  161. package/web/dist/assets/{syntax-highlight-Dk0-ewLI.js → syntax-highlight-BFgN_C0Y.js} +1 -1
  162. package/web/dist/assets/{table-2-BR5e3z8m.js → table-2-DvGHhMm4.js} +1 -1
  163. package/web/dist/assets/table-DaXD6jJv.js +1 -0
  164. package/web/dist/assets/textarea-9wB8Hsz-.js +1 -0
  165. package/web/dist/assets/toast-9yeTf7d9.js +1 -0
  166. package/web/dist/assets/use-mocks-file-status-BUIUJ4oQ.js +1 -0
  167. package/web/dist/assets/{wand-sparkles-CJ7fSnom.js → wand-sparkles-Bmt4dDOf.js} +1 -1
  168. package/web/dist/assets/{wifi-CCLKyySQ.js → wifi-Cjj_Br1u.js} +1 -1
  169. package/web/dist/assets/{zap-DR-xiUMe.js → zap-BuOtogAv.js} +1 -1
  170. package/web/dist/index.html +16 -10
  171. package/web/dist/assets/alert-DCvlZAiv.js +0 -1
  172. package/web/dist/assets/arrow-right-B4Mrlj2-.js +0 -1
  173. package/web/dist/assets/button-BTToMaBW.js +0 -1
  174. package/web/dist/assets/checkbox-D1Z9DtjF.js +0 -1
  175. package/web/dist/assets/chevron-down-CPngAx4M.js +0 -1
  176. package/web/dist/assets/chevron-right-V1DGIDbL.js +0 -1
  177. package/web/dist/assets/code-5_eJ_XpJ.js +0 -1
  178. package/web/dist/assets/code-fixer-D48sCDtp.js +0 -20
  179. package/web/dist/assets/detail-panel-BSFz9CUw.js +0 -4
  180. package/web/dist/assets/file-system-access-_og-Tg9o.js +0 -1
  181. package/web/dist/assets/health-panel-BS3L2e5d.js +0 -1
  182. package/web/dist/assets/index-CvTR1IVi.js +0 -18
  183. package/web/dist/assets/index-bfV7sxx5.css +0 -2
  184. package/web/dist/assets/mobile-proxy-panel-tU0NyJ3P.js +0 -8
  185. package/web/dist/assets/mock-config-CULJP6Vt.js +0 -1
  186. package/web/dist/assets/mock-editor-panel-9wlDaySA.js +0 -1
  187. package/web/dist/assets/monaco-editor-BttaUoOz.js +0 -11
  188. package/web/dist/assets/plugin-code-editor-BAIBp4lg.js +0 -2
  189. package/web/dist/assets/plugin-config-ButUV2SZ.js +0 -1
  190. package/web/dist/assets/plugin-generator-uceUPSCv.js +0 -2
  191. package/web/dist/assets/plugin-test-dialog-BrJ4HfRX.js +0 -7
  192. package/web/dist/assets/plus-tVxSydJ8.js +0 -1
  193. package/web/dist/assets/rotate-ccw-CAYM6Vv0.js +0 -1
  194. package/web/dist/assets/route-preview-C4cGrS1-.js +0 -1
  195. package/web/dist/assets/rule-config-BTTGNwMs.js +0 -15
  196. package/web/dist/assets/rule-overview-panel-SFR2OloL.js +0 -1
  197. package/web/dist/assets/select-aBXQ0zNa.js +0 -1
  198. package/web/dist/assets/settings-panel-BMReDG8b.js +0 -1
  199. package/web/dist/assets/smartphone-DKeDuJTU.js +0 -1
  200. package/web/dist/assets/switch-Bes_YiJu.js +0 -1
  201. package/web/dist/assets/table-nW7uQVcl.js +0 -1
  202. package/web/dist/assets/textarea-BSI0rnW6.js +0 -1
  203. /package/web/dist/assets/{babel-DCr4VA1c.js → babel-bwZm0qi3.js} +0 -0
  204. /package/web/dist/assets/{clipboard-VhPXNN5m.js → clipboard-Bt1qY01V.js} +0 -0
  205. /package/web/dist/assets/{estree-qO_m2Qaw.js → estree-MatbZDwq.js} +0 -0
  206. /package/web/dist/assets/{html-VDGahtyk.js → html-CCrsbFYX.js} +0 -0
  207. /package/web/dist/assets/{postcss-BUm8EKMw.js → postcss-BxN7Gr8n.js} +0 -0
  208. /package/web/dist/assets/{standalone-Bj8SSd8Q.js → standalone-DsnFnsqM.js} +0 -0
package/mcp-server.js CHANGED
@@ -18,6 +18,7 @@ const {
18
18
  } = require('./bin/lib/sessions')
19
19
  const { GLOBAL_DEFAULT_PORT } = require('./bin/lib/session-args')
20
20
  const { buildProxySpawn, getReentryArgv } = require('./bin/lib/spawn-proxy')
21
+ const { addRouteRule, updateRouteRule, deleteRouteRule } = require('./bin/lib/rule-file-edit')
21
22
 
22
23
  const meddleDir = resolveMeddleHome()
23
24
  const mcpFile = path.join(meddleDir, 'mcp-proxy-url.json')
@@ -53,11 +54,55 @@ function proxyApiForSession(sessionId, method, pathname, body) {
53
54
  const opts = { method, headers: { 'Content-Type': 'application/json' } }
54
55
  if (body !== undefined) opts.body = typeof body === 'string' ? body : JSON.stringify(body)
55
56
  return fetch(url, opts).then((res) => {
56
- if (!res.ok) return res.text().then((t) => { throw new Error(t || res.statusText) })
57
- return res.headers.get('content-type')?.includes('application/json') ? res.json() : res.text()
57
+ if (!res.ok) return res.text().then((t) => { throw apiError(res, t) })
58
+ return res.headers.get('content-type')?.includes('application/json') ? res.json() : readTextKeepBom(res)
58
59
  })
59
60
  }
60
61
 
62
+ /**
63
+ * Issue #145: `Response.text()` strips a leading UTF-8 BOM, so a rule file read
64
+ * and written back through the API would silently lose it. Decode keeping it.
65
+ */
66
+ function readTextKeepBom(res) {
67
+ return res.arrayBuffer().then((buf) => new TextDecoder('utf-8', { ignoreBOM: true }).decode(buf))
68
+ }
69
+
70
+ // ---------- Issue #137: 只读规则集 ----------
71
+ // 锁只存在 settings.json,只能在 Meddle Web 界面中加锁 / 解锁;MCP 没有对应工具,只读取状态并在写入被拒时如实返回。
72
+ const RULESET_READONLY = 'RULESET_READONLY'
73
+ const RULESET_READONLY_MESSAGE = '该规则集已设为只读,只能在 Meddle 界面中解锁'
74
+ const READONLY_NOTE = '只读规则集会被拒绝(错误码 RULESET_READONLY,只能在 Meddle 界面中解锁)。'
75
+
76
+ /** 把代理 API 的错误响应转成 Error,保留结构化的 code / ruleFile。 */
77
+ function apiError(res, text) {
78
+ const err = new Error(text || res.statusText)
79
+ err.status = res.status
80
+ try {
81
+ const data = JSON.parse(text)
82
+ if (data && typeof data === 'object') {
83
+ if (typeof data.code === 'string') err.code = data.code
84
+ if (typeof data.ruleFile === 'string') err.ruleFile = data.ruleFile
85
+ }
86
+ } catch (_) {}
87
+ return err
88
+ }
89
+
90
+ function rulesetReadonlyResult(ruleFile) {
91
+ return {
92
+ content: [{
93
+ type: 'text',
94
+ text: JSON.stringify({ error: { code: RULESET_READONLY, message: RULESET_READONLY_MESSAGE, ruleFile: ruleFile || null } }, null, 2)
95
+ }],
96
+ isError: true
97
+ }
98
+ }
99
+
100
+ /** 统一的错误返回:只读拒绝给出结构化结果,其它错误保持原样。 */
101
+ function toolError(e, ruleFile) {
102
+ if (e && e.code === RULESET_READONLY) return rulesetReadonlyResult(e.ruleFile || ruleFile)
103
+ return { content: [{ type: 'text', text: e.message }], isError: true }
104
+ }
105
+
61
106
  const FILE_PATTERN = /^file:\/\//
62
107
  const LOCAL_FILE_PATTERN = /^[A-Za-z]:\\|^\/|^\\/
63
108
 
@@ -109,37 +154,6 @@ function parseEprc(content) {
109
154
  return parseEprcWithExclusions(content).ruleMap
110
155
  }
111
156
 
112
- /** 将 pattern -> target 对象转回规则文件文本(与 helpers.ruleMapToEprcText 一致,保留 exclusions) */
113
- function ruleMapToEprcText(ruleMap, excludeMap) {
114
- const entries = Object.entries(ruleMap)
115
- if (entries.length === 0) return ''
116
- const byTargetAndExclusions = {}
117
- entries.forEach(([rule, target]) => {
118
- const bm = target.match(/\[([^\]]+)\]/)
119
- const groupKey = bm ? target.replace(bm[0], '') : target
120
- const displayRule = bm ? rule.replace(bm[1], bm[0]) : rule
121
- const exclusions = excludeMap?.[rule] || []
122
- const exclusionsKey = exclusions.join(',')
123
- // Create a compound key that includes both target and exclusions
124
- const compoundKey = `${groupKey}|||${exclusionsKey}`
125
- if (!byTargetAndExclusions[compoundKey]) {
126
- byTargetAndExclusions[compoundKey] = { target: groupKey, rules: [], exclusions }
127
- }
128
- byTargetAndExclusions[compoundKey].rules.push(displayRule)
129
- })
130
- return Object.entries(byTargetAndExclusions)
131
- .map(([, { target, rules, exclusions }]) => {
132
- let displayTarget = target
133
- if (FILE_PATTERN.test(target)) {
134
- displayTarget = target.replace(/^file:\/\//, '').replace(/\//g, path.sep)
135
- }
136
- const exclusionStr = exclusions.map(e => `!${e}`).join(' ')
137
- const rulesStr = rules.join(' ')
138
- return exclusionStr ? `${rulesStr} ${exclusionStr} ${displayTarget}` : `${rulesStr} ${displayTarget}`
139
- })
140
- .join('\n')
141
- }
142
-
143
157
  /** 请求代理 API */
144
158
  function proxyApi(method, pathname, body) {
145
159
  const base = getProxyBaseUrl()
@@ -147,9 +161,8 @@ function proxyApi(method, pathname, body) {
147
161
  const opts = { method, headers: { 'Content-Type': 'application/json' } }
148
162
  if (body !== undefined) opts.body = typeof body === 'string' ? body : JSON.stringify(body)
149
163
  return fetch(url, opts).then((res) => {
150
- const text = () => res.text()
151
- if (!res.ok) return text().then((t) => { throw new Error(t || res.statusText) })
152
- return res.headers.get('content-type')?.includes('application/json') ? res.json() : text()
164
+ if (!res.ok) return res.text().then((t) => { throw new Error(t || res.statusText) })
165
+ return res.headers.get('content-type')?.includes('application/json') ? res.json() : readTextKeepBom(res)
153
166
  })
154
167
  }
155
168
 
@@ -395,7 +408,7 @@ mcpServer.registerTool('mock_rule_list', {
395
408
  const rules = await proxyApiForSession(session, 'GET', '/api/mocks')
396
409
  return { content: [{ type: 'text', text: JSON.stringify(rules, null, 2) }] }
397
410
  } catch (e) {
398
- return { content: [{ type: 'text', text: e.message }], isError: true }
411
+ return toolError(e)
399
412
  }
400
413
  })
401
414
 
@@ -405,6 +418,7 @@ mcpServer.registerTool('mock_rule_add', {
405
418
  session: z.string().optional().describe('目标 session id,不传则操作默认 session'),
406
419
  name: z.string().describe('规则名称,便于识别'),
407
420
  urlPattern: z.string().describe('URL 匹配正则或字符串,如 example\\.com/api 或 .*\\.example\\.com'),
421
+ query: z.string().optional().describe('可选 query 匹配条件(精确 key=value 参数边界,如 window_key=A,不会前缀匹配 AB);响应头可用 {origin} 回显 Origin'),
408
422
  method: z.string().optional().describe('HTTP 方法,如 GET、POST、* 表示全部,默认 *'),
409
423
  statusCode: z.number().optional().describe('响应状态码,默认 200'),
410
424
  headers: z.record(z.string()).optional().describe('响应头,如 {"content-type":"application/json"}'),
@@ -419,6 +433,7 @@ mcpServer.registerTool('mock_rule_add', {
419
433
  const body = {
420
434
  name: rest.name ?? '',
421
435
  urlPattern: rest.urlPattern ?? '',
436
+ query: rest.query ?? '',
422
437
  method: rest.method ?? '*',
423
438
  statusCode: rest.statusCode ?? 200,
424
439
  delay: rest.delay ?? 0,
@@ -433,7 +448,7 @@ mcpServer.registerTool('mock_rule_add', {
433
448
  content: [{ type: 'text', text: `已添加 Mock 规则 id=${rule.id}: ${rule.name} (${rule.urlPattern})` }]
434
449
  }
435
450
  } catch (e) {
436
- return { content: [{ type: 'text', text: e.message }], isError: true }
451
+ return toolError(e)
437
452
  }
438
453
  })
439
454
 
@@ -444,6 +459,7 @@ mcpServer.registerTool('mock_rule_update', {
444
459
  id: z.number().describe('规则 id,从 mock_rule_list 获取'),
445
460
  name: z.string().optional(),
446
461
  urlPattern: z.string().optional(),
462
+ query: z.string().optional().describe('可选 query 匹配条件'),
447
463
  method: z.string().optional(),
448
464
  statusCode: z.number().optional(),
449
465
  headers: z.record(z.string()).optional(),
@@ -467,7 +483,7 @@ mcpServer.registerTool('mock_rule_update', {
467
483
  content: [{ type: 'text', text: `已更新 Mock 规则 id=${id}: ${rule.name ?? '(未改)'}` }]
468
484
  }
469
485
  } catch (e) {
470
- return { content: [{ type: 'text', text: e.message }], isError: true }
486
+ return toolError(e)
471
487
  }
472
488
  })
473
489
 
@@ -482,14 +498,14 @@ mcpServer.registerTool('mock_rule_delete', {
482
498
  await proxyApiForSession(session, 'DELETE', `/api/mocks/${id}`)
483
499
  return { content: [{ type: 'text', text: `已删除 Mock 规则 id=${id}` }] }
484
500
  } catch (e) {
485
- return { content: [{ type: 'text', text: e.message }], isError: true }
501
+ return toolError(e)
486
502
  }
487
503
  })
488
504
 
489
505
  // ---------- 路由规则(可选 session 参数) ----------
490
506
 
491
507
  mcpServer.registerTool('route_rule_list', {
492
- description: '列出所有路由规则文件;可选指定 ruleFile 获取该文件下的规则列表(pattern -> target 及 exclusions)。可选 session 参数指定操作的 session(不传则操作默认 session)。',
508
+ description: '列出所有路由规则文件(每项含 readonly: true|false);可选指定 ruleFile 获取该文件下的规则列表(pattern -> target 及 exclusions,含 readonly)。readonly 只能在 Meddle 界面中修改,MCP 没有加锁/解锁工具。可选 session 参数指定操作的 session(不传则操作默认 session)。',
493
509
  inputSchema: {
494
510
  session: z.string().optional().describe('目标 session id,不传则操作默认 session'),
495
511
  ruleFile: z.string().optional().describe('规则文件名(不含 .txt),不传则只返回文件列表')
@@ -517,11 +533,13 @@ mcpServer.registerTool('route_rule_list', {
517
533
  for (const exclusions of Object.values(excludeMap)) {
518
534
  totalExclusions += exclusions.length
519
535
  }
536
+ const info = Array.isArray(files) ? files.find((item) => item && item.name === ruleFile.trim()) : null
537
+ const readonly = Boolean(info && info.readonly)
520
538
  return {
521
- content: [{ type: 'text', text: JSON.stringify({ ruleFile, rules: displayRules, ruleCount: Object.keys(displayRules).length, exclusionCount: totalExclusions }, null, 2) }]
539
+ content: [{ type: 'text', text: JSON.stringify({ ruleFile, readonly, rules: displayRules, ruleCount: Object.keys(displayRules).length, exclusionCount: totalExclusions }, null, 2) }]
522
540
  }
523
541
  } catch (e) {
524
- return { content: [{ type: 'text', text: e.message }], isError: true }
542
+ return toolError(e)
525
543
  }
526
544
  })
527
545
 
@@ -546,12 +564,12 @@ mcpServer.registerTool('route_rule_active_get', {
546
564
  }]
547
565
  }
548
566
  } catch (e) {
549
- return { content: [{ type: 'text', text: e.message }], isError: true }
567
+ return toolError(e)
550
568
  }
551
569
  })
552
570
 
553
571
  mcpServer.registerTool('route_rule_active_set', {
554
- description: '设置当前激活的路由规则文件。可选 session 参数指定操作的 session(不传则操作默认 session)。',
572
+ description: '设置当前激活的路由规则文件。会改变启用状态的规则集中若有只读规则集则整体拒绝、不做任何修改:' + READONLY_NOTE + '可选 session 参数指定操作的 session(不传则操作默认 session)。',
555
573
  inputSchema: {
556
574
  session: z.string().optional().describe('目标 session id,不传则操作默认 session'),
557
575
  ruleFile: z.string().describe('要设为当前激活的规则文件名(不含 .txt)')
@@ -568,6 +586,10 @@ mcpServer.registerTool('route_rule_active_set', {
568
586
  return { content: [{ type: 'text', text: `未找到规则文件: ${targetName}` }], isError: true }
569
587
  }
570
588
 
589
+ // 先整体检查,避免锁住的规则集让切换只做了一半
590
+ const blocked = files.find((item) => item && item.readonly && !!item.enabled !== (item.name === targetName))
591
+ if (blocked) return rulesetReadonlyResult(blocked.name)
592
+
571
593
  for (const item of files) {
572
594
  const nextEnabled = item.name === targetName
573
595
  if (!!item.enabled === nextEnabled) continue
@@ -582,12 +604,12 @@ mcpServer.registerTool('route_rule_active_set', {
582
604
  }]
583
605
  }
584
606
  } catch (e) {
585
- return { content: [{ type: 'text', text: e.message }], isError: true }
607
+ return toolError(e)
586
608
  }
587
609
  })
588
610
 
589
611
  mcpServer.registerTool('route_rule_create_file', {
590
- description: '创建新的路由规则文件。可选 session 参数指定操作的 session(不传则操作默认 session)。',
612
+ description: '创建新的路由规则文件(新文件默认可读写)。同名规则文件已存在时失败,不会覆盖已有规则集,因此只读规则集会被拒绝。可选 session 参数指定操作的 session(不传则操作默认 session)。',
591
613
  inputSchema: {
592
614
  session: z.string().optional().describe('目标 session id,不传则操作默认 session'),
593
615
  name: z.string().describe('规则文件名称(不含 .txt),如 dev、staging;非法字符会被替换为下划线'),
@@ -606,18 +628,18 @@ mcpServer.registerTool('route_rule_create_file', {
606
628
  }]
607
629
  }
608
630
  } catch (e) {
609
- return { content: [{ type: 'text', text: e.message }], isError: true }
631
+ return toolError(e)
610
632
  }
611
633
  })
612
634
 
613
635
  mcpServer.registerTool('route_rule_add', {
614
- description: '在指定规则文件中添加一条路由规则(pattern -> target)。若 pattern 已存在则覆盖。可选 session 参数指定操作的 session(不传则操作默认 session)。',
636
+ description: '在指定规则文件中添加一条路由规则(pattern -> target)。若 pattern 已存在则覆盖其 target。exclusions 不传时保留该规则原有的排除规则(新规则无排除规则),传 [] 清空。只改这一行,文件中的注释、空行和其他规则保持原样。' + READONLY_NOTE + '可选 session 参数指定操作的 session(不传则操作默认 session)。',
615
637
  inputSchema: {
616
638
  session: z.string().optional().describe('目标 session id,不传则操作默认 session'),
617
639
  ruleFile: z.string().describe('规则文件名(不含 .txt)'),
618
640
  pattern: z.string().describe('匹配完整请求 URL。支持:(1) 正则表达式,如 ^https://a\\.com/api; (2) 通配符,如 *.wps.cn 匹配 wps.cn、plus.wps.cn、deep.plus.wps.cn;(3) [marker] 路径重写,如 ^https://cdn.com/[assets] 将 assets 后的路径拼接到 target'),
619
641
  target: z.string().describe('转发目标。若仅 host:port 则继承原请求的协议、pathname、query;若完整 URL 则直接使用;若原请求是 websocket 而 target 是 http(s),自动转为 ws(s)'),
620
- exclusions: z.array(z.string()).optional().describe('排除规则列表,匹配完整 URL。若任一 exclusion 命中则跳过此规则继续匹配下一条。如 ["api/health", "^https://a\\.com/internal"]')
642
+ exclusions: z.array(z.string()).optional().describe('排除规则列表,匹配完整 URL。若任一 exclusion 命中则跳过此规则继续匹配下一条。如 ["api/health", "^https://a\\.com/internal"]。不传时保留该规则原有的排除规则(新规则无排除规则);传 [] 清空')
621
643
  }
622
644
  }, async ({ session, ruleFile, pattern, target, exclusions }) => {
623
645
  try {
@@ -629,34 +651,25 @@ mcpServer.registerTool('route_rule_add', {
629
651
  return { content: [{ type: 'text', text: `规则文件不存在或代理未启动: ${err.message}` }], isError: true }
630
652
  }
631
653
  const text = typeof content === 'string' ? content : String(content)
632
- const { ruleMap, excludeMap } = parseEprcWithExclusions(text)
633
- const pat = pattern.trim()
634
- const tgt = target.trim()
635
- const bm = pat.match(/\[([^\]]+)\]/)
636
- if (bm) {
637
- ruleMap[pat.replace(bm[0], bm[1])] = tgt + bm[0]
638
- excludeMap[pat.replace(bm[0], bm[1])] = exclusions || []
639
- } else {
640
- ruleMap[pat] = tgt
641
- excludeMap[pat] = exclusions || []
642
- }
643
- const newContent = ruleMapToEprcText(ruleMap, excludeMap)
654
+ // Issue #145: edit only this rule's line(s); other lines keep their exact bytes.
655
+ // Without `exclusions` an existing rule keeps its own exclusions.
656
+ const { content: newContent } = addRouteRule(text, { pattern: pattern.trim(), target: target.trim(), exclusions })
644
657
  await proxyApiForSession(session, 'PUT', `/api/rule-files/${name}/content`, { content: newContent })
645
658
  const exclusionInfo = exclusions && exclusions.length > 0 ? `,排除规则: ${exclusions.join(', ')}` : ''
646
659
  return { content: [{ type: 'text', text: `已添加规则: ${pattern} -> ${target}${exclusionInfo}` }] }
647
660
  } catch (e) {
648
- return { content: [{ type: 'text', text: e.message }], isError: true }
661
+ return toolError(e)
649
662
  }
650
663
  })
651
664
 
652
665
  mcpServer.registerTool('route_rule_update', {
653
- description: '修改指定规则文件中某条规则的 target 和 exclusions(按 pattern 查找)。可选 session 参数指定操作的 session(不传则操作默认 session)。',
666
+ description: '修改指定规则文件中某条规则的 target 和 exclusions(按 pattern 查找)。exclusions 不传时保留该规则原有的排除规则,传 [] 清空。只改这一行,文件中的注释、空行和其他规则保持原样。' + READONLY_NOTE + '可选 session 参数指定操作的 session(不传则操作默认 session)。',
654
667
  inputSchema: {
655
668
  session: z.string().optional().describe('目标 session id,不传则操作默认 session'),
656
669
  ruleFile: z.string().describe('规则文件名(不含 .txt)'),
657
670
  pattern: z.string().describe('要修改的 pattern(需与现有规则一致,支持带 [marker] 的写法)'),
658
671
  newTarget: z.string().optional().describe('新的转发目标。若仅 host:port 则继承原请求的协议、pathname、query;若完整 URL 则直接使用'),
659
- exclusions: z.array(z.string()).optional().describe('新的排除规则列表,匹配完整 URL。设为空数组 [] 可清除所有排除规则')
672
+ exclusions: z.array(z.string()).optional().describe('新的排除规则列表,匹配完整 URL。不传时保留该规则原有的排除规则;传 [] 清空')
660
673
  }
661
674
  }, async ({ session, ruleFile, pattern, newTarget, exclusions }) => {
662
675
  try {
@@ -669,32 +682,24 @@ mcpServer.registerTool('route_rule_update', {
669
682
  return { content: [{ type: 'text', text: `规则文件不存在或代理未启动: ${err.message}` }], isError: true }
670
683
  }
671
684
  const text = typeof content === 'string' ? content : String(content)
672
- const { ruleMap, excludeMap } = parseEprcWithExclusions(text)
673
- const bm = pat.match(/\[([^\]]+)\]/)
674
- const internalKey = bm ? pat.replace(bm[0], bm[1]) : pat
675
- if (!Object.prototype.hasOwnProperty.call(ruleMap, internalKey)) {
685
+ // Issue #145: edit only this rule's line(s); other lines keep their exact bytes.
686
+ const result = updateRouteRule(text, { pattern: pat, target: newTarget ? newTarget.trim() : undefined, exclusions })
687
+ if (!result.found) {
676
688
  return { content: [{ type: 'text', text: `未找到 pattern: ${pat}` }], isError: true }
677
689
  }
678
- if (newTarget) {
679
- const tgt = newTarget.trim()
680
- ruleMap[internalKey] = bm ? tgt + bm[0] : tgt
681
- }
682
- if (exclusions !== undefined) {
683
- excludeMap[internalKey] = exclusions
684
- }
685
- const newContent = ruleMapToEprcText(ruleMap, excludeMap)
690
+ const newContent = result.content
686
691
  await proxyApiForSession(session, 'PUT', `/api/rule-files/${name}/content`, { content: newContent })
687
692
  const targetInfo = newTarget ? `目标: ${newTarget}` : ''
688
693
  const exclusionInfo = exclusions !== undefined ? (exclusions.length > 0 ? `排除规则: ${exclusions.join(', ')}` : '已清除排除规则') : ''
689
694
  const parts = [targetInfo, exclusionInfo].filter(Boolean).join(', ')
690
695
  return { content: [{ type: 'text', text: `已更新规则: ${pat}${parts ? ` (${parts})` : ''}` }] }
691
696
  } catch (e) {
692
- return { content: [{ type: 'text', text: e.message }], isError: true }
697
+ return toolError(e)
693
698
  }
694
699
  })
695
700
 
696
701
  mcpServer.registerTool('route_rule_delete', {
697
- description: '从指定规则文件中删除一条路由规则(按 pattern)。可选 session 参数指定操作的 session(不传则操作默认 session)。',
702
+ description: '从指定规则文件中删除一条路由规则(按 pattern)。' + READONLY_NOTE + '可选 session 参数指定操作的 session(不传则操作默认 session)。',
698
703
  inputSchema: {
699
704
  session: z.string().optional().describe('目标 session id,不传则操作默认 session'),
700
705
  ruleFile: z.string().describe('规则文件名(不含 .txt)'),
@@ -711,19 +716,16 @@ mcpServer.registerTool('route_rule_delete', {
711
716
  return { content: [{ type: 'text', text: `规则文件不存在或代理未启动: ${err.message}` }], isError: true }
712
717
  }
713
718
  const text = typeof content === 'string' ? content : String(content)
714
- const { ruleMap, excludeMap } = parseEprcWithExclusions(text)
715
- const bm = pat.match(/\[([^\]]+)\]/)
716
- const internalKey = bm ? pat.replace(bm[0], bm[1]) : pat
717
- if (!Object.prototype.hasOwnProperty.call(ruleMap, internalKey)) {
719
+ // Issue #145: remove only this rule; other lines keep their exact bytes.
720
+ const result = deleteRouteRule(text, { pattern: pat })
721
+ if (!result.found) {
718
722
  return { content: [{ type: 'text', text: `未找到 pattern: ${pat}` }], isError: true }
719
723
  }
720
- delete ruleMap[internalKey]
721
- delete excludeMap[internalKey]
722
- const newContent = ruleMapToEprcText(ruleMap, excludeMap)
724
+ const newContent = result.content
723
725
  await proxyApiForSession(session, 'PUT', `/api/rule-files/${name}/content`, { content: newContent })
724
726
  return { content: [{ type: 'text', text: `已删除规则: ${pat}` }] }
725
727
  } catch (e) {
726
- return { content: [{ type: 'text', text: e.message }], isError: true }
728
+ return toolError(e)
727
729
  }
728
730
  })
729
731
 
@@ -786,7 +788,7 @@ mcpServer.registerTool('route_preview', {
786
788
  content: [{ type: 'text', text: JSON.stringify(output, null, 2) }]
787
789
  }
788
790
  } catch (e) {
789
- return { content: [{ type: 'text', text: e.message }], isError: true }
791
+ return toolError(e)
790
792
  }
791
793
  })
792
794
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jonathanleelx/meddle",
3
- "version": "0.5.0-beta.8",
3
+ "version": "0.5.0",
4
4
  "description": "A simple development proxy server with custom routing rules, mock responses, HTTPS interception, and a plugin system",
5
5
  "type": "commonjs",
6
6
  "main": "index.js",
@@ -1,4 +1,5 @@
1
1
  import { Plugin, MockPluginOptions, HookContext } from '../../core/types';
2
+ import { resolveHeaderPlaceholders, mergeResponseHeaders } from '../../core/mock-utils';
2
3
 
3
4
  /**
4
5
  * 检测响应体的 Content-Type
@@ -87,7 +88,7 @@ export function createBuiltinMockPlugin(options: MockPluginOptions): Plugin {
87
88
  ? undefined // 保留 rule.headers 中的 Content-Type
88
89
  : detectContentType(rule.body || '');
89
90
 
90
- const responseHeaders: Record<string, string> = {
91
+ const defaults: Record<string, string> = {
91
92
  'X-Mock-Rule': encodeURIComponent(rule.name || String(rule.id || '')),
92
93
  'Access-Control-Allow-Origin': '*',
93
94
  'Access-Control-Allow-Methods': '*',
@@ -96,15 +97,18 @@ export function createBuiltinMockPlugin(options: MockPluginOptions): Plugin {
96
97
 
97
98
  // 如果没有自定义 Content-Type,则使用检测到的类型
98
99
  if (contentType) {
99
- responseHeaders['Content-Type'] = contentType;
100
+ defaults['Content-Type'] = contentType;
100
101
  }
101
102
 
102
- // 合并自定义响应头(会覆盖默认的 Content-Type)
103
- Object.assign(responseHeaders, ruleHeaders);
103
+ // 合并自定义响应头(会覆盖默认头),并解析 {origin} 占位符
104
+ const resolvedHeaders = resolveHeaderPlaceholders(
105
+ mergeResponseHeaders(defaults, ruleHeaders),
106
+ ctx.request.headers,
107
+ );
104
108
 
105
109
  ctx.respond({
106
110
  statusCode: rule.statusCode || 200,
107
- headers: responseHeaders,
111
+ headers: resolvedHeaders,
108
112
  body: rule.body || '',
109
113
  });
110
114
  },
@@ -0,0 +1 @@
1
+ import{c as e,d as t,l as n,p as r,s as i}from"./button-BFNlGZ5p.js";r(t(),1);var a=e(),o=i(`relative w-full rounded-lg border px-4 py-3 text-sm grid gap-1`,{variants:{variant:{default:`bg-background text-foreground`,destructive:`border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive`}},defaultVariants:{variant:`default`}});function s({className:e,variant:t,...r}){return(0,a.jsx)(`div`,{role:`alert`,className:n(o({variant:t}),e),...r})}function c({className:e,...t}){return(0,a.jsx)(`h5`,{className:n(`mb-1 font-medium leading-none tracking-tight`,e),...t})}function l({className:e,...t}){return(0,a.jsx)(`div`,{className:n(`text-sm [&_p]:leading-relaxed`,e),...t})}export{l as n,c as r,s as t};
@@ -0,0 +1 @@
1
+ import{u as e}from"./button-BFNlGZ5p.js";var t=e(`arrow-right`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]);export{t};
@@ -1,6 +1,6 @@
1
- import{a as e,f as t,u as n}from"./button-BTToMaBW.js";var r=class{diff(e,t,n={}){let r;typeof n==`function`?(r=n,n={}):`callback`in n&&(r=n.callback);let i=this.castInput(e,n),a=this.castInput(t,n),o=this.removeEmpty(this.tokenize(i,n)),s=this.removeEmpty(this.tokenize(a,n));return this.diffWithOptionsObj(o,s,n,r)}diffWithOptionsObj(e,t,n,r){let i=e=>{if(e=this.postProcess(e,n),r){setTimeout(function(){r(e)},0);return}else return e},a=t.length,o=e.length,s=1,c=a+o;n.maxEditLength!=null&&(c=Math.min(c,n.maxEditLength));let l=n.timeout??1/0,u=Date.now()+l,d=[{oldPos:-1,lastComponent:void 0}],f=this.extractCommon(d[0],t,e,0,n);if(d[0].oldPos+1>=o&&f+1>=a)return i(this.buildValues(d[0].lastComponent,t,e));let p=-1/0,m=1/0,h=()=>{for(let r=Math.max(p,-s);r<=Math.min(m,s);r+=2){let s,c=d[r-1],l=d[r+1];c&&(d[r-1]=void 0);let u=!1;if(l){let e=l.oldPos-r;u=l&&0<=e&&e<a}let h=c&&c.oldPos+1<o;if(!u&&!h){d[r]=void 0;continue}if(s=!h||u&&c.oldPos<l.oldPos?this.addToPath(l,!0,!1,0,n):this.addToPath(c,!1,!0,1,n),f=this.extractCommon(s,t,e,r,n),s.oldPos+1>=o&&f+1>=a)return i(this.buildValues(s.lastComponent,t,e))||!0;d[r]=s,s.oldPos+1>=o&&(m=Math.min(m,r-1)),f+1>=a&&(p=Math.max(p,r+1))}s++};if(r)(function e(){setTimeout(function(){if(s>c||Date.now()>u)return r(void 0);h()||e()},0)})();else for(;s<=c&&Date.now()<=u;){let e=h();if(e)return e}}addToPath(e,t,n,r,i){let a=e.lastComponent;return a&&!i.oneChangePerToken&&a.added===t&&a.removed===n?{oldPos:e.oldPos+r,lastComponent:{count:a.count+1,added:t,removed:n,previousComponent:a.previousComponent}}:{oldPos:e.oldPos+r,lastComponent:{count:1,added:t,removed:n,previousComponent:a}}}extractCommon(e,t,n,r,i){let a=t.length,o=n.length,s=e.oldPos,c=s-r,l=0;for(;c+1<a&&s+1<o&&this.equals(n[s+1],t[c+1],i);)c++,s++,l++,i.oneChangePerToken&&(e.lastComponent={count:1,previousComponent:e.lastComponent,added:!1,removed:!1});return l&&!i.oneChangePerToken&&(e.lastComponent={count:l,previousComponent:e.lastComponent,added:!1,removed:!1}),e.oldPos=s,c}equals(e,t,n){return n.comparator?n.comparator(e,t):e===t||!!n.ignoreCase&&e.toLowerCase()===t.toLowerCase()}removeEmpty(e){let t=[];for(let n=0;n<e.length;n++)e[n]&&t.push(e[n]);return t}castInput(e,t){return e}tokenize(e,t){return Array.from(e)}join(e){return e.join(``)}postProcess(e,t){return e}get useLongestToken(){return!1}buildValues(e,t,n){let r=[],i;for(;e;)r.push(e),i=e.previousComponent,delete e.previousComponent,e=i;r.reverse();let a=r.length,o=0,s=0,c=0;for(;o<a;o++){let e=r[o];if(e.removed)e.value=this.join(n.slice(c,c+e.count)),c+=e.count;else{if(!e.added&&this.useLongestToken){let r=t.slice(s,s+e.count);r=r.map(function(e,t){let r=n[c+t];return r.length>e.length?r:e}),e.value=this.join(r)}else e.value=this.join(t.slice(s,s+e.count));s+=e.count,e.added||(c+=e.count)}}return r}};new class extends r{};function i(e,t){let n;for(n=0;n<e.length&&n<t.length;n++)if(e[n]!=t[n])return e.slice(0,n);return e.slice(0,n)}function a(e,t){let n;if(!e||!t||e[e.length-1]!=t[t.length-1])return``;for(n=0;n<e.length&&n<t.length;n++)if(e[e.length-(n+1)]!=t[t.length-(n+1)])return e.slice(-n);return e.slice(-n)}function o(e,t,n){if(e.slice(0,t.length)!=t)throw Error(`string ${JSON.stringify(e)} doesn't start with prefix ${JSON.stringify(t)}; this is a bug`);return n+e.slice(t.length)}function s(e,t,n){if(!t)return e+n;if(e.slice(-t.length)!=t)throw Error(`string ${JSON.stringify(e)} doesn't end with suffix ${JSON.stringify(t)}; this is a bug`);return e.slice(0,-t.length)+n}function c(e,t){return o(e,t,``)}function l(e,t){return s(e,t,``)}function u(e,t){return t.slice(0,d(e,t))}function d(e,t){let n=0;e.length>t.length&&(n=e.length-t.length);let r=t.length;e.length<t.length&&(r=e.length);let i=Array(r),a=0;i[0]=0;for(let e=1;e<r;e++){for(t[e]==t[a]?i[e]=i[a]:i[e]=a;a>0&&t[e]!=t[a];)a=i[a];t[e]==t[a]&&a++}a=0;for(let r=n;r<e.length;r++){for(;a>0&&e[r]!=t[a];)a=i[a];e[r]==t[a]&&a++}return a}function f(e){let t;for(t=e.length-1;t>=0&&e[t].match(/\s/);t--);return e.substring(t+1)}function p(e){let t=e.match(/^\s*/);return t?t[0]:``}var m=`a-zA-Z0-9_\\u{AD}\\u{C0}-\\u{D6}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}`,h=RegExp(`[${m}]+|\\s+|[^${m}]`,`ug`);new class extends r{equals(e,t,n){return n.ignoreCase&&(e=e.toLowerCase(),t=t.toLowerCase()),e.trim()===t.trim()}tokenize(e,t={}){let n;if(t.intlSegmenter){let r=t.intlSegmenter;if(r.resolvedOptions().granularity!=`word`)throw Error(`The segmenter passed must have a granularity of "word"`);n=[];for(let t of Array.from(r.segment(e))){let e=t.segment;n.length&&/\s/.test(n[n.length-1])&&/\s/.test(e)?n[n.length-1]+=e:n.push(e)}}else n=e.match(h)||[];let r=[],i=null;return n.forEach(e=>{/\s/.test(e)?i==null?r.push(e):r.push(r.pop()+e):i!=null&&/\s/.test(i)?r[r.length-1]==i?r.push(r.pop()+e):r.push(i+e):r.push(e),i=e}),r}join(e){return e.map((e,t)=>t==0?e:e.replace(/^\s+/,``)).join(``)}postProcess(e,t){if(!e||t.oneChangePerToken)return e;let n=null,r=null,i=null;return e.forEach(e=>{e.added?r=e:e.removed?i=e:((r||i)&&g(n,i,r,e),n=e,r=null,i=null)}),(r||i)&&g(n,i,r,null),e}};function g(e,t,n,r){if(t&&n){let u=p(t.value),d=f(t.value),m=p(n.value),h=f(n.value);if(e){let r=i(u,m);e.value=s(e.value,m,r),t.value=c(t.value,r),n.value=c(n.value,r)}if(r){let e=a(d,h);r.value=o(r.value,h,e),t.value=l(t.value,e),n.value=l(n.value,e)}}else if(n){if(e){let e=p(n.value);n.value=n.value.substring(e.length)}if(r){let e=p(r.value);r.value=r.value.substring(e.length)}}else if(e&&r){let n=p(r.value),u=p(t.value),d=f(t.value),m=i(n,u);t.value=c(t.value,m);let h=a(c(n,m),d);t.value=l(t.value,h),r.value=o(r.value,n,h),e.value=s(e.value,n,n.slice(0,n.length-h.length))}else if(r){let e=p(r.value),n=u(f(t.value),e);t.value=l(t.value,n)}else if(e){let n=u(f(e.value),p(t.value));t.value=c(t.value,n)}}new class extends r{tokenize(e){let t=RegExp(`(\\r?\\n)|[${m}]+|[^\\S\\n\\r]+|[^${m}]`,`ug`);return e.match(t)||[]}};var _=new class extends r{constructor(){super(...arguments),this.tokenize=y}equals(e,t,n){return n.ignoreWhitespace?((!n.newlineIsToken||!e.includes(`
1
+ import{c as e,d as t,p as n}from"./button-BFNlGZ5p.js";var r=class{diff(e,t,n={}){let r;typeof n==`function`?(r=n,n={}):`callback`in n&&(r=n.callback);let i=this.castInput(e,n),a=this.castInput(t,n),o=this.removeEmpty(this.tokenize(i,n)),s=this.removeEmpty(this.tokenize(a,n));return this.diffWithOptionsObj(o,s,n,r)}diffWithOptionsObj(e,t,n,r){let i=e=>{if(e=this.postProcess(e,n),r){setTimeout(function(){r(e)},0);return}else return e},a=t.length,o=e.length,s=1,c=a+o;n.maxEditLength!=null&&(c=Math.min(c,n.maxEditLength));let l=n.timeout??1/0,u=Date.now()+l,d=[{oldPos:-1,lastComponent:void 0}],f=this.extractCommon(d[0],t,e,0,n);if(d[0].oldPos+1>=o&&f+1>=a)return i(this.buildValues(d[0].lastComponent,t,e));let p=-1/0,m=1/0,h=()=>{for(let r=Math.max(p,-s);r<=Math.min(m,s);r+=2){let s,c=d[r-1],l=d[r+1];c&&(d[r-1]=void 0);let u=!1;if(l){let e=l.oldPos-r;u=l&&0<=e&&e<a}let h=c&&c.oldPos+1<o;if(!u&&!h){d[r]=void 0;continue}if(s=!h||u&&c.oldPos<l.oldPos?this.addToPath(l,!0,!1,0,n):this.addToPath(c,!1,!0,1,n),f=this.extractCommon(s,t,e,r,n),s.oldPos+1>=o&&f+1>=a)return i(this.buildValues(s.lastComponent,t,e))||!0;d[r]=s,s.oldPos+1>=o&&(m=Math.min(m,r-1)),f+1>=a&&(p=Math.max(p,r+1))}s++};if(r)(function e(){setTimeout(function(){if(s>c||Date.now()>u)return r(void 0);h()||e()},0)})();else for(;s<=c&&Date.now()<=u;){let e=h();if(e)return e}}addToPath(e,t,n,r,i){let a=e.lastComponent;return a&&!i.oneChangePerToken&&a.added===t&&a.removed===n?{oldPos:e.oldPos+r,lastComponent:{count:a.count+1,added:t,removed:n,previousComponent:a.previousComponent}}:{oldPos:e.oldPos+r,lastComponent:{count:1,added:t,removed:n,previousComponent:a}}}extractCommon(e,t,n,r,i){let a=t.length,o=n.length,s=e.oldPos,c=s-r,l=0;for(;c+1<a&&s+1<o&&this.equals(n[s+1],t[c+1],i);)c++,s++,l++,i.oneChangePerToken&&(e.lastComponent={count:1,previousComponent:e.lastComponent,added:!1,removed:!1});return l&&!i.oneChangePerToken&&(e.lastComponent={count:l,previousComponent:e.lastComponent,added:!1,removed:!1}),e.oldPos=s,c}equals(e,t,n){return n.comparator?n.comparator(e,t):e===t||!!n.ignoreCase&&e.toLowerCase()===t.toLowerCase()}removeEmpty(e){let t=[];for(let n=0;n<e.length;n++)e[n]&&t.push(e[n]);return t}castInput(e,t){return e}tokenize(e,t){return Array.from(e)}join(e){return e.join(``)}postProcess(e,t){return e}get useLongestToken(){return!1}buildValues(e,t,n){let r=[],i;for(;e;)r.push(e),i=e.previousComponent,delete e.previousComponent,e=i;r.reverse();let a=r.length,o=0,s=0,c=0;for(;o<a;o++){let e=r[o];if(e.removed)e.value=this.join(n.slice(c,c+e.count)),c+=e.count;else{if(!e.added&&this.useLongestToken){let r=t.slice(s,s+e.count);r=r.map(function(e,t){let r=n[c+t];return r.length>e.length?r:e}),e.value=this.join(r)}else e.value=this.join(t.slice(s,s+e.count));s+=e.count,e.added||(c+=e.count)}}return r}};new class extends r{};function i(e,t){let n;for(n=0;n<e.length&&n<t.length;n++)if(e[n]!=t[n])return e.slice(0,n);return e.slice(0,n)}function a(e,t){let n;if(!e||!t||e[e.length-1]!=t[t.length-1])return``;for(n=0;n<e.length&&n<t.length;n++)if(e[e.length-(n+1)]!=t[t.length-(n+1)])return e.slice(-n);return e.slice(-n)}function o(e,t,n){if(e.slice(0,t.length)!=t)throw Error(`string ${JSON.stringify(e)} doesn't start with prefix ${JSON.stringify(t)}; this is a bug`);return n+e.slice(t.length)}function s(e,t,n){if(!t)return e+n;if(e.slice(-t.length)!=t)throw Error(`string ${JSON.stringify(e)} doesn't end with suffix ${JSON.stringify(t)}; this is a bug`);return e.slice(0,-t.length)+n}function c(e,t){return o(e,t,``)}function l(e,t){return s(e,t,``)}function u(e,t){return t.slice(0,d(e,t))}function d(e,t){let n=0;e.length>t.length&&(n=e.length-t.length);let r=t.length;e.length<t.length&&(r=e.length);let i=Array(r),a=0;i[0]=0;for(let e=1;e<r;e++){for(t[e]==t[a]?i[e]=i[a]:i[e]=a;a>0&&t[e]!=t[a];)a=i[a];t[e]==t[a]&&a++}a=0;for(let r=n;r<e.length;r++){for(;a>0&&e[r]!=t[a];)a=i[a];e[r]==t[a]&&a++}return a}function f(e){let t;for(t=e.length-1;t>=0&&e[t].match(/\s/);t--);return e.substring(t+1)}function p(e){let t=e.match(/^\s*/);return t?t[0]:``}var m=`a-zA-Z0-9_\\u{AD}\\u{C0}-\\u{D6}\\u{D8}-\\u{F6}\\u{F8}-\\u{2C6}\\u{2C8}-\\u{2D7}\\u{2DE}-\\u{2FF}\\u{1E00}-\\u{1EFF}`,h=RegExp(`[${m}]+|\\s+|[^${m}]`,`ug`);new class extends r{equals(e,t,n){return n.ignoreCase&&(e=e.toLowerCase(),t=t.toLowerCase()),e.trim()===t.trim()}tokenize(e,t={}){let n;if(t.intlSegmenter){let r=t.intlSegmenter;if(r.resolvedOptions().granularity!=`word`)throw Error(`The segmenter passed must have a granularity of "word"`);n=[];for(let t of Array.from(r.segment(e))){let e=t.segment;n.length&&/\s/.test(n[n.length-1])&&/\s/.test(e)?n[n.length-1]+=e:n.push(e)}}else n=e.match(h)||[];let r=[],i=null;return n.forEach(e=>{/\s/.test(e)?i==null?r.push(e):r.push(r.pop()+e):i!=null&&/\s/.test(i)?r[r.length-1]==i?r.push(r.pop()+e):r.push(i+e):r.push(e),i=e}),r}join(e){return e.map((e,t)=>t==0?e:e.replace(/^\s+/,``)).join(``)}postProcess(e,t){if(!e||t.oneChangePerToken)return e;let n=null,r=null,i=null;return e.forEach(e=>{e.added?r=e:e.removed?i=e:((r||i)&&g(n,i,r,e),n=e,r=null,i=null)}),(r||i)&&g(n,i,r,null),e}};function g(e,t,n,r){if(t&&n){let u=p(t.value),d=f(t.value),m=p(n.value),h=f(n.value);if(e){let r=i(u,m);e.value=s(e.value,m,r),t.value=c(t.value,r),n.value=c(n.value,r)}if(r){let e=a(d,h);r.value=o(r.value,h,e),t.value=l(t.value,e),n.value=l(n.value,e)}}else if(n){if(e){let e=p(n.value);n.value=n.value.substring(e.length)}if(r){let e=p(r.value);r.value=r.value.substring(e.length)}}else if(e&&r){let n=p(r.value),u=p(t.value),d=f(t.value),m=i(n,u);t.value=c(t.value,m);let h=a(c(n,m),d);t.value=l(t.value,h),r.value=o(r.value,n,h),e.value=s(e.value,n,n.slice(0,n.length-h.length))}else if(r){let e=p(r.value),n=u(f(t.value),e);t.value=l(t.value,n)}else if(e){let n=u(f(e.value),p(t.value));t.value=c(t.value,n)}}new class extends r{tokenize(e){let t=RegExp(`(\\r?\\n)|[${m}]+|[^\\S\\n\\r]+|[^${m}]`,`ug`);return e.match(t)||[]}};var _=new class extends r{constructor(){super(...arguments),this.tokenize=y}equals(e,t,n){return n.ignoreWhitespace?((!n.newlineIsToken||!e.includes(`
2
2
  `))&&(e=e.trim()),(!n.newlineIsToken||!t.includes(`
3
3
  `))&&(t=t.trim())):n.ignoreNewlineAtEof&&!n.newlineIsToken&&(e.endsWith(`
4
4
  `)&&(e=e.slice(0,-1)),t.endsWith(`
5
5
  `)&&(t=t.slice(0,-1))),super.equals(e,t,n)}};function v(e,t,n){return _.diff(e,t,n)}function y(e,t){t.stripTrailingCr&&(e=e.replace(/\r\n/g,`
6
- `));let n=[],r=e.split(/(\n|\r\n)/);r[r.length-1]||r.pop();for(let e=0;e<r.length;e++){let i=r[e];e%2&&!t.newlineIsToken?n[n.length-1]+=i:n.push(i)}return n}function b(e){return e==`.`||e==`!`||e==`?`}new class extends r{tokenize(e){let t=[],n=0;for(let r=0;r<e.length;r++){if(r==e.length-1){t.push(e.slice(n));break}if(b(e[r])&&e[r+1].match(/\s/)){for(t.push(e.slice(n,r+1)),r=n=r+1;e[r+1]?.match(/\s/);)r++;t.push(e.slice(n,r+1)),n=r+1}}return t}},new class extends r{tokenize(e){return e.split(/([{}:;,]|\s+)/)}},new class extends r{constructor(){super(...arguments),this.tokenize=y}get useLongestToken(){return!0}castInput(e,t){let{undefinedReplacement:n,stringifyReplacer:r=(e,t)=>t===void 0?n:t}=t;return typeof e==`string`?e:JSON.stringify(x(e,null,null,r),null,` `)}equals(e,t,n){return super.equals(e.replace(/,([\r\n])/g,`$1`),t.replace(/,([\r\n])/g,`$1`),n)}};function x(e,t,n,r,i){t||=[],n||=[],r&&(e=r(i===void 0?``:i,e));let a;for(a=0;a<t.length;a+=1)if(t[a]===e)return n[a];let o;if(Object.prototype.toString.call(e)===`[object Array]`){for(t.push(e),o=Array(e.length),n.push(o),a=0;a<e.length;a+=1)o[a]=x(e[a],t,n,r,String(a));return t.pop(),n.pop(),o}if(e&&e.toJSON&&(e=e.toJSON()),typeof e==`object`&&e){t.push(e),o={},n.push(o);let i=[],s;for(s in e)Object.prototype.hasOwnProperty.call(e,s)&&i.push(s);for(i.sort(),a=0;a<i.length;a+=1)s=i[a],o[s]=x(e[s],t,n,r,s);t.pop(),n.pop()}else o=e;return o}new class extends r{tokenize(e){return e.slice()}join(e){return e}removeEmpty(e){return e}};var S=t(n(),1),C=e();function w(e,t){let n=`rounded-md border px-2 py-1.5`;return e===`unchanged`?`${n} border-transparent`:e===`changed`?`${n} border-orange-300 bg-orange-500/10`:e===`added`?t===`modified`?`${n} border-green-300 bg-green-500/10`:`${n} border-transparent opacity-50`:e===`removed`?t===`original`?`${n} border-red-300 bg-red-500/10`:`${n} border-transparent opacity-50`:n}function T(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n],i=e[n+1];if(r.removed&&i?.added){t.push({status:`changed`,original:r.value,modified:i.value}),n+=1;continue}if(r.added&&i?.removed){t.push({status:`changed`,original:i.value,modified:r.value}),n+=1;continue}if(r.added){t.push({status:`added`,original:``,modified:r.value});continue}if(r.removed){t.push({status:`removed`,original:r.value,modified:``});continue}t.push({status:`unchanged`,original:r.value,modified:r.value})}return t}function E({original:e,modified:t,className:n=``,maxHeight:r=`320px`,mode:i=`inline`}){let a=(0,S.useMemo)(()=>v(e||``,t||``),[e,t]),o=(0,S.useMemo)(()=>T(a),[a]);return i===`split`?(0,C.jsx)(`div`,{className:`overflow-auto rounded-md border bg-muted/30 p-2 ${n}`,style:{maxHeight:r},children:(0,C.jsxs)(`div`,{className:`grid grid-cols-2 gap-2 text-xs font-mono`,children:[(0,C.jsx)(`div`,{className:`text-[10px] text-muted-foreground mb-0.5`,children:`原始`}),(0,C.jsx)(`div`,{className:`text-[10px] text-muted-foreground mb-0.5`,children:`修改后`}),o.map((e,t)=>(0,C.jsxs)(`div`,{className:`contents`,children:[(0,C.jsx)(`div`,{className:w(e.status,`original`),children:(0,C.jsx)(`div`,{className:`whitespace-pre-wrap break-all`,children:e.original||(0,C.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})})}),(0,C.jsx)(`div`,{className:w(e.status,`modified`),children:(0,C.jsx)(`div`,{className:`whitespace-pre-wrap break-all`,children:e.modified||(0,C.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})})})]},t))]})}):(0,C.jsx)(`pre`,{className:`text-xs font-mono overflow-auto whitespace-pre-wrap break-all rounded-md border bg-muted/30 ${n}`,style:{maxHeight:r},children:a.map((e,t)=>e.added?(0,C.jsx)(`span`,{className:`block bg-green-500/20 text-green-800 dark:text-green-200 border-l-2 border-green-500 pl-2`,children:e.value},t):e.removed?(0,C.jsx)(`span`,{className:`block bg-red-500/20 text-red-800 dark:text-red-200 border-l-2 border-red-500 pl-2`,children:e.value},t):(0,C.jsx)(`span`,{children:e.value},t))})}export{v as n,E as t};
6
+ `));let n=[],r=e.split(/(\n|\r\n)/);r[r.length-1]||r.pop();for(let e=0;e<r.length;e++){let i=r[e];e%2&&!t.newlineIsToken?n[n.length-1]+=i:n.push(i)}return n}function b(e){return e==`.`||e==`!`||e==`?`}new class extends r{tokenize(e){let t=[],n=0;for(let r=0;r<e.length;r++){if(r==e.length-1){t.push(e.slice(n));break}if(b(e[r])&&e[r+1].match(/\s/)){for(t.push(e.slice(n,r+1)),r=n=r+1;e[r+1]?.match(/\s/);)r++;t.push(e.slice(n,r+1)),n=r+1}}return t}},new class extends r{tokenize(e){return e.split(/([{}:;,]|\s+)/)}},new class extends r{constructor(){super(...arguments),this.tokenize=y}get useLongestToken(){return!0}castInput(e,t){let{undefinedReplacement:n,stringifyReplacer:r=(e,t)=>t===void 0?n:t}=t;return typeof e==`string`?e:JSON.stringify(x(e,null,null,r),null,` `)}equals(e,t,n){return super.equals(e.replace(/,([\r\n])/g,`$1`),t.replace(/,([\r\n])/g,`$1`),n)}};function x(e,t,n,r,i){t||=[],n||=[],r&&(e=r(i===void 0?``:i,e));let a;for(a=0;a<t.length;a+=1)if(t[a]===e)return n[a];let o;if(Object.prototype.toString.call(e)===`[object Array]`){for(t.push(e),o=Array(e.length),n.push(o),a=0;a<e.length;a+=1)o[a]=x(e[a],t,n,r,String(a));return t.pop(),n.pop(),o}if(e&&e.toJSON&&(e=e.toJSON()),typeof e==`object`&&e){t.push(e),o={},n.push(o);let i=[],s;for(s in e)Object.prototype.hasOwnProperty.call(e,s)&&i.push(s);for(i.sort(),a=0;a<i.length;a+=1)s=i[a],o[s]=x(e[s],t,n,r,s);t.pop(),n.pop()}else o=e;return o}new class extends r{tokenize(e){return e.slice()}join(e){return e}removeEmpty(e){return e}};var S=n(t(),1),C=e();function w(e,t){let n=`rounded-md border px-2 py-1.5`;return e===`unchanged`?`${n} border-transparent`:e===`changed`?`${n} border-orange-300 bg-orange-500/10`:e===`added`?t===`modified`?`${n} border-green-300 bg-green-500/10`:`${n} border-transparent opacity-50`:e===`removed`?t===`original`?`${n} border-red-300 bg-red-500/10`:`${n} border-transparent opacity-50`:n}function T(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n],i=e[n+1];if(r.removed&&i?.added){t.push({status:`changed`,original:r.value,modified:i.value}),n+=1;continue}if(r.added&&i?.removed){t.push({status:`changed`,original:i.value,modified:r.value}),n+=1;continue}if(r.added){t.push({status:`added`,original:``,modified:r.value});continue}if(r.removed){t.push({status:`removed`,original:r.value,modified:``});continue}t.push({status:`unchanged`,original:r.value,modified:r.value})}return t}function E({original:e,modified:t,className:n=``,maxHeight:r=`320px`,mode:i=`inline`}){let a=(0,S.useMemo)(()=>v(e||``,t||``),[e,t]),o=(0,S.useMemo)(()=>T(a),[a]);return i===`split`?(0,C.jsx)(`div`,{className:`overflow-auto rounded-md border bg-muted/30 p-2 ${n}`,style:{maxHeight:r},children:(0,C.jsxs)(`div`,{className:`grid grid-cols-2 gap-2 text-xs font-mono`,children:[(0,C.jsx)(`div`,{className:`text-[10px] text-muted-foreground mb-0.5`,children:`原始`}),(0,C.jsx)(`div`,{className:`text-[10px] text-muted-foreground mb-0.5`,children:`修改后`}),o.map((e,t)=>(0,C.jsxs)(`div`,{className:`contents`,children:[(0,C.jsx)(`div`,{className:w(e.status,`original`),children:(0,C.jsx)(`div`,{className:`whitespace-pre-wrap break-all`,children:e.original||(0,C.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})})}),(0,C.jsx)(`div`,{className:w(e.status,`modified`),children:(0,C.jsx)(`div`,{className:`whitespace-pre-wrap break-all`,children:e.modified||(0,C.jsx)(`span`,{className:`text-muted-foreground italic`,children:`(无)`})})})]},t))]})}):(0,C.jsx)(`pre`,{className:`text-xs font-mono overflow-auto whitespace-pre-wrap break-all rounded-md border bg-muted/30 ${n}`,style:{maxHeight:r},children:a.map((e,t)=>e.added?(0,C.jsx)(`span`,{className:`block bg-green-500/20 text-green-800 dark:text-green-200 border-l-2 border-green-500 pl-2`,children:e.value},t):e.removed?(0,C.jsx)(`span`,{className:`block bg-red-500/20 text-red-800 dark:text-red-200 border-l-2 border-red-500 pl-2`,children:e.value},t):(0,C.jsx)(`span`,{children:e.value},t))})}export{v as n,E as t};
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n)),l=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var S=Array.isArray;function C(){}var w={H:null,A:null,T:null,S:null},T=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function ee(e,t){return E(e.type,t,e.props)}function D(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function O(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var k=/\/+/g;function A(e,t){return typeof e==`object`&&e&&e.key!=null?O(``+e.key):t.toString(36)}function j(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(C,C):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function M(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,M(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+A(e,0):a,S(o)?(i=``,c!=null&&(i=c.replace(k,`$&/`)+`/`),M(o,r,i,``,function(e){return e})):o!=null&&(D(o)&&(o=ee(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(k,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(S(e))for(var u=0;u<e.length;u++)a=e[u],s=l+A(a,u),c+=M(a,r,i,s,o);else if(u=m(e),typeof u==`function`)for(e=u.call(e),u=0;!(a=e.next()).done;)a=a.value,s=l+A(a,u++),c+=M(a,r,i,s,o);else if(s===`object`){if(typeof e.then==`function`)return M(j(e),r,i,a,o);throw r=String(e),Error(`Objects are not valid as a React child (found: `+(r===`[object Object]`?`object with keys {`+Object.keys(e).join(`, `)+`}`:r)+`). If you meant to render a collection of children, use an array instead.`)}return c}function N(e,t,n){if(e==null)return e;var r=[],i=0;return M(e,r,``,``,function(e){return t.call(n,e,i++)}),r}function te(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(t){(e._status===0||e._status===-1)&&(e._status=1,e._result=t)},function(t){(e._status===0||e._status===-1)&&(e._status=2,e._result=t)}),e._status===-1&&(e._status=0,e._result=t)}if(e._status===1)return e._result.default;throw e._result}var P=typeof reportError==`function`?reportError:function(e){if(typeof window==`object`&&typeof window.ErrorEvent==`function`){var t=new window.ErrorEvent(`error`,{bubbles:!0,cancelable:!0,message:typeof e==`object`&&e&&typeof e.message==`string`?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process==`object`&&typeof process.emit==`function`){process.emit(`uncaughtException`,e);return}console.error(e)},ne={map:N,forEach:function(e,t,n){N(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return N(e,function(){t++}),t},toArray:function(e){return N(e,function(e){return e})||[]},only:function(e){if(!D(e))throw Error(`React.Children.only expected to receive a single React element child.`);return e}};e.Activity=f,e.Children=ne,e.Component=v,e.Fragment=r,e.Profiler=a,e.PureComponent=b,e.StrictMode=i,e.Suspense=l,e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=w,e.__COMPILER_RUNTIME={__proto__:null,c:function(e){return w.H.useMemoCache(e)}},e.cache=function(e){return function(){return e.apply(null,arguments)}},e.cacheSignal=function(){return null},e.cloneElement=function(e,t,n){if(e==null)throw Error(`The argument must be a React element, but you passed `+e+`.`);var r=g({},e.props),i=e.key;if(t!=null)for(a in t.key!==void 0&&(i=``+t.key),t)!T.call(t,a)||a===`key`||a===`__self`||a===`__source`||a===`ref`&&t.ref===void 0||(r[a]=t[a]);var a=arguments.length-2;if(a===1)r.children=n;else if(1<a){for(var o=Array(a),s=0;s<a;s++)o[s]=arguments[s+2];r.children=o}return E(e.type,i,r)},e.createContext=function(e){return e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider=e,e.Consumer={$$typeof:o,_context:e},e},e.createElement=function(e,t,n){var r,i={},a=null;if(t!=null)for(r in t.key!==void 0&&(a=``+t.key),t)T.call(t,r)&&r!==`key`&&r!==`__self`&&r!==`__source`&&(i[r]=t[r]);var o=arguments.length-2;if(o===1)i.children=n;else if(1<o){for(var s=Array(o),c=0;c<o;c++)s[c]=arguments[c+2];i.children=s}if(e&&e.defaultProps)for(r in o=e.defaultProps,o)i[r]===void 0&&(i[r]=o[r]);return E(e,a,i)},e.createRef=function(){return{current:null}},e.forwardRef=function(e){return{$$typeof:c,render:e}},e.isValidElement=D,e.lazy=function(e){return{$$typeof:d,_payload:{_status:-1,_result:e},_init:te}},e.memo=function(e,t){return{$$typeof:u,type:e,compare:t===void 0?null:t}},e.startTransition=function(e){var t=w.T,n={};w.T=n;try{var r=e(),i=w.S;i!==null&&i(n,r),typeof r==`object`&&r&&typeof r.then==`function`&&r.then(C,P)}catch(e){P(e)}finally{t!==null&&n.types!==null&&(t.types=n.types),w.T=t}},e.unstable_useCacheRefresh=function(){return w.H.useCacheRefresh()},e.use=function(e){return w.H.use(e)},e.useActionState=function(e,t,n){return w.H.useActionState(e,t,n)},e.useCallback=function(e,t){return w.H.useCallback(e,t)},e.useContext=function(e){return w.H.useContext(e)},e.useDebugValue=function(){},e.useDeferredValue=function(e,t){return w.H.useDeferredValue(e,t)},e.useEffect=function(e,t){return w.H.useEffect(e,t)},e.useEffectEvent=function(e){return w.H.useEffectEvent(e)},e.useId=function(){return w.H.useId()},e.useImperativeHandle=function(e,t,n){return w.H.useImperativeHandle(e,t,n)},e.useInsertionEffect=function(e,t){return w.H.useInsertionEffect(e,t)},e.useLayoutEffect=function(e,t){return w.H.useLayoutEffect(e,t)},e.useMemo=function(e,t){return w.H.useMemo(e,t)},e.useOptimistic=function(e,t){return w.H.useOptimistic(e,t)},e.useReducer=function(e,t,n){return w.H.useReducer(e,t,n)},e.useRef=function(e){return w.H.useRef(e)},e.useState=function(e){return w.H.useState(e)},e.useSyncExternalStore=function(e,t,n){return w.H.useSyncExternalStore(e,t,n)},e.useTransition=function(){return w.H.useTransition()},e.version=`19.2.4`})),u=o(((e,t)=>{t.exports=l()})),d=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),f=e=>e.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase(),p=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,n)=>n?n.toUpperCase():t.toLowerCase()),m=e=>{let t=p(e);return t.charAt(0).toUpperCase()+t.slice(1)},h={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:2,strokeLinecap:`round`,strokeLinejoin:`round`},g=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0;return!1},_=c(u()),v=(0,_.forwardRef)(({color:e=`currentColor`,size:t=24,strokeWidth:n=2,absoluteStrokeWidth:r,className:i=``,children:a,iconNode:o,...s},c)=>(0,_.createElement)(`svg`,{ref:c,...h,width:t,height:t,stroke:e,strokeWidth:r?Number(n)*24/Number(t):n,className:d(`lucide`,i),...!a&&!g(s)&&{"aria-hidden":`true`},...s},[...o.map(([e,t])=>(0,_.createElement)(e,t)),...Array.isArray(a)?a:[a]])),y=(e,t)=>{let n=(0,_.forwardRef)(({className:n,...r},i)=>(0,_.createElement)(v,{ref:i,iconNode:t,className:d(`lucide-${f(m(e))}`,`lucide-${e}`,n),...r}));return n.displayName=m(e),n};function b(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`)if(Array.isArray(e)){var i=e.length;for(t=0;t<i;t++)e[t]&&(n=b(e[t]))&&(r&&(r+=` `),r+=n)}else for(n in e)e[n]&&(r&&(r+=` `),r+=n);return r}function x(){for(var e,t,n=0,r=``,i=arguments.length;n<i;n++)(e=arguments[n])&&(t=b(e))&&(r&&(r+=` `),r+=t);return r}var S=(e,t)=>{let n=Array(e.length+t.length);for(let t=0;t<e.length;t++)n[t]=e[t];for(let r=0;r<t.length;r++)n[e.length+r]=t[r];return n},C=(e,t)=>({classGroupId:e,validator:t}),w=(e=new Map,t=null,n)=>({nextPart:e,validators:t,classGroupId:n}),T=`-`,E=[],ee=`arbitrary..`,D=e=>{let t=A(e),{conflictingClassGroups:n,conflictingClassGroupModifiers:r}=e;return{getClassGroupId:e=>{if(e.startsWith(`[`)&&e.endsWith(`]`))return k(e);let n=e.split(T);return O(n,n[0]===``&&n.length>1?1:0,t)},getConflictingClassGroupIds:(e,t)=>{if(t){let t=r[e],i=n[e];return t?i?S(i,t):t:i||E}return n[e]||E}}},O=(e,t,n)=>{if(e.length-t===0)return n.classGroupId;let r=e[t],i=n.nextPart.get(r);if(i){let n=O(e,t+1,i);if(n)return n}let a=n.validators;if(a===null)return;let o=t===0?e.join(T):e.slice(t).join(T),s=a.length;for(let e=0;e<s;e++){let t=a[e];if(t.validator(o))return t.classGroupId}},k=e=>e.slice(1,-1).indexOf(`:`)===-1?void 0:(()=>{let t=e.slice(1,-1),n=t.indexOf(`:`),r=t.slice(0,n);return r?ee+r:void 0})(),A=e=>{let{theme:t,classGroups:n}=e;return j(n,t)},j=(e,t)=>{let n=w();for(let r in e){let i=e[r];M(i,n,r,t)}return n},M=(e,t,n,r)=>{let i=e.length;for(let a=0;a<i;a++){let i=e[a];N(i,t,n,r)}},N=(e,t,n,r)=>{if(typeof e==`string`){te(e,t,n);return}if(typeof e==`function`){P(e,t,n,r);return}ne(e,t,n,r)},te=(e,t,n)=>{let r=e===``?t:F(t,e);r.classGroupId=n},P=(e,t,n,r)=>{if(I(e)){M(e(r),t,n,r);return}t.validators===null&&(t.validators=[]),t.validators.push(C(n,e))},ne=(e,t,n,r)=>{let i=Object.entries(e),a=i.length;for(let e=0;e<a;e++){let[a,o]=i[e];M(o,F(t,a),n,r)}},F=(e,t)=>{let n=e,r=t.split(T),i=r.length;for(let e=0;e<i;e++){let t=r[e],i=n.nextPart.get(t);i||(i=w(),n.nextPart.set(t,i)),n=i}return n},I=e=>`isThemeGetter`in e&&e.isThemeGetter===!0,L=e=>{if(e<1)return{get:()=>void 0,set:()=>{}};let t=0,n=Object.create(null),r=Object.create(null),i=(i,a)=>{n[i]=a,t++,t>e&&(t=0,r=n,n=Object.create(null))};return{get(e){let t=n[e];if(t!==void 0)return t;if((t=r[e])!==void 0)return i(e,t),t},set(e,t){e in n?n[e]=t:i(e,t)}}},R=`!`,re=`:`,z=[],ie=(e,t,n,r,i)=>({modifiers:e,hasImportantModifier:t,baseClassName:n,maybePostfixModifierPosition:r,isExternal:i}),B=e=>{let{prefix:t,experimentalParseClassName:n}=e,r=e=>{let t=[],n=0,r=0,i=0,a,o=e.length;for(let s=0;s<o;s++){let o=e[s];if(n===0&&r===0){if(o===re){t.push(e.slice(i,s)),i=s+1;continue}if(o===`/`){a=s;continue}}o===`[`?n++:o===`]`?n--:o===`(`?r++:o===`)`&&r--}let s=t.length===0?e:e.slice(i),c=s,l=!1;s.endsWith(R)?(c=s.slice(0,-1),l=!0):s.startsWith(R)&&(c=s.slice(1),l=!0);let u=a&&a>i?a-i:void 0;return ie(t,l,c,u)};if(t){let e=t+re,n=r;r=t=>t.startsWith(e)?n(t.slice(e.length)):ie(z,!1,t,void 0,!0)}if(n){let e=r;r=t=>n({className:t,parseClassName:e})}return r},V=e=>{let t=new Map;return e.orderSensitiveModifiers.forEach((e,n)=>{t.set(e,1e6+n)}),e=>{let n=[],r=[];for(let i=0;i<e.length;i++){let a=e[i],o=a[0]===`[`,s=t.has(a);o||s?(r.length>0&&(r.sort(),n.push(...r),r=[]),n.push(a)):r.push(a)}return r.length>0&&(r.sort(),n.push(...r)),n}},ae=e=>({cache:L(e.cacheSize),parseClassName:B(e),sortModifiers:V(e),...D(e)}),H=/\s+/,oe=(e,t)=>{let{parseClassName:n,getClassGroupId:r,getConflictingClassGroupIds:i,sortModifiers:a}=t,o=[],s=e.trim().split(H),c=``;for(let e=s.length-1;e>=0;--e){let t=s[e],{isExternal:l,modifiers:u,hasImportantModifier:d,baseClassName:f,maybePostfixModifierPosition:p}=n(t);if(l){c=t+(c.length>0?` `+c:c);continue}let m=!!p,h=r(m?f.substring(0,p):f);if(!h){if(!m){c=t+(c.length>0?` `+c:c);continue}if(h=r(f),!h){c=t+(c.length>0?` `+c:c);continue}m=!1}let g=u.length===0?``:u.length===1?u[0]:a(u).join(`:`),_=d?g+R:g,v=_+h;if(o.indexOf(v)>-1)continue;o.push(v);let y=i(h,m);for(let e=0;e<y.length;++e){let t=y[e];o.push(_+t)}c=t+(c.length>0?` `+c:c)}return c},se=(...e)=>{let t=0,n,r,i=``;for(;t<e.length;)(n=e[t++])&&(r=ce(n))&&(i&&(i+=` `),i+=r);return i},ce=e=>{if(typeof e==`string`)return e;let t,n=``;for(let r=0;r<e.length;r++)e[r]&&(t=ce(e[r]))&&(n&&(n+=` `),n+=t);return n},le=(e,...t)=>{let n,r,i,a,o=o=>(n=ae(t.reduce((e,t)=>t(e),e())),r=n.cache.get,i=n.cache.set,a=s,s(o)),s=e=>{let t=r(e);if(t)return t;let a=oe(e,n);return i(e,a),a};return a=o,(...e)=>a(se(...e))},ue=[],U=e=>{let t=t=>t[e]||ue;return t.isThemeGetter=!0,t},de=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,fe=/^\((?:(\w[\w-]*):)?(.+)\)$/i,pe=/^\d+\/\d+$/,me=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,he=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,ge=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,_e=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,ve=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,W=e=>pe.test(e),G=e=>!!e&&!Number.isNaN(Number(e)),K=e=>!!e&&Number.isInteger(Number(e)),ye=e=>e.endsWith(`%`)&&G(e.slice(0,-1)),q=e=>me.test(e),be=()=>!0,xe=e=>he.test(e)&&!ge.test(e),Se=()=>!1,Ce=e=>_e.test(e),we=e=>ve.test(e),Te=e=>!J(e)&&!X(e),Ee=e=>Q(e,Re,Se),J=e=>de.test(e),Y=e=>Q(e,ze,xe),De=e=>Q(e,Be,G),Oe=e=>Q(e,Ie,Se),ke=e=>Q(e,Le,we),Ae=e=>Q(e,He,Ce),X=e=>fe.test(e),Z=e=>$(e,ze),je=e=>$(e,Ve),Me=e=>$(e,Ie),Ne=e=>$(e,Re),Pe=e=>$(e,Le),Fe=e=>$(e,He,!0),Q=(e,t,n)=>{let r=de.exec(e);return r?r[1]?t(r[1]):n(r[2]):!1},$=(e,t,n=!1)=>{let r=fe.exec(e);return r?r[1]?t(r[1]):n:!1},Ie=e=>e===`position`||e===`percentage`,Le=e=>e===`image`||e===`url`,Re=e=>e===`length`||e===`size`||e===`bg-size`,ze=e=>e===`length`,Be=e=>e===`number`,Ve=e=>e===`family-name`,He=e=>e===`shadow`,Ue=le(()=>{let e=U(`color`),t=U(`font`),n=U(`text`),r=U(`font-weight`),i=U(`tracking`),a=U(`leading`),o=U(`breakpoint`),s=U(`container`),c=U(`spacing`),l=U(`radius`),u=U(`shadow`),d=U(`inset-shadow`),f=U(`text-shadow`),p=U(`drop-shadow`),m=U(`blur`),h=U(`perspective`),g=U(`aspect`),_=U(`ease`),v=U(`animate`),y=()=>[`auto`,`avoid`,`all`,`avoid-page`,`page`,`left`,`right`,`column`],b=()=>[`center`,`top`,`bottom`,`left`,`right`,`top-left`,`left-top`,`top-right`,`right-top`,`bottom-right`,`right-bottom`,`bottom-left`,`left-bottom`],x=()=>[...b(),X,J],S=()=>[`auto`,`hidden`,`clip`,`visible`,`scroll`],C=()=>[`auto`,`contain`,`none`],w=()=>[X,J,c],T=()=>[W,`full`,`auto`,...w()],E=()=>[K,`none`,`subgrid`,X,J],ee=()=>[`auto`,{span:[`full`,K,X,J]},K,X,J],D=()=>[K,`auto`,X,J],O=()=>[`auto`,`min`,`max`,`fr`,X,J],k=()=>[`start`,`end`,`center`,`between`,`around`,`evenly`,`stretch`,`baseline`,`center-safe`,`end-safe`],A=()=>[`start`,`end`,`center`,`stretch`,`center-safe`,`end-safe`],j=()=>[`auto`,...w()],M=()=>[W,`auto`,`full`,`dvw`,`dvh`,`lvw`,`lvh`,`svw`,`svh`,`min`,`max`,`fit`,...w()],N=()=>[e,X,J],te=()=>[...b(),Me,Oe,{position:[X,J]}],P=()=>[`no-repeat`,{repeat:[``,`x`,`y`,`space`,`round`]}],ne=()=>[`auto`,`cover`,`contain`,Ne,Ee,{size:[X,J]}],F=()=>[ye,Z,Y],I=()=>[``,`none`,`full`,l,X,J],L=()=>[``,G,Z,Y],R=()=>[`solid`,`dashed`,`dotted`,`double`],re=()=>[`normal`,`multiply`,`screen`,`overlay`,`darken`,`lighten`,`color-dodge`,`color-burn`,`hard-light`,`soft-light`,`difference`,`exclusion`,`hue`,`saturation`,`color`,`luminosity`],z=()=>[G,ye,Me,Oe],ie=()=>[``,`none`,m,X,J],B=()=>[`none`,G,X,J],V=()=>[`none`,G,X,J],ae=()=>[G,X,J],H=()=>[W,`full`,...w()];return{cacheSize:500,theme:{animate:[`spin`,`ping`,`pulse`,`bounce`],aspect:[`video`],blur:[q],breakpoint:[q],color:[be],container:[q],"drop-shadow":[q],ease:[`in`,`out`,`in-out`],font:[Te],"font-weight":[`thin`,`extralight`,`light`,`normal`,`medium`,`semibold`,`bold`,`extrabold`,`black`],"inset-shadow":[q],leading:[`none`,`tight`,`snug`,`normal`,`relaxed`,`loose`],perspective:[`dramatic`,`near`,`normal`,`midrange`,`distant`,`none`],radius:[q],shadow:[q],spacing:[`px`,G],text:[q],"text-shadow":[q],tracking:[`tighter`,`tight`,`normal`,`wide`,`wider`,`widest`]},classGroups:{aspect:[{aspect:[`auto`,`square`,W,J,X,g]}],container:[`container`],columns:[{columns:[G,J,X,s]}],"break-after":[{"break-after":y()}],"break-before":[{"break-before":y()}],"break-inside":[{"break-inside":[`auto`,`avoid`,`avoid-page`,`avoid-column`]}],"box-decoration":[{"box-decoration":[`slice`,`clone`]}],box:[{box:[`border`,`content`]}],display:[`block`,`inline-block`,`inline`,`flex`,`inline-flex`,`table`,`inline-table`,`table-caption`,`table-cell`,`table-column`,`table-column-group`,`table-footer-group`,`table-header-group`,`table-row-group`,`table-row`,`flow-root`,`grid`,`inline-grid`,`contents`,`list-item`,`hidden`],sr:[`sr-only`,`not-sr-only`],float:[{float:[`right`,`left`,`none`,`start`,`end`]}],clear:[{clear:[`left`,`right`,`both`,`none`,`start`,`end`]}],isolation:[`isolate`,`isolation-auto`],"object-fit":[{object:[`contain`,`cover`,`fill`,`none`,`scale-down`]}],"object-position":[{object:x()}],overflow:[{overflow:S()}],"overflow-x":[{"overflow-x":S()}],"overflow-y":[{"overflow-y":S()}],overscroll:[{overscroll:C()}],"overscroll-x":[{"overscroll-x":C()}],"overscroll-y":[{"overscroll-y":C()}],position:[`static`,`fixed`,`absolute`,`relative`,`sticky`],inset:[{inset:T()}],"inset-x":[{"inset-x":T()}],"inset-y":[{"inset-y":T()}],start:[{start:T()}],end:[{end:T()}],top:[{top:T()}],right:[{right:T()}],bottom:[{bottom:T()}],left:[{left:T()}],visibility:[`visible`,`invisible`,`collapse`],z:[{z:[K,`auto`,X,J]}],basis:[{basis:[W,`full`,`auto`,s,...w()]}],"flex-direction":[{flex:[`row`,`row-reverse`,`col`,`col-reverse`]}],"flex-wrap":[{flex:[`nowrap`,`wrap`,`wrap-reverse`]}],flex:[{flex:[G,W,`auto`,`initial`,`none`,J]}],grow:[{grow:[``,G,X,J]}],shrink:[{shrink:[``,G,X,J]}],order:[{order:[K,`first`,`last`,`none`,X,J]}],"grid-cols":[{"grid-cols":E()}],"col-start-end":[{col:ee()}],"col-start":[{"col-start":D()}],"col-end":[{"col-end":D()}],"grid-rows":[{"grid-rows":E()}],"row-start-end":[{row:ee()}],"row-start":[{"row-start":D()}],"row-end":[{"row-end":D()}],"grid-flow":[{"grid-flow":[`row`,`col`,`dense`,`row-dense`,`col-dense`]}],"auto-cols":[{"auto-cols":O()}],"auto-rows":[{"auto-rows":O()}],gap:[{gap:w()}],"gap-x":[{"gap-x":w()}],"gap-y":[{"gap-y":w()}],"justify-content":[{justify:[...k(),`normal`]}],"justify-items":[{"justify-items":[...A(),`normal`]}],"justify-self":[{"justify-self":[`auto`,...A()]}],"align-content":[{content:[`normal`,...k()]}],"align-items":[{items:[...A(),{baseline:[``,`last`]}]}],"align-self":[{self:[`auto`,...A(),{baseline:[``,`last`]}]}],"place-content":[{"place-content":k()}],"place-items":[{"place-items":[...A(),`baseline`]}],"place-self":[{"place-self":[`auto`,...A()]}],p:[{p:w()}],px:[{px:w()}],py:[{py:w()}],ps:[{ps:w()}],pe:[{pe:w()}],pt:[{pt:w()}],pr:[{pr:w()}],pb:[{pb:w()}],pl:[{pl:w()}],m:[{m:j()}],mx:[{mx:j()}],my:[{my:j()}],ms:[{ms:j()}],me:[{me:j()}],mt:[{mt:j()}],mr:[{mr:j()}],mb:[{mb:j()}],ml:[{ml:j()}],"space-x":[{"space-x":w()}],"space-x-reverse":[`space-x-reverse`],"space-y":[{"space-y":w()}],"space-y-reverse":[`space-y-reverse`],size:[{size:M()}],w:[{w:[s,`screen`,...M()]}],"min-w":[{"min-w":[s,`screen`,`none`,...M()]}],"max-w":[{"max-w":[s,`screen`,`none`,`prose`,{screen:[o]},...M()]}],h:[{h:[`screen`,`lh`,...M()]}],"min-h":[{"min-h":[`screen`,`lh`,`none`,...M()]}],"max-h":[{"max-h":[`screen`,`lh`,...M()]}],"font-size":[{text:[`base`,n,Z,Y]}],"font-smoothing":[`antialiased`,`subpixel-antialiased`],"font-style":[`italic`,`not-italic`],"font-weight":[{font:[r,X,De]}],"font-stretch":[{"font-stretch":[`ultra-condensed`,`extra-condensed`,`condensed`,`semi-condensed`,`normal`,`semi-expanded`,`expanded`,`extra-expanded`,`ultra-expanded`,ye,J]}],"font-family":[{font:[je,J,t]}],"fvn-normal":[`normal-nums`],"fvn-ordinal":[`ordinal`],"fvn-slashed-zero":[`slashed-zero`],"fvn-figure":[`lining-nums`,`oldstyle-nums`],"fvn-spacing":[`proportional-nums`,`tabular-nums`],"fvn-fraction":[`diagonal-fractions`,`stacked-fractions`],tracking:[{tracking:[i,X,J]}],"line-clamp":[{"line-clamp":[G,`none`,X,De]}],leading:[{leading:[a,...w()]}],"list-image":[{"list-image":[`none`,X,J]}],"list-style-position":[{list:[`inside`,`outside`]}],"list-style-type":[{list:[`disc`,`decimal`,`none`,X,J]}],"text-alignment":[{text:[`left`,`center`,`right`,`justify`,`start`,`end`]}],"placeholder-color":[{placeholder:N()}],"text-color":[{text:N()}],"text-decoration":[`underline`,`overline`,`line-through`,`no-underline`],"text-decoration-style":[{decoration:[...R(),`wavy`]}],"text-decoration-thickness":[{decoration:[G,`from-font`,`auto`,X,Y]}],"text-decoration-color":[{decoration:N()}],"underline-offset":[{"underline-offset":[G,`auto`,X,J]}],"text-transform":[`uppercase`,`lowercase`,`capitalize`,`normal-case`],"text-overflow":[`truncate`,`text-ellipsis`,`text-clip`],"text-wrap":[{text:[`wrap`,`nowrap`,`balance`,`pretty`]}],indent:[{indent:w()}],"vertical-align":[{align:[`baseline`,`top`,`middle`,`bottom`,`text-top`,`text-bottom`,`sub`,`super`,X,J]}],whitespace:[{whitespace:[`normal`,`nowrap`,`pre`,`pre-line`,`pre-wrap`,`break-spaces`]}],break:[{break:[`normal`,`words`,`all`,`keep`]}],wrap:[{wrap:[`break-word`,`anywhere`,`normal`]}],hyphens:[{hyphens:[`none`,`manual`,`auto`]}],content:[{content:[`none`,X,J]}],"bg-attachment":[{bg:[`fixed`,`local`,`scroll`]}],"bg-clip":[{"bg-clip":[`border`,`padding`,`content`,`text`]}],"bg-origin":[{"bg-origin":[`border`,`padding`,`content`]}],"bg-position":[{bg:te()}],"bg-repeat":[{bg:P()}],"bg-size":[{bg:ne()}],"bg-image":[{bg:[`none`,{linear:[{to:[`t`,`tr`,`r`,`br`,`b`,`bl`,`l`,`tl`]},K,X,J],radial:[``,X,J],conic:[K,X,J]},Pe,ke]}],"bg-color":[{bg:N()}],"gradient-from-pos":[{from:F()}],"gradient-via-pos":[{via:F()}],"gradient-to-pos":[{to:F()}],"gradient-from":[{from:N()}],"gradient-via":[{via:N()}],"gradient-to":[{to:N()}],rounded:[{rounded:I()}],"rounded-s":[{"rounded-s":I()}],"rounded-e":[{"rounded-e":I()}],"rounded-t":[{"rounded-t":I()}],"rounded-r":[{"rounded-r":I()}],"rounded-b":[{"rounded-b":I()}],"rounded-l":[{"rounded-l":I()}],"rounded-ss":[{"rounded-ss":I()}],"rounded-se":[{"rounded-se":I()}],"rounded-ee":[{"rounded-ee":I()}],"rounded-es":[{"rounded-es":I()}],"rounded-tl":[{"rounded-tl":I()}],"rounded-tr":[{"rounded-tr":I()}],"rounded-br":[{"rounded-br":I()}],"rounded-bl":[{"rounded-bl":I()}],"border-w":[{border:L()}],"border-w-x":[{"border-x":L()}],"border-w-y":[{"border-y":L()}],"border-w-s":[{"border-s":L()}],"border-w-e":[{"border-e":L()}],"border-w-t":[{"border-t":L()}],"border-w-r":[{"border-r":L()}],"border-w-b":[{"border-b":L()}],"border-w-l":[{"border-l":L()}],"divide-x":[{"divide-x":L()}],"divide-x-reverse":[`divide-x-reverse`],"divide-y":[{"divide-y":L()}],"divide-y-reverse":[`divide-y-reverse`],"border-style":[{border:[...R(),`hidden`,`none`]}],"divide-style":[{divide:[...R(),`hidden`,`none`]}],"border-color":[{border:N()}],"border-color-x":[{"border-x":N()}],"border-color-y":[{"border-y":N()}],"border-color-s":[{"border-s":N()}],"border-color-e":[{"border-e":N()}],"border-color-t":[{"border-t":N()}],"border-color-r":[{"border-r":N()}],"border-color-b":[{"border-b":N()}],"border-color-l":[{"border-l":N()}],"divide-color":[{divide:N()}],"outline-style":[{outline:[...R(),`none`,`hidden`]}],"outline-offset":[{"outline-offset":[G,X,J]}],"outline-w":[{outline:[``,G,Z,Y]}],"outline-color":[{outline:N()}],shadow:[{shadow:[``,`none`,u,Fe,Ae]}],"shadow-color":[{shadow:N()}],"inset-shadow":[{"inset-shadow":[`none`,d,Fe,Ae]}],"inset-shadow-color":[{"inset-shadow":N()}],"ring-w":[{ring:L()}],"ring-w-inset":[`ring-inset`],"ring-color":[{ring:N()}],"ring-offset-w":[{"ring-offset":[G,Y]}],"ring-offset-color":[{"ring-offset":N()}],"inset-ring-w":[{"inset-ring":L()}],"inset-ring-color":[{"inset-ring":N()}],"text-shadow":[{"text-shadow":[`none`,f,Fe,Ae]}],"text-shadow-color":[{"text-shadow":N()}],opacity:[{opacity:[G,X,J]}],"mix-blend":[{"mix-blend":[...re(),`plus-darker`,`plus-lighter`]}],"bg-blend":[{"bg-blend":re()}],"mask-clip":[{"mask-clip":[`border`,`padding`,`content`,`fill`,`stroke`,`view`]},`mask-no-clip`],"mask-composite":[{mask:[`add`,`subtract`,`intersect`,`exclude`]}],"mask-image-linear-pos":[{"mask-linear":[G]}],"mask-image-linear-from-pos":[{"mask-linear-from":z()}],"mask-image-linear-to-pos":[{"mask-linear-to":z()}],"mask-image-linear-from-color":[{"mask-linear-from":N()}],"mask-image-linear-to-color":[{"mask-linear-to":N()}],"mask-image-t-from-pos":[{"mask-t-from":z()}],"mask-image-t-to-pos":[{"mask-t-to":z()}],"mask-image-t-from-color":[{"mask-t-from":N()}],"mask-image-t-to-color":[{"mask-t-to":N()}],"mask-image-r-from-pos":[{"mask-r-from":z()}],"mask-image-r-to-pos":[{"mask-r-to":z()}],"mask-image-r-from-color":[{"mask-r-from":N()}],"mask-image-r-to-color":[{"mask-r-to":N()}],"mask-image-b-from-pos":[{"mask-b-from":z()}],"mask-image-b-to-pos":[{"mask-b-to":z()}],"mask-image-b-from-color":[{"mask-b-from":N()}],"mask-image-b-to-color":[{"mask-b-to":N()}],"mask-image-l-from-pos":[{"mask-l-from":z()}],"mask-image-l-to-pos":[{"mask-l-to":z()}],"mask-image-l-from-color":[{"mask-l-from":N()}],"mask-image-l-to-color":[{"mask-l-to":N()}],"mask-image-x-from-pos":[{"mask-x-from":z()}],"mask-image-x-to-pos":[{"mask-x-to":z()}],"mask-image-x-from-color":[{"mask-x-from":N()}],"mask-image-x-to-color":[{"mask-x-to":N()}],"mask-image-y-from-pos":[{"mask-y-from":z()}],"mask-image-y-to-pos":[{"mask-y-to":z()}],"mask-image-y-from-color":[{"mask-y-from":N()}],"mask-image-y-to-color":[{"mask-y-to":N()}],"mask-image-radial":[{"mask-radial":[X,J]}],"mask-image-radial-from-pos":[{"mask-radial-from":z()}],"mask-image-radial-to-pos":[{"mask-radial-to":z()}],"mask-image-radial-from-color":[{"mask-radial-from":N()}],"mask-image-radial-to-color":[{"mask-radial-to":N()}],"mask-image-radial-shape":[{"mask-radial":[`circle`,`ellipse`]}],"mask-image-radial-size":[{"mask-radial":[{closest:[`side`,`corner`],farthest:[`side`,`corner`]}]}],"mask-image-radial-pos":[{"mask-radial-at":b()}],"mask-image-conic-pos":[{"mask-conic":[G]}],"mask-image-conic-from-pos":[{"mask-conic-from":z()}],"mask-image-conic-to-pos":[{"mask-conic-to":z()}],"mask-image-conic-from-color":[{"mask-conic-from":N()}],"mask-image-conic-to-color":[{"mask-conic-to":N()}],"mask-mode":[{mask:[`alpha`,`luminance`,`match`]}],"mask-origin":[{"mask-origin":[`border`,`padding`,`content`,`fill`,`stroke`,`view`]}],"mask-position":[{mask:te()}],"mask-repeat":[{mask:P()}],"mask-size":[{mask:ne()}],"mask-type":[{"mask-type":[`alpha`,`luminance`]}],"mask-image":[{mask:[`none`,X,J]}],filter:[{filter:[``,`none`,X,J]}],blur:[{blur:ie()}],brightness:[{brightness:[G,X,J]}],contrast:[{contrast:[G,X,J]}],"drop-shadow":[{"drop-shadow":[``,`none`,p,Fe,Ae]}],"drop-shadow-color":[{"drop-shadow":N()}],grayscale:[{grayscale:[``,G,X,J]}],"hue-rotate":[{"hue-rotate":[G,X,J]}],invert:[{invert:[``,G,X,J]}],saturate:[{saturate:[G,X,J]}],sepia:[{sepia:[``,G,X,J]}],"backdrop-filter":[{"backdrop-filter":[``,`none`,X,J]}],"backdrop-blur":[{"backdrop-blur":ie()}],"backdrop-brightness":[{"backdrop-brightness":[G,X,J]}],"backdrop-contrast":[{"backdrop-contrast":[G,X,J]}],"backdrop-grayscale":[{"backdrop-grayscale":[``,G,X,J]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[G,X,J]}],"backdrop-invert":[{"backdrop-invert":[``,G,X,J]}],"backdrop-opacity":[{"backdrop-opacity":[G,X,J]}],"backdrop-saturate":[{"backdrop-saturate":[G,X,J]}],"backdrop-sepia":[{"backdrop-sepia":[``,G,X,J]}],"border-collapse":[{border:[`collapse`,`separate`]}],"border-spacing":[{"border-spacing":w()}],"border-spacing-x":[{"border-spacing-x":w()}],"border-spacing-y":[{"border-spacing-y":w()}],"table-layout":[{table:[`auto`,`fixed`]}],caption:[{caption:[`top`,`bottom`]}],transition:[{transition:[``,`all`,`colors`,`opacity`,`shadow`,`transform`,`none`,X,J]}],"transition-behavior":[{transition:[`normal`,`discrete`]}],duration:[{duration:[G,`initial`,X,J]}],ease:[{ease:[`linear`,`initial`,_,X,J]}],delay:[{delay:[G,X,J]}],animate:[{animate:[`none`,v,X,J]}],backface:[{backface:[`hidden`,`visible`]}],perspective:[{perspective:[h,X,J]}],"perspective-origin":[{"perspective-origin":x()}],rotate:[{rotate:B()}],"rotate-x":[{"rotate-x":B()}],"rotate-y":[{"rotate-y":B()}],"rotate-z":[{"rotate-z":B()}],scale:[{scale:V()}],"scale-x":[{"scale-x":V()}],"scale-y":[{"scale-y":V()}],"scale-z":[{"scale-z":V()}],"scale-3d":[`scale-3d`],skew:[{skew:ae()}],"skew-x":[{"skew-x":ae()}],"skew-y":[{"skew-y":ae()}],transform:[{transform:[X,J,``,`none`,`gpu`,`cpu`]}],"transform-origin":[{origin:x()}],"transform-style":[{transform:[`3d`,`flat`]}],translate:[{translate:H()}],"translate-x":[{"translate-x":H()}],"translate-y":[{"translate-y":H()}],"translate-z":[{"translate-z":H()}],"translate-none":[`translate-none`],accent:[{accent:N()}],appearance:[{appearance:[`none`,`auto`]}],"caret-color":[{caret:N()}],"color-scheme":[{scheme:[`normal`,`dark`,`light`,`light-dark`,`only-dark`,`only-light`]}],cursor:[{cursor:[`auto`,`default`,`pointer`,`wait`,`text`,`move`,`help`,`not-allowed`,`none`,`context-menu`,`progress`,`cell`,`crosshair`,`vertical-text`,`alias`,`copy`,`no-drop`,`grab`,`grabbing`,`all-scroll`,`col-resize`,`row-resize`,`n-resize`,`e-resize`,`s-resize`,`w-resize`,`ne-resize`,`nw-resize`,`se-resize`,`sw-resize`,`ew-resize`,`ns-resize`,`nesw-resize`,`nwse-resize`,`zoom-in`,`zoom-out`,X,J]}],"field-sizing":[{"field-sizing":[`fixed`,`content`]}],"pointer-events":[{"pointer-events":[`auto`,`none`]}],resize:[{resize:[`none`,``,`y`,`x`]}],"scroll-behavior":[{scroll:[`auto`,`smooth`]}],"scroll-m":[{"scroll-m":w()}],"scroll-mx":[{"scroll-mx":w()}],"scroll-my":[{"scroll-my":w()}],"scroll-ms":[{"scroll-ms":w()}],"scroll-me":[{"scroll-me":w()}],"scroll-mt":[{"scroll-mt":w()}],"scroll-mr":[{"scroll-mr":w()}],"scroll-mb":[{"scroll-mb":w()}],"scroll-ml":[{"scroll-ml":w()}],"scroll-p":[{"scroll-p":w()}],"scroll-px":[{"scroll-px":w()}],"scroll-py":[{"scroll-py":w()}],"scroll-ps":[{"scroll-ps":w()}],"scroll-pe":[{"scroll-pe":w()}],"scroll-pt":[{"scroll-pt":w()}],"scroll-pr":[{"scroll-pr":w()}],"scroll-pb":[{"scroll-pb":w()}],"scroll-pl":[{"scroll-pl":w()}],"snap-align":[{snap:[`start`,`end`,`center`,`align-none`]}],"snap-stop":[{snap:[`normal`,`always`]}],"snap-type":[{snap:[`none`,`x`,`y`,`both`]}],"snap-strictness":[{snap:[`mandatory`,`proximity`]}],touch:[{touch:[`auto`,`none`,`manipulation`]}],"touch-x":[{"touch-pan":[`x`,`left`,`right`]}],"touch-y":[{"touch-pan":[`y`,`up`,`down`]}],"touch-pz":[`touch-pinch-zoom`],select:[{select:[`none`,`text`,`all`,`auto`]}],"will-change":[{"will-change":[`auto`,`scroll`,`contents`,`transform`,X,J]}],fill:[{fill:[`none`,...N()]}],"stroke-w":[{stroke:[G,Z,Y,De]}],stroke:[{stroke:[`none`,...N()]}],"forced-color-adjust":[{"forced-color-adjust":[`auto`,`none`]}]},conflictingClassGroups:{overflow:[`overflow-x`,`overflow-y`],overscroll:[`overscroll-x`,`overscroll-y`],inset:[`inset-x`,`inset-y`,`start`,`end`,`top`,`right`,`bottom`,`left`],"inset-x":[`right`,`left`],"inset-y":[`top`,`bottom`],flex:[`basis`,`grow`,`shrink`],gap:[`gap-x`,`gap-y`],p:[`px`,`py`,`ps`,`pe`,`pt`,`pr`,`pb`,`pl`],px:[`pr`,`pl`],py:[`pt`,`pb`],m:[`mx`,`my`,`ms`,`me`,`mt`,`mr`,`mb`,`ml`],mx:[`mr`,`ml`],my:[`mt`,`mb`],size:[`w`,`h`],"font-size":[`leading`],"fvn-normal":[`fvn-ordinal`,`fvn-slashed-zero`,`fvn-figure`,`fvn-spacing`,`fvn-fraction`],"fvn-ordinal":[`fvn-normal`],"fvn-slashed-zero":[`fvn-normal`],"fvn-figure":[`fvn-normal`],"fvn-spacing":[`fvn-normal`],"fvn-fraction":[`fvn-normal`],"line-clamp":[`display`,`overflow`],rounded:[`rounded-s`,`rounded-e`,`rounded-t`,`rounded-r`,`rounded-b`,`rounded-l`,`rounded-ss`,`rounded-se`,`rounded-ee`,`rounded-es`,`rounded-tl`,`rounded-tr`,`rounded-br`,`rounded-bl`],"rounded-s":[`rounded-ss`,`rounded-es`],"rounded-e":[`rounded-se`,`rounded-ee`],"rounded-t":[`rounded-tl`,`rounded-tr`],"rounded-r":[`rounded-tr`,`rounded-br`],"rounded-b":[`rounded-br`,`rounded-bl`],"rounded-l":[`rounded-tl`,`rounded-bl`],"border-spacing":[`border-spacing-x`,`border-spacing-y`],"border-w":[`border-w-x`,`border-w-y`,`border-w-s`,`border-w-e`,`border-w-t`,`border-w-r`,`border-w-b`,`border-w-l`],"border-w-x":[`border-w-r`,`border-w-l`],"border-w-y":[`border-w-t`,`border-w-b`],"border-color":[`border-color-x`,`border-color-y`,`border-color-s`,`border-color-e`,`border-color-t`,`border-color-r`,`border-color-b`,`border-color-l`],"border-color-x":[`border-color-r`,`border-color-l`],"border-color-y":[`border-color-t`,`border-color-b`],translate:[`translate-x`,`translate-y`,`translate-none`],"translate-none":[`translate`,`translate-x`,`translate-y`,`translate-z`],"scroll-m":[`scroll-mx`,`scroll-my`,`scroll-ms`,`scroll-me`,`scroll-mt`,`scroll-mr`,`scroll-mb`,`scroll-ml`],"scroll-mx":[`scroll-mr`,`scroll-ml`],"scroll-my":[`scroll-mt`,`scroll-mb`],"scroll-p":[`scroll-px`,`scroll-py`,`scroll-ps`,`scroll-pe`,`scroll-pt`,`scroll-pr`,`scroll-pb`,`scroll-pl`],"scroll-px":[`scroll-pr`,`scroll-pl`],"scroll-py":[`scroll-pt`,`scroll-pb`],touch:[`touch-x`,`touch-y`,`touch-pz`],"touch-x":[`touch`],"touch-y":[`touch`],"touch-pz":[`touch`]},conflictingClassGroupModifiers:{"font-size":[`leading`]},orderSensitiveModifiers:[`*`,`**`,`after`,`backdrop`,`before`,`details-content`,`file`,`first-letter`,`first-line`,`marker`,`placeholder`,`selection`]}});function We(...e){return Ue(x(e))}var Ge=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),Ke=o(((e,t)=>{t.exports=Ge()})),qe=e=>typeof e==`boolean`?`${e}`:e===0?`0`:e,Je=x,Ye=(e,t)=>n=>{if(t?.variants==null)return Je(e,n?.class,n?.className);let{variants:r,defaultVariants:i}=t,a=Object.keys(r).map(e=>{let t=n?.[e],a=i?.[e];if(t===null)return null;let o=qe(t)||qe(a);return r[e][o]}),o=n&&Object.entries(n).reduce((e,t)=>{let[n,r]=t;return r===void 0||(e[n]=r),e},{});return Je(e,a,t?.compoundVariants?.reduce((e,t)=>{let{class:n,className:r,...a}=t;return Object.entries(a).every(e=>{let[t,n]=e;return Array.isArray(n)?n.includes({...i,...o}[t]):{...i,...o}[t]===n})?[...e,n,r]:e},[]),n?.class,n?.className)};function Xe(e,t){if(typeof e==`function`)return e(t);e!=null&&(e.current=t)}function Ze(...e){return t=>{let n=!1,r=e.map(e=>{let r=Xe(e,t);return!n&&typeof r==`function`&&(n=!0),r});if(n)return()=>{for(let t=0;t<r.length;t++){let n=r[t];typeof n==`function`?n():Xe(e[t],null)}}}}function Qe(...e){return _.useCallback(Ze(...e),e)}var $e=Ke();function et(e){let t=nt(e),n=_.forwardRef((e,n)=>{let{children:r,...i}=e,a=_.Children.toArray(r),o=a.find(at);if(o){let e=o.props.children,r=a.map(t=>t===o?_.Children.count(e)>1?_.Children.only(null):_.isValidElement(e)?e.props.children:null:t);return(0,$e.jsx)(t,{...i,ref:n,children:_.isValidElement(e)?_.cloneElement(e,void 0,r):null})}return(0,$e.jsx)(t,{...i,ref:n,children:r})});return n.displayName=`${e}.Slot`,n}var tt=et(`Slot`);function nt(e){let t=_.forwardRef((e,t)=>{let{children:n,...r}=e;if(_.isValidElement(n)){let e=st(n),i=ot(r,n.props);return n.type!==_.Fragment&&(i.ref=t?Ze(t,e):e),_.cloneElement(n,i)}return _.Children.count(n)>1?_.Children.only(null):null});return t.displayName=`${e}.SlotClone`,t}var rt=Symbol(`radix.slottable`);function it(e){let t=({children:e})=>(0,$e.jsx)($e.Fragment,{children:e});return t.displayName=`${e}.Slottable`,t.__radixId=rt,t}function at(e){return _.isValidElement(e)&&typeof e.type==`function`&&`__radixId`in e.type&&e.type.__radixId===rt}function ot(e,t){let n={...t};for(let r in t){let i=e[r],a=t[r];/^on[A-Z]/.test(r)?i&&a?n[r]=(...e)=>{let t=a(...e);return i(...e),t}:i&&(n[r]=i):r===`style`?n[r]={...i,...a}:r===`className`&&(n[r]=[i,a].filter(Boolean).join(` `))}return{...e,...n}}function st(e){let t=Object.getOwnPropertyDescriptor(e.props,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}var ct=Ye(`inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive`,{variants:{variant:{default:`bg-foreground text-background hover:bg-primary hover:text-primary-foreground`,selected:`bg-primary text-primary-foreground hover:bg-primary/90`,destructive:`bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60`,outline:`border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input`,secondary:`bg-secondary text-secondary-foreground hover:bg-accent hover:text-accent-foreground`,ghost:`hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50`,link:`text-foreground underline-offset-4 hover:text-primary hover:underline`},size:{default:`h-9 px-4 py-2 has-[>svg]:px-3`,xs:`h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3`,sm:`h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5`,lg:`h-10 rounded-md px-6 has-[>svg]:px-4`,icon:`size-9`,"icon-xs":`size-6 rounded-md [&_svg:not([class*='size-'])]:size-3`,"icon-sm":`size-8`,"icon-lg":`size-10`}},defaultVariants:{variant:`default`,size:`default`}});function lt({className:e,variant:t=`default`,size:n=`default`,asChild:r=!1,...i}){return(0,$e.jsx)(r?tt:`button`,{"data-slot":`button`,"data-variant":t,"data-size":n,className:We(ct({variant:t,size:n,className:e})),...i})}export{Ze as a,Ke as c,u as d,o as f,it as i,We as l,tt as n,Qe as o,c as p,et as r,Ye as s,lt as t,y as u};
@@ -0,0 +1 @@
1
+ import{u as e}from"./button-BFNlGZ5p.js";var t=e(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]);export{t};
@@ -0,0 +1 @@
1
+ import{c as e,d as t,l as n,o as r,p as i,u as a}from"./button-BFNlGZ5p.js";import{a as o,o as s,r as c,t as l}from"./dist-CFZ4xMSF.js";import{t as u}from"./check-BkfHQ6re.js";import{t as d}from"./dist-CRmX_NvH.js";import{n as f,t as p}from"./dist-fzPL-8F9.js";var m=a(`grip-vertical`,[[`circle`,{cx:`9`,cy:`12`,r:`1`,key:`1vctgf`}],[`circle`,{cx:`9`,cy:`5`,r:`1`,key:`hp0tcf`}],[`circle`,{cx:`9`,cy:`19`,r:`1`,key:`fkjjf6`}],[`circle`,{cx:`15`,cy:`12`,r:`1`,key:`1tmaij`}],[`circle`,{cx:`15`,cy:`5`,r:`1`,key:`19l28e`}],[`circle`,{cx:`15`,cy:`19`,r:`1`,key:`f4zoj3`}]]),h=i(t(),1),g=e(),_=`Checkbox`,[v,y]=o(_),[b,x]=v(_);function S(e){let{__scopeCheckbox:t,checked:n,children:r,defaultChecked:i,disabled:a,form:o,name:s,onCheckedChange:c,required:u,value:d=`on`,internal_do_not_use_render:f}=e,[p,m]=l({prop:n,defaultProp:i??!1,onChange:c,caller:_}),[v,y]=h.useState(null),[x,S]=h.useState(null),C=h.useRef(!1),w=v?!!o||!!v.closest(`form`):!0,T={checked:p,disabled:a,setChecked:m,control:v,setControl:y,name:s,form:o,value:d,hasConsumerStoppedPropagationRef:C,required:u,defaultChecked:j(i)?!1:i,isFormControl:w,bubbleInput:x,setBubbleInput:S};return(0,g.jsx)(b,{scope:t,...T,children:A(f)?f(T):r})}var C=`CheckboxTrigger`,w=h.forwardRef(({__scopeCheckbox:e,onKeyDown:t,onClick:n,...i},a)=>{let{control:o,value:l,disabled:u,checked:d,required:f,setControl:p,setChecked:m,hasConsumerStoppedPropagationRef:_,isFormControl:v,bubbleInput:y}=x(C,e),b=r(a,p),S=h.useRef(d);return h.useEffect(()=>{let e=o?.form;if(e){let t=()=>m(S.current);return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)}},[o,m]),(0,g.jsx)(s.button,{type:`button`,role:`checkbox`,"aria-checked":j(d)?`mixed`:d,"aria-required":f,"data-state":M(d),"data-disabled":u?``:void 0,disabled:u,value:l,...i,ref:b,onKeyDown:c(t,e=>{e.key===`Enter`&&e.preventDefault()}),onClick:c(n,e=>{m(e=>j(e)?!0:!e),y&&v&&(_.current=e.isPropagationStopped(),_.current||e.stopPropagation())})})});w.displayName=C;var T=h.forwardRef((e,t)=>{let{__scopeCheckbox:n,name:r,checked:i,defaultChecked:a,required:o,disabled:s,value:c,onCheckedChange:l,form:u,...d}=e;return(0,g.jsx)(S,{__scopeCheckbox:n,checked:i,defaultChecked:a,disabled:s,required:o,onCheckedChange:l,name:r,form:u,value:c,internal_do_not_use_render:({isFormControl:e})=>(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(w,{...d,ref:t,__scopeCheckbox:n}),e&&(0,g.jsx)(k,{__scopeCheckbox:n})]})})});T.displayName=_;var E=`CheckboxIndicator`,D=h.forwardRef((e,t)=>{let{__scopeCheckbox:n,forceMount:r,...i}=e,a=x(E,n);return(0,g.jsx)(d,{present:r||j(a.checked)||a.checked===!0,children:(0,g.jsx)(s.span,{"data-state":M(a.checked),"data-disabled":a.disabled?``:void 0,...i,ref:t,style:{pointerEvents:`none`,...e.style}})})});D.displayName=E;var O=`CheckboxBubbleInput`,k=h.forwardRef(({__scopeCheckbox:e,...t},n)=>{let{control:i,hasConsumerStoppedPropagationRef:a,checked:o,defaultChecked:c,required:l,disabled:u,name:d,value:m,form:_,bubbleInput:v,setBubbleInput:y}=x(O,e),b=r(n,y),S=f(o),C=p(i);h.useEffect(()=>{let e=v;if(!e)return;let t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,`checked`).set,r=!a.current;if(S!==o&&n){let t=new Event(`click`,{bubbles:r});e.indeterminate=j(o),n.call(e,j(o)?!1:o),e.dispatchEvent(t)}},[v,S,o,a]);let w=h.useRef(j(o)?!1:o);return(0,g.jsx)(s.input,{type:`checkbox`,"aria-hidden":!0,defaultChecked:c??w.current,required:l,disabled:u,name:d,value:m,form:_,...t,tabIndex:-1,ref:b,style:{...t.style,...C,position:`absolute`,pointerEvents:`none`,opacity:0,margin:0,transform:`translateX(-100%)`}})});k.displayName=O;function A(e){return typeof e==`function`}function j(e){return e===`indeterminate`}function M(e){return j(e)?`indeterminate`:e?`checked`:`unchecked`}function N({className:e,...t}){return(0,g.jsx)(T,{"data-slot":`checkbox`,className:n(`peer border-input dark:bg-input/30 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground dark:data-[state=checked]:bg-primary data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50`,e),...t,children:(0,g.jsx)(D,{"data-slot":`checkbox-indicator`,className:`grid place-content-center text-current transition-none`,children:(0,g.jsx)(u,{className:`size-3.5`})})})}export{m as n,N as t};
@@ -0,0 +1 @@
1
+ import{u as e}from"./button-BFNlGZ5p.js";var t=e(`chevron-down`,[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]);export{t};
@@ -1 +1 @@
1
- import{l as e}from"./button-BTToMaBW.js";var t=e(`circle-alert`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`12`,x2:`12`,y1:`8`,y2:`12`,key:`1pkeuh`}],[`line`,{x1:`12`,x2:`12.01`,y1:`16`,y2:`16`,key:`4dfq90`}]]);export{t};
1
+ import{u as e}from"./button-BFNlGZ5p.js";var t=e(`circle-alert`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`12`,x2:`12`,y1:`8`,y2:`12`,key:`1pkeuh`}],[`line`,{x1:`12`,x2:`12.01`,y1:`16`,y2:`16`,key:`4dfq90`}]]);export{t};
@@ -1 +1 @@
1
- import{l as e}from"./button-BTToMaBW.js";var t=e(`circle-x`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]]);export{t};
1
+ import{u as e}from"./button-BFNlGZ5p.js";var t=e(`circle-x`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]]);export{t};