element-plus
Version:
A Component Library for Vue 3
1 lines • 11.8 kB
Source Map (JSON)
{"version":3,"file":"space.mjs","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 CSSProperties,\n ExtractPropTypes,\n ExtractPublicPropTypes,\n StyleValue,\n VNode,\n VNodeArrayChildren,\n VNodeChild,\n} from 'vue'\nimport type { 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<CSSProperties['align-items']>(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"],"names":["Item","children"],"mappings":"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"}