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 () => (
);
},
});
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 (
);
};
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 (
);
};
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);
}
}
}
`;