TextToolForm.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import { useEditor } from "@/modules/editor";
  2. import { DesignComp } from "@/modules/editor/objects/DesignTemp/DesignComp";
  3. import { css } from "@linaria/core";
  4. import { defineComponent, toRaw, watch } from "vue";
  5. import { any } from "vue-types";
  6. import { Divider } from "ant-design-vue";
  7. import {
  8. AlignComp,
  9. FontFamily,
  10. FontSize,
  11. FontStyleWapper,
  12. LetterSpacingComp,
  13. LineHeightComp,
  14. TextToolItem,
  15. TextColor,
  16. TextStroke,
  17. } from "./TextToolComp";
  18. export const TextToolForm = defineComponent({
  19. props: {
  20. component: any<DesignComp>().isRequired,
  21. },
  22. setup(props) {
  23. const { controls } = useEditor();
  24. const changeVal = (e: { dataIndex: string; value: any }) => {
  25. let editor = controls.textEditorCtrl.state.currEditor;
  26. if (!editor) {
  27. return;
  28. }
  29. editor = toRaw(editor);
  30. editor.execute(e.dataIndex, e.value);
  31. console.log("change", e);
  32. setTimeout(() => {
  33. const selection = window.getSelection();
  34. selection?.removeAllRanges();
  35. editor.editing.view.focus();
  36. }, 100);
  37. };
  38. return () => {
  39. return (
  40. <div id="text_toolform">
  41. <div class={"text-white"}>文本</div>
  42. <div class={"mt-18px"}>
  43. <div class={formRowItem}>
  44. <TextToolItem
  45. column={{
  46. dataIndex: "fontFamily",
  47. component: FontFamily,
  48. props: {
  49. class: "w-190px",
  50. },
  51. }}
  52. onChange={changeVal}
  53. />
  54. <TextToolItem
  55. column={{
  56. label: "字号",
  57. dataIndex: "fontSize",
  58. component: FontSize,
  59. props: {
  60. class: "!w-full",
  61. },
  62. }}
  63. onChange={changeVal}
  64. />
  65. </div>
  66. <div class={formRowItem}>
  67. <TextToolItem
  68. column={{
  69. label: "字间距",
  70. dataIndex: "letterSpacing",
  71. component: LetterSpacingComp,
  72. props: {
  73. class: "!w-full",
  74. },
  75. }}
  76. onChange={changeVal}
  77. />
  78. <TextToolItem
  79. column={{
  80. label: "行高",
  81. dataIndex: "lineHeight",
  82. component: LineHeightComp,
  83. props: {
  84. class: "!w-full",
  85. },
  86. }}
  87. onChange={changeVal}
  88. />
  89. </div>
  90. <div class={formRowItem}>
  91. <FontStyleWapper onChange={changeVal} />
  92. <TextToolItem
  93. column={{
  94. label: "",
  95. dataIndex: "alignment",
  96. component: AlignComp,
  97. }}
  98. onChange={changeVal}
  99. />
  100. </div>
  101. </div>
  102. <Divider class={"!my-18px"} />
  103. <div class={[FormLabelItem, "justify-between mb-20px"]}>
  104. <div class={"label"}>颜色</div>
  105. <div>
  106. <TextToolItem
  107. column={{
  108. label: "字体颜色",
  109. dataIndex: "fontColor",
  110. component: TextColor,
  111. }}
  112. onChange={changeVal}
  113. />
  114. </div>
  115. </div>
  116. <div class={FormLabelItem}>
  117. <div class={"label"}>描边</div>
  118. <TextToolItem
  119. column={{
  120. label: "",
  121. dataIndex: "textStroke",
  122. component: TextStroke,
  123. }}
  124. onChange={changeVal}
  125. />
  126. </div>
  127. <Divider class={"!my-18px"} />
  128. </div>
  129. );
  130. };
  131. },
  132. });
  133. const formRowItem = css`
  134. display: flex;
  135. align-items: center;
  136. margin-bottom: 14px;
  137. &:last-child {
  138. margin-bottom: 0;
  139. }
  140. `;
  141. const FormLabelItem = css`
  142. display: flex;
  143. align-items: center;
  144. .label {
  145. min-width: 60px;
  146. margin-right: 10px;
  147. user-select: none;
  148. font-size: 12px;
  149. color: rgba(255, 255, 255, 0.8);
  150. }
  151. `;