mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-08-28 14:07:13 +00:00
Compare commits
4 Commits
1f846c3cb2
...
e2f75acad2
| Author | SHA1 | Date | |
|---|---|---|---|
| e2f75acad2 | |||
| 69a8237581 | |||
| f3f57e66f5 | |||
| 8a8da88548 |
@@ -36,11 +36,17 @@ const sampleLink = 'vless://11112222-3333-4444-5555-666677778888@panel.example.c
|
||||
|
||||
export const Collapsed: Story = {
|
||||
args: { label: 'vless', text: sampleLink, fileName: 'client-config.txt' },
|
||||
play: async ({ canvas, userEvent }) => {
|
||||
play: async ({ canvas, canvasElement, userEvent }) => {
|
||||
await expect(canvas.queryByText(/vless:\/\/11112222/)).not.toBeInTheDocument();
|
||||
await userEvent.click(canvas.getByText('vless'));
|
||||
const configText = await canvas.findByText(/vless:\/\/11112222/);
|
||||
await waitFor(() => expect(configText).toBeVisible());
|
||||
// Collapse fades content in over motionDurationMid; wait it out so the a11y
|
||||
// scan doesn't sample a mid-transition, lower-contrast opacity.
|
||||
await waitFor(() => {
|
||||
const panel = canvasElement.querySelector('.ant-collapse-panel');
|
||||
expect(panel && getComputedStyle(panel).opacity).toBe('1');
|
||||
});
|
||||
await expect(canvas.getByRole('button', { name: 'Copy' })).toBeVisible();
|
||||
await expect(canvas.getByRole('button', { name: 'Download' })).toBeVisible();
|
||||
await expect(canvas.getByRole('button', { name: 'QR Code' })).toBeVisible();
|
||||
|
||||
@@ -151,6 +151,57 @@ function makeBackendProxy(target) {
|
||||
};
|
||||
}
|
||||
|
||||
// Deps only reachable through swagger-ui-react (verified via `npm ls`). The
|
||||
// catch-all `vendor` chunk would otherwise eager-load them on first paint,
|
||||
// although the api-docs page is the only lazy route importing them.
|
||||
const SWAGGER_ONLY_DEPS = [
|
||||
'@babel/runtime-corejs3',
|
||||
'@scarf/scarf',
|
||||
'@swagger-api/apidom-',
|
||||
'@swaggerexpert/',
|
||||
'base64-js',
|
||||
'buffer',
|
||||
'classnames',
|
||||
'css.escape',
|
||||
'deep-extend',
|
||||
'dompurify',
|
||||
'fast-json-patch',
|
||||
'highlight.js',
|
||||
'highlightjs-vue',
|
||||
'ieee754',
|
||||
'immutable',
|
||||
'js-file-download',
|
||||
'js-yaml',
|
||||
'lodash',
|
||||
'lowlight',
|
||||
'neotraverse',
|
||||
'node-abort-controller',
|
||||
'openapi-path-templating',
|
||||
'openapi-server-url-templating',
|
||||
'prismjs',
|
||||
'prop-types',
|
||||
'ramda',
|
||||
'ramda-adjunct',
|
||||
'randexp',
|
||||
'react-copy-to-clipboard',
|
||||
'react-debounce-input',
|
||||
'react-immutable-proptypes',
|
||||
'react-immutable-pure-component',
|
||||
'react-inspector',
|
||||
'react-redux',
|
||||
'react-syntax-highlighter',
|
||||
'redux',
|
||||
'redux-immutable',
|
||||
'remarkable',
|
||||
'reselect',
|
||||
'serialize-error',
|
||||
'sha.js',
|
||||
'url-parse',
|
||||
'xml',
|
||||
'xml-but-prettier',
|
||||
'zenscroll',
|
||||
];
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [react(), injectBasePathPlugin(), rocketLoaderOptOutPlugin()],
|
||||
resolve: {
|
||||
@@ -222,6 +273,7 @@ export default defineConfig({
|
||||
id.includes('/node_modules/swagger-ui-react/')
|
||||
|| id.includes('/node_modules/swagger-ui/')
|
||||
|| id.includes('/node_modules/swagger-client/')
|
||||
|| SWAGGER_ONLY_DEPS.some((dep) => id.includes(`/node_modules/${dep}/`))
|
||||
) return 'vendor-swagger';
|
||||
if (id.includes('/node_modules/uplot/')) return 'vendor-uplot';
|
||||
if (id.includes('dayjs')) return 'vendor-dayjs';
|
||||
|
||||
@@ -64,7 +64,7 @@ require (
|
||||
github.com/jinzhu/now v1.1.5 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/juju/ratelimit v1.0.2 // indirect
|
||||
github.com/klauspost/compress v1.19.1
|
||||
github.com/klauspost/compress v1.19.2
|
||||
github.com/klauspost/cpuid/v2 v2.4.0 // indirect
|
||||
github.com/leodido/go-urn v1.5.0 // indirect
|
||||
github.com/lufia/plan9stats v0.0.0-20260802145828-341c2f0c90b5 // indirect
|
||||
|
||||
@@ -115,8 +115,8 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/juju/ratelimit v1.0.2 h1:sRxmtRiajbvrcLQT7S+JbqU0ntsb9W2yhSdNN8tWfaI=
|
||||
github.com/juju/ratelimit v1.0.2/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk=
|
||||
github.com/klauspost/compress v1.19.1 h1:VsB4HPswih7mmZ8WleSFQ75c/Ui1M4trX5oAsJnhSlk=
|
||||
github.com/klauspost/compress v1.19.1/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
|
||||
github.com/klauspost/compress v1.19.2 h1:hMRETovs/pu/dVWN7zIT1PGG8t509MwT6bO7XSi26R8=
|
||||
github.com/klauspost/compress v1.19.2/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ=
|
||||
github.com/klauspost/cpuid/v2 v2.4.0 h1:S6Hrbc7+ywsr0r+RLapfGBHfyefhCTwEh3A0tV913Dw=
|
||||
github.com/klauspost/cpuid/v2 v2.4.0/go.mod h1:19jmZ9mjzoF//ddRSUsv0zfBTJWh3QJh9FNxZTMrGxU=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
|
||||
@@ -1503,8 +1503,8 @@
|
||||
},
|
||||
"outbound": {
|
||||
"tag": "标签",
|
||||
"egress": "Egress",
|
||||
"egressHint": "Run an HTTP test to show egress IP and country.",
|
||||
"egress": "出口",
|
||||
"egressHint": "执行 HTTP 测试以显示出口 IP 和所在国家/地区。",
|
||||
"outboundStatus": "出站状态",
|
||||
"sendThrough": "发送通过",
|
||||
"targetStrategy": "目标解析策略",
|
||||
@@ -1607,14 +1607,14 @@
|
||||
"tagDuplicate": "该标签已被其他均衡器使用",
|
||||
"tagPlaceholder": "唯一均衡器标签",
|
||||
"selector": "选择器",
|
||||
"fallback": "Fallback",
|
||||
"fallback": "备用负载均衡器",
|
||||
"cycleTooltip": "循环: {path} → (回到 {start})",
|
||||
"expected": "期望",
|
||||
"expectedPlaceholder": "最佳节点数",
|
||||
"maxRtt": "最大 RTT",
|
||||
"tolerance": "容差",
|
||||
"baselines": "Baselines",
|
||||
"costs": "Costs",
|
||||
"baselines": "基准值",
|
||||
"costs": "成本设置",
|
||||
"costMatch": "标签匹配模式",
|
||||
"costValue": "权重",
|
||||
"costRegexp": "正则表达式匹配",
|
||||
@@ -1635,7 +1635,7 @@
|
||||
"userLevel": "用户级别"
|
||||
},
|
||||
"nord": {
|
||||
"accessToken": "Access token",
|
||||
"accessToken": "访问令牌",
|
||||
"privateKey": "私钥",
|
||||
"noServers": "未找到选定国家/地区的服务器",
|
||||
"noPublicKey": "选定的服务器未公布 NordLynx 公钥。",
|
||||
@@ -1651,7 +1651,7 @@
|
||||
"licenseError": "设置 WARP 许可证失败。",
|
||||
"fetchFirst": "请先获取 WARP 配置。",
|
||||
"createAccount": "创建 WARP 账户",
|
||||
"accessToken": "Access token",
|
||||
"accessToken": "访问令牌",
|
||||
"deviceId": "设备 ID",
|
||||
"licenseKey": "许可证密钥",
|
||||
"privateKey": "私钥",
|
||||
@@ -1702,7 +1702,7 @@
|
||||
"timeoutMs": "超时 (毫秒)",
|
||||
"skipFallback": "跳过回退",
|
||||
"finalQuery": "最终查询",
|
||||
"hosts": "Hosts",
|
||||
"hosts": "主机映射",
|
||||
"hostsAdd": "添加 Host",
|
||||
"hostsEmpty": "未定义任何 Host",
|
||||
"hostsDomain": "域名 (例如 domain:example.com)",
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
"outbounds": "出站",
|
||||
"apiDocs": "API 文件",
|
||||
"donate": "捐贈",
|
||||
"hosts": "Hosts",
|
||||
"hosts": "主機",
|
||||
"docs": "文件",
|
||||
"openMenu": "開啟選單",
|
||||
"pinSidebar": "固定側邊欄",
|
||||
@@ -1503,8 +1503,8 @@
|
||||
},
|
||||
"outbound": {
|
||||
"tag": "標籤",
|
||||
"egress": "Egress",
|
||||
"egressHint": "Run an HTTP test to show egress IP and country.",
|
||||
"egress": "出口",
|
||||
"egressHint": "執行 HTTP 測試以顯示出口 IP 與所在國家/地區。",
|
||||
"outboundStatus": "出站狀態",
|
||||
"sendThrough": "傳送通過",
|
||||
"targetStrategy": "目標解析策略",
|
||||
@@ -1607,14 +1607,14 @@
|
||||
"tagDuplicate": "該標籤已被其他均衡器使用",
|
||||
"tagPlaceholder": "唯一均衡器標籤",
|
||||
"selector": "選擇器",
|
||||
"fallback": "Fallback",
|
||||
"fallback": "備用負載平衡器",
|
||||
"cycleTooltip": "循環: {path} → (回到 {start})",
|
||||
"expected": "期望",
|
||||
"expectedPlaceholder": "最佳節點數",
|
||||
"maxRtt": "最大 RTT",
|
||||
"tolerance": "容差",
|
||||
"baselines": "Baselines",
|
||||
"costs": "Costs",
|
||||
"baselines": "基準值",
|
||||
"costs": "成本設定",
|
||||
"costMatch": "標籤比對模式",
|
||||
"costValue": "權重",
|
||||
"costRegexp": "正規表示式比對",
|
||||
@@ -1635,7 +1635,7 @@
|
||||
"userLevel": "用戶級別"
|
||||
},
|
||||
"nord": {
|
||||
"accessToken": "Access token",
|
||||
"accessToken": "存取權杖",
|
||||
"privateKey": "私鑰",
|
||||
"noServers": "未找到選定國家/地區的伺服器",
|
||||
"noPublicKey": "選定的伺服器未公布 NordLynx 公鑰。",
|
||||
@@ -1651,7 +1651,7 @@
|
||||
"licenseError": "設定 WARP 授權失敗。",
|
||||
"fetchFirst": "請先取得 WARP 設定。",
|
||||
"createAccount": "建立 WARP 帳號",
|
||||
"accessToken": "Access token",
|
||||
"accessToken": "存取權杖",
|
||||
"deviceId": "裝置 ID",
|
||||
"licenseKey": "授權金鑰",
|
||||
"privateKey": "私鑰",
|
||||
@@ -1702,7 +1702,7 @@
|
||||
"timeoutMs": "逾時 (毫秒)",
|
||||
"skipFallback": "跳過回退",
|
||||
"finalQuery": "最終查詢",
|
||||
"hosts": "Hosts",
|
||||
"hosts": "主機對應",
|
||||
"hostsAdd": "新增 Host",
|
||||
"hostsEmpty": "未定義任何 Host",
|
||||
"hostsDomain": "網域 (例如 domain:example.com)",
|
||||
|
||||
Reference in New Issue
Block a user