import { IconLineHeight, IconTextCenter, IconTextJustify, IconTextLeft, IconTextRight, } from "@/assets/icons"; import { css } from "@linaria/core"; import { Button, Dropdown, InputNumber, Menu, Tooltip } from "ant-design-vue"; import Select from "@queenjs-modules/queditor/components/FormUI/Items/Select"; import Pickr from "@simonwep/pickr"; import "@simonwep/pickr/dist/themes/nano.min.css"; import { queenApi } from "queenjs"; import { defineComponent, onMounted, ref, watch, onUnmounted } from "vue"; import { any, bool, string } from "vue-types"; export const TextColor = defineComponent({ props: { value: string().def("#666666"), }, emits: ["change"], setup(props, { emit }) { let picker: any = null; let emitFlagRef = ref(true); function initPicker() { picker = Pickr.create({ el: ".color_picker", theme: "nano", default: props.value, i18n: { "btn:save": "确定", }, components: { preview: true, opacity: false, hue: true, interaction: { hex: false, rgba: false, input: true, save: true, }, }, }); picker.on("save", (color: any) => { picker.hide(); const hexa = color.toHEXA().toString(); if (!emitFlagRef.value) { emitFlagRef.value = true; return; } emit("change", hexa); }); } watch( () => props.value, () => { console.log(props.value); emitFlagRef.value = false; picker.setColor(props.value); } ); onMounted(() => { initPicker(); }); onUnmounted(() => { console.log("destroy"); if (picker) { picker.destroyAndRemove(); picker = null; } }); return () => (
{ picker?.show(); }} >
); }, }); export const AlignComp = defineComponent({ props: { value: string<"left" | "right" | "center" | "justify">().def("left"), }, emits: ["change"], setup(props, { emit }) { const aligns = [ { label: "左对齐", key: "left", icon: , }, { label: "居中对齐", key: "center", icon: , }, { label: "右对齐", key: "right", icon: , }, { label: "两端对齐", key: "justify", icon: , }, ]; const overlay = () => { return ( {aligns.map((e: any) => { return ( { emit("change", e.key); }} > {e.icon} ); })} ); }; const currIcon = (key: string) => { const item = aligns.find((e) => { return e.key == key; }); return item ? item.icon : null; }; return () => ( ); }, }); export const LineHeightComp = defineComponent({ props: { value: string().def("1.5"), }, emits: ["change"], setup(props, { emit }) { const options = [1, 1.5, 2, 2.5, 3]; const overlay = () => { return ( {options.map((e: any) => { return ( { emit("change", e); }} > {e} ); })} ); }; return () => ( ); }, }); export const FontStyleComp = defineComponent({ props: { icon: any(), value: bool().def(false), }, emits: ["change"], setup(props, { emit }) { const triggerStyle = () => { emit("change", !props.value); }; return () => ( ); }, }); export const FontFamily = defineComponent({ props: { value: string().def(""), }, emits: ["change"], setup(props, { emit }) { const options = [ { label: "默认字体", value: "" }, { label: "宋体", value: "宋体,Songti,STSong,serif" }, { label: "黑体", value: "黑体,Heiti,STHeiti,sans-serif" }, { label: "仿宋", value: "仿宋,FangSong,STFangsong,serif" }, { label: "楷体", value: "楷体,KaiTi,STKaiti,sans-serif" }, ]; return () => { return ( ); }; }, }); export const FontSize = defineComponent({ props: { value: string().def("12px"), }, emits: ["change"], setup(props, { emit }) { return () => { return ( { emit("change", value + "px"); }} /> ); }; }, }); export const LinkButton = defineComponent({ props: { icon: any(), value: any(), }, emits: ["change"], setup(props, { emit }) { const showLinkInput = async () => { const res = await queenApi.showInput({ title: "请输入链接地址", defaultValue: "http://", }); emit("change", res); }; return () => ( ); }, }); const currStyle = css` color: @inf-primary-color; &:hover, &:focus { color: @inf-primary-color; } `; const ColorPicker = css` position: relative; width: 32px; height: 32px; border-radius: 2px; cursor: pointer; .pickr { width: 100%; height: 100%; .pcr-button { width: 100%; height: 100%; border: 1px solid transparent; } border-radius: 2px; input { &:focus, &.pcr-active { border-color: @inf-primary-color; box-shadow: 0 0 0 2px rgba(232, 139, 0, 0.2); } } button { &:focus, &.pcr-active { border-color: @inf-primary-color; box-shadow: 0 0 0 2px rgba(232, 139, 0, 0.2); } } } .pcr-app { input { &:focus, &.pcr-active { border-color: @inf-primary-color; box-shadow: 0 0 0 2px rgba(232, 139, 0, 0.2); } } button { &:focus, &.pcr-active { border-color: @inf-primary-color; box-shadow: 0 0 0 2px rgba(232, 139, 0, 0.2); } } } `;