@tmagic/editor 1.5.2 → 1.5.4

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 (89) hide show
  1. package/dist/style.css +366 -6
  2. package/dist/tmagic-editor.js +1749 -829
  3. package/dist/tmagic-editor.umd.cjs +1764 -843
  4. package/package.json +7 -7
  5. package/src/components/CodeBlockEditor.vue +3 -3
  6. package/src/components/CodeParams.vue +2 -2
  7. package/src/components/ContentMenu.vue +13 -13
  8. package/src/components/FloatingBox.vue +9 -9
  9. package/src/components/Resizer.vue +2 -2
  10. package/src/components/ScrollBar.vue +6 -7
  11. package/src/components/ScrollViewer.vue +6 -6
  12. package/src/components/SplitView.vue +3 -3
  13. package/src/fields/DataSourceInput.vue +3 -3
  14. package/src/fields/DataSourceMethods.vue +4 -4
  15. package/src/fields/DisplayConds.vue +2 -1
  16. package/src/fields/StyleSetter/Index.vue +69 -0
  17. package/src/fields/StyleSetter/components/BackgroundPosition.vue +71 -0
  18. package/src/fields/StyleSetter/components/Border.vue +104 -0
  19. package/src/fields/StyleSetter/components/Box.vue +73 -0
  20. package/src/fields/StyleSetter/components/Position.vue +54 -0
  21. package/src/fields/StyleSetter/icons/background-position/LeftBottom.vue +7 -0
  22. package/src/fields/StyleSetter/icons/background-position/LeftCenter.vue +7 -0
  23. package/src/fields/StyleSetter/icons/background-position/LeftTop.vue +12 -0
  24. package/src/fields/StyleSetter/icons/background-position/index.ts +3 -0
  25. package/src/fields/StyleSetter/icons/background-repeat/NoRepeat.vue +8 -0
  26. package/src/fields/StyleSetter/icons/background-repeat/Repeat.vue +31 -0
  27. package/src/fields/StyleSetter/icons/background-repeat/RepeatX.vue +8 -0
  28. package/src/fields/StyleSetter/icons/background-repeat/RepeatY.vue +8 -0
  29. package/src/fields/StyleSetter/icons/background-repeat/index.ts +4 -0
  30. package/src/fields/StyleSetter/icons/display/Block.vue +7 -0
  31. package/src/fields/StyleSetter/icons/display/Flex.vue +7 -0
  32. package/src/fields/StyleSetter/icons/display/Inline.vue +7 -0
  33. package/src/fields/StyleSetter/icons/display/InlineBlock.vue +7 -0
  34. package/src/fields/StyleSetter/icons/display/None.vue +7 -0
  35. package/src/fields/StyleSetter/icons/display/index.ts +5 -0
  36. package/src/fields/StyleSetter/icons/flex-direction/Column.vue +7 -0
  37. package/src/fields/StyleSetter/icons/flex-direction/ColumnReverse.vue +7 -0
  38. package/src/fields/StyleSetter/icons/flex-direction/Row.vue +7 -0
  39. package/src/fields/StyleSetter/icons/flex-direction/RowReverse.vue +7 -0
  40. package/src/fields/StyleSetter/icons/flex-direction/index.ts +4 -0
  41. package/src/fields/StyleSetter/icons/justify-content/Center.vue +5 -0
  42. package/src/fields/StyleSetter/icons/justify-content/FlexEnd.vue +5 -0
  43. package/src/fields/StyleSetter/icons/justify-content/FlexStart.vue +5 -0
  44. package/src/fields/StyleSetter/icons/justify-content/SpaceAround.vue +7 -0
  45. package/src/fields/StyleSetter/icons/justify-content/SpaceBetween.vue +5 -0
  46. package/src/fields/StyleSetter/icons/justify-content/index.ts +5 -0
  47. package/src/fields/StyleSetter/icons/text-align/Center.vue +7 -0
  48. package/src/fields/StyleSetter/icons/text-align/Left.vue +7 -0
  49. package/src/fields/StyleSetter/icons/text-align/Right.vue +7 -0
  50. package/src/fields/StyleSetter/icons/text-align/index.ts +3 -0
  51. package/src/fields/StyleSetter/pro/Background.vue +78 -0
  52. package/src/fields/StyleSetter/pro/Border.vue +35 -0
  53. package/src/fields/StyleSetter/pro/Font.vue +90 -0
  54. package/src/fields/StyleSetter/pro/Layout.vue +164 -0
  55. package/src/fields/StyleSetter/pro/Position.vue +48 -0
  56. package/src/fields/StyleSetter/pro/index.ts +5 -0
  57. package/src/hooks/use-code-block-edit.ts +5 -5
  58. package/src/index.ts +3 -0
  59. package/src/initService.ts +104 -66
  60. package/src/layouts/CodeEditor.vue +6 -6
  61. package/src/layouts/Framework.vue +5 -5
  62. package/src/layouts/NavMenu.vue +6 -3
  63. package/src/layouts/page-bar/PageBar.vue +13 -13
  64. package/src/layouts/page-bar/PageBarScrollContainer.vue +12 -11
  65. package/src/layouts/props-panel/FormPanel.vue +7 -7
  66. package/src/layouts/props-panel/PropsPanel.vue +36 -4
  67. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +3 -3
  68. package/src/layouts/sidebar/layer/LayerMenu.vue +2 -2
  69. package/src/layouts/sidebar/layer/LayerPanel.vue +5 -4
  70. package/src/layouts/sidebar/layer/use-click.ts +4 -6
  71. package/src/layouts/workspace/viewer/NodeListMenu.vue +5 -5
  72. package/src/layouts/workspace/viewer/Stage.vue +13 -13
  73. package/src/layouts/workspace/viewer/StageOverlay.vue +2 -2
  74. package/src/layouts/workspace/viewer/ViewerMenu.vue +3 -3
  75. package/src/services/componentList.ts +2 -2
  76. package/src/services/dep.ts +8 -2
  77. package/src/services/editor.ts +2 -2
  78. package/src/services/stageOverlay.ts +2 -2
  79. package/src/services/ui.ts +2 -2
  80. package/src/theme/props-panel.scss +13 -0
  81. package/src/theme/resizer.scss +2 -2
  82. package/src/theme/style-setter/background.scss +113 -0
  83. package/src/theme/style-setter/border.scss +53 -0
  84. package/src/theme/style-setter/index.scss +28 -0
  85. package/src/theme/style-setter/layout.scss +199 -0
  86. package/src/theme/theme.scss +1 -0
  87. package/src/utils/idle-task.ts +26 -10
  88. package/src/utils/props.ts +52 -297
  89. package/types/index.d.ts +432 -170
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.5.2",
2
+ "version": "1.5.4",
3
3
  "name": "@tmagic/editor",
