UNPKG

element-plus

Version:

A Component Library for Vue 3

1 lines 9.44 kB
{"version":3,"file":"space.mjs","names":["Item"],"sources":["../../../../../../packages/components/space/src/space.ts"],"sourcesContent":["import {\n Comment,\n createTextVNode,\n createVNode,\n defineComponent,\n isVNode,\n renderSlot,\n} from 'vue'\nimport {\n PatchFlags,\n buildProps,\n definePropType,\n isArray,\n isFragment,\n isNumber,\n isString,\n isValidElementNode,\n} from '@element-plus/utils'\nimport { componentSizes } from '@element-plus/constants'\nimport Item from './item'\nimport { useSpace } from './use-space'\n\nimport type {\n ExtractPropTypes,\n ExtractPublicPropTypes,\n StyleValue,\n VNode,\n VNodeArrayChildren,\n VNodeChild,\n} from 'vue'\nimport type { AlignItems, Arrayable } from '@element-plus/utils'\n\nexport const spaceProps = buildProps({\n /**\n * @description Placement direction\n */\n direction: {\n type: String,\n values: ['horizontal', 'vertical'],\n default: 'horizontal',\n },\n /**\n * @description Classname\n */\n class: {\n type: definePropType<Arrayable<Record<string, boolean> | string>>([\n String,\n Object,\n Array,\n ]),\n default: '',\n },\n /**\n * @description Extra style rules\n */\n style: {\n type: definePropType<StyleValue>([String, Array, Object]),\n default: '',\n },\n /**\n * @description Controls the alignment of items\n */\n alignment: {\n type: definePropType<AlignItems>(String),\n default: 'center',\n },\n /**\n * @description Prefix for space-items\n */\n prefixCls: {\n type: String,\n },\n /**\n * @description Spacer\n */\n spacer: {\n type: definePropType<VNodeChild>([Object, String, Number, Array]),\n default: null,\n validator: (val: unknown) => isVNode(val) || isNumber(val) || isString(val),\n },\n /**\n * @description Auto wrapping\n */\n wrap: Boolean,\n /**\n * @description Whether to fill the container\n */\n fill: Boolean,\n /**\n * @description Ratio of fill\n */\n fillRatio: {\n type: Number,\n default: 100,\n },\n /**\n * @description Spacing size\n */\n size: {\n type: [String, Array, Number],\n values: componentSizes,\n validator: (val: unknown): val is [number, number] | number => {\n return (\n isNumber(val) ||\n (isArray(val) && val.length === 2 && val.every(isNumber))\n )\n },\n },\n} as const)\nexport type SpaceProps = ExtractPropTypes<typeof spaceProps>\nexport type SpacePropsPublic = ExtractPublicPropTypes<typeof spaceProps>\n\nconst Space = defineComponent({\n name: 'ElSpace',\n\n props: spaceProps,\n\n setup(props, { slots }) {\n const { classes, containerStyle, itemStyle } = useSpace(props)\n\n // retrieve the children out via a simple for loop\n // the edge case here is that when users uses directives like <v-for>, <v-if>\n // we need to go deeper until the child is not the Fragment type\n function extractChildren(\n children: VNodeArrayChildren,\n parentKey = '',\n extractedChildren: VNode[] = []\n ) {\n const { prefixCls } = props\n children.forEach((child, loopKey) => {\n if (isFragment(child)) {\n if (isArray(child.children)) {\n child.children.forEach((nested, key) => {\n if (isFragment(nested) && isArray(nested.children)) {\n extractChildren(\n nested.children,\n `${parentKey + key}-`,\n extractedChildren\n )\n } else {\n if (isVNode(nested) && nested?.type === Comment) {\n extractedChildren.push(nested)\n } else {\n extractedChildren.push(\n createVNode(\n Item,\n {\n style: itemStyle.value,\n prefixCls,\n key: `nested-${parentKey + key}`,\n },\n {\n default: () => [nested],\n },\n PatchFlags.PROPS | PatchFlags.STYLE,\n ['style', 'prefixCls']\n )\n )\n }\n }\n })\n }\n // if the current child is valid vnode, then append this current vnode\n // to item as child node.\n } else if (isValidElementNode(child)) {\n extractedChildren.push(\n createVNode(\n Item,\n {\n style: itemStyle.value,\n prefixCls,\n key: `LoopKey${parentKey + loopKey}`,\n },\n {\n default: () => [child],\n },\n PatchFlags.PROPS | PatchFlags.STYLE,\n ['style', 'prefixCls']\n )\n )\n }\n })\n\n return extractedChildren\n }\n\n return () => {\n const { spacer, direction } = props\n\n const children = renderSlot(slots, 'default', { key: 0 }, () => [])\n\n if ((children.children ?? []).length === 0) return null\n // loop the children, if current children is rendered via `renderList` or `<v-for>`\n if (isArray(children.children)) {\n let extractedChildren = extractChildren(children.children)\n\n if (spacer) {\n // track the current rendering index, when encounters the last element\n // then no need to add a spacer after it.\n const len = extractedChildren.length - 1\n extractedChildren = extractedChildren.reduce<VNode[]>(\n (acc, child, idx) => {\n const children = [...acc, child]\n if (idx !== len) {\n children.push(\n createVNode(\n 'span',\n // adding width 100% for vertical alignment,\n // when the spacer inherit the width from the\n // parent, this span's width was not set, so space\n // might disappear\n {\n style: [\n itemStyle.value,\n direction === 'vertical' ? 'width: 100%' : null,\n ],\n key: idx,\n },\n [\n // if spacer is already a valid vnode, then append it to the current\n // span element.\n // otherwise, treat it as string.\n isVNode(spacer)\n ? spacer\n : createTextVNode(spacer as string, PatchFlags.TEXT),\n ],\n PatchFlags.STYLE\n )\n )\n }\n return children\n },\n []\n )\n }\n\n // spacer container.\n return createVNode(\n 'div',\n {\n class: classes.value,\n style: containerStyle.value,\n },\n extractedChildren,\n PatchFlags.STYLE | PatchFlags.CLASS\n )\n }\n\n return children.children\n }\n },\n})\n\nexport type SpaceInstance = InstanceType<typeof Space> & unknown\n\nexport default Space\n"],"mappings":"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"}