plain-design 1.0.0-beta.22 → 1.0.0-beta.24

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 (26) hide show
  1. package/dist/plain-design.commonjs.min.js +2 -2
  2. package/dist/plain-design.min.css +1 -0
  3. package/dist/plain-design.min.js +2 -2
  4. package/dist/report.html +5 -5
  5. package/package.json +3 -3
  6. package/src/packages/components/CascadePanel/list/CascadeListPanelItem.tsx +3 -3
  7. package/src/packages/components/Select/createPublicSelectRender.tsx +1 -1
  8. package/src/packages/components/Table/standard/PlcExpand.tsx +12 -20
  9. package/src/packages/components/Table/table/Table.tsx +10 -3
  10. package/src/packages/components/Table/table/utils/createTableHooks.ts +3 -1
  11. package/src/packages/components/Table/table/utils/table.utils.ts +6 -1
  12. package/src/packages/components/ThemeEditor/index.tsx +160 -0
  13. package/src/packages/components/ThemeEditor/theme-editor.scss +94 -0
  14. package/src/packages/components/Tree/RenderTreeNode.tsx +1 -1
  15. package/src/packages/components/Tree/index.tsx +3 -3
  16. package/src/packages/components/VirtualList/index.tsx +3 -3
  17. package/src/packages/components/VirtualList/useVirtualList.tsx +46 -47
  18. package/src/packages/components/VirtualTable/index.tsx +4 -4
  19. package/src/packages/entry.tsx +1 -0
  20. package/src/pages/index/Demo/DemoRow.scss +9 -6
  21. package/src/pages/index/Demo/DemoRowController.tsx +2 -2
  22. package/src/pages/index/components/normal/DemoDropdown.tsx +1 -1
  23. package/src/pages/index/components/normal/DemoVirtualList.tsx +9 -9
  24. package/src/pages/index/components/table/DemoTableExpand.tsx +41 -19
  25. package/src/pages/index/components/table/DemoVirtualTable.tsx +4 -4
  26. package/src/pages/index/home/AppHead.tsx +3 -90
@@ -1,4 +1,4 @@
1
- import {computed, getComponentCls, onMounted, onUpdated, reactive, useClasses, useStyles, watch} from "plain-design-composition";
1
+ import {computed, createCounter, getComponentCls, onMounted, onUpdated, reactive, useClasses, useStyles, watch} from "plain-design-composition";
2
2
  import {delay} from "plain-utils/utils/delay";
3
3
  import './virtual-list.scss';
4
4
  import Scroll from "../Scroll";
@@ -9,13 +9,15 @@ interface DataNode {
9
9
  top: number;
10
10
  bottom: number;
11
11
  height: number;
12
-
13
- data: any;
14
- index: number;
12
+ item: any;
13
+ id: string;
14
+ index: number,
15
15
  }
16
16
 
17
17
  const ScrollDirection = createEnum(['up', 'down', 'none'] as const);
18
18
 