4
4
  "type": "module",
5
5
  "sideEffects": [
@@ -58,11 +58,11 @@
58
58
  "moveable": "^0.53.0",
59
59
  "serialize-javascript": "^6.0.0",
60
60
  "sortablejs": "^1.15.2",
61
- "@tmagic/design": "1.5.2",
62
- "@tmagic/table": "1.5.2",
63
- "@tmagic/stage": "1.5.2",
64
- "@tmagic/utils": "1.5.2",
65
- "@tmagic/form": "1.5.2"
61
+ "@tmagic/design": "1.5.4",
62
+ "@tmagic/stage": "1.5.4",
63
+ "@tmagic/form": "1.5.4",
64
+ "@tmagic/table": "1.5.4",
65
+ "@tmagic/utils": "1.5.4"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@types/events": "^3.0.0",
@@ -83,7 +83,7 @@
83
83
  "monaco-editor": "^0.48.0",
84
84
  "typescript": "*",
85
85
  "vue": ">=3.5.0",
86
- "@tmagic/core": "1.5.2"
86
+ "@tmagic/core": "1.5.4"
87
87
  },
88
88
  "peerDependenciesMeta": {
89
89
  "typescript": {
@@ -104,14 +104,14 @@ const { height: codeBlockEditorHeight } = useEditorContentHeight();
104
104
  const difVisible = ref(false);
105
105
  const { rect: windowRect } = useWindowRect();
106
106
 
107
- const magicVsEditor = useTemplateRef<InstanceType<typeof CodeEditor>>('magicVsEditor');
107
+ const magicVsEditorRef = useTemplateRef<InstanceType<typeof CodeEditor>>('magicVsEditor');
108
108
 
109
109
  const diffChange = () => {
110
- if (!magicVsEditor.value || !formBox.value?.form) {
110
+ if (!magicVsEditorRef.value || !formBox.value?.form) {
111
111
  return;
112
112
  }
113
113
 
114
- formBox.value.form.values.content = magicVsEditor.value.getEditorValue();
114
+ formBox.value.form.values.content = magicVsEditorRef.value.getEditorValue();
115
115
 
116
116
  difVisible.value = false;
117
117
  };
@@ -32,7 +32,7 @@ const props = defineProps<{
32
32
 
33
33
  const emit = defineEmits(['change']);
34
34
 
35
- const form = useTemplateRef<InstanceType<typeof MForm>>('form');
35
+ const formRef = useTemplateRef<InstanceType<typeof MForm>>('form');
36
36
 
37
37
  const getFormConfig = (items: FormConfig = []) => [
38
38
  {
@@ -61,7 +61,7 @@ const codeParamsConfig = computed(() =>
61
61
  */
62
62
  const onParamsChangeHandler = async (v: FormValue, eventData: ContainerChangeEventData) => {
63
63
  try {
64
- const value = await form.value?.submitForm(true);
64
+ const value = await formRef.value?.submitForm(true);
65
65
  emit('change', value, eventData);
66
66
  } catch (e) {
67
67
  error(e);
@@ -69,9 +69,9 @@ const emit = defineEmits<{
69
69
  mouseenter: [];
70
70
  }>();
71
71
 
72
- const menu = useTemplateRef<HTMLDivElement>('menu');
73
- const buttons = useTemplateRef<InstanceType<typeof ToolButton>[]>('buttons');
74
- const subMenu = useTemplateRef<any>('subMenu');
72
+ const menuEl = useTemplateRef<HTMLDivElement>('menu');
73
+ const buttonRefs = useTemplateRef<InstanceType<typeof ToolButton>[]>('buttons');
74
+ const subMenuRef = useTemplateRef<any>('subMenu');
75
75
  const visible = ref(false);
76
76
  const subMenuData = ref<(MenuButton | MenuComponent)[]>([]);
77
77
  const zIndex = useZIndex();
@@ -88,13 +88,13 @@ const menuStyle = computed(() => ({
88
88
  zIndex: curZIndex.value,
89
89
  }));
90
90
 
91
- const contains = (el: HTMLElement) => menu.value?.contains(el) || subMenu.value?.contains(el);
91
+ const contains = (el: HTMLElement) => menuEl.value?.contains(el) || subMenuRef.value?.contains(el);
92
92
 
93
93
  const hide = () => {
94
94
  if (!visible.value) return;
95
95
 
96
96
  visible.value = false;
97
- subMenu.value?.hide();
97
+ subMenuRef.value?.hide();
98
98
 
99
99
  emit('hide');
100
100
  };
@@ -121,7 +121,7 @@ const outsideClickHideHandler = (e: MouseEvent) => {
121
121
  };
122
122
 
123
123
  const setPosition = (e: { clientY: number; clientX: number }) => {
124
- const menuHeight = menu.value?.clientHeight || 0;
124
+ const menuHeight = menuEl.value?.clientHeight || 0;
125
125
 
126
126
  let top = e.clientY;
127
127
  if (menuHeight + e.clientY > document.body.clientHeight) {
@@ -158,15 +158,15 @@ const showSubMenu = (item: MenuButton | MenuComponent, index: number) => {
158
158
  return;
159
159
  }
160
160
 
161
- if (menu.value) {
161
+ if (menuEl.value) {
162
162
  // 将子菜单放置在按钮右侧,与按钮齐平
163
- let y = menu.value.offsetTop;
164
- if (buttons.value?.[index].$el) {
165
- const rect = buttons.value?.[index].$el.getBoundingClientRect();
163
+ let y = menuEl.value.offsetTop;
164
+ if (buttonRefs.value?.[index].$el) {
165
+ const rect = buttonRefs.value?.[index].$el.getBoundingClientRect();
166
166
  y = rect.top;
167
167
  }
168
- subMenu.value?.show({
169
- clientX: menu.value.offsetLeft + menu.value.clientWidth - 2,
168
+ subMenuRef.value?.show({
169
+ clientX: menuEl.value.offsetLeft + menuEl.value.clientWidth - 2,
170
170
  clientY: y,
171
171
  });
172
172
  }
@@ -190,7 +190,7 @@ onBeforeUnmount(() => {
190
190
  });
191
191
 
192
192
  defineExpose({
193
- menu,
193
+ menu: menuEl,
194
194
  menuPosition,
195
195
  hide,
196
196
  show,
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <Teleport to="body" v-if="visible">
3
3
  <div ref="target" class="m-editor-float-box" :style="{ ...style, zIndex: curZIndex }" @mousedown="nextZIndex">
4
- <div ref="titleEl" class="m-editor-float-box-title">
4
+ <div ref="title" class="m-editor-float-box-title">
5
5
  <slot name="title">
6
6
  <span>{{ title }}</span>
7
7
  </slot>
@@ -47,8 +47,8 @@ const props = withDefaults(
47
47
  },
48
48
  );
49
49
 
50
- const target = useTemplateRef<HTMLDivElement>('target');
51
- const titleEl = useTemplateRef<HTMLDivElement>('titleEl');
50
+ const targetEl = useTemplateRef<HTMLDivElement>('target');
51
+ const titleEl = useTemplateRef<HTMLDivElement>('title');
52
52
 
53
53
  const zIndex = useZIndex();
54
54
  const curZIndex = ref<number>(0);
@@ -59,8 +59,8 @@ const bodyHeight = computed(() => {
59
59
  return height.value - titleHeight.value;
60
60
  }
61
61
 
62
- if (target.value) {
63
- return target.value.clientHeight - titleHeight.value;
62
+ if (targetEl.value) {
63
+ return targetEl.value.clientHeight - titleHeight.value;
64
64
  }
65
65
 
66
66
  return 'auto';
@@ -87,7 +87,7 @@ let moveable: VanillaMoveable | null = null;
87
87
  const initMoveable = () => {
88
88
  moveable = new VanillaMoveable(globalThis.document.body, {
89
89
  className: 'm-editor-floating-box-moveable',
90
- target: target.value,
90
+ target: targetEl.value,
91
91
  draggable: true,
92
92
  resizable: true,
93
93
  edge: true,
@@ -126,7 +126,7 @@ watch(
126
126
  await nextTick();
127
127
  curZIndex.value = zIndex.nextZIndex();
128
128
 
129
- const targetRect = target.value?.getBoundingClientRect();
129
+ const targetRect = targetEl.value?.getBoundingClientRect();
130
130
  if (targetRect) {
131
131
  width.value = targetRect.width;
132
132
  height.value = targetRect.height;
@@ -168,11 +168,11 @@ const nextZIndex = () => {
168
168
  curZIndex.value = zIndex.nextZIndex();
169
169
  };
170
170
 
171
- provide('parentFloating', target);
171
+ provide('parentFloating', targetEl);
172
172
 
173
173
  defineExpose({
174
174
  bodyHeight,
175
- target,
175
+ target: targetEl,
176
176
  titleEl,
177
177
  });
178
178
  </script>
@@ -18,6 +18,6 @@ const emit = defineEmits<{
18
18
  change: [e: OnDrag];
19
19
  }>();
20
20
 
21
- const target = useTemplateRef<HTMLSpanElement>('target');
22
- const { isDragging } = useGetSo(target, emit);
21
+ const targetEl = useTemplateRef<HTMLSpanElement>('target');
22
+ const { isDragging } = useGetSo(targetEl, emit);
23
23
  </script>
@@ -21,8 +21,8 @@ const props = defineProps<{
21
21
 
22
22
  const emit = defineEmits(['scroll']);
23
23
 
24
- const bar = useTemplateRef<HTMLDivElement>('bar');
25
- const thumb = useTemplateRef<HTMLDivElement>('thumb');
24
+ const barEl = useTemplateRef<HTMLDivElement>('bar');
25
+ const thumbEl = useTemplateRef<HTMLDivElement>('thumb');
26
26
 
27
27
  const thumbSize = computed(() => props.size * (props.size / props.scrollSize));
28
28
  const thumbPos = computed(() => (props.pos / props.scrollSize) * props.size);
@@ -35,9 +35,8 @@ const thumbStyle = computed(() => ({
35
35
  let gesto: Gesto;
36
36
 
37
37
  onMounted(() => {
38
- if (!thumb.value) return;
39
- const thumbEl = thumb.value;
40
- gesto = new Gesto(thumbEl, {
38
+ if (!thumbEl.value) return;
39
+ gesto = new Gesto(thumbEl.value, {
41
40
  container: window,
42
41
  });
43
42
 
@@ -50,12 +49,12 @@ onMounted(() => {
50
49
  scrollBy(getDelta(e));
51
50
  });
52
51
 
53
- bar.value?.addEventListener('wheel', wheelHandler, false);
52
+ barEl.value?.addEventListener('wheel', wheelHandler, false);
54
53
  });
55
54
 
56
55
  onBeforeUnmount(() => {
57
56
  if (gesto) gesto.off();
58
- bar.value?.removeEventListener('wheel', wheelHandler, false);
57
+ barEl.value?.removeEventListener('wheel', wheelHandler, false);
59
58
  });
60
59
 
61
60
  const wheelHandler = (e: WheelEvent) => {
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div class="m-editor-scroll-viewer-container" ref="container">
3
- <div ref="el" :style="style">
3
+ <div ref="target" :style="style">
4
4
  <slot></slot>
5
5
  </div>
6
6
 
@@ -63,8 +63,8 @@ const props = withDefaults(
63
63
  },
64
64
  );
65
65
 
66
- const container = useTemplateRef<HTMLDivElement>('container');
67
- const el = useTemplateRef<HTMLDivElement>('el');
66
+ const containerEl = useTemplateRef<HTMLDivElement>('container');
67
+ const el = useTemplateRef<HTMLDivElement>('target');
68
68
  const style = computed(
69
69
  () => `
70
70
  width: ${isNumber(`${props.width}`) ? `${props.width}px` : props.width};
@@ -80,9 +80,9 @@ const scrollHeight = ref(0);
80
80
  let scrollViewer: ScrollViewer;
81
81
 
82
82
  onMounted(() => {
83
- if (!container.value || !el.value) return;
83
+ if (!containerEl.value || !el.value) return;
84
84
  scrollViewer = new ScrollViewer({
85
- container: container.value,
85
+ container: containerEl.value,
86
86
  target: el.value,
87
87
  zoom: props.zoom,
88
88
  correctionScrollSize: props.correctionScrollSize,
@@ -123,6 +123,6 @@ const hScrollHandler = (delta: number) => {
123
123
  };
124
124
 
125
125
  defineExpose({
126
- container,
126
+ container: containerEl,
127
127
  });
128
128
  </script>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div ref="el" class="m-editor-layout" :style="`min-width: ${props.minCenter + props.minLeft + props.minRight}px`">
2
+ <div ref="target" class="m-editor-layout" :style="`min-width: ${props.minCenter + props.minLeft + props.minRight}px`">
3
3
  <template v-if="hasLeft && $slots.left">
4
4
  <div class="m-editor-layout-left" :class="leftClass" :style="`width: ${left}px`">
5
5
  <slot name="left"></slot>
@@ -22,7 +22,7 @@
22
22
 
23
23
  <script lang="ts" setup>
24
24
  import { computed, onBeforeUnmount, onMounted, ref, useTemplateRef, watchEffect } from 'vue';
25
- import { OnDrag } from 'gesto';
25
+ import type { OnDrag } from 'gesto';
26
26
 
27
27
  import Resizer from './Resizer.vue';
28
28
 
@@ -51,7 +51,7 @@ const props = withDefaults(
51
51
  },
52
52
  );
53
53
 
54
- const el = useTemplateRef<HTMLElement>('el');
54
+ const el = useTemplateRef<HTMLElement>('target');
55
55
 
56
56
  const hasLeft = computed(() => typeof props.left !== 'undefined');
57
57
  const hasRight = computed(() => typeof props.right !== 'undefined');
@@ -83,12 +83,12 @@ const emit = defineEmits<{
83
83
 
84
84
  const { dataSourceService } = inject<Services>('services') || {};
85
85
 
86
- const autocomplete = useTemplateRef<InstanceType<typeof TMagicAutocomplete>>('autocomplete');
86
+ const autocompleteRef = useTemplateRef<InstanceType<typeof TMagicAutocomplete>>('autocomplete');
87
87
  const isFocused = ref(false);
88
88
  const state = ref('');
89
89
  const displayState = ref<{ value: string; type: 'var' | 'text' }[]>([]);
90
90
 
91
- const input = computed<HTMLInputElement>(() => autocomplete.value?.inputRef?.input);
91
+ const input = computed<HTMLInputElement>(() => autocompleteRef.value?.inputRef?.input);
92
92
  const dataSources = computed(() => dataSourceService?.get('dataSources') || []);
93
93
 
94
94
  const setDisplayState = () => {
@@ -112,7 +112,7 @@ const mouseupHandler = async () => {
112
112
 
113
113
  isFocused.value = true;
114
114
  await nextTick();
115
- autocomplete.value?.focus();
115
+ autocompleteRef.value?.focus();
116
116
 
117
117
  if (focusOffset && input.value) {
118
118
  input.value.setSelectionRange(anchorOffset, focusOffset);
@@ -51,7 +51,7 @@ const props = withDefaults(
51
51
  const emit = defineEmits(['change']);
52
52
 
53
53
  const codeConfig = ref<CodeBlockContent>();
54
- const codeBlockEditor = useTemplateRef<InstanceType<typeof CodeBlockEditor>>('codeBlockEditor');
54
+ const codeBlockEditorRef = useTemplateRef<InstanceType<typeof CodeBlockEditor>>('codeBlockEditor');
55
55
 
56
56
  let editIndex = -1;
57
57
 
@@ -94,7 +94,7 @@ const methodColumns: ColumnConfig[] = [
94
94
  editIndex = index;
95
95
 
96
96
  nextTick(() => {
97
- codeBlockEditor.value?.show();
97
+ codeBlockEditorRef.value?.show();
98
98
  });
99
99
  },
100
100
  },
@@ -121,7 +121,7 @@ const createCodeHandler = () => {
121
121
  editIndex = -1;
122
122
 
123
123
  nextTick(() => {
124
- codeBlockEditor.value?.show();
124
+ codeBlockEditorRef.value?.show();
125
125
  });
126
126
  };
127
127
 
@@ -157,6 +157,6 @@ const submitCodeHandler = (value: CodeBlockContent, data: ContainerChangeEventDa
157
157
  editIndex = -1;
158
158
  codeConfig.value = void 0;
159
159
 
160
- codeBlockEditor.value?.hide();
160
+ codeBlockEditorRef.value?.hide();
161
161
  };
162
162
  </script>
@@ -63,7 +63,8 @@ const config = computed<GroupListConfig>(() => ({
63
63
  {
64
64
  type: 'table',
65
65
  name: 'cond',
66
- operateColWidth: 50,
66
+ operateColWidth: 100,
67
+ enableToggleMode: false,
67
68
  items: [
68
69
  parentFields.value.length
69
70
  ? {
@@ -0,0 +1,69 @@
1
+ <template>
2
+ <div class="m-fields-style-setter">
3
+ <TMagicCollapse :model-value="collapseValue">
4
+ <template v-for="(item, index) in list" :key="index">
5
+ <TMagicCollapseItem :name="`${index}`">
6
+ <template #title><MIcon :icon="Grid"></MIcon>{{ item.title }}</template>
7
+ <component v-if="item.component" :is="item.component" :values="model[name]" @change="change"></component>
8
+ </TMagicCollapseItem>
9
+ </template>
10
+ </TMagicCollapse>
11
+ </div>
12
+ </template>
13
+
14
+ <script setup lang="ts">
15
+ import { shallowRef } from 'vue';
16
+ import { Grid } from '@element-plus/icons-vue';
17
+
18
+ import { TMagicCollapse, TMagicCollapseItem } from '@tmagic/design';
19
+ import type { ContainerChangeEventData, FieldProps } from '@tmagic/form';
20
+ import type { StyleSchema } from '@tmagic/schema';
21
+
22
+ import MIcon from '@editor/components/Icon.vue';
23
+
24
+ import { Background, Border, Font, Layout, Position } from './pro/';
25
+
26
+ defineOptions({
27
+ name: 'MFieldsStyleSetter',
28
+ });
29
+
30
+ defineProps<FieldProps<StyleSchema>>();
31
+
32
+ const emit = defineEmits<{
33
+ change: [v: any, eventData: ContainerChangeEventData];
34
+ }>();
35
+
36
+ const list = [
37
+ {
38
+ name: 'font',
39
+ title: '布局',
40
+ component: Layout,
41
+ },
42
+ {
43
+ title: '位置',
44
+ component: Position,
45
+ },
46
+ {
47
+ title: '背景',
48
+ component: Background,
49
+ },
50
+ {
51
+ title: '文字',
52
+ component: Font,
53
+ },
54
+ {
55
+ title: '边框与圆角',
56
+ component: Border,
57
+ },
58
+ ];
59
+
60
+ const collapseValue = shallowRef(
61
+ Array(list.length)
62
+ .fill(1)
63
+ .map((x, i) => `${i}`),
64
+ );
65
+
66
+ const change = (v: any, eventData: ContainerChangeEventData) => {
67
+ emit('change', v, eventData);
68
+ };
69
+ </script>
@@ -0,0 +1,71 @@
1
+ <template>
2
+ <div class="background-position-container">
3
+ <div class="presets-value-list">
4
+ <TMagicButton
5
+ v-for="(item, index) in list"
6
+ :key="index"
7
+ link
8
+ :class="model[name] === item.value && 'btn-active'"
9
+ @click="changeHandler(item.value)"
10
+ >
11
+ <div :class="['position-icon', item.class, model[name] === item.value && 'active']"></div>
12
+ </TMagicButton>
13
+ </div>
14
+ <div class="custom-value">
15
+ <TMagicInput v-model="model[name]" size="small" placeholder="自定义背景位置" clearable @change="changeHandler">
16
+ </TMagicInput>
17
+ </div>
18
+ </div>
19
+ </template>
20
+
21
+ <script lang="ts" setup>
22
+ import { TMagicButton, TMagicInput } from '@tmagic/design';
23
+ import type { FieldProps, FormItem } from '@tmagic/form';
24
+
25
+ const emit = defineEmits(['change']);
26
+ defineProps<FieldProps<{ type: 'style-setter' } & FormItem>>();
27
+
28
+ const horizontalList = [
29
+ {
30
+ value: 'left',
31
+ text: '左',
32
+ },
33
+ {
34
+ value: 'center',
35
+ text: '中',
36
+ },
37
+ {
38
+ value: 'right',
39
+ text: '右',
40
+ },
41
+ ];
42
+
43
+ const verticalList = [
44
+ {
45
+ value: 'top',
46
+ text: '上',
47
+ },
48
+ {
49
+ value: 'center',
50
+ text: '中',
51
+ },
52
+ {
53
+ value: 'bottom',
54
+ text: '下',
55
+ },
56
+ ];
57
+
58
+ const list = verticalList
59
+ .map((vertical) =>
60
+ horizontalList.map((horizontal) => ({
61
+ value: `${horizontal.value} ${vertical.value}`,
62
+ tips: `${horizontal.text}${vertical.text}`,
63
+ class: `${horizontal.value}-${vertical.value}`,
64
+ })),
65
+ )
66
+ .flat();
67
+
68
+ const changeHandler = (v: string) => {
69
+ emit('change', v);
70
+ };
71
+ </script>
@@ -0,0 +1,104 @@
1
+ <template>
2
+ <div class="border-box-container">
3
+ <div class="border-icon-container">
4
+ <div class="border-icon-container-row">
5
+ <div
6
+ class="border-icon border-icon-top"
7
+ :class="{ active: direction === 'Top' }"
8
+ @click="selectDirection('Top')"
9
+ ></div>
10
+ </div>
11
+ <div class="border-icon-container-row">
12
+ <div
13
+ class="border-icon border-icon-left"
14
+ :class="{ active: direction === 'Left' }"
15
+ @click="selectDirection('Left')"
16
+ ></div>
17
+ <div class="border-icon" :class="{ active: direction === '' }" @click="selectDirection()"></div>
18
+ <div
19
+ class="border-icon border-icon-right"
20
+ :class="{ active: direction === 'Right' }"
21
+ @click="selectDirection('Right')"
22
+ ></div>
23
+ </div>
24
+ <div class="border-icon-container-row">
25
+ <div
26
+ class="border-icon border-icon-bottom"
27
+ :class="{ active: direction === 'Bottom' }"
28
+ @click="selectDirection('Bottom')"
29
+ ></div>
30
+ </div>
31
+ </div>
32
+ <div class="border-value-container">
33
+ <MContainer :config="config" :model="model" @change="change"></MContainer>
34
+ </div>
35
+ </div>
36
+ </template>
37
+
38
+ <script lang="ts" setup>
39
+ import { computed, ref } from 'vue';
40
+
41
+ import type { ContainerChangeEventData, FormValue } from '@tmagic/form';
42
+ import { MContainer } from '@tmagic/form';
43
+ import type { StyleSchema } from '@tmagic/schema';
44
+
45
+ const direction = ref('');
46
+
47
+ const config = computed(() => ({
48
+ items: [
49
+ {
50
+ name: `border${direction.value}Width`,
51
+ text: '边框宽度',
52
+ labelWidth: '68px',
53
+ type: 'data-source-field-select',
54
+ fieldConfig: {
55
+ type: 'text',
56
+ },
57
+ },
58
+ {
59
+ name: `border${direction.value}Color`,
60
+ text: '边框颜色',
61
+ labelWidth: '68px',
62
+ type: 'data-source-field-select',
63
+ fieldConfig: {
64
+ type: 'colorPicker',
65
+ },
66
+ },
67
+ {
68
+ name: `border${direction.value}Style`,
69
+ text: '边框样式',
70
+
71
+ labelWidth: '68px',
72
+ type: 'data-source-field-select',
73
+ fieldConfig: {
74
+ type: 'select',
75
+ options: ['solid', 'dashed', 'dotted'].map((item) => ({
76
+ value: item,
77
+ text: item,
78
+ })),
79
+ },
80
+ },
81
+ ],
82
+ }));
83
+
84
+ const selectDirection = (d?: string) => (direction.value = d || '');
85
+
86
+ const emit = defineEmits<{
87
+ change: [v: StyleSchema, eventData: ContainerChangeEventData];
88
+ }>();
89
+
90
+ withDefaults(
91
+ defineProps<{
92
+ model: FormValue;
93
+ }>(),
94
+ {},
95
+ );
96
+
97
+ const change = (value: StyleSchema, eventData: ContainerChangeEventData) => {
98
+ eventData.changeRecords?.forEach((record) => {
99
+ emit('change', record.value, {
100
+ modifyKey: record.propPath,
101
+ });
102
+ });
103
+ };
104
+ </script>