@easy-editor/materials-dashboard-scroll-list 0.0.2

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 (44) hide show
  1. package/.vite/plugins/vite-plugin-external-deps.ts +224 -0
  2. package/.vite/plugins/vite-plugin-material-dev.ts +218 -0
  3. package/CHANGELOG.md +7 -0
  4. package/LICENSE +9 -0
  5. package/dist/component.esm.js +176 -0
  6. package/dist/component.esm.js.map +1 -0
  7. package/dist/component.js +185 -0
  8. package/dist/component.js.map +1 -0
  9. package/dist/component.min.js +2 -0
  10. package/dist/component.min.js.map +1 -0
  11. package/dist/index.cjs +669 -0
  12. package/dist/index.cjs.map +1 -0
  13. package/dist/index.esm.js +666 -0
  14. package/dist/index.esm.js.map +1 -0
  15. package/dist/index.js +674 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/index.min.js +2 -0
  18. package/dist/index.min.js.map +1 -0
  19. package/dist/meta.esm.js +494 -0
  20. package/dist/meta.esm.js.map +1 -0
  21. package/dist/meta.js +505 -0
  22. package/dist/meta.js.map +1 -0
  23. package/dist/meta.min.js +2 -0
  24. package/dist/meta.min.js.map +1 -0
  25. package/dist/src/component.d.ts +51 -0
  26. package/dist/src/configure.d.ts +7 -0
  27. package/dist/src/constants.d.ts +16 -0
  28. package/dist/src/index.d.ts +6 -0
  29. package/dist/src/meta.d.ts +7 -0
  30. package/dist/src/snippets.d.ts +7 -0
  31. package/package.json +65 -0
  32. package/rollup.config.js +222 -0
  33. package/src/component.module.css +184 -0
  34. package/src/component.tsx +189 -0
  35. package/src/configure.ts +439 -0
  36. package/src/constants.ts +18 -0
  37. package/src/index.tsx +7 -0
  38. package/src/meta.ts +28 -0
  39. package/src/snippets.ts +64 -0
  40. package/src/type.d.ts +8 -0
  41. package/tsconfig.build.json +12 -0
  42. package/tsconfig.json +9 -0
  43. package/tsconfig.test.json +7 -0
  44. package/vite.config.ts +54 -0