19
+ const nextRowId = createCounter('__v__');
20
+
19
21
  export function useVirtualList(
20
22
  {
21
23
  props,
@@ -53,10 +55,30 @@ export function useVirtualList(
53
55
  };
54
56
  /*响应式属性*/
55
57
  const state = reactive({
56
- nodes: [] as DataNode[], // 格式化的data数组数据
57
58
  scrollTop: 0, // 当前滚动scrollTop(非实时的)
58
59
  pageSize: 0, // 页大小
59
60
  scrollDirection: ScrollDirection.none as typeof ScrollDirection.TYPE,
61
+ id2height: {} as Record<string, number | undefined>,
62
+ avgHeight: props.size
63
+ });
64
+
65
+ const idMap = new WeakMap<object, string>();
66
+ let prevBottom = 0;
67
+
68
+ const nodes = computed(() => {
69
+ prevBottom = 0;
70
+ return props.data.map((item, index): DataNode => {
71
+ let id = idMap.get(item);
72
+ if (!id) {
73
+ id = nextRowId();
74
+ idMap.set(item, id);
75
+ }
76
+ const height: number = state.id2height[id] || state.avgHeight;
77
+ let top = prevBottom;
78
+ let bottom = top + height;
79
+ prevBottom = bottom;
80
+ return { id: id!, item, height, top, bottom, index };
81
+ });
60
82
  });
61
83
 
62
84
  /**
@@ -64,22 +86,21 @@ export function useVirtualList(
64
86
  * @author 韦胜健
65
87
  * @date 2020/11/15 9:28
66
88
  */
67
- const offsetData = computed((): { list: { item: any, index: number }[], startPageIndex: number, start: number } => {
89
+ const offsetData = computed((): { list: { item: any, id: string, index: number }[], startPageIndex: number, start: number } => {
68
90
  const { pageSize, scrollTop } = state;
69
- const data = props.data || [];
70
91
  if (!pageSize) {
71
92
  return { list: [], startPageIndex: 0, start: 0 };
72
93
  }
73
94
  if (props.disabled) {
74
95
  return {
75
- list: data.map((item, index) => ({ item, index })),
96
+ list: nodes.value,
76
97
  start: 0,
77
98
  startPageIndex: 0,
78
99
  };
79
100
  }
80
101
  const { start, end, pageIndex } = utils.getPageIndex(scrollTop, pageSize);
81
102
  return {
82
- list: data.map((item, index) => ({ item, index })).slice(start, end),
103
+ list: nodes.value.slice(start, end),
83
104
  startPageIndex: pageIndex,
84
105
  start,
85
106
  };
@@ -116,7 +137,7 @@ export function useVirtualList(
116
137
  if (!props.dynamicSize) {
117
138
  style.height = `${(props.data || []).length * props.size}px`;
118
139
  } else {
119
- style.height = `${state.nodes[state.nodes.length - 1].bottom}px`;
140
+ style.height = `${nodes.value[nodes.value.length - 1].bottom}px`;
120
141
  }
121
142
  });
122
143
 
@@ -140,7 +161,7 @@ export function useVirtualList(
140
161
  if (!props.dynamicSize) {
141
162
  top = start * props.size;
142
163
  } else {
143
- top = state.nodes[start].top;
164
+ top = nodes.value[start].top;
144
165
  }
145
166
 
146
167
  if (transform !== false) {
@@ -165,13 +186,13 @@ export function useVirtualList(
165
186
  // console.log('not dynamic》》》getIndex', top / props.size)
166
187
  return Math.floor(top / props.size);
167
188
  } else {
168
- const { nodes } = state;
189
+ const _nodes = nodes.value;
169
190
  let start = 0;
170
- let end = nodes.length - 1;
191
+ let end = _nodes.length - 1;
171
192
  let temp = 0;
172
193
  while (start <= end) {
173
194
  let middle = Math.floor((start + end) / 2);
174
- let middleBottom = nodes[middle].bottom;
195
+ let middleBottom = _nodes[middle].bottom;
175
196
  if (middleBottom === top) {
176
197
  return middle + 1;
177
198
  } else if (middleBottom < top) {
@@ -240,21 +261,6 @@ export function useVirtualList(
240
261
  pageIndex,
241
262
  };
242
263
  },
243
- /**
244
- * 格式化props.data为 DataNode数组
245
- * @author 韦胜健
246
- * @date 2020/11/15 9:29
247
- */
248
- resetData: (data: any[]) => {
249
- // console.log('resetData')
250
- state.nodes = data.map((item, index) => ({
251
- data: item,
252
- index,
253
- top: props.size * index,
254
- height: props.size,
255
- bottom: props.size * (index + 1),
256
- }));
257
- }
258
264
  };
259
265
 
260
266
  /*---------------------------------------handler-------------------------------------------*/
@@ -282,9 +288,7 @@ export function useVirtualList(
282
288
  if (!props.dynamicSize) {
283
289
  return;
284
290
  }
285
- !!refs.scroll && refs.scroll.methods.scrollTop(0, 0);
286
- /*如果是动态高度,则刷state.nodes*/
287
- utils.resetData(data);
291
+ // !!refs.scroll && refs.scroll.methods.scrollTop(0, 0);
288
292
  });
289
293
 
290
294
  onMounted(() => {
@@ -299,9 +303,6 @@ export function useVirtualList(
299
303
  }
300
304
 
301
305
  state.pageSize = Math.floor(hostHeight / props.size);
302
- if (props.dynamicSize && !props.disabled) {
303
- utils.resetData(props.data);
304
- }
305
306
  });
306
307
 
307
308
  onUpdated(async () => {
@@ -313,7 +314,9 @@ export function useVirtualList(
313
314
  }
314
315
  await delay();
315
316
  // console.log('dynamic scan height')
316
- const elNodes = (Array.from(refs.content!.childNodes || []) as HTMLElement[]).filter(node => node.nodeType !== 3);
317
+ const elNodes = (refs.content?.querySelectorAll('[data-vid],[vid]') || []) as HTMLElement[];
318
+ let newAvgHeight = state.avgHeight;
319
+
317
320
  for (let i = 0; i < elNodes.length; i++) {
318
321
  const el = elNodes[i];
319
322
  const { offsetHeight: height } = el;
@@ -321,19 +324,15 @@ export function useVirtualList(
321
324
  if (vid == null) {
322
325
  throw new Error('Each item of the virtual-list must have an attribute named "vid", please set :vid="index" or :data-vid="index"');
323
326
  }
324
- vid = Number(vid);
325
- const prevNode = state.nodes[vid];
326
- const prevHeight = prevNode.height;
327
- let deltaHeight = prevHeight - height;
328
- if (deltaHeight !== 0) {
329
- prevNode.height = height;
330
- prevNode.bottom = prevNode.bottom - deltaHeight;
331
- for (let j = vid + 1; j < state.nodes!.length; j++) {
332
- state.nodes![j].top = state.nodes![j - 1].bottom;
333
- state.nodes![j].bottom = state.nodes![j].bottom - deltaHeight;
334
- }
327
+ if (state.id2height[vid] != height) {
328
+ state.id2height[vid] = height;
329
+ newAvgHeight = Number(((state.avgHeight + height) / 2).toFixed(0));
335
330
  }
336
331
  }
332
+
333
+ if (newAvgHeight != state.avgHeight) {
334
+ state.avgHeight = newAvgHeight;
335
+ }
337
336
  });
338
337
 
339
338
  return {
@@ -29,7 +29,7 @@ export const VirtualTable = designComponent({
29
29
  },
30
30
  slots: ['colgroup', 'head', 'headColgroup'],
31
31
  scopeSlots: {
32
- default: (scope: { item: any, index: number, virtualIndex: number }) => {},
32
+ default: (scope: { item: any, index: number, vIndex: number, vid: string }) => {},
33
33
  },
34
34
  setup({ props, slots, scopeSlots, event: { emit } }) {
35
35
 
@@ -70,7 +70,7 @@ export const VirtualTable = designComponent({
70
70
  const strutStyles = useStyles(style => {
71
71
  Object.assign(style, virtual.strutStyles.value);
72
72
  !!props.width && (style.width = unit(props.width));
73
- style.minHeight = bodyTableWrapperStyles.value.minHeight
73
+ style.minHeight = bodyTableWrapperStyles.value.minHeight;
74
74
  });
75
75
 
76
76
  const contentStyles = useStyles(style => {
@@ -168,7 +168,7 @@ export const VirtualTable = designComponent({
168
168
  <div className="virtual-table-body-table-wrapper" ref={onRef.body} style={bodyTableWrapperStyles.value}>
169
169
  <table className="virtual-table-body-table" {...{ ...PublicTableAttrs, style: tableStyles.value }}>
170
170
  {slots.colgroup()}
171
- <tbody>{list.map((node, virtualIndex) => scopeSlots.default({ ...node, virtualIndex }))}</tbody>
171
+ <tbody>{list.map((item, vIndex) => scopeSlots.default({ ...item, vIndex, vid: item.id }))}</tbody>
172
172
  </table>
173
173
  </div>
174
174
  </div>
@@ -177,7 +177,7 @@ export const VirtualTable = designComponent({
177
177
  <div className="virtual-table-summary-table-wrapper" ref={onRef.summary}>
178
178
  <table className="virtual-table-summary-table" style={summaryTableStyles.value}{...PublicTableAttrs} data-virtual-foot>
179
179
  {slots.colgroup()}
180
- <tbody>{!props.summaryData ? null : props.summaryData.map((item, index) => scopeSlots.default({ item, index, virtualIndex: index }))}</tbody>
180
+ <tbody>{!props.summaryData ? null : props.summaryData.map((item, index) => scopeSlots.default({ item, index, vIndex: index, vid: `__smy__${index}` }))}</tbody>
181
181
  </table>
182
182
  </div>
183
183
  )}
@@ -189,6 +189,7 @@ export type {
189
189
  } from './components/AutoTable/use/useTableOption.cache.utils';
190
190
  export {PageThemeUtils} from './components/PageThemeUtils';
191
191
  export {ThemePrimaryColors} from './components/ThemePrimaryColors';
192
+ export {ThemeEditor} from './components/ThemeEditor';
192
193
  export {useReferenceTrigger} from './components/useReferenceTrigger';
193
194
  export {usePopupTrigger} from './components/usePopupTrigger';
194
195
  export {useWatchAutoClear} from './components/useWatchAutoClear';
@@ -93,8 +93,8 @@
93
93
 
94
94
  .demo-row-collector-operator {
95
95
  position: fixed;
96
- bottom: 20px;
97
- right: 20px;
96
+ bottom: 8px;
97
+ right: 0;
98
98
  display: flex;
99
99
  align-items: center;
100
100
 
@@ -105,16 +105,19 @@
105
105
  font-size: 12px;
106
106
  cursor: pointer;
107
107
  color: plv(text-2);
108
+ display: flex;
109
+ align-items: center;
108
110
 
109
111
  &:first-child {
110
112
  border-right: none;
111
- border-bottom-left-radius: 2px;
112
- border-top-left-radius: 2px;
113
+ border-bottom-left-radius: plv(box-size-normal-border-radius);
114
+ border-top-left-radius: plv(box-size-normal-border-radius);
113
115
  }
114
116
 
115
117
  &:last-child {
116
- border-bottom-right-radius: 2px;
117
- border-top-right-radius: 2px;
118
+ border-bottom-right-radius: 0;
119
+ border-top-right-radius: 0;
120
+ border-right: none;
118
121
  }
119
122
 
120
123
  & > span {
@@ -26,11 +26,11 @@ export const DemoRowController = designComponent({
26
26
  <div className="demo-row-collector-operator">
27
27
  <div onClick={() => methods.changeAll(false)}>
28
28
  <span>全部收起</span>
29
- <Icon icon="pi-left" style={{ transform: 'rotate(-90deg)' }}/>
29
+ <Icon icon="pi-fullscreen-exit"/>
30
30
  </div>
31
31
  <div onClick={() => methods.changeAll(true)}>
32
32
  <span>全部展开</span>
33
- <Icon icon="pi-left" style={{ transform: 'rotate(90deg)' }}/>
33
+ <Icon icon="pi-fullscreen"/>
34
34
  </div>
35
35
  </div>
36
36
  </>
@@ -432,7 +432,7 @@ export const demoDropdownScroll = designPage(() => {
432
432
 
433
433
  export const demoDropdownVirtualList = designPage(() => {
434
434
 
435
- const options = new Array(10000).fill({});
435
+ const options = new Array(1000).fill({});
436
436
 
437
437
  return () => (
438
438
  <DemoRow title="虚拟滚动,长列表">
@@ -1,4 +1,4 @@
1
- import {computed, designPage, getComponentCls, classnames,reactive} from "plain-design-composition";
1
+ import {computed, designPage, getComponentCls, classnames, reactive} from "plain-design-composition";
2
2
  import data2 from '../../../data/data-2.json';
3
3
  import {DemoRow} from "../../Demo/DemoRow";
4
4
  import {Alert, ApplicationConfigurationProvider, Checkbox, VirtualList} from "../../../../packages";
@@ -11,7 +11,7 @@ export const demo1 = designPage(() => {
11
11
  if (colors.length === 0) {colors = [...sourceColors];}
12
12
  const palette = colors.splice(Math.floor(Math.random() * colors.length), 1);
13
13
  const backgroundColor = `var(--${getComponentCls(`${palette}-1`)})`;
14
- const color = `var(--${getComponentCls(`${palette}-6`)})`
14
+ const color = `var(--${getComponentCls(`${palette}-6`)})`;
15
15
  return { backgroundColor, color };
16
16
  };
17
17
  const list = computed(() => data2.slice(0, 188).map(item => ({ ...item, color: getRandomColor() })));
@@ -91,7 +91,7 @@ export const demo2 = designPage(() => {
91
91
  if (colors.length === 0) {colors = [...sourceColors];}
92
92
  const palette = colors.splice(Math.floor(Math.random() * colors.length), 1);
93
93
  const backgroundColor = `var(--${getComponentCls(`${palette}-1`)})`;
94
- const color = `var(--${getComponentCls(`${palette}-6`)})`
94
+ const color = `var(--${getComponentCls(`${palette}-6`)})`;
95
95
  return { backgroundColor, color };
96
96
  };
97
97
  const list = computed(() => data2.slice(0, 188).map(item => ({ ...item, color: getRandomColor() })));
@@ -100,11 +100,11 @@ export const demo2 = designPage(() => {
100
100
  <DemoRow title={'动态高度'}>
101
101
  <div style={{ width: '300px', height: '400px', backgroundColor: '#f6f6f6' }}>
102
102
  <VirtualList data={list.value} size={60} dynamicSize v-slots={{
103
- default: ({ item, index }) => (
103
+ default: ({ item, vid, index, vIndex }) => (
104
104
  <div
105
- key={index}
106
- data-vid={index}
107
- onClick={() => console.log(index, { ...item })}
105
+ key={vIndex}
106
+ data-vid={vid}
107
+ onClick={() => console.log(vid, { ...item })}
108
108
  style={{
109
109
  ...item.color,
110
110
  height: item.size + 'px',
@@ -165,7 +165,7 @@ export const demo3 = designPage(() => {
165
165
  if (colors.length === 0) {colors = [...sourceColors];}
166
166
  const palette = colors.splice(Math.floor(Math.random() * colors.length), 1);
167
167
  const backgroundColor = `var(--${getComponentCls(`${palette}-1`)})`;
168
- const color = `var(--${getComponentCls(`${palette}-6`)})`
168
+ const color = `var(--${getComponentCls(`${palette}-6`)})`;
169
169
  return { backgroundColor, color };
170
170
  };
171
171
  const list = computed(() => data2.map(item => ({ ...item, color: getRandomColor() })));
@@ -250,7 +250,7 @@ export const demo4 = designPage(() => {
250
250
  if (colors.length === 0) {colors = [...sourceColors];}
251
251
  const palette = colors.splice(Math.floor(Math.random() * colors.length), 1);
252
252
  const backgroundColor = `var(--${getComponentCls(`${palette}-1`)})`;
253
- const color = `var(--${getComponentCls(`${palette}-6`)})`
253
+ const color = `var(--${getComponentCls(`${palette}-6`)})`;
254
254
  return { backgroundColor, color };
255
255
  };
256
256
  const list = computed(() => data2.map(item => ({ ...item, color: getRandomColor() })));
@@ -8,7 +8,19 @@ import {ColorPicker, DatePicker, Form, FormItem, Input, InputNumber, Plc, PlcExp
8
8
  export const demoExpand = designPage(() => {
9
9
 
10
10
  const state = reactive({
11
- data,
11
+ data: data.map((item) => {
12
+ return {
13
+ ...item,
14
+ children: new Array(Math.ceil(Math.random() * 5 + 2)).fill(null).map((_, index) => {
15
+ return {
16
+ id: index,
17
+ date: item.date,
18
+ name: item.name + `_${index + 1}`,
19
+ address: item.addr,
20
+ };
21
+ })
22
+ };
23
+ }),
12
24
  });
13
25
 
14
26
  const summaryData = deepcopy(data.slice(0, 2));
@@ -19,6 +31,8 @@ export const demoExpand = designPage(() => {
19
31
  data={state.data}
20
32
  summaryData={summaryData}
21
33
  virtual
34
+ virtualRowType="realIndex"
35
+ dynamicSize
22
36
  showRows={10}
23
37
  >
24
38
  <PlcIndex/>
@@ -27,14 +41,12 @@ export const demoExpand = designPage(() => {
27
41
  v-slots={{
28
42
  expand: ({ row }) => {
29
43
  return (
30
- <div style={{ padding: '12px' }}>
31
- <Form column={1} disabled key={row.id}>
32
- <FormItem label={'普通文本'}>{row.name}</FormItem>
33
- <FormItem label={'输入框'}><Input disabled={false} v-model={row.name}/></FormItem>
34
- <FormItem label={'数字'}><InputNumber v-model={row.size}/></FormItem>
35
- <FormItem label={'日期'}><DatePicker v-model={row.date}/></FormItem>
36
- <FormItem label={'颜色'}><ColorPicker v-model={row.color}/></FormItem>
37
- </Form>
44
+ <div style={{ padding: '20px' }}>
45
+ <Table data={row.children} showRows="auto" size="small">
46
+ <Plc title="名称" field="name"/>
47
+ <Plc title="日期" field="date"/>
48
+ <Plc title="地址" field="address"/>
49
+ </Table>
38
50
  </div>
39
51
  );
40
52
  }
@@ -68,7 +80,19 @@ export const demoExpand = designPage(() => {
68
80
  export const demoExpandVirtualCOlumn = designPage(() => {
69
81
 
70
82
  const state = reactive({
71
- data,
83
+ data: data.map((item) => {
84
+ return {
85
+ ...item,
86
+ children: new Array(Math.ceil(Math.random() * 5 + 2)).fill(null).map((_, index) => {
87
+ return {
88
+ id: index,
89
+ date: item.date,
90
+ name: item.name + `_${index + 1}`,
91
+ address: item.addr,
92
+ };
93
+ })
94
+ };
95
+ }),
72
96
  });
73
97
 
74
98
  const summaryData = deepcopy(data.slice(0, 2));
@@ -80,23 +104,21 @@ export const demoExpandVirtualCOlumn = designPage(() => {
80
104
  summaryData={summaryData}
81
105
  virtual
82
106
  showRows={10}
107
+ dynamicSize
83
108
  virtualColumn
84
109
  >
85
110
  <PlcIndex/>
86
111
  <PlcExpand
87
- toggleOnClickRow
88
112
  fixedWidth
89
113
  v-slots={{
90
114
  expand: ({ row }) => {
91
115
  return (
92
- <div style={{ padding: '12px' }}>
93
- <Form column={1} disabled key={row.id}>
94
- <FormItem label={'普通文本'}>{row.name}</FormItem>
95
- <FormItem label={'输入框'}><Input disabled={false} v-model={row.name}/></FormItem>
96
- <FormItem label={'数字'}><InputNumber v-model={row.size}/></FormItem>
97
- <FormItem label={'日期'}><DatePicker v-model={row.date}/></FormItem>
98
- <FormItem label={'颜色'}><ColorPicker v-model={row.color}/></FormItem>
99
- </Form>
116
+ <div style={{ padding: '20px' }}>
117
+ <Table data={row.children} showRows="auto" size="small">
118
+ <Plc title="名称" field="name"/>
119
+ <Plc title="日期" field="date"/>
120
+ <Plc title="地址" field="address"/>
121
+ </Table>
100
122
  </div>
101
123
  );
102
124
  }
@@ -69,8 +69,8 @@ export const demo1 = designPage(() => {
69
69
  </tr>
70
70
  ))
71
71
  ),
72
- default: ({ item, index, virtualIndex }) => (
73
- <tr key={virtualIndex} {...{ vid: index } as any} style={{ height: '40px', borderBottom: 'solid 1px #ececec', backgroundColor: "item.color" }}>
72
+ default: ({ item, vid, vIndex }) => (
73
+ <tr key={vIndex} data-vid={vid} style={{ height: '40px', borderBottom: 'solid 1px #ececec', backgroundColor: "item.color" }}>
74
74
  {Object.keys(DATA[0] as any).map((key: string) => (
75
75
  <td key={key}>{(item as any)[key]}</td>
76
76
  ))}
@@ -104,8 +104,8 @@ export const demo1 = designPage(() => {
104
104
  </tr>
105
105
  ))
106
106
  ),
107
- default: ({ item, index, virtualIndex }) => (
108
- <tr key={virtualIndex} {...{ vid: index } as any} style={{ height: '40px', borderBottom: 'solid 1px #ececec', backgroundColor: "item.color" }}>
107
+ default: ({ item, vIndex, vid }) => (
108
+ <tr key={vIndex} data-vid={vid} style={{ height: '40px', borderBottom: 'solid 1px #ececec', backgroundColor: "item.color" }}>
109
109
  {Object.keys(DATA[0] as any).map((key: string) => (
110
110
  <td key={key}>{(item as any)[key]}</td>
111
111
  ))}
@@ -1,48 +1,9 @@
1
- import {designPage, reactive} from "plain-design-composition";
1
+ import {designPage} from "plain-design-composition";
2
2
  import {PlainLogo} from 'plain-icons/src/packages/component/logo/react';
3
- import {PageThemeUtils, Select, SelectOption, ThemePrimaryColors} from "../../../packages";
4
- import ClientZoom from "../../../packages/components/ClientZoom";
5
3
  import logoImage from './plain-design.png';
4
+ import {ThemeEditor} from "../../../packages/components/ThemeEditor";
6
5
 
7
6
  export const AppHead = designPage(() => {
8
-
9
- const state = reactive({
10
- size: PageThemeUtils.state.size || 'normal',
11
- dark: PageThemeUtils.state.dark ? 'dark' : 'light',
12
- shape: PageThemeUtils.state.shape || 'square',
13
- zoom: PageThemeUtils.state.zoom || null,
14
- primaryKey: PageThemeUtils.state.primaryKey as string || 'default',
15
- inputMode: PageThemeUtils.state.inputMode || 'flat',
16
- });
17
-
18
- const onSizeChange = () => {
19
- PageThemeUtils.size(state.size);
20
- };
21
-
22
- const onShapeChange = () => {
23
- PageThemeUtils.shape(state.shape);
24
- };
25
-
26
- const onZoomChange = () => {
27
- PageThemeUtils.zoom(state.zoom);
28
- ClientZoom.set(state.zoom);
29
- };
30
-
31
- const onDarkChange = () => {
32
- const val = !state.dark ? false : state.dark === 'dark';
33
- PageThemeUtils.toggle(val);
34
- };
35
-
36
- const onPrimaryChange = () => {
37
- PageThemeUtils.primary(state.primaryKey);
38
- };
39
-
40
- const onInputModeChange = () => {
41
- PageThemeUtils.inputMode(state.inputMode);
42
- };
43
-
44
- const publicPopperAttrs = { trigger: 'hover' };
45
-
46
7
  return () => (
47
8
  <div className="app-head">
48
9
  <div className="app-head-logo">
@@ -50,55 +11,7 @@ export const AppHead = designPage(() => {
50
11
  <img src={logoImage}/>
51
12
  </div>
52
13
  <div className="app-head-operation">
53
- <Select v-model={state.inputMode} onChange={onInputModeChange} size="mini" width="100" placeholder="输入框" popperAttrs={publicPopperAttrs}>
54
- <SelectOption label="输入框:填充" val="flat"/>
55
- <SelectOption label="输入框:描边" val="stroke"/>
56
- </Select>
57
- &nbsp;
58
- <Select v-model={state.primaryKey} onChange={onPrimaryChange} size="mini" width="90" placeholder="主题色" popperAttrs={publicPopperAttrs}>
59
- {Object.entries(ThemePrimaryColors).map(([key, value]) => (
60
- <SelectOption label={value!.label} val={key} key={key}>
61
- {!!value!.primary && <span style={{ height: '1em', width: '1em', display: 'inline-block', marginRight: '4px', background: value!.primary }}/>}
62
- <span>{value!.label}</span>
63
- </SelectOption>
64
- ))}
65
- </Select>
66
- &nbsp;
67
- <Select v-model={state.size} onChange={onSizeChange} size="mini" width="90" placeholder="主题尺寸" popperAttrs={publicPopperAttrs}>
68
- <SelectOption label="大尺寸" val="large"/>
69
- <SelectOption label="中等尺寸" val="normal"/>
70
- <SelectOption label="小尺寸" val="small"/>
71
- <SelectOption label="极小尺寸" val="mini"/>
72
- </Select>
73
- &nbsp;
74
- <Select v-model={state.dark} onChange={onDarkChange} size="mini" width="90" placeholder="黑白主题" popperAttrs={publicPopperAttrs}>
75
- <SelectOption label="黑色主题" val="dark"/>
76
- <SelectOption label="白色主题" val="light"/>
77
- </Select>
78
- &nbsp;
79
- <Select v-model={state.shape} onChange={onShapeChange} size="mini" width="90" placeholder="圆角类型" popperAttrs={publicPopperAttrs}>
80
- <SelectOption label="圆角" val="round"/>
81
- <SelectOption label="小圆角" val="square"/>
82
- <SelectOption label="无圆角" val="none"/>
83
- </Select>
84
- &nbsp;
85
- <Select v-model={state.zoom} onChange={onZoomChange} size="mini" width="90" placeholder="页面缩放" popperAttrs={publicPopperAttrs}>
86
- <SelectOption label="0.6" val={0.6}/>
87
- <SelectOption label="0.7" val={0.7}/>
88
- <SelectOption label="0.8" val={0.8}/>
89
- <SelectOption label="0.9" val={0.9}/>
90
- <SelectOption label="1.0" val={null}/>
91
- <SelectOption label="1.1" val={1.1}/>
92
- <SelectOption label="1.2" val={1.2}/>
93
- <SelectOption label="1.3" val={1.3}/>
94
- <SelectOption label="1.4" val={1.4}/>
95
- <SelectOption label="1.5" val={1.5}/>
96
- <SelectOption label="1.6" val={1.6}/>
97
- <SelectOption label="1.7" val={1.7}/>
98
- <SelectOption label="1.8" val={1.8}/>
99
- <SelectOption label="1.9" val={1.9}/>
100
- <SelectOption label="2.0" val={2.0}/>
101
- </Select>
14
+ <ThemeEditor/>
102
15
  </div>
103
16
  </div>
104
17
  );