@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,189 @@
1
+ /**
2
+ * Scroll List Component
3
+ * 滚动列表组件 - 用于展示排行榜、数据列表等
4
+ */
5
+
6
+ import type { CSSProperties, Ref } from 'react'
7
+ import { cn } from '@easy-editor/materials-shared'
8
+ import styles from './component.module.css'
9
+
10
+ export interface ScrollListItem {
11
+ rank: number
12
+ name: string
13
+ value: number
14
+ }
15
+
16
+ export interface ScrollListProps {
17
+ ref?: Ref<HTMLDivElement>
18
+ /** 列表数据 */
19
+ data?: ScrollListItem[]
20
+ /** 最大显示条数 */
21
+ maxItems?: number
22
+ /** 是否显示排名 */
23
+ showRank?: boolean
24
+ /** 是否显示奖牌图标 */
25
+ showMedal?: boolean
26
+ /** 是否显示进度条 */
27
+ progressBarEnable?: boolean
28
+ /** 是否使用渐变进度条 */
29
+ progressBarGradient?: boolean
30
+ /** 进度条颜色 [起始色, 结束色] */
31
+ progressBarColors?: [string, string]
32
+ /** 数值格式化 */
33
+ valueFormat?: 'number' | 'currency' | 'percent'
34
+ /** 数值前缀 */
35
+ valuePrefix?: string
36
+ /** 数值后缀 */
37
+ valueSuffix?: string
38
+ /** 名称颜色 */
39
+ nameColor?: string
40
+ /** 数值颜色 */
41
+ valueColor?: string
42
+ /** 背景颜色 */
43
+ backgroundColor?: string
44
+ /** 边框颜色 */
45
+ borderColor?: string
46
+ /** 行背景颜色 */
47
+ itemBackgroundColor?: string
48
+ /** 行边框颜色 */
49
+ itemBorderColor?: string
50
+ /** 是否显示发光效果 */
51
+ glowEnable?: boolean
52
+ /** 外部样式 */
53
+ style?: CSSProperties
54
+ }
55
+
56
+ const DEFAULT_DATA: ScrollListItem[] = [
57
+ { rank: 1, name: '北京市', value: 9800 },
58
+ { rank: 2, name: '上海市', value: 8500 },
59
+ { rank: 3, name: '广州市', value: 7200 },
60
+ { rank: 4, name: '深圳市', value: 6100 },
61
+ { rank: 5, name: '杭州市', value: 4800 },
62
+ ]
63
+
64
+ const MEDAL_EMOJI: Record<number, string> = {
65
+ 1: '🥇',
66
+ 2: '🥈',
67
+ 3: '🥉',
68
+ }
69
+
70
+ const getRankClass = (rank: number): string => {
71
+ if (rank === 1) {
72
+ return styles.rankGold
73
+ }
74
+ if (rank === 2) {
75
+ return styles.rankSilver
76
+ }
77
+ if (rank === 3) {
78
+ return styles.rankBronze
79
+ }
80
+ return ''
81
+ }
82
+
83
+ const formatDisplayValue = (value: number, format: string, prefix: string, suffix: string): string => {
84
+ let formatted: string
85
+ switch (format) {
86
+ case 'currency':
87
+ formatted = value.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })
88
+ break
89
+ case 'percent':
90
+ formatted = `${value}%`
91
+ break
92
+ default:
93
+ formatted = value.toLocaleString()
94
+ }
95
+ return `${prefix}${formatted}${suffix}`
96
+ }
97
+
98
+ export const ScrollList: React.FC<ScrollListProps> = ({
99
+ ref,
100
+ data = DEFAULT_DATA,
101
+ maxItems = 5,
102
+ showRank = true,
103
+ showMedal = true,
104
+ progressBarEnable = true,
105
+ progressBarGradient = true,
106
+ progressBarColors = ['#00d4ff', '#9b59b6'],
107
+ valueFormat = 'number',
108
+ valuePrefix = '',
109
+ valueSuffix = '',
110
+ nameColor = '#e6e6e6',
111
+ valueColor = '#00d4ff',
112
+ backgroundColor = 'rgba(10, 10, 26, 0.95)',
113
+ borderColor = 'rgba(26, 26, 62, 0.8)',
114
+ itemBackgroundColor = 'rgba(15, 15, 42, 0.9)',
115
+ itemBorderColor = 'rgba(26, 26, 62, 0.6)',
116
+ glowEnable = false,
117
+ style: externalStyle,
118
+ }) => {
119
+ const displayData = data.slice(0, maxItems)
120
+ const maxValue = Math.max(...displayData.map(item => item.value), 1)
121
+
122
+ const getProgressBarStyle = (value: number): CSSProperties => {
123
+ const percentage = (value / maxValue) * 100
124
+ return {
125
+ width: `${percentage}%`,
126
+ background: progressBarGradient
127
+ ? `linear-gradient(90deg, ${progressBarColors[0]}, ${progressBarColors[1]})`
128
+ : progressBarColors[0],
129
+ boxShadow: glowEnable ? `0 0 8px ${progressBarColors[0]}60` : undefined,
130
+ }
131
+ }
132
+
133
+ const containerStyle: CSSProperties = {
134
+ ...externalStyle,
135
+ backgroundColor,
136
+ borderColor,
137
+ }
138
+
139
+ const itemStyle: CSSProperties = {
140
+ backgroundColor: itemBackgroundColor,
141
+ borderColor: itemBorderColor,
142
+ }
143
+
144
+ return (
145
+ <div className={styles.container} ref={ref} style={containerStyle}>
146
+ <div className={styles.list}>
147
+ {displayData.map(item => {
148
+ const isTopThree = item.rank <= 3
149
+
150
+ return (
151
+ <div className={styles.item} key={item.rank} style={itemStyle}>
152
+ {/* Rank Badge */}
153
+ {showRank ? (
154
+ <div
155
+ className={cn(
156
+ styles.rankBadge,
157
+ isTopThree ? styles.rankBadgeTopThree : styles.rankBadgeNormal,
158
+ getRankClass(item.rank),
159
+ )}
160
+ >
161
+ {showMedal && isTopThree ? MEDAL_EMOJI[item.rank] : item.rank}
162
+ </div>
163
+ ) : null}
164
+
165
+ {/* Name */}
166
+ <div className={styles.name} style={{ color: nameColor }}>
167
+ {item.name}
168
+ </div>
169
+
170
+ {/* Value and Progress */}
171
+ <div className={styles.valueContainer}>
172
+ <span className={styles.value} style={{ color: valueColor }}>
173
+ {formatDisplayValue(item.value, valueFormat, valuePrefix, valueSuffix)}
174
+ </span>
175
+ {progressBarEnable ? (
176
+ <div className={styles.progressBar}>
177
+ <div className={styles.progressFill} style={getProgressBarStyle(item.value)} />
178
+ </div>
179
+ ) : null}
180
+ </div>
181
+ </div>
182
+ )
183
+ })}
184
+ </div>
185
+ </div>
186
+ )
187
+ }
188
+
189
+ export default ScrollList
@@ -0,0 +1,439 @@
1
+ /**
2
+ * Scroll List Configure
3
+ * 滚动列表组件配置
4
+ */
5
+
6
+ import type { Configure } from '@easy-editor/core'
7
+
8
+ export const configure: Configure = {
9
+ props: [
10
+ {
11
+ type: 'group',
12
+ title: '属性',
13
+ setter: 'TabSetter',
14
+ items: [
15
+ {
16
+ type: 'group',
17
+ key: 'config',
18
+ title: '配置',
19
+ setter: {
20
+ componentName: 'CollapseSetter',
21
+ props: {
22
+ icon: false,
23
+ },
24
+ },
25
+ items: [
26
+ // 基础配置
27
+ {
28
+ name: 'id',
29
+ title: 'ID',
30
+ setter: 'NodeIdSetter',
31
+ extraProps: {
32
+ // @ts-expect-error label is not a valid extra prop
33
+ label: false,
34
+ },
35
+ },
36
+ {
37
+ name: 'title',
38
+ title: '标题',
39
+ setter: 'StringSetter',
40
+ extraProps: {
41
+ getValue(target) {
42
+ return target.getExtraPropValue('title')
43
+ },
44
+ setValue(target, value) {
45
+ target.setExtraPropValue('title', value)
46
+ },
47
+ },
48
+ },
49
+ {
50
+ type: 'group',
51
+ title: '基础属性',
52
+ setter: {
53
+ componentName: 'CollapseSetter',
54
+ props: {
55
+ icon: false,
56
+ },
57
+ },
58
+ items: [
59
+ {
60
+ name: 'rect',
61
+ title: '位置尺寸',
62
+ setter: 'RectSetter',
63
+ extraProps: {
64
+ getValue(target) {
65
+ return target.getExtraPropValue('$dashboard.rect')
66
+ },
67
+ setValue(target, value) {
68
+ target.setExtraPropValue('$dashboard.rect', value)
69
+ },
70
+ },
71
+ },
72
+ ],
73
+ },
74
+ // 组件配置
75
+ {
76
+ type: 'group',
77
+ title: '数据',
78
+ setter: {
79
+ componentName: 'CollapseSetter',
80
+ props: {
81
+ icon: false,
82
+ },
83
+ },
84
+ items: [
85
+ {
86
+ name: 'data',
87
+ title: '列表数据',
88
+ setter: 'JsonSetter',
89
+ },
90
+ {
91
+ name: 'maxItems',
92
+ title: '最大显示数',
93
+ setter: {
94
+ componentName: 'NumberSetter',
95
+ props: {
96
+ min: 1,
97
+ max: 20,
98
+ },
99
+ },
100
+ extraProps: {
101
+ defaultValue: 5,
102
+ },
103
+ },
104
+ ],
105
+ },
106
+ {
107
+ type: 'group',
108
+ title: '显示',
109
+ setter: {
110
+ componentName: 'CollapseSetter',
111
+ props: {
112
+ icon: false,
113
+ },
114
+ },
115
+ items: [
116
+ {
117
+ name: 'showRank',
118
+ title: '显示排名',
119
+ setter: 'SwitchSetter',
120
+ extraProps: {
121
+ defaultValue: true,
122
+ },
123
+ },
124
+ {
125
+ name: 'showMedal',
126
+ title: '显示奖牌',
127
+ setter: 'SwitchSetter',
128
+ extraProps: {
129
+ defaultValue: true,
130
+ },
131
+ },
132
+ {
133
+ name: 'progressBarEnable',
134
+ title: '显示进度条',
135
+ setter: 'SwitchSetter',
136
+ extraProps: {
137
+ defaultValue: true,
138
+ },
139
+ },
140
+ {
141
+ name: 'progressBarGradient',
142
+ title: '渐变效果',
143
+ setter: 'SwitchSetter',
144
+ extraProps: {
145
+ defaultValue: true,
146
+ },
147
+ },
148
+ {
149
+ name: 'glowEnable',
150
+ title: '发光效果',
151
+ setter: 'SwitchSetter',
152
+ extraProps: {
153
+ defaultValue: false,
154
+ },
155
+ },
156
+ ],
157
+ },
158
+ {
159
+ type: 'group',
160
+ title: '数值格式',
161
+ setter: {
162
+ componentName: 'CollapseSetter',
163
+ props: {
164
+ icon: false,
165
+ },
166
+ },
167
+ items: [
168
+ {
169
+ name: 'valueFormat',
170
+ title: '格式类型',
171
+ setter: {
172
+ componentName: 'SelectSetter',
173
+ props: {
174
+ options: [
175
+ { label: '数字', value: 'number' },
176
+ { label: '货币', value: 'currency' },
177
+ { label: '百分比', value: 'percent' },
178
+ ],
179
+ },
180
+ },
181
+ extraProps: {
182
+ defaultValue: 'number',
183
+ },
184
+ },
185
+ {
186
+ name: 'valuePrefix',
187
+ title: '数值前缀',
188
+ setter: 'StringSetter',
189
+ extraProps: {
190
+ defaultValue: '',
191
+ },
192
+ },
193
+ {
194
+ name: 'valueSuffix',
195
+ title: '数值后缀',
196
+ setter: 'StringSetter',
197
+ extraProps: {
198
+ defaultValue: '',
199
+ },
200
+ },
201
+ ],
202
+ },
203
+ {
204
+ type: 'group',
205
+ title: '颜色',
206
+ setter: {
207
+ componentName: 'CollapseSetter',
208
+ props: {
209
+ icon: false,
210
+ },
211
+ },
212
+ items: [
213
+ {
214
+ name: 'progressBarColors',
215
+ title: '进度条颜色',
216
+ setter: 'ColorSetter',
217
+ extraProps: {
218
+ defaultValue: ['#00d4ff', '#9b59b6'],
219
+ },
220
+ },
221
+ {
222
+ name: 'nameColor',
223
+ title: '名称颜色',
224
+ setter: 'ColorSetter',
225
+ extraProps: {
226
+ defaultValue: '#e6e6e6',
227
+ },
228
+ },
229
+ {
230
+ name: 'valueColor',
231
+ title: '数值颜色',
232
+ setter: 'ColorSetter',
233
+ extraProps: {
234
+ defaultValue: '#00d4ff',
235
+ },
236
+ },
237
+ {
238
+ name: 'backgroundColor',
239
+ title: '背景颜色',
240
+ setter: 'ColorSetter',
241
+ extraProps: {
242
+ defaultValue: 'rgba(10, 10, 26, 0.95)',
243
+ },
244
+ },
245
+ {
246
+ name: 'borderColor',
247
+ title: '边框颜色',
248
+ setter: 'ColorSetter',
249
+ extraProps: {
250
+ defaultValue: 'rgba(26, 26, 62, 0.8)',
251
+ },
252
+ },
253
+ {
254
+ name: 'itemBackgroundColor',
255
+ title: '行背景颜色',
256
+ setter: 'ColorSetter',
257
+ extraProps: {
258
+ defaultValue: 'rgba(15, 15, 42, 0.9)',
259
+ },
260
+ },
261
+ {
262
+ name: 'itemBorderColor',
263
+ title: '行边框颜色',
264
+ setter: 'ColorSetter',
265
+ extraProps: {
266
+ defaultValue: 'rgba(26, 26, 62, 0.6)',
267
+ },
268
+ },
269
+ ],
270
+ },
271
+ ],
272
+ },
273
+ {
274
+ type: 'group',
275
+ key: 'data',
276
+ title: '数据',
277
+ items: [
278
+ {
279
+ name: 'dataBinding',
280
+ title: '数据绑定',
281
+ setter: 'DataBindingSetter',
282
+ },
283
+ ],
284
+ },
285
+ {
286
+ type: 'group',
287
+ key: 'advanced',
288
+ title: '高级',
289
+ items: [
290
+ {
291
+ name: 'condition',
292
+ title: '显隐控制',
293
+ setter: 'SwitchSetter',
294
+ extraProps: {
295
+ defaultValue: true,
296
+ supportVariable: true,
297
+ },
298
+ },
299
+ {
300
+ type: 'group',
301
+ title: '滚动配置',
302
+ setter: {
303
+ componentName: 'CollapseSetter',
304
+ props: {
305
+ icon: false,
306
+ },
307
+ },
308
+ items: [
309
+ {
310
+ name: 'scrollEnable',
311
+ title: '启用滚动',
312
+ setter: 'SwitchSetter',
313
+ extraProps: {
314
+ defaultValue: true,
315
+ },
316
+ },
317
+ {
318
+ name: 'scrollDirection',
319
+ title: '滚动方向',
320
+ setter: {
321
+ componentName: 'SegmentedSetter',
322
+ props: {
323
+ options: [
324
+ { label: '向上', value: 'up' },
325
+ { label: '向下', value: 'down' },
326
+ ],
327
+ },
328
+ },
329
+ extraProps: {
330
+ defaultValue: 'up',
331
+ },
332
+ },
333
+ {
334
+ name: 'scrollSpeed',
335
+ title: '滚动速度',
336
+ setter: {
337
+ componentName: 'SliderSetter',
338
+ props: {
339
+ min: 1,
340
+ max: 10,
341
+ step: 1,
342
+ suffix: 'x',
343
+ },
344
+ },
345
+ extraProps: {
346
+ defaultValue: 3,
347
+ },
348
+ },
349
+ {
350
+ name: 'hoverPause',
351
+ title: '悬停暂停',
352
+ setter: 'SwitchSetter',
353
+ extraProps: {
354
+ defaultValue: true,
355
+ },
356
+ },
357
+ {
358
+ name: 'scrollInterval',
359
+ title: '滚动间隔',
360
+ setter: {
361
+ componentName: 'SliderSetter',
362
+ props: {
363
+ min: 1000,
364
+ max: 10_000,
365
+ step: 500,
366
+ suffix: 'ms',
367
+ },
368
+ },
369
+ extraProps: {
370
+ defaultValue: 3000,
371
+ },
372
+ },
373
+ ],
374
+ },
375
+ {
376
+ type: 'group',
377
+ title: '动画',
378
+ setter: {
379
+ componentName: 'CollapseSetter',
380
+ props: {
381
+ icon: false,
382
+ },
383
+ },
384
+ items: [
385
+ {
386
+ name: 'animationEnable',
387
+ title: '启用动画',
388
+ setter: 'SwitchSetter',
389
+ extraProps: {
390
+ defaultValue: true,
391
+ },
392
+ },
393
+ {
394
+ name: 'animationDuration',
395
+ title: '动画时长',
396
+ setter: {
397
+ componentName: 'SliderSetter',
398
+ props: {
399
+ min: 0,
400
+ max: 2000,
401
+ step: 100,
402
+ suffix: 'ms',
403
+ },
404
+ },
405
+ extraProps: {
406
+ defaultValue: 500,
407
+ },
408
+ },
409
+ {
410
+ name: 'animationEasing',
411
+ title: '缓动函数',
412
+ setter: {
413
+ componentName: 'SelectSetter',
414
+ props: {
415
+ options: [
416
+ { label: '线性', value: 'linear' },
417
+ { label: '缓入', value: 'ease-in' },
418
+ { label: '缓出', value: 'ease-out' },
419
+ { label: '缓入缓出', value: 'ease-in-out' },
420
+ ],
421
+ },
422
+ },
423
+ extraProps: {
424
+ defaultValue: 'ease-out',
425
+ },
426
+ },
427
+ ],
428
+ },
429
+ ],
430
+ },
431
+ ],
432
+ },
433
+ ],
434
+ component: {},
435
+ supports: {},
436
+ advanced: {},
437
+ }
438
+
439
+ export default configure
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 物料常量配置
3
+ * 统一管理全局变量名等配置,确保 meta.ts 和 rollup.config.js 使用相同的值
4
+ */
5
+
6
+ /**
7
+ * UMD 全局变量基础名称
8
+ * 用于构建:
9
+ * - 元数据:${GLOBAL_NAME}Meta (例如: EasyEditorMaterialsRankingListMeta)
10
+ * - 组件:${GLOBAL_NAME}Component (例如: EasyEditorMaterialsRankingListComponent)
11
+ * - 完整构建:${GLOBAL_NAME} (例如: EasyEditorMaterialsRankingList)
12
+ */
13
+ export const COMPONENT_NAME = 'EasyEditorMaterialsScrollList'
14
+
15
+ /**
16
+ * 包名
17
+ */
18
+ export const PACKAGE_NAME = '@easy-editor/materials-dashboard-scroll-list'
package/src/index.tsx ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Scroll List Entry
3
+ * 滚动列表组件入口
4
+ */
5
+
6
+ export { ScrollList as component } from './component'
7
+ export { default as meta } from './meta'
package/src/meta.ts ADDED
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Scroll List Meta
3
+ * 滚动列表组件元数据
4
+ */
5
+
6
+ import type { ComponentMetadata } from '@easy-editor/core'
7
+ import { MaterialGroup } from '@easy-editor/materials-shared'
8
+ import { COMPONENT_NAME, PACKAGE_NAME } from './constants'
9
+ import configure from './configure'
10
+ import snippets from './snippets'
11
+ import pkg from '../package.json'
12
+
13
+ export const meta: ComponentMetadata = {
14
+ componentName: COMPONENT_NAME,
15
+ title: '滚动列表',
16
+ group: MaterialGroup.DISPLAY,
17
+ devMode: 'proCode',
18
+ npm: {
19
+ package: PACKAGE_NAME,
20
+ version: pkg.version,
21
+ globalName: COMPONENT_NAME,
22
+ componentName: COMPONENT_NAME,
23
+ },
24
+ snippets,
25
+ configure,
26
+ }
27
+
28
+ export default meta