{items.map((child, index) => {
let itemStyle: CSSProperties = {};
if (!supportFlexGap.value) {
@@ -110,7 +115,7 @@ const Space = defineComponent({
}
}
- return (
+ return wrapSSR(
<>
{child}
@@ -120,7 +125,7 @@ const Space = defineComponent({
{split}
)}
- >
+ >,
);
})}
@@ -129,4 +134,17 @@ const Space = defineComponent({
},
});
-export default withInstall(Space);
+Space.Compact = Compact;
+
+Space.install = function (app: App) {
+ app.component(Space.name, Space);
+ app.component(Compact.name, Compact);
+ return app;
+};
+
+export { Compact };
+
+export default Space as typeof Space &
+ Plugin & {
+ readonly Compact: typeof Compact;
+ };
diff --git a/components/space/index.zh-CN.md b/components/space/index.zh-CN.md
index 05359aed7..59a965372 100644
--- a/components/space/index.zh-CN.md
+++ b/components/space/index.zh-CN.md
@@ -15,11 +15,37 @@ cover: https://gw.alipayobjects.com/zos/antfincdn/wc6%263gJ0Y8/Space.svg
- 适合行内元素的水平间距。
- 可以设置各种水平对齐方式。
+- 需要表单组件之间紧凑连接且合并边框时,使用 Space.Compact(自 `ant-design-vue@4.0.0` 版本开始提供该组件)。
## API
-| 参数 | 说明 | 类型 | 默认值 | 版本 |
-| --------- | -------- | ------------------------------------------ | ------------ | ----- |
-| align | 对齐方式 | `start` \| `end` \|`center` \|`baseline` | - | 1.6.5 |
-| direction | 间距方向 | `vertical` \| `horizontal` | `horizontal` | 1.6.5 |
-| size | 间距大小 | `small` \| `middle` \| `large` \| `number` | `small` | 1.6.5 |
+### Space
+
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --- | --- | --- | --- | --- |
+| align | 对齐方式 | `start` \| `end` \|`center` \|`baseline` | - | 1.6.5 |
+| direction | 间距方向 | `vertical` \| `horizontal` | `horizontal` | 1.6.5 |
+| size | 间距大小 | `small` \| `middle` \| `large` \| `number` | `small` | 1.6.5 |
+| split | 设置拆分 | VueNode \| v-slot | - | 2.2.0 |
+| wrap | 是否自动换行,仅在 `horizontal` 时有效 | boolean | false | 2.2.0 |
+
+### Space.Compact
+
+> 自 ant-design-vue@4.0.0 版本开始提供该组件。
+
+需要表单组件之间紧凑连接且合并边框时,使用 Space.Compact。支持的组件有:
+
+- Button
+- AutoComplete
+- Cascader
+- DatePicker
+- Input/Input.Search
+- Select
+- TimePicker
+- TreeSelect
+
+| 参数 | 说明 | 类型 | 默认值 | 版本 |
+| --------- | ---------------------------- | ------------------------------ | ------------ | ----- |
+| block | 将宽度调整为父元素宽度的选项 | boolean | false | 4.0.0 |
+| direction | 指定排列方向 | `vertical` \| `horizontal` | `horizontal` | 4.0.0 |
+| size | 子组件大小 | `large` \| `middle` \| `small` | `middle` | 4.0.0 |
diff --git a/components/space/style/compact.tsx b/components/space/style/compact.tsx
new file mode 100644
index 000000000..bffe711d4
--- /dev/null
+++ b/components/space/style/compact.tsx
@@ -0,0 +1,29 @@
+import type { FullToken, GenerateStyle } from '../../theme/internal';
+/** Component only token. Which will handle additional calculation of alias token */
+export interface ComponentToken {
+ // Component token here
+}
+
+interface SpaceToken extends FullToken<'Space'> {
+ // Custom token here
+}
+
+const genSpaceCompactStyle: GenerateStyle
= token => {
+ const { componentCls } = token;
+
+ return {
+ [componentCls]: {
+ display: 'inline-flex',
+ '&-block': {
+ display: 'flex',
+ width: '100%',
+ },
+ '&-vertical': {
+ flexDirection: 'column',
+ },
+ },
+ };
+};
+
+// ============================== Export ==============================
+export default genSpaceCompactStyle;
diff --git a/components/space/style/index.less b/components/space/style/index.less
deleted file mode 100644
index 842554ca2..000000000
--- a/components/space/style/index.less
+++ /dev/null
@@ -1,39 +0,0 @@
-@import '../../style/themes/index';
-@import '../../style/mixins/index';
-
-@space-prefix-cls: ~'@{ant-prefix}-space';
-@space-item-prefix-cls: ~'@{ant-prefix}-space-item';
-
-.@{space-prefix-cls} {
- display: inline-flex;
-
- &-vertical {
- flex-direction: column;
- }
-
- &-align {
- &-center {
- align-items: center;
- }
-
- &-start {
- align-items: flex-start;
- }
-
- &-end {
- align-items: flex-end;
- }
-
- &-baseline {
- align-items: baseline;
- }
- }
-}
-
-.@{space-item-prefix-cls} {
- &:empty {
- display: none;
- }
-}
-
-@import './rtl';
diff --git a/components/space/style/index.tsx b/components/space/style/index.tsx
index 3a3ab0de5..b10d56ce3 100644
--- a/components/space/style/index.tsx
+++ b/components/space/style/index.tsx
@@ -1,2 +1,54 @@
-import '../../style/index.less';
-import './index.less';
+import type { FullToken, GenerateStyle } from '../../theme/internal';
+import { genComponentStyleHook } from '../../theme/internal';
+import genSpaceCompactStyle from './compact';
+
+/** Component only token. Which will handle additional calculation of alias token */
+export interface ComponentToken {
+ // Component token here
+}
+
+interface SpaceToken extends FullToken<'Space'> {
+ // Custom token here
+}
+
+const genSpaceStyle: GenerateStyle = token => {
+ const { componentCls } = token;
+
+ return {
+ [componentCls]: {
+ display: 'inline-flex',
+ '&-rtl': {
+ direction: 'rtl',
+ },
+ '&-vertical': {
+ flexDirection: 'column',
+ },
+ '&-align': {
+ flexDirection: 'column',
+ '&-center': {
+ alignItems: 'center',
+ },
+ '&-start': {
+ alignItems: 'flex-start',
+ },
+ '&-end': {
+ alignItems: 'flex-end',
+ },
+ '&-baseline': {
+ alignItems: 'baseline',
+ },
+ },
+ [`${componentCls}-space-item`]: {
+ '&:empty': {
+ display: 'none',
+ },
+ },
+ },
+ };
+};
+
+// ============================== Export ==============================
+export default genComponentStyleHook('Space', token => [
+ genSpaceStyle(token),
+ genSpaceCompactStyle(token),
+]);
diff --git a/components/space/style/rtl.less b/components/space/style/rtl.less
deleted file mode 100644
index 75aa411b7..000000000
--- a/components/space/style/rtl.less
+++ /dev/null
@@ -1,10 +0,0 @@
-@import '../../style/themes/index';
-@import '../../style/mixins/index';
-
-@space-prefix-cls: ~'@{ant-prefix}-space';
-
-.@{space-prefix-cls} {
- &-rtl {
- direction: rtl;
- }
-}
diff --git a/components/style.ts b/components/style.ts
index 23700052a..73a4299e6 100644
--- a/components/style.ts
+++ b/components/style.ts
@@ -58,7 +58,7 @@ import './result/style';
// import './descriptions/style';
// import './page-header/style';
import './form/style';
-import './space/style';
+// import './space/style';
import './image/style';
import './typography/style';
// import './color-picker/style';
diff --git a/components/theme/interface/components.ts b/components/theme/interface/components.ts
index cfd7a4500..842013e7f 100644
--- a/components/theme/interface/components.ts
+++ b/components/theme/interface/components.ts
@@ -34,7 +34,7 @@ import type { ComponentToken as ProgressComponentToken } from '../../progress/st
// import type { ComponentToken as SelectComponentToken } from '../../select/style';
import type { ComponentToken as SkeletonComponentToken } from '../../skeleton/style';
// import type { ComponentToken as SliderComponentToken } from '../../slider/style';
-// import type { ComponentToken as SpaceComponentToken } from '../../space/style';
+import type { ComponentToken as SpaceComponentToken } from '../../space/style';
import type { ComponentToken as SpinComponentToken } from '../../spin/style';
// import type { ComponentToken as StepsComponentToken } from '../../steps/style';
// import type { ComponentToken as TableComponentToken } from '../../table/style';
@@ -111,7 +111,7 @@ export interface ComponentTokenMap {
Tooltip?: TooltipComponentToken;
// Table?: TableComponentToken;
// Space?: SpaceComponentToken;
- Progress?: ProgressComponentToken;
+ // Progress?: ProgressComponentToken;
// Tour?: TourComponentToken;
// QRCode?: QRCodeComponentToken;
// App?: AppComponentToken;