{"version":3,"file":"space.mjs","sources":["../../../../../../packages/components/space/src/space.ts"],"sourcesContent":["import {\n  createTextVNode,\n  createVNode,\n  defineComponent,\n  isVNode,\n  renderSlot,\n} from 'vue'\nimport { isString } from '@vue/shared'\nimport {\n  PatchFlags,\n  buildProps,\n  definePropType,\n  isArray,\n  isFragment,\n  isNumber,\n  isValidElementNode,\n} from '@bigin/utils'\nimport { componentSizes } from '@bigin/constants'\nimport Item from './item'\nimport { useSpace } from './use-space'\n\nimport type {\n  ExtractPropTypes,\n  StyleValue,\n  VNode,\n  VNodeArrayChildren,\n  VNodeChild,\n} from 'vue'\nimport type { Arrayable } from '@bigin/utils'\nimport type { Property } from 'csstype'\n\nexport const spaceProps = buildProps({\n  direction: {\n    type: String,\n    values: ['horizontal', 'vertical'],\n    default: 'horizontal',\n  },\n\n  class: {\n    type: definePropType<Arrayable<Record<string, boolean> | string>>([\n      String,\n      Object,\n      Array,\n    ]),\n    default: '',\n  },\n\n  itemClass: {\n    type: definePropType<Arrayable<Record<string, boolean> | string>>([\n      String,\n      Object,\n      Array,\n    ]),\n    default: '',\n  },\n\n  style: {\n    type: definePropType<StyleValue>([String, Array, Object]),\n    default: '',\n  },\n\n  alignment: {\n    type: definePropType<Property.AlignItems>(String),\n    default: 'center',\n  },\n\n  prefixCls: {\n    type: String,\n  },\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  wrap: Boolean,\n\n  fill: Boolean,\n\n  fillRatio: {\n    type: Number,\n    default: 100,\n  },\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  gutter: {\n    type: Number,\n    default: -1,\n  },\n  vertical: Boolean,\n} as const)\nexport type SpaceProps = ExtractPropTypes<typeof spaceProps>\n\nexport default defineComponent({\n  name: 'BSpace',\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, itemClass } = 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                extractedChildren.push(\n                  createVNode(\n                    Item,\n                    {\n                      style: itemStyle.value,\n                      prefixCls,\n                      itemClass,\n                      key: `nested-${parentKey + key}`,\n                    },\n                    {\n                      default: () => [nested],\n                    },\n                    PatchFlags.PROPS | PatchFlags.STYLE,\n                    ['style', 'prefixCls', 'itemClass']\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                itemClass,\n                key: `LoopKey${parentKey + loopKey}`,\n              },\n              {\n                default: () => [child],\n              },\n              PatchFlags.PROPS | PatchFlags.STYLE,\n              ['style', 'prefixCls', 'itemClass']\n            )\n          )\n        }\n      })\n\n      return extractedChildren\n    }\n\n    return () => {\n      const { spacer, direction, vertical } = 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                    'div',\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' || vertical\n                          ? 'width: 100%'\n                          : 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            dataTestName: 'space',\n          },\n          extractedChildren,\n          PatchFlags.STYLE | PatchFlags.CLASS\n        )\n      }\n\n      return children.children\n    }\n  },\n})\n"],"names":["Item","children"],"mappings":"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"}