|
@@ -0,0 +1,86 @@
|
|
|
|
+import { useEditor } from "@/modules/editor";
|
|
|
|
+import { css, cx } from "@linaria/core";
|
|
|
|
+import { watch } from "vue";
|
|
|
|
+import { string } from "vue-types";
|
|
|
|
+import { useCompData } from ".";
|
|
|
|
+import { Text } from "../../../basicUI";
|
|
|
|
+import { createUIComp } from "../../../defines/createUIComp";
|
|
|
|
+
|
|
|
|
+export const Component = createUIComp({
|
|
|
|
+ props: {
|
|
|
|
+ compId: string().isRequired,
|
|
|
|
+ },
|
|
|
|
+ setup(props) {
|
|
|
|
+ const { helper } = useEditor();
|
|
|
|
+ const { value } = useCompData(props.compId);
|
|
|
|
+
|
|
|
|
+ watch(
|
|
|
|
+ () => [value.columns],
|
|
|
|
+ () => {
|
|
|
|
+ const { columns, list } = value;
|
|
|
|
+ const offset = columns - list.length;
|
|
|
|
+ if (offset > 0) {
|
|
|
|
+ Array.from({ length: offset }, () => {
|
|
|
|
+ list.push({ label: "标题", content: "内容" });
|
|
|
|
+ });
|
|
|
|
+ } else {
|
|
|
|
+ list.splice(columns, offset * -1);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ return () => (
|
|
|
|
+ <div class={rootStyles}>
|
|
|
|
+ {value.list.map((d) => (
|
|
|
|
+ <div
|
|
|
|
+ class="flex items-center text-primary px-0.1rem"
|
|
|
|
+ style={{
|
|
|
|
+ margin: helper.designToNaturalSize(value.gap),
|
|
|
|
+ }}
|
|
|
|
+ >
|
|
|
|
+ <div
|
|
|
|
+ class={cx(
|
|
|
|
+ "py-0.08rem px-0.1rem",
|
|
|
|
+ value.showBackground ? "label text-white" : "text-secondary"
|
|
|
|
+ )}
|
|
|
|
+ style={{
|
|
|
|
+ width: helper.designToNaturalSize(value.width),
|
|
|
|
+ }}
|
|
|
|
+ >
|
|
|
|
+ <Text.Component
|
|
|
|
+ v-model={[d.label, "value"]}
|
|
|
|
+ class="text text-center"
|
|
|
|
+ />
|
|
|
|
+ </div>
|
|
|
|
+ <Text.Component
|
|
|
|
+ v-model={[d.content, "value"]}
|
|
|
|
+ class="flex-1 ml-0.3rem"
|
|
|
|
+ />
|
|
|
|
+ </div>
|
|
|
|
+ ))}
|
|
|
|
+ </div>
|
|
|
|
+ );
|
|
|
|
+ },
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+const rootStyles = css`
|
|
|
|
+ .label {
|
|
|
|
+ position: relative;
|
|
|
|
+ z-index: 1;
|
|
|
|
+ .text {
|
|
|
|
+ position: relative;
|
|
|
|
+ z-index: 1;
|
|
|
|
+ }
|
|
|
|
+ &::before {
|
|
|
|
+ content: "";
|
|
|
|
+ position: absolute;
|
|
|
|
+ top: 0;
|
|
|
|
+ left: 4%;
|
|
|
|
+ width: 92%;
|
|
|
|
+ height: 100%;
|
|
|
|
+ background-color: #333;
|
|
|
|
+ transform: skewX(347deg);
|
|
|
|
+ z-index: 0;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+`;
|