@@ -0,0 +1,224 @@
1
+ /**
2
+ * Vite Plugin: External Dependencies
3
+ * 外部依赖插件 - 在开发模式下将 React/ReactDOM 外部化
4
+ *
5
+ * 用途:
6
+ * - 防止 Vite 将 React/ReactDOM 打包进开发服务器的模块
7
+ * - 强制使用父应用(dashboard)提供的 React 实例
8
+ * - 解决双 React 实例导致的 "Invalid hook call" 错误
9
+ */
10
+
11
+ import type { Plugin } from 'vite'
12
+
13
+ interface ExternalDepsOptions {
14
+ /** 需要外部化的依赖列表 */
15
+ externals?: string[]
16
+ /** 全局变量映射 */
17
+ globals?: Record<string, string>
18
+ }
19
+
20
+ const DEFAULT_EXTERNALS = ['react', 'react-dom', 'react/jsx-runtime']
21
+
22
+ const DEFAULT_GLOBALS: Record<string, string> = {
23
+ react: 'React',
24
+ 'react-dom': 'ReactDOM',
25
+ 'react/jsx-runtime': 'jsxRuntime',
26
+ }
27
+
28
+ /**
29
+ * 创建外部依赖插件
30
+ */
31
+ export function externalDeps(options: ExternalDepsOptions = {}): Plugin {
32
+ const externals = options.externals || DEFAULT_EXTERNALS
33
+ const globals = { ...DEFAULT_GLOBALS, ...options.globals }
34
+
35
+ // 虚拟模块前缀
36
+ const VIRTUAL_PREFIX = '\0virtual:external:'
37
+
38
+ return {
39
+ name: 'vite-plugin-external-deps',
40
+ enforce: 'pre',
41
+
42
+ // 在开发模式下拦截模块解析
43
+ resolveId(id) {
44
+ // 检查是否是需要外部化的依赖
45
+ if (externals.includes(id)) {
46
+ // 返回虚拟模块 ID(\0 前缀告诉 Vite 这是虚拟模块)
47
+ return VIRTUAL_PREFIX + id
48
+ }
49
+ return null
50
+ },
51
+
52
+ // 加载外部模块的代理代码
53
+ load(id) {
54
+ // 检查是否是虚拟外部模块
55
+ if (!id.startsWith(VIRTUAL_PREFIX)) {
56
+ return null
57
+ }
58
+
59
+ const moduleName = id.slice(VIRTUAL_PREFIX.length)
60
+ const globalName = globals[moduleName]
61
+
62
+ if (!globalName) {
63
+ throw new Error(
64
+ `[vite-plugin-external-deps] No global mapping found for "${moduleName}". ` +
65
+ `Please add it to the globals option.`
66
+ )
67
+ }
68
+
69
+ // 对于 react,导出常用的命名导出
70
+ if (moduleName === 'react') {
71
+ return `
72
+ // External module: react -> window.${globalName}
73
+ const React = window.${globalName};
74
+ if (!React) {
75
+ throw new Error(
76
+ 'External dependency "react" (window.${globalName}) is not available. ' +
77
+ 'Make sure the parent application has loaded it globally.'
78
+ );
79
+ }
80
+
81
+ // 导出默认导出
82
+ export default React;
83
+
84
+ // 导出常用的命名导出
85
+ export const {
86
+ useState,
87
+ useEffect,
88
+ useContext,
89
+ useReducer,
90
+ useCallback,
91
+ useMemo,
92
+ useRef,
93
+ useImperativeHandle,
94
+ useLayoutEffect,
95
+ useDebugValue,
96
+ useDeferredValue,
97
+ useTransition,
98
+ useId,
99
+ useSyncExternalStore,
100
+ Fragment,
101
+ StrictMode,
102
+ Suspense,
103
+ createElement,
104
+ createContext,
105
+ forwardRef,
106
+ lazy,
107
+ memo,
108
+ startTransition,
109
+ Component,
110
+ PureComponent,
111
+ Children,
112
+ cloneElement,
113
+ isValidElement,
114
+ } = React;
115
+ `
116
+ }
117
+
118
+ // 对于 react-dom,导出常用的命名导出
119
+ if (moduleName === 'react-dom') {
120
+ return `
121
+ // External module: react-dom -> window.${globalName}
122
+ const ReactDOM = window.${globalName};
123
+ if (!ReactDOM) {
124
+ throw new Error(
125
+ 'External dependency "react-dom" (window.${globalName}) is not available. ' +
126
+ 'Make sure the parent application has loaded it globally.'
127
+ );
128
+ }
129
+
130
+ // 导出默认导出
131
+ export default ReactDOM;
132
+
133
+ // 导出常用的命名导出
134
+ export const {
135
+ createRoot,
136
+ hydrateRoot,
137
+ render,
138
+ hydrate,
139
+ unmountComponentAtNode,
140
+ findDOMNode,
141
+ flushSync,
142
+ } = ReactDOM;
143
+ `
144
+ }
145
+
146
+ // 对于 react/jsx-runtime
147
+ if (moduleName === 'react/jsx-runtime') {
148
+ return `
149
+ // External module: react/jsx-runtime -> window.${globalName}
150
+ const jsxRuntime = window.${globalName};
151
+ if (!jsxRuntime) {
152
+ throw new Error(
153
+ 'External dependency "react/jsx-runtime" (window.${globalName}) is not available. ' +
154
+ 'Make sure the parent application has loaded it globally.'
155
+ );
156
+ }
157
+
158
+ // 导出 JSX 运行时函数
159
+ export const { jsx, jsxs, Fragment } = jsxRuntime;
160
+ export default jsxRuntime;
161
+ `
162
+ }
163
+
164
+ // 对于 @easy-editor/core
165
+ if (moduleName === '@easy-editor/core') {
166
+ return `
167
+ // External module: @easy-editor/core -> window.${globalName}
168
+ const EasyEditorCore = window.${globalName};
169
+ if (!EasyEditorCore) {
170
+ throw new Error(
171
+ 'External dependency "@easy-editor/core" (window.${globalName}) is not available. ' +
172
+ 'Make sure the parent application has loaded it globally.'
173
+ );
174
+ }
175
+
176
+ // 导出整个模块
177
+ export default EasyEditorCore;
178
+ export * from '\0virtual:external:@easy-editor/core:named';
179
+ `
180
+ }
181
+
182
+ // 处理 @easy-editor/core 的命名导出
183
+ if (id === '\0virtual:external:@easy-editor/core:named') {
184
+ return `
185
+ const EasyEditorCore = window.${globals['@easy-editor/core']};
186
+ // 尝试导出所有属性
187
+ const keys = Object.keys(EasyEditorCore || {});
188
+ const exports = {};
189
+ keys.forEach(key => {
190
+ exports[key] = EasyEditorCore[key];
191
+ });
192
+ export default exports;
193
+ `
194
+ }
195
+
196
+ // 默认情况:简单的全局变量代理
197
+ return `
198
+ // External module: ${moduleName} -> window.${globalName}
199
+ const mod = window.${globalName};
200
+ if (!mod) {
201
+ throw new Error(
202
+ 'External dependency "${moduleName}" (window.${globalName}) is not available. ' +
203
+ 'Make sure the parent application has loaded it globally.'
204
+ );
205
+ }
206
+ export default mod;
207
+ `
208
+ },
209
+
210
+ // 配置 Rollup 外部化(用于构建)
211
+ config(config) {
212
+ return {
213
+ build: {
214
+ rollupOptions: {
215
+ external: externals,
216
+ output: {
217
+ globals,
218
+ },
219
+ },
220
+ },
221
+ }
222
+ },
223
+ }
224
+ }
@@ -0,0 +1,218 @@
1
+ /**
2
+ * Vite Plugin for Material Development
3
+ * 物料开发 Vite 插件 - 提供物料调试所需的 API 和 WebSocket 通知
4
+ */
5
+
6
+ import type { Plugin, ViteDevServer } from 'vite'
7
+ import type { IncomingMessage, ServerResponse } from 'node:http'
8
+ import { WebSocketServer, WebSocket } from 'ws'
9
+
10
+ interface MaterialDevPluginOptions {
11
+ /** 物料入口文件路径 */
12
+ entry?: string
13
+ /** WebSocket 端口(默认与 HTTP 端口相同) */
14
+ wsPort?: number
15
+ }
16
+
17
+ /**
18
+ * 物料开发插件
19
+ * 提供:
20
+ * - /api/health - 健康检查
21
+ * - /api/material - 物料信息
22
+ * - WebSocket 通知 - 文件变更时通知连接的客户端
23
+ */
24
+ export function materialDevPlugin(options: MaterialDevPluginOptions = {}): Plugin {
25
+ const { entry = '/src/index.tsx' } = options
26
+
27
+ let server: ViteDevServer
28
+ let wss: WebSocketServer | null = null
29
+ const clients = new Set<WebSocket>()
30
+
31
+ // 广播消息给所有连接的客户端
32
+ function broadcast(message: object) {
33
+ const data = JSON.stringify(message)
34
+ for (const client of clients) {
35
+ if (client.readyState === WebSocket.OPEN) {
36
+ client.send(data)
37
+ }
38
+ }
39
+ }
40
+
41
+ return {
42
+ name: 'vite-plugin-material-dev',
43
+
44
+ configureServer(_server) {
45
+ server = _server
46
+
47
+ // 创建 WebSocket 服务器,复用 Vite 的 HTTP 服务器
48
+ wss = new WebSocketServer({ noServer: true })
49
+
50
+ // 处理 WebSocket 升级请求
51
+ server.httpServer?.on('upgrade', (request, socket, head) => {
52
+ // 只处理 /ws 路径的 WebSocket 请求,避免与 Vite HMR 冲突
53
+ if (request.url === '/ws' || request.url === '/__material_ws__') {
54
+ wss?.handleUpgrade(request, socket, head, ws => {
55
+ wss?.emit('connection', ws, request)
56
+ })
57
+ }
58
+ })
59
+
60
+ wss.on('connection', ws => {
61
+ console.log('[MaterialDevPlugin] Client connected')
62
+ clients.add(ws)
63
+
64
+ // 发送连接成功消息
65
+ ws.send(
66
+ JSON.stringify({
67
+ type: 'connected',
68
+ message: 'Material dev server connected',
69
+ timestamp: Date.now(),
70
+ }),
71
+ )
72
+
73
+ ws.on('close', () => {
74
+ console.log('[MaterialDevPlugin] Client disconnected')
75
+ clients.delete(ws)
76
+ })
77
+
78
+ ws.on('error', error => {
79
+ console.error('[MaterialDevPlugin] WebSocket error:', error)
80
+ clients.delete(ws)
81
+ })
82
+ })
83
+
84
+ // 处理 CORS 预检请求(需要在其他中间件之前)
85
+ server.middlewares.use((req: IncomingMessage, res: ServerResponse, next: () => void) => {
86
+ if (req.method === 'OPTIONS') {
87
+ res.setHeader('Access-Control-Allow-Origin', '*')
88
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
89
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type')
90
+ res.statusCode = 204
91
+ res.end()
92
+ return
93
+ }
94
+ next()
95
+ })
96
+
97
+ // 健康检查 API
98
+ server.middlewares.use('/api/health', (_req: IncomingMessage, res: ServerResponse) => {
99
+ res.setHeader('Content-Type', 'application/json')
100
+ res.setHeader('Access-Control-Allow-Origin', '*')
101
+ res.end(
102
+ JSON.stringify({
103
+ status: 'ok',
104
+ timestamp: Date.now(),
105
+ server: 'vite',
106
+ wsPath: '/ws',
107
+ }),
108
+ )
109
+ })
110
+
111
+ // 物料信息 API
112
+ server.middlewares.use('/api/material', async (_req: IncomingMessage, res: ServerResponse) => {
113
+ res.setHeader('Content-Type', 'application/json')
114
+ res.setHeader('Access-Control-Allow-Origin', '*')
115
+
116
+ try {
117
+ // 使用 Vite 的 SSR 模块加载能力加载物料模块
118
+ const module = await server.ssrLoadModule(entry)
119
+
120
+ const meta = module.meta || module.default?.meta
121
+ const component = module.component || module.default
122
+
123
+ if (!meta) {
124
+ res.statusCode = 400
125
+ res.end(
126
+ JSON.stringify({
127
+ error: 'Material meta not found. Make sure to export "meta" from the entry file.',
128
+ }),
129
+ )
130
+ return
131
+ }
132
+
133
+ // 返回物料信息
134
+ const materialInfo = {
135
+ // 基本信息
136
+ name: meta.componentName,
137
+ title: meta.title,
138
+ version: meta.npm?.version || '0.0.0-dev',
139
+ group: meta.group,
140
+ category: meta.category,
141
+
142
+ // 入口信息
143
+ entry,
144
+
145
+ // 模块状态
146
+ hasComponent: !!component,
147
+ hasMeta: !!meta,
148
+ hasConfigure: !!meta.configure,
149
+ hasSnippets: Array.isArray(meta.snippets) && meta.snippets.length > 0,
150
+
151
+ // WebSocket 路径
152
+ wsPath: '/ws',
153
+ }
154
+
155
+ res.end(JSON.stringify(materialInfo))
156
+ } catch (error) {
157
+ console.error('[MaterialDevPlugin] Failed to load material:', error)
158
+ res.statusCode = 500
159
+ res.end(
160
+ JSON.stringify({
161
+ error: error instanceof Error ? error.message : String(error),
162
+ }),
163
+ )
164
+ }
165
+ })
166
+
167
+ // 在服务器启动时打印信息
168
+ server.httpServer?.once('listening', () => {
169
+ const address = server.httpServer?.address()
170
+ const port = typeof address === 'object' && address ? address.port : 5001
171
+ const host = server.config.server.host || 'localhost'
172
+
173
+ setTimeout(() => {
174
+ console.log('')
175
+ console.log('\x1b[36m%s\x1b[0m', ' Material Dev Server Ready')
176
+ console.log('')
177
+ console.log(` Health Check: http://${host}:${port}/api/health`)
178
+ console.log(` Material Info: http://${host}:${port}/api/material`)
179
+ console.log(` Module Entry: http://${host}:${port}${entry}`)
180
+ console.log(` WebSocket: ws://${host}:${port}/ws`)
181
+ console.log('')
182
+ console.log('\x1b[33m%s\x1b[0m', ' Connect this URL in EasyEditor to start debugging')
183
+ console.log('')
184
+ }, 100)
185
+ })
186
+ },
187
+
188
+ // 监听 Vite 的 HMR 事件,转发给我们的 WebSocket 客户端
189
+ handleHotUpdate({ file, modules }) {
190
+ console.log(`[MaterialDevPlugin] File changed: ${file}`)
191
+
192
+ // 通知所有连接的客户端
193
+ broadcast({
194
+ type: 'update',
195
+ file,
196
+ timestamp: Date.now(),
197
+ modules: modules.map(m => m.id),
198
+ })
199
+
200
+ // 返回 undefined 让 Vite 继续处理 HMR
201
+ return
202
+ },
203
+
204
+ // 插件关闭时清理
205
+ closeBundle() {
206
+ if (wss) {
207
+ for (const client of clients) {
208
+ client.close()
209
+ }
210
+ clients.clear()
211
+ wss.close()
212
+ wss = null
213
+ }
214
+ },
215
+ }
216
+ }
217
+
218
+ export default materialDevPlugin
package/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # @easy-editor/materials-dashboard-scroll-list
2
+
3
+ ## 0.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - feat: new setters
package/LICENSE ADDED
@@ -0,0 +1,9 @@
1
+ MIT License
2
+
3
+ Copyright © 2025-PRESENT JinSo <https://github.com/JinSooo>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6
+
7
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+ THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,176 @@
1
+ /* @easy-editor/materials-dashboard-ranking-list v0.0.1 (component, esm) */
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+
4
+ function r(e){var t,f,n="";if("string"==typeof e||"number"==typeof e)n+=e;else if("object"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=" "),n+=f);}else for(f in e)e[f]&&(n&&(n+=" "),n+=f);return n}function clsx(){for(var e,t,f=0,n="",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=" "),n+=t);return n}
5
+
6
+ function cn(...inputs) {
7
+ return clsx(inputs);
8
+ }
9
+
10
+ function styleInject(css, ref) {
11
+ if (ref === void 0) ref = {};
12
+ var insertAt = ref.insertAt;
13
+ if (typeof document === 'undefined') {
14
+ return;
15
+ }
16
+ var head = document.head || document.getElementsByTagName('head')[0];
17
+ var style = document.createElement('style');
18
+ style.type = 'text/css';
19
+ if (insertAt === 'top') {
20
+ if (head.firstChild) {
21
+ head.insertBefore(style, head.firstChild);
22
+ } else {
23
+ head.appendChild(style);
24
+ }
25
+ } else {
26
+ head.appendChild(style);
27
+ }
28
+ if (style.styleSheet) {
29
+ style.styleSheet.cssText = css;
30
+ } else {
31
+ style.appendChild(document.createTextNode(css));
32
+ }
33
+ }
34
+
35
+ var css_248z = ".component-module__container___VbZSk{backdrop-filter:blur(10px);background:rgba(10,10,26,.95);border:1px solid rgba(26,26,62,.8);border-radius:12px;box-shadow:0 4px 20px rgba(0,0,0,.3);box-sizing:border-box;height:100%;overflow:hidden;padding:16px;width:100%}.component-module__list___ZzqLO{display:flex;flex-direction:column;gap:10px;height:100%}.component-module__item___-0hiq{align-items:center;background:rgba(15,15,42,.9);border:1px solid rgba(26,26,62,.6);border-radius:8px;display:flex;gap:14px;overflow:hidden;padding:12px 16px;position:relative;transition:all .3s ease}.component-module__item___-0hiq:before{background:linear-gradient(180deg,transparent,rgba(0,212,255,.5),transparent);bottom:0;content:\"\";left:0;opacity:0;position:absolute;top:0;transition:opacity .3s ease;width:3px}.component-module__item___-0hiq:hover{background:rgba(20,20,52,.95);border-color:rgba(0,212,255,.3);transform:translateX(4px)}.component-module__item___-0hiq:hover:before{opacity:1}.component-module__rankBadge___qWXYW{align-items:center;border-radius:6px;display:flex;font-weight:700;height:32px;justify-content:center;min-width:32px;transition:transform .3s ease}.component-module__item___-0hiq:hover .component-module__rankBadge___qWXYW{transform:scale(1.1)}.component-module__rankBadgeTopThree___kYqJt{font-size:20px;text-shadow:0 2px 8px rgba(0,0,0,.5)}.component-module__rankBadgeNormal___Fl3nh{background:rgba(26,26,62,.8);border:1px solid rgba(136,146,176,.2);color:#8892b0;font-size:14px}.component-module__rankGold___lLkRo{color:gold;filter:drop-shadow(0 0 6px rgba(255,215,0,.6))}.component-module__rankSilver___QUAyV{color:#e8e8e8;filter:drop-shadow(0 0 6px rgba(192,192,192,.6))}.component-module__rankBronze___Wc-LC{color:#f96;filter:drop-shadow(0 0 6px rgba(205,127,50,.6))}.component-module__name___6zmww{color:#e6e6e6;flex:1;font-size:15px;font-weight:500;overflow:hidden;text-overflow:ellipsis;transition:color .3s ease;white-space:nowrap}.component-module__item___-0hiq:hover .component-module__name___6zmww{color:#fff}.component-module__valueContainer___xBbFD{align-items:flex-end;display:flex;flex-direction:column;gap:6px;min-width:120px}.component-module__value___Fg70k{color:#00d4ff;font-family:Courier New,Courier,monospace;font-size:15px;font-weight:700;text-shadow:0 0 10px rgba(0,212,255,.3);transition:all .3s ease}.component-module__item___-0hiq:hover .component-module__value___Fg70k{text-shadow:0 0 15px rgba(0,212,255,.5);transform:scale(1.05)}.component-module__progressBar___wROZC{background:rgba(26,26,62,.8);border-radius:3px;box-shadow:inset 0 1px 3px rgba(0,0,0,.3);height:5px;overflow:hidden;width:100%}.component-module__progressFill___F8n5d{border-radius:3px;height:100%;position:relative;transition:width .5s cubic-bezier(.4,0,.2,1)}.component-module__progressFill___F8n5d:after{animation:component-module__shimmer___7hQ6G 2s infinite;background:linear-gradient(90deg,transparent,hsla(0,0%,100%,.2),transparent);bottom:0;content:\"\";left:0;position:absolute;right:0;top:0}@keyframes component-module__shimmer___7hQ6G{0%{transform:translateX(-100%)}to{transform:translateX(100%)}}";
36
+ var styles = {"container":"component-module__container___VbZSk","list":"component-module__list___ZzqLO","item":"component-module__item___-0hiq","rankBadge":"component-module__rankBadge___qWXYW","rankBadgeTopThree":"component-module__rankBadgeTopThree___kYqJt","rankBadgeNormal":"component-module__rankBadgeNormal___Fl3nh","rankGold":"component-module__rankGold___lLkRo","rankSilver":"component-module__rankSilver___QUAyV","rankBronze":"component-module__rankBronze___Wc-LC","name":"component-module__name___6zmww","valueContainer":"component-module__valueContainer___xBbFD","value":"component-module__value___Fg70k","progressBar":"component-module__progressBar___wROZC","progressFill":"component-module__progressFill___F8n5d"};
37
+ styleInject(css_248z);
38
+
39
+ /**
40
+ * Scroll List Component
41
+ * 滚动列表组件 - 用于展示排行榜、数据列表等
42
+ */
43
+
44
+ const DEFAULT_DATA = [{
45
+ rank: 1,
46
+ name: '北京市',
47
+ value: 9800
48
+ }, {
49
+ rank: 2,
50
+ name: '上海市',
51
+ value: 8500
52
+ }, {
53
+ rank: 3,
54
+ name: '广州市',
55
+ value: 7200
56
+ }, {
57
+ rank: 4,
58
+ name: '深圳市',
59
+ value: 6100
60
+ }, {
61
+ rank: 5,
62
+ name: '杭州市',
63
+ value: 4800
64
+ }];
65
+ const MEDAL_EMOJI = {
66
+ 1: '🥇',
67
+ 2: '🥈',
68
+ 3: '🥉'
69
+ };
70
+ const getRankClass = rank => {
71
+ if (rank === 1) return styles.rankGold;
72
+ if (rank === 2) return styles.rankSilver;
73
+ if (rank === 3) return styles.rankBronze;
74
+ return '';
75
+ };
76
+ const formatDisplayValue = (value, format, prefix, suffix) => {
77
+ let formatted;
78
+ switch (format) {
79
+ case 'currency':
80
+ formatted = value.toLocaleString('zh-CN', {
81
+ minimumFractionDigits: 2,
82
+ maximumFractionDigits: 2
83
+ });
84
+ break;
85
+ case 'percent':
86
+ formatted = `${value}%`;
87
+ break;
88
+ default:
89
+ formatted = value.toLocaleString();
90
+ }
91
+ return `${prefix}${formatted}${suffix}`;
92
+ };
93
+ const ScrollList = ({
94
+ ref,
95
+ data = DEFAULT_DATA,
96
+ maxItems = 5,
97
+ showRank = true,
98
+ showMedal = true,
99
+ progressBarEnable = true,
100
+ progressBarGradient = true,
101
+ progressBarColors = ['#00d4ff', '#9b59b6'],
102
+ valueFormat = 'number',
103
+ valuePrefix = '',
104
+ valueSuffix = '',
105
+ nameColor = '#e6e6e6',
106
+ valueColor = '#00d4ff',
107
+ backgroundColor = 'rgba(10, 10, 26, 0.95)',
108
+ borderColor = 'rgba(26, 26, 62, 0.8)',
109
+ itemBackgroundColor = 'rgba(15, 15, 42, 0.9)',
110
+ itemBorderColor = 'rgba(26, 26, 62, 0.6)',
111
+ glowEnable = false,
112
+ style: externalStyle
113
+ }) => {
114
+ const displayData = data.slice(0, maxItems);
115
+ const maxValue = Math.max(...displayData.map(item => item.value), 1);
116
+ const getProgressBarStyle = value => {
117
+ const percentage = value / maxValue * 100;
118
+ return {
119
+ width: `${percentage}%`,
120
+ background: progressBarGradient ? `linear-gradient(90deg, ${progressBarColors[0]}, ${progressBarColors[1]})` : progressBarColors[0],
121
+ boxShadow: glowEnable ? `0 0 8px ${progressBarColors[0]}60` : undefined
122
+ };
123
+ };
124
+ const containerStyle = {
125
+ ...externalStyle,
126
+ backgroundColor,
127
+ borderColor
128
+ };
129
+ const itemStyle = {
130
+ backgroundColor: itemBackgroundColor,
131
+ borderColor: itemBorderColor
132
+ };
133
+ return /*#__PURE__*/jsx("div", {
134
+ className: styles.container,
135
+ ref: ref,
136
+ style: containerStyle,
137
+ children: /*#__PURE__*/jsx("div", {
138
+ className: styles.list,
139
+ children: displayData.map(item => {
140
+ const isTopThree = item.rank <= 3;
141
+ return /*#__PURE__*/jsxs("div", {
142
+ className: styles.item,
143
+ style: itemStyle,
144
+ children: [showRank ? /*#__PURE__*/jsx("div", {
145
+ className: cn(styles.rankBadge, isTopThree ? styles.rankBadgeTopThree : styles.rankBadgeNormal, getRankClass(item.rank)),
146
+ children: showMedal && isTopThree ? MEDAL_EMOJI[item.rank] : item.rank
147
+ }) : null, /*#__PURE__*/jsx("div", {
148
+ className: styles.name,
149
+ style: {
150
+ color: nameColor
151
+ },
152
+ children: item.name
153
+ }), /*#__PURE__*/jsxs("div", {
154
+ className: styles.valueContainer,
155
+ children: [/*#__PURE__*/jsx("span", {
156
+ className: styles.value,
157
+ style: {
158
+ color: valueColor
159
+ },
160
+ children: formatDisplayValue(item.value, valueFormat, valuePrefix, valueSuffix)
161
+ }), progressBarEnable ? /*#__PURE__*/jsx("div", {
162
+ className: styles.progressBar,
163
+ children: /*#__PURE__*/jsx("div", {
164
+ className: styles.progressFill,
165
+ style: getProgressBarStyle(item.value)
166
+ })
167
+ }) : null]
168
+ })]
169
+ }, item.rank);
170
+ })
171
+ })
172
+ });
173
+ };
174
+
175
+ export { ScrollList, ScrollList as default };
176
+ //# sourceMappingURL=component.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component.esm.js","sources":["../../../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../../../../shared/src/lib/utils.ts","../../../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.js","../src/component.tsx"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import { clsx, type ClassValue } from 'clsx'\n\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs)\n}\n","function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n","/**\n * Scroll List Component\n * 滚动列表组件 - 用于展示排行榜、数据列表等\n */\n\nimport type { CSSProperties, Ref } from 'react'\nimport { cn } from '@easy-editor/materials-shared'\nimport styles from './component.module.css'\n\nexport interface ScrollListItem {\n rank: number\n name: string\n value: number\n}\n\nexport interface ScrollListProps {\n ref?: Ref<HTMLDivElement>\n /** 列表数据 */\n data?: ScrollListItem[]\n /** 最大显示条数 */\n maxItems?: number\n /** 是否显示排名 */\n showRank?: boolean\n /** 是否显示奖牌图标 */\n showMedal?: boolean\n /** 是否显示进度条 */\n progressBarEnable?: boolean\n /** 是否使用渐变进度条 */\n progressBarGradient?: boolean\n /** 进度条颜色 [起始色, 结束色] */\n progressBarColors?: [string, string]\n /** 数值格式化 */\n valueFormat?: 'number' | 'currency' | 'percent'\n /** 数值前缀 */\n valuePrefix?: string\n /** 数值后缀 */\n valueSuffix?: string\n /** 名称颜色 */\n nameColor?: string\n /** 数值颜色 */\n valueColor?: string\n /** 背景颜色 */\n backgroundColor?: string\n /** 边框颜色 */\n borderColor?: string\n /** 行背景颜色 */\n itemBackgroundColor?: string\n /** 行边框颜色 */\n itemBorderColor?: string\n /** 是否显示发光效果 */\n glowEnable?: boolean\n /** 外部样式 */\n style?: CSSProperties\n}\n\nconst DEFAULT_DATA: ScrollListItem[] = [\n { rank: 1, name: '北京市', value: 9800 },\n { rank: 2, name: '上海市', value: 8500 },\n { rank: 3, name: '广州市', value: 7200 },\n { rank: 4, name: '深圳市', value: 6100 },\n { rank: 5, name: '杭州市', value: 4800 },\n]\n\nconst MEDAL_EMOJI: Record<number, string> = {\n 1: '🥇',\n 2: '🥈',\n 3: '🥉',\n}\n\nconst getRankClass = (rank: number): string => {\n if (rank === 1) return styles.rankGold\n if (rank === 2) return styles.rankSilver\n if (rank === 3) return styles.rankBronze\n return ''\n}\n\nconst formatDisplayValue = (\n value: number,\n format: string,\n prefix: string,\n suffix: string,\n): string => {\n let formatted: string\n switch (format) {\n case 'currency':\n formatted = value.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })\n break\n case 'percent':\n formatted = `${value}%`\n break\n default:\n formatted = value.toLocaleString()\n }\n return `${prefix}${formatted}${suffix}`\n}\n\nexport const ScrollList: React.FC<ScrollListProps> = ({\n ref,\n data = DEFAULT_DATA,\n maxItems = 5,\n showRank = true,\n showMedal = true,\n progressBarEnable = true,\n progressBarGradient = true,\n progressBarColors = ['#00d4ff', '#9b59b6'],\n valueFormat = 'number',\n valuePrefix = '',\n valueSuffix = '',\n nameColor = '#e6e6e6',\n valueColor = '#00d4ff',\n backgroundColor = 'rgba(10, 10, 26, 0.95)',\n borderColor = 'rgba(26, 26, 62, 0.8)',\n itemBackgroundColor = 'rgba(15, 15, 42, 0.9)',\n itemBorderColor = 'rgba(26, 26, 62, 0.6)',\n glowEnable = false,\n style: externalStyle,\n}) => {\n const displayData = data.slice(0, maxItems)\n const maxValue = Math.max(...displayData.map(item => item.value), 1)\n\n const getProgressBarStyle = (value: number): CSSProperties => {\n const percentage = (value / maxValue) * 100\n return {\n width: `${percentage}%`,\n background: progressBarGradient\n ? `linear-gradient(90deg, ${progressBarColors[0]}, ${progressBarColors[1]})`\n : progressBarColors[0],\n boxShadow: glowEnable ? `0 0 8px ${progressBarColors[0]}60` : undefined,\n }\n }\n\n const containerStyle: CSSProperties = {\n ...externalStyle,\n backgroundColor,\n borderColor,\n }\n\n const itemStyle: CSSProperties = {\n backgroundColor: itemBackgroundColor,\n borderColor: itemBorderColor,\n }\n\n return (\n <div className={styles.container} ref={ref} style={containerStyle}>\n <div className={styles.list}>\n {displayData.map(item => {\n const isTopThree = item.rank <= 3\n\n return (\n <div className={styles.item} key={item.rank} style={itemStyle}>\n {/* Rank Badge */}\n {showRank ? (\n <div\n className={cn(\n styles.rankBadge,\n isTopThree ? styles.rankBadgeTopThree : styles.rankBadgeNormal,\n getRankClass(item.rank),\n )}\n >\n {showMedal && isTopThree ? MEDAL_EMOJI[item.rank] : item.rank}\n </div>\n ) : null}\n\n {/* Name */}\n <div className={styles.name} style={{ color: nameColor }}>{item.name}</div>\n\n {/* Value and Progress */}\n <div className={styles.valueContainer}>\n <span className={styles.value} style={{ color: valueColor }}>\n {formatDisplayValue(item.value, valueFormat, valuePrefix, valueSuffix)}\n </span>\n {progressBarEnable ? (\n <div className={styles.progressBar}>\n <div className={styles.progressFill} style={getProgressBarStyle(item.value)} />\n </div>\n ) : null}\n </div>\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nexport default ScrollList\n"],"names":["cn","inputs","clsx","styleInject","css","ref","insertAt","document","head","getElementsByTagName","style","createElement","type","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","DEFAULT_DATA","rank","name","value","MEDAL_EMOJI","getRankClass","styles","rankGold","rankSilver","rankBronze","formatDisplayValue","format","prefix","suffix","formatted","toLocaleString","minimumFractionDigits","maximumFractionDigits","ScrollList","data","maxItems","showRank","showMedal","progressBarEnable","progressBarGradient","progressBarColors","valueFormat","valuePrefix","valueSuffix","nameColor","valueColor","backgroundColor","borderColor","itemBackgroundColor","itemBorderColor","glowEnable","externalStyle","displayData","slice","maxValue","Math","max","map","item","getProgressBarStyle","percentage","width","background","boxShadow","undefined","containerStyle","itemStyle","_jsx","className","container","children","list","isTopThree","_jsxs","rankBadge","rankBadgeTopThree","rankBadgeNormal","color","valueContainer","progressBar","progressFill"],"mappings":";;;AAAA,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAC,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAQ,SAAS,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;;ACExW,SAASA,EAAEA,CAAC,GAAGC,MAAoB,EAAE;EAC1C,OAAOC,IAAI,CAACD,MAAM,CAAC;AACrB;;ACJA,SAASE,WAAWA,CAACC,GAAG,EAAEC,GAAG,EAAE;EAC7B,IAAKA,GAAG,KAAK,MAAM,EAAGA,GAAG,GAAG,EAAE;AAC9B,EAAA,IAAIC,QAAQ,GAAGD,GAAG,CAACC,QAAQ;AAE3B,EAAA,IAAY,OAAOC,QAAQ,KAAK,WAAW,EAAE;AAAE,IAAA;AAAQ,EAAA;AAEvD,EAAA,IAAIC,IAAI,GAAGD,QAAQ,CAACC,IAAI,IAAID,QAAQ,CAACE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpE,EAAA,IAAIC,KAAK,GAAGH,QAAQ,CAACI,aAAa,CAAC,OAAO,CAAC;EAC3CD,KAAK,CAACE,IAAI,GAAG,UAAU;EAEvB,IAAIN,QAAQ,KAAK,KAAK,EAAE;IACtB,IAAIE,IAAI,CAACK,UAAU,EAAE;MACnBL,IAAI,CAACM,YAAY,CAACJ,KAAK,EAAEF,IAAI,CAACK,UAAU,CAAC;AAC3C,IAAA,CAAC,MAAM;AACLL,MAAAA,IAAI,CAACO,WAAW,CAACL,KAAK,CAAC;AACzB,IAAA;AACF,EAAA,CAAC,MAAM;AACLF,IAAAA,IAAI,CAACO,WAAW,CAACL,KAAK,CAAC;AACzB,EAAA;EAEA,IAAIA,KAAK,CAACM,UAAU,EAAE;AACpBN,IAAAA,KAAK,CAACM,UAAU,CAACC,OAAO,GAAGb,GAAG;AAChC,EAAA,CAAC,MAAM;IACLM,KAAK,CAACK,WAAW,CAACR,QAAQ,CAACW,cAAc,CAACd,GAAG,CAAC,CAAC;AACjD,EAAA;AACF;;;;;;ACzBA;AACA;AACA;AACA;;AAoDA,MAAMe,YAA8B,GAAG,CACrC;AAAEC,EAAAA,IAAI,EAAE,CAAC;AAAEC,EAAAA,IAAI,EAAE,KAAK;AAAEC,EAAAA,KAAK,EAAE;AAAK,CAAC,EACrC;AAAEF,EAAAA,IAAI,EAAE,CAAC;AAAEC,EAAAA,IAAI,EAAE,KAAK;AAAEC,EAAAA,KAAK,EAAE;AAAK,CAAC,EACrC;AAAEF,EAAAA,IAAI,EAAE,CAAC;AAAEC,EAAAA,IAAI,EAAE,KAAK;AAAEC,EAAAA,KAAK,EAAE;AAAK,CAAC,EACrC;AAAEF,EAAAA,IAAI,EAAE,CAAC;AAAEC,EAAAA,IAAI,EAAE,KAAK;AAAEC,EAAAA,KAAK,EAAE;AAAK,CAAC,EACrC;AAAEF,EAAAA,IAAI,EAAE,CAAC;AAAEC,EAAAA,IAAI,EAAE,KAAK;AAAEC,EAAAA,KAAK,EAAE;AAAK,CAAC,CACtC;AAED,MAAMC,WAAmC,GAAG;AAC1C,EAAA,CAAC,EAAE,IAAI;AACP,EAAA,CAAC,EAAE,IAAI;AACP,EAAA,CAAC,EAAE;AACL,CAAC;AAED,MAAMC,YAAY,GAAIJ,IAAY,IAAa;AAC7C,EAAA,IAAIA,IAAI,KAAK,CAAC,EAAE,OAAOK,MAAM,CAACC,QAAQ;AACtC,EAAA,IAAIN,IAAI,KAAK,CAAC,EAAE,OAAOK,MAAM,CAACE,UAAU;AACxC,EAAA,IAAIP,IAAI,KAAK,CAAC,EAAE,OAAOK,MAAM,CAACG,UAAU;AACxC,EAAA,OAAO,EAAE;AACX,CAAC;AAED,MAAMC,kBAAkB,GAAGA,CACzBP,KAAa,EACbQ,MAAc,EACdC,MAAc,EACdC,MAAc,KACH;AACX,EAAA,IAAIC,SAAiB;AACrB,EAAA,QAAQH,MAAM;AACZ,IAAA,KAAK,UAAU;AACbG,MAAAA,SAAS,GAAGX,KAAK,CAACY,cAAc,CAAC,OAAO,EAAE;AAAEC,QAAAA,qBAAqB,EAAE,CAAC;AAAEC,QAAAA,qBAAqB,EAAE;AAAE,OAAC,CAAC;AACjG,MAAA;AACF,IAAA,KAAK,SAAS;MACZH,SAAS,GAAG,CAAA,EAAGX,KAAK,CAAA,CAAA,CAAG;AACvB,MAAA;AACF,IAAA;AACEW,MAAAA,SAAS,GAAGX,KAAK,CAACY,cAAc,EAAE;AACtC;AACA,EAAA,OAAO,GAAGH,MAAM,CAAA,EAAGE,SAAS,CAAA,EAAGD,MAAM,CAAA,CAAE;AACzC,CAAC;AAEM,MAAMK,UAAqC,GAAGA,CAAC;EACpDhC,GAAG;AACHiC,EAAAA,IAAI,GAAGnB,YAAY;AACnBoB,EAAAA,QAAQ,GAAG,CAAC;AACZC,EAAAA,QAAQ,GAAG,IAAI;AACfC,EAAAA,SAAS,GAAG,IAAI;AAChBC,EAAAA,iBAAiB,GAAG,IAAI;AACxBC,EAAAA,mBAAmB,GAAG,IAAI;AAC1BC,EAAAA,iBAAiB,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC;AAC1CC,EAAAA,WAAW,GAAG,QAAQ;AACtBC,EAAAA,WAAW,GAAG,EAAE;AAChBC,EAAAA,WAAW,GAAG,EAAE;AAChBC,EAAAA,SAAS,GAAG,SAAS;AACrBC,EAAAA,UAAU,GAAG,SAAS;AACtBC,EAAAA,eAAe,GAAG,wBAAwB;AAC1CC,EAAAA,WAAW,GAAG,uBAAuB;AACrCC,EAAAA,mBAAmB,GAAG,uBAAuB;AAC7CC,EAAAA,eAAe,GAAG,uBAAuB;AACzCC,EAAAA,UAAU,GAAG,KAAK;AAClB5C,EAAAA,KAAK,EAAE6C;AACT,CAAC,KAAK;EACJ,MAAMC,WAAW,GAAGlB,IAAI,CAACmB,KAAK,CAAC,CAAC,EAAElB,QAAQ,CAAC;AAC3C,EAAA,MAAMmB,QAAQ,GAAGC,IAAI,CAACC,GAAG,CAAC,GAAGJ,WAAW,CAACK,GAAG,CAACC,IAAI,IAAIA,IAAI,CAACxC,KAAK,CAAC,EAAE,CAAC,CAAC;EAEpE,MAAMyC,mBAAmB,GAAIzC,KAAa,IAAoB;AAC5D,IAAA,MAAM0C,UAAU,GAAI1C,KAAK,GAAGoC,QAAQ,GAAI,GAAG;IAC3C,OAAO;MACLO,KAAK,EAAE,CAAA,EAAGD,UAAU,CAAA,CAAA,CAAG;AACvBE,MAAAA,UAAU,EAAEvB,mBAAmB,GAC3B,0BAA0BC,iBAAiB,CAAC,CAAC,CAAC,CAAA,EAAA,EAAKA,iBAAiB,CAAC,CAAC,CAAC,CAAA,CAAA,CAAG,GAC1EA,iBAAiB,CAAC,CAAC,CAAC;MACxBuB,SAAS,EAAEb,UAAU,GAAG,CAAA,QAAA,EAAWV,iBAAiB,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI,GAAGwB;KAC/D;EACH,CAAC;AAED,EAAA,MAAMC,cAA6B,GAAG;AACpC,IAAA,GAAGd,aAAa;IAChBL,eAAe;AACfC,IAAAA;GACD;AAED,EAAA,MAAMmB,SAAwB,GAAG;AAC/BpB,IAAAA,eAAe,EAAEE,mBAAmB;AACpCD,IAAAA,WAAW,EAAEE;GACd;AAED,EAAA,oBACEkB,GAAA,CAAA,KAAA,EAAA;IAAKC,SAAS,EAAE/C,MAAM,CAACgD,SAAU;AAACpE,IAAAA,GAAG,EAAEA,GAAI;AAACK,IAAAA,KAAK,EAAE2D,cAAe;AAAAK,IAAAA,QAAA,eAChEH,GAAA,CAAA,KAAA,EAAA;MAAKC,SAAS,EAAE/C,MAAM,CAACkD,IAAK;AAAAD,MAAAA,QAAA,EACzBlB,WAAW,CAACK,GAAG,CAACC,IAAI,IAAI;AACvB,QAAA,MAAMc,UAAU,GAAGd,IAAI,CAAC1C,IAAI,IAAI,CAAC;AAEjC,QAAA,oBACEyD,IAAA,CAAA,KAAA,EAAA;UAAKL,SAAS,EAAE/C,MAAM,CAACqC,IAAK;AAAiBpD,UAAAA,KAAK,EAAE4D,SAAU;UAAAI,QAAA,EAAA,CAE3DlC,QAAQ,gBACP+B,GAAA,CAAA,KAAA,EAAA;YACEC,SAAS,EAAExE,EAAE,CACXyB,MAAM,CAACqD,SAAS,EAChBF,UAAU,GAAGnD,MAAM,CAACsD,iBAAiB,GAAGtD,MAAM,CAACuD,eAAe,EAC9DxD,YAAY,CAACsC,IAAI,CAAC1C,IAAI,CACxB,CAAE;AAAAsD,YAAAA,QAAA,EAEDjC,SAAS,IAAImC,UAAU,GAAGrD,WAAW,CAACuC,IAAI,CAAC1C,IAAI,CAAC,GAAG0C,IAAI,CAAC1C;AAAI,WAC1D,CAAC,GACJ,IAAI,eAGRmD,GAAA,CAAA,KAAA,EAAA;YAAKC,SAAS,EAAE/C,MAAM,CAACJ,IAAK;AAACX,YAAAA,KAAK,EAAE;AAAEuE,cAAAA,KAAK,EAAEjC;aAAY;YAAA0B,QAAA,EAAEZ,IAAI,CAACzC;WAAU,CAAC,eAG3EwD,IAAA,CAAA,KAAA,EAAA;YAAKL,SAAS,EAAE/C,MAAM,CAACyD,cAAe;AAAAR,YAAAA,QAAA,gBACpCH,GAAA,CAAA,MAAA,EAAA;cAAMC,SAAS,EAAE/C,MAAM,CAACH,KAAM;AAACZ,cAAAA,KAAK,EAAE;AAAEuE,gBAAAA,KAAK,EAAEhC;eAAa;cAAAyB,QAAA,EACzD7C,kBAAkB,CAACiC,IAAI,CAACxC,KAAK,EAAEuB,WAAW,EAAEC,WAAW,EAAEC,WAAW;AAAC,aAClE,CAAC,EACNL,iBAAiB,gBAChB6B,GAAA,CAAA,KAAA,EAAA;cAAKC,SAAS,EAAE/C,MAAM,CAAC0D,WAAY;AAAAT,cAAAA,QAAA,eACjCH,GAAA,CAAA,KAAA,EAAA;gBAAKC,SAAS,EAAE/C,MAAM,CAAC2D,YAAa;AAAC1E,gBAAAA,KAAK,EAAEqD,mBAAmB,CAACD,IAAI,CAACxC,KAAK;eAAI;aAC3E,CAAC,GACJ,IAAI;AAAA,WACL,CAAC;SAAA,EA3B0BwC,IAAI,CAAC1C,IA4BlC,CAAC;MAEV,CAAC;KACE;AAAC,GACH,CAAC;AAEV;;;;","x_google_ignoreList":[0,2]}