refactor(Space): less to cssinjs & add compact mode (#6229)
* refactor(Space): less to cssinjs & add compact mode * chore(space): update md * chore(space): add demo * chore(space): add some demo * feat(button): add compact mode * fix: reactivity lose * docs: fix props version --------- Co-authored-by: tangjinzhou <415800467@qq.com>pull/6246/head^2
							parent
							
								
									e2d4f8c2e3
								
							
						
					
					
						commit
						f0649999fb
					
				|  | @ -19,6 +19,7 @@ import useStyle from './style'; | |||
| import type { ButtonType } from './buttonTypes'; | ||||
| import type { VNode, Ref } from 'vue'; | ||||
| import { GroupSizeContext } from './button-group'; | ||||
| import { useCompactItemContext } from '../space/Compact'; | ||||
| 
 | ||||
| type Loading = boolean | number; | ||||
| 
 | ||||
|  | @ -49,6 +50,7 @@ export default defineComponent({ | |||
|     const hasTwoCNChar = ref(false); | ||||
| 
 | ||||
|     const autoInsertSpace = computed(() => autoInsertSpaceInButton.value !== false); | ||||
|     const { compactSize, compactItemClassnames } = useCompactItemContext(prefixCls, direction); | ||||
| 
 | ||||
|     // =============== Update Loading =============== | ||||
|     const loadingOrDelay = computed(() => | ||||
|  | @ -79,22 +81,25 @@ export default defineComponent({ | |||
|       const pre = prefixCls.value; | ||||
| 
 | ||||
|       const sizeClassNameMap = { large: 'lg', small: 'sm', middle: undefined }; | ||||
|       const sizeFullname = groupSize?.value || size.value; | ||||
|       const sizeFullname = compactSize.value || groupSize?.value || size.value; | ||||
|       const sizeCls = sizeFullname ? sizeClassNameMap[sizeFullname] || '' : ''; | ||||
| 
 | ||||
|       return { | ||||
|         [hashId.value]: true, | ||||
|         [`${pre}`]: true, | ||||
|         [`${pre}-${shape}`]: shape !== 'default' && shape, | ||||
|         [`${pre}-${type}`]: type, | ||||
|         [`${pre}-${sizeCls}`]: sizeCls, | ||||
|         [`${pre}-loading`]: innerLoading.value, | ||||
|         [`${pre}-background-ghost`]: ghost && !isUnBorderedButtonType(type), | ||||
|         [`${pre}-two-chinese-chars`]: hasTwoCNChar.value && autoInsertSpace.value, | ||||
|         [`${pre}-block`]: block, | ||||
|         [`${pre}-dangerous`]: !!danger, | ||||
|         [`${pre}-rtl`]: direction.value === 'rtl', | ||||
|       }; | ||||
|       return [ | ||||
|         compactItemClassnames.value, | ||||
|         { | ||||
|           [hashId.value]: true, | ||||
|           [`${pre}`]: true, | ||||
|           [`${pre}-${shape}`]: shape !== 'default' && shape, | ||||
|           [`${pre}-${type}`]: type, | ||||
|           [`${pre}-${sizeCls}`]: sizeCls, | ||||
|           [`${pre}-loading`]: innerLoading.value, | ||||
|           [`${pre}-background-ghost`]: ghost && !isUnBorderedButtonType(type), | ||||
|           [`${pre}-two-chinese-chars`]: hasTwoCNChar.value && autoInsertSpace.value, | ||||
|           [`${pre}-block`]: block, | ||||
|           [`${pre}-dangerous`]: !!danger, | ||||
|           [`${pre}-rtl`]: direction.value === 'rtl', | ||||
|         }, | ||||
|       ]; | ||||
|     }); | ||||
| 
 | ||||
|     const fixTwoCNChar = () => { | ||||
|  | @ -209,7 +214,11 @@ export default defineComponent({ | |||
|       ); | ||||
| 
 | ||||
|       if (!isUnBorderedButtonType(type)) { | ||||
|         buttonNode = <Wave ref="wave" disabled={!!innerLoading.value}>{buttonNode}</Wave>; | ||||
|         buttonNode = ( | ||||
|           <Wave ref="wave" disabled={!!innerLoading.value}> | ||||
|             {buttonNode} | ||||
|           </Wave> | ||||
|         ); | ||||
|       } | ||||
| 
 | ||||
|       return wrapSSR(buttonNode); | ||||
|  |  | |||
|  | @ -0,0 +1,135 @@ | |||
| import classNames from '../_util/classNames'; | ||||
| import type { DirectionType, SizeType } from '../config-provider'; | ||||
| import createContext from '../_util/createContext'; | ||||
| import useConfigInject from '../config-provider/hooks/useConfigInject'; | ||||
| 
 | ||||
| import useStyle from './style'; | ||||
| import { computed, defineComponent } from 'vue'; | ||||
| import type { PropType, ExtractPropTypes, Ref } from 'vue'; | ||||
| import PropTypes from '../_util/vue-types'; | ||||
| import { booleanType, tuple } from '../_util/type'; | ||||
| import { isEmpty } from 'lodash-es'; | ||||
| 
 | ||||
| export const spaceCompactItemProps = () => ({ | ||||
|   compactSize: String as PropType<SizeType>, | ||||
|   compactDirection: PropTypes.oneOf(tuple('horizontal', 'vertical')).def('horizontal'), | ||||
|   isFirstItem: booleanType(), | ||||
|   isLastItem: booleanType(), | ||||
| }); | ||||
| 
 | ||||
| export type SpaceCompactItemContextType = Partial< | ||||
|   ExtractPropTypes<ReturnType<typeof spaceCompactItemProps>> | ||||
| >; | ||||
| 
 | ||||
| export const SpaceCompactItemContext = createContext<SpaceCompactItemContextType | null>(null); | ||||
| 
 | ||||
| export const useCompactItemContext = (prefixCls: Ref<string>, direction: Ref<DirectionType>) => { | ||||
|   const compactItemContext = SpaceCompactItemContext.useInject(); | ||||
| 
 | ||||
|   const compactItemClassnames = computed(() => { | ||||
|     if (!compactItemContext || isEmpty(compactItemContext)) return ''; | ||||
| 
 | ||||
|     const { compactDirection, isFirstItem, isLastItem } = compactItemContext; | ||||
|     const separator = compactDirection === 'vertical' ? '-vertical-' : '-'; | ||||
| 
 | ||||
|     return classNames({ | ||||
|       [`${prefixCls.value}-compact${separator}item`]: true, | ||||
|       [`${prefixCls.value}-compact${separator}first-item`]: isFirstItem, | ||||
|       [`${prefixCls.value}-compact${separator}last-item`]: isLastItem, | ||||
|       [`${prefixCls.value}-compact${separator}item-rtl`]: direction.value === 'rtl', | ||||
|     }); | ||||
|   }); | ||||
| 
 | ||||
|   return { | ||||
|     compactSize: computed(() => compactItemContext?.compactSize), | ||||
|     compactDirection: computed(() => compactItemContext?.compactDirection), | ||||
|     compactItemClassnames, | ||||
|   }; | ||||
| }; | ||||
| 
 | ||||
| export const NoCompactStyle = defineComponent({ | ||||
|   name: 'NoCompactStyle', | ||||
|   setup(_, { slots }) { | ||||
|     SpaceCompactItemContext.useProvide(null); | ||||
|     return () => { | ||||
|       return slots.default?.(); | ||||
|     }; | ||||
|   }, | ||||
| }); | ||||
| 
 | ||||
| export const spaceCompactProps = () => ({ | ||||
|   prefixCls: String, | ||||
|   size: { | ||||
|     type: [String, Number, Array] as PropType<SizeType>, | ||||
|   }, | ||||
|   direction: PropTypes.oneOf(tuple('horizontal', 'vertical')).def('horizontal'), | ||||
|   align: PropTypes.oneOf(tuple('start', 'end', 'center', 'baseline')), | ||||
|   block: { type: Boolean, default: undefined }, | ||||
| }); | ||||
| 
 | ||||
| export type SpaceCompactProps = Partial<ExtractPropTypes<ReturnType<typeof spaceCompactProps>>>; | ||||
| 
 | ||||
| const CompactItem = defineComponent({ | ||||
|   name: 'CompactItem', | ||||
|   props: spaceCompactItemProps(), | ||||
|   setup(props, { slots }) { | ||||
|     SpaceCompactItemContext.useProvide(props); | ||||
| 
 | ||||
|     return () => slots.default?.(); | ||||
|   }, | ||||
| }); | ||||
| 
 | ||||
| const Compact = defineComponent({ | ||||
|   name: 'ASpaceCompact', | ||||
|   inheritAttrs: false, | ||||
|   props: spaceCompactProps(), | ||||
|   setup(props, { attrs, slots }) { | ||||
|     const { prefixCls, direction: directionConfig } = useConfigInject('space-compact', props); | ||||
|     const compactItemContext = SpaceCompactItemContext.useInject(); | ||||
| 
 | ||||
|     const [wrapSSR, hashId] = useStyle(prefixCls); | ||||
| 
 | ||||
|     const clx = computed(() => { | ||||
|       return classNames(prefixCls.value, hashId.value, { | ||||
|         [`${prefixCls.value}-rtl`]: directionConfig.value === 'rtl', | ||||
|         [`${prefixCls.value}-block`]: props.block, | ||||
|         [`${prefixCls.value}-vertical`]: props.direction === 'vertical', | ||||
|       }); | ||||
|     }); | ||||
| 
 | ||||
|     return () => { | ||||
|       // =========================== Render =========================== | ||||
|       if (slots.default?.()?.length === 0) { | ||||
|         return null; | ||||
|       } | ||||
| 
 | ||||
|       const childNodes = slots.default?.() || []; | ||||
| 
 | ||||
|       return wrapSSR( | ||||
|         <div class={clx.value} {...attrs}> | ||||
|           {childNodes.map((child, i) => { | ||||
|             const key = (child && child.key) || `${prefixCls.value}-item-${i}`; | ||||
|             const noCompactItemContext = !compactItemContext || isEmpty(compactItemContext); | ||||
| 
 | ||||
|             return ( | ||||
|               <CompactItem | ||||
|                 key={key} | ||||
|                 compactSize={props.size} | ||||
|                 compactDirection={props.direction} | ||||
|                 isFirstItem={i === 0 && (noCompactItemContext || compactItemContext?.isFirstItem)} | ||||
|                 isLastItem={ | ||||
|                   i === childNodes.length - 1 && | ||||
|                   (noCompactItemContext || compactItemContext?.isLastItem) | ||||
|                 } | ||||
|               > | ||||
|                 {child} | ||||
|               </CompactItem> | ||||
|             ); | ||||
|           })} | ||||
|         </div>, | ||||
|       ); | ||||
|     }; | ||||
|   }, | ||||
| }); | ||||
| 
 | ||||
| export default Compact; | ||||
|  | @ -0,0 +1,43 @@ | |||
| <docs> | ||||
| --- | ||||
| order: 8 | ||||
| title: | ||||
|   zh-CN: 垂直方向紧凑布局 | ||||
|   en-US: Vertical Compact Mode | ||||
| --- | ||||
| 
 | ||||
| ## zh-CN | ||||
| 
 | ||||
| 垂直方向的紧凑布局,目前仅支持 Button 组合。 | ||||
| 
 | ||||
| ## en-US | ||||
| 
 | ||||
| Vertical Mode for Space.Compact, support Button only. | ||||
| 
 | ||||
| </docs> | ||||
| 
 | ||||
| <template> | ||||
|   <a-space> | ||||
|     <a-space-compact direction="vertical"> | ||||
|       <a-button>Button 1</a-button> | ||||
|       <a-button>Button 2</a-button> | ||||
|       <a-button>Button 3</a-button> | ||||
|     </a-space-compact> | ||||
|     <a-space-compact direction="vertical"> | ||||
|       <a-button type="dashed">Button 1</a-button> | ||||
|       <a-button type="dashed">Button 2</a-button> | ||||
|       <a-button type="dashed">Button 3</a-button> | ||||
|     </a-space-compact> | ||||
|     <a-space-compact direction="vertical"> | ||||
|       <a-button type="primary">Button 1</a-button> | ||||
|       <a-button type="primary">Button 2</a-button> | ||||
|       <a-button type="primary">Button 3</a-button> | ||||
|     </a-space-compact> | ||||
|   </a-space> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| 
 | ||||
| export default defineComponent({}); | ||||
| </script> | ||||
|  | @ -0,0 +1,151 @@ | |||
| <docs> | ||||
| --- | ||||
| order: 7 | ||||
| title: | ||||
|   zh-CN: Button 紧凑布局 | ||||
|   en-US: Button Compact Mode | ||||
| --- | ||||
| 
 | ||||
| ## zh-CN | ||||
| 
 | ||||
| Button 组件紧凑排列的示例。 | ||||
| 
 | ||||
| ## en-US | ||||
| 
 | ||||
| Button component compact example. | ||||
| 
 | ||||
| </docs> | ||||
| 
 | ||||
| <template> | ||||
|   <div> | ||||
|     <a-space-compact block> | ||||
|       <a-tooltip title="Like"> | ||||
|         <a-button> | ||||
|           <LikeOutlined /> | ||||
|         </a-button> | ||||
|       </a-tooltip> | ||||
|       <a-tooltip title="Comment"> | ||||
|         <a-button> | ||||
|           <CommentOutlined /> | ||||
|         </a-button> | ||||
|       </a-tooltip> | ||||
|       <a-tooltip title="Star"> | ||||
|         <a-button> | ||||
|           <StarOutlined /> | ||||
|         </a-button> | ||||
|       </a-tooltip> | ||||
|       <a-tooltip title="Heart"> | ||||
|         <a-button> | ||||
|           <HeartOutlined /> | ||||
|         </a-button> | ||||
|       </a-tooltip> | ||||
|       <a-tooltip title="Share"> | ||||
|         <a-button> | ||||
|           <ShareAltOutlined /> | ||||
|         </a-button> | ||||
|       </a-tooltip> | ||||
|       <a-tooltip title="Download"> | ||||
|         <a-button> | ||||
|           <DownloadOutlined /> | ||||
|         </a-button> | ||||
|       </a-tooltip> | ||||
|       <a-dropdown placement="bottomRight" :trigger="['click']"> | ||||
|         <a-button> | ||||
|           <EllipsisOutlined /> | ||||
|         </a-button> | ||||
| 
 | ||||
|         <template #overlay> | ||||
|           <a-menu> | ||||
|             <a-menu-item> | ||||
|               <a href="javascript:;">1st menu item</a> | ||||
|             </a-menu-item> | ||||
|             <a-menu-item> | ||||
|               <a href="javascript:;">2nd menu item</a> | ||||
|             </a-menu-item> | ||||
|             <a-menu-item> | ||||
|               <a href="javascript:;">3rd menu item</a> | ||||
|             </a-menu-item> | ||||
|           </a-menu> | ||||
|         </template> | ||||
|       </a-dropdown> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-button type="primary">Button 1</a-button> | ||||
|       <a-button type="primary">Button 2</a-button> | ||||
|       <a-button type="primary">Button 3</a-button> | ||||
|       <a-button type="primary">Button 4</a-button> | ||||
|       <a-tooltip title="Tooltip"> | ||||
|         <a-button type="primary" disabled> | ||||
|           <DownloadOutlined /> | ||||
|         </a-button> | ||||
|       </a-tooltip> | ||||
|       <a-tooltip title="Tooltip"> | ||||
|         <a-button type="primary" disabled> | ||||
|           <DownloadOutlined /> | ||||
|         </a-button> | ||||
|       </a-tooltip> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-button>Button 1</a-button> | ||||
|       <a-button>Button 2</a-button> | ||||
|       <a-button>Button 3</a-button> | ||||
|       <a-tooltip title="Tooltip"> | ||||
|         <a-button disabled> | ||||
|           <DownloadOutlined /> | ||||
|         </a-button> | ||||
|       </a-tooltip> | ||||
|       <a-tooltip title="Tooltip"> | ||||
|         <a-button> | ||||
|           <DownloadOutlined /> | ||||
|         </a-button> | ||||
|       </a-tooltip> | ||||
|       <a-button type="primary">Button 4</a-button> | ||||
|       <a-dropdown placement="bottomRight" :trigger="['click']"> | ||||
|         <a-button type="primary"> | ||||
|           <EllipsisOutlined /> | ||||
|         </a-button> | ||||
| 
 | ||||
|         <template #overlay> | ||||
|           <a-menu> | ||||
|             <a-menu-item> | ||||
|               <a href="javascript:;">1st menu item</a> | ||||
|             </a-menu-item> | ||||
|             <a-menu-item> | ||||
|               <a href="javascript:;">2nd menu item</a> | ||||
|             </a-menu-item> | ||||
|             <a-menu-item> | ||||
|               <a href="javascript:;">3rd menu item</a> | ||||
|             </a-menu-item> | ||||
|           </a-menu> | ||||
|         </template> | ||||
|       </a-dropdown> | ||||
|     </a-space-compact> | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { | ||||
|   DownloadOutlined, | ||||
|   EllipsisOutlined, | ||||
|   HeartOutlined, | ||||
|   LikeOutlined, | ||||
|   CommentOutlined, | ||||
|   StarOutlined, | ||||
|   ShareAltOutlined, | ||||
| } from '@ant-design/icons-vue'; | ||||
| import { defineComponent } from 'vue'; | ||||
| 
 | ||||
| export default defineComponent({ | ||||
|   components: { | ||||
|     DownloadOutlined, | ||||
|     EllipsisOutlined, | ||||
|     HeartOutlined, | ||||
|     LikeOutlined, | ||||
|     CommentOutlined, | ||||
|     StarOutlined, | ||||
|     ShareAltOutlined, | ||||
|   }, | ||||
| }); | ||||
| </script> | ||||
|  | @ -0,0 +1,227 @@ | |||
| <docs> | ||||
| --- | ||||
| order: 6 | ||||
| title: | ||||
|   zh-CN: 紧凑布局组合 | ||||
|   en-US: Compact Mode for form component | ||||
| --- | ||||
| 
 | ||||
| ## zh-CN | ||||
| 
 | ||||
| 使用 Space.Compact 让表单组件之间紧凑连接且合并边框。 | ||||
| 
 | ||||
| ## en-US | ||||
| 
 | ||||
| Compact Mode for form component. | ||||
| 
 | ||||
| </docs> | ||||
| 
 | ||||
| <template> | ||||
|   <div className="site-space-compact-wrapper"> | ||||
|     <a-space-compact block> | ||||
|       <a-input :style="{ width: '20%' }" default-value="0571" /> | ||||
|       <a-input :style="{ width: '30%' }" default-value="26888888" /> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block size="small"> | ||||
|       <a-input :style="{ width: 'calc(100% - 200px)' }" default-value="https://ant.design" /> | ||||
|       <a-button type="primary">Submit</a-button> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-input :style="{ width: 'calc(100% - 200px)' }" default-value="https://ant.design" /> | ||||
|       <a-button type="primary">Submit</a-button> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-input | ||||
|         :style="{ width: 'calc(100% - 200px)' }" | ||||
|         default-value="git@github.com:ant-design/ant-design.git" | ||||
|       /> | ||||
|       <a-tooltip title="copy git url"> | ||||
|         <a-button> | ||||
|           <CopyOutlined /> | ||||
|         </a-button> | ||||
|       </a-tooltip> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-select default-value="Zhejiang" allow-clear> | ||||
|         <a-select-option value="Zhejiang">Zhejiang</a-select-option> | ||||
|         <a-select-option value="Jiangsu">Jiangsu</a-select-option> | ||||
|       </a-select> | ||||
|       <a-input :style="{ width: '50%' }" default-value="Xihu District, Hangzhou" /> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-select allow-clear mode="multiple" default-value="Zhejianggggg" :style="{ width: '50%' }"> | ||||
|         <a-select-option value="Zhejianggggg">Zhejianggggg</a-select-option> | ||||
|         <a-select-option value="Jiangsu">Jiangsu</a-select-option> | ||||
|       </a-select> | ||||
|       <a-input :style="{ width: '50%' }" default-value="Xihu District, Hangzhou" /> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-input-search :style="{ width: '30%' }" default-value="0571" /> | ||||
|       <a-input-search allow-clear :style="{ width: '50%' }" default-value="26888888" /> | ||||
|       <a-input-search :style="{ width: '20%' }" default-value="+1" /> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-select default-value="Option1"> | ||||
|         <a-select-option value="Option1">Option1</a-select-option> | ||||
|         <a-select-option value="Option2">Option2</a-select-option> | ||||
|       </a-select> | ||||
|       <a-input :style="{ width: '50%' }" default-value="input content" /> | ||||
|       <a-input-number :default-value="12" /> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-input :style="{ width: '50%' }" default-value="input content" /> | ||||
|       <a-date-picker :style="{ width: '50%' }" /> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-range-picker :style="{ width: '70%' }" /> | ||||
|       <a-input :style="{ width: '30%' }" default-value="input content" /> | ||||
|       <a-button type="primary">查询</a-button> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-input :style="{ width: '30%' }" default-value="input content" /> | ||||
|       <a-range-picker :style="{ width: '70%' }" /> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-select default-value="Option1-1"> | ||||
|         <a-select-option value="Option1-1">Option1-1</a-select-option> | ||||
|         <a-select-option value="Option1-2">Option1-2</a-select-option> | ||||
|       </a-select> | ||||
|       <a-select default-value="Option2-2"> | ||||
|         <a-select-option value="Option2-1">Option2-1</a-select-option> | ||||
|         <a-select-option value="Option2-2">Option2-2</a-select-option> | ||||
|       </a-select> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-select default-value="1"> | ||||
|         <a-select-option value="1">Between</a-select-option> | ||||
|         <a-select-option value="2">Except</a-select-option> | ||||
|       </a-select> | ||||
|       <a-input :style="{ width: 100, textAlig: 'center' }" placeholder="Minimum" /> | ||||
|       <a-input | ||||
|         class="site-input-split" | ||||
|         :style="{ | ||||
|           width: 30, | ||||
|           borderLef: 0, | ||||
|           borderRight: 0, | ||||
|           pointerEvents: 'none', | ||||
|         }" | ||||
|         placeholder="~" | ||||
|         disabled | ||||
|       /> | ||||
|       <a-input | ||||
|         class="site-input-right" | ||||
|         :style="{ | ||||
|           width: 100, | ||||
|           textAlig: 'center', | ||||
|         }" | ||||
|         placeholder="Maximum" | ||||
|       /> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-select default-value="Sign Up" :style="{ width: '30%' }"> | ||||
|         <a-select-option value="Sign Up">Sign Up</a-select-option> | ||||
|         <a-select-option value="Sign In">Sign In</a-select-option> | ||||
|       </a-select> | ||||
|       <a-auto-complete | ||||
|         :style="{ width: '70%' }" | ||||
|         placeholder="Email" | ||||
|         :options="[{ value: 'text 1' }, { value: 'text 2' }]" | ||||
|       /> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-time-picker :style="{ width: '70%' }" /> | ||||
|       <a-cascader | ||||
|         :style="{ width: '70%' }" | ||||
|         :options="[ | ||||
|           { | ||||
|             value: 'zhejiang', | ||||
|             label: 'Zhejiang', | ||||
|             children: [ | ||||
|               { | ||||
|                 value: 'hangzhou', | ||||
|                 label: 'Hangzhou', | ||||
|                 children: [ | ||||
|                   { | ||||
|                     value: 'xihu', | ||||
|                     label: 'West Lake', | ||||
|                   }, | ||||
|                 ], | ||||
|               }, | ||||
|             ], | ||||
|           }, | ||||
|           { | ||||
|             value: 'jiangsu', | ||||
|             label: 'Jiangsu', | ||||
|             children: [ | ||||
|               { | ||||
|                 value: 'nanjing', | ||||
|                 label: 'Nanjing', | ||||
|                 children: [ | ||||
|                   { | ||||
|                     value: 'zhonghuamen', | ||||
|                     label: 'Zhong Hua Men', | ||||
|                   }, | ||||
|                 ], | ||||
|               }, | ||||
|             ], | ||||
|           }, | ||||
|         ]" | ||||
|         placeholder="Select Address" | ||||
|       /> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|     <a-space-compact block> | ||||
|       <a-time-range-picker /> | ||||
|       <a-tree-select | ||||
|         show-search | ||||
|         :style="{ width: '60%' }" | ||||
|         value="leaf1" | ||||
|         :dropdown-style="{ maxHeight: 400, overflow: 'auto' }" | ||||
|         placeholder="Please select" | ||||
|         allow-clear | ||||
|         tree-default-expand-all | ||||
|       > | ||||
|         <a-tree-select-node value="parent 1" title="parent 1"> | ||||
|           <a-tree-select-node value="parent 1-0" title="parent 1-0"> | ||||
|             <a-tree-select-node value="leaf1" title="leaf1" /> | ||||
|             <a-tree-select-node value="leaf2" title="leaf2" /> | ||||
|           </a-tree-select-node> | ||||
|           <a-tree-select-node value="parent 1-1" title="parent 1-1"> | ||||
|             <a-tree-select-node value="leaf3"> | ||||
|               <template #title> | ||||
|                 <b :style="{ color: '#08c' }">leaf3</b> | ||||
|               </template> | ||||
|             </a-tree-select-node> | ||||
|           </a-tree-select-node> | ||||
|         </a-tree-select-node> | ||||
|       </a-tree-select> | ||||
|       <a-button type="primary">Submit</a-button> | ||||
|     </a-space-compact> | ||||
|     <br /> | ||||
|   </div> | ||||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { CopyOutlined } from '@ant-design/icons-vue'; | ||||
| import { defineComponent } from 'vue'; | ||||
| 
 | ||||
| export default defineComponent({ | ||||
|   components: { | ||||
|     CopyOutlined, | ||||
|   }, | ||||
| }); | ||||
| </script> | ||||
|  | @ -4,6 +4,11 @@ | |||
|     <Customize /> | ||||
|     <Vertical /> | ||||
|     <Align /> | ||||
|     <Wrap /> | ||||
|     <Split /> | ||||
|     <Compact /> | ||||
|     <CompactButtons /> | ||||
|     <CompactButtonVertical /> | ||||
|   </demo-sort> | ||||
| </template> | ||||
| <script lang="ts"> | ||||
|  | @ -11,6 +16,11 @@ import Base from './base.vue'; | |||
| import Customize from './customize.vue'; | ||||
| import Vertical from './vertical.vue'; | ||||
| import Align from './align.vue'; | ||||
| import Wrap from './wrap.vue'; | ||||
| import Split from './split.vue'; | ||||
| import Compact from './compact.vue'; | ||||
| import CompactButtons from './compact-buttons.vue'; | ||||
| import CompactButtonVertical from './compact-button-vertical.vue'; | ||||
| import CN from '../index.zh-CN.md'; | ||||
| import US from '../index.en-US.md'; | ||||
| import { defineComponent } from 'vue'; | ||||
|  | @ -23,6 +33,11 @@ export default defineComponent({ | |||
|     Customize, | ||||
|     Vertical, | ||||
|     Align, | ||||
|     Wrap, | ||||
|     Split, | ||||
|     Compact, | ||||
|     CompactButtons, | ||||
|     CompactButtonVertical, | ||||
|   }, | ||||
|   setup() { | ||||
|     return {}; | ||||
|  |  | |||
|  | @ -0,0 +1,33 @@ | |||
| <docs> | ||||
| --- | ||||
| order: 0 | ||||
| title: | ||||
|   zh-CN: 分隔符 | ||||
|   en-US: Split | ||||
| --- | ||||
| 
 | ||||
| ## zh-CN | ||||
| 
 | ||||
| 相邻组件分隔符。 | ||||
| 
 | ||||
| ## en-US | ||||
| 
 | ||||
| Crowded components split. | ||||
| 
 | ||||
| </docs> | ||||
| 
 | ||||
| <template> | ||||
|   <a-space> | ||||
|     <template #split> | ||||
|       <a-divider type="vertical" /> | ||||
|     </template> | ||||
|     <a-typography-link>Link</a-typography-link> | ||||
|     <a-typography-link>Link</a-typography-link> | ||||
|     <a-typography-link>Link</a-typography-link> | ||||
|   </a-space> | ||||
| </template> | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| 
 | ||||
| export default defineComponent({}); | ||||
| </script> | ||||
|  | @ -0,0 +1,30 @@ | |||
| <docs> | ||||
| --- | ||||
| order: 0 | ||||
| title: | ||||
|   zh-CN: 自动换行 | ||||
|   en-US: Basic Usage | ||||
| --- | ||||
| 
 | ||||
| ## zh-CN | ||||
| 
 | ||||
| 自动换行。 | ||||
| 
 | ||||
| ## en-US | ||||
| 
 | ||||
| Wrap | ||||
| 
 | ||||
| </docs> | ||||
| 
 | ||||
| <template> | ||||
|   <a-space :size="[8, 16]" wrap> | ||||
|     <template v-for="index in 20" :key="index"> | ||||
|       <a-button>Button</a-button> | ||||
|     </template> | ||||
|   </a-space> | ||||
| </template> | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| 
 | ||||
| export default defineComponent({}); | ||||
| </script> | ||||
|  | @ -10,12 +10,36 @@ Set components spacing. | |||
| 
 | ||||
| ## When To Use | ||||
| 
 | ||||
| Avoid components clinging together and set a unified space. | ||||
| - Avoid components clinging together and set a unified space. | ||||
| - Use Space.Compact when child form components are compactly connected and the border is collapsed (After version `ant-design-vue@4.0.0` Supported). | ||||
| 
 | ||||
| ## API | ||||
| 
 | ||||
| ### Space | ||||
| 
 | ||||
| | Property | Description | Type | Default | Version | | ||||
| | --- | --- | --- | --- | --- | | ||||
| | align | Align items | `start` \| `end` \|`center` \|`baseline` | - | 1.6.5 | | ||||
| | direction | The space direction | `vertical` \| `horizontal` | `horizontal` | 1.6.5 | | ||||
| | size | The space size | `small` \| `middle` \| `large` \| `number` | `small` | 1.6.5 | | ||||
| | split | Set split | VueNode \| v-slot | - | 2.2.0 | | ||||
| | wrap | Auto wrap line, when `horizontal` effective | boolean | false | 2.2.0 | | ||||
| 
 | ||||
| ### Space.Compact | ||||
| 
 | ||||
| Use Space.Compact when child form components are compactly connected and the border is collapsed. The supported components are: | ||||
| 
 | ||||
| - Button | ||||
| - AutoComplete | ||||
| - Cascader | ||||
| - DatePicker | ||||
| - Input/Input.Search | ||||
| - Select | ||||
| - TimePicker | ||||
| - TreeSelect | ||||
| 
 | ||||
| | Property | Description | Type | Default | Version | | ||||
| | --- | --- | --- | --- | --- | | ||||
| | block | Option to fit width to its parent\'s width | boolean | false | 4.0.0 | | ||||
| | direction | Set direction of layout | `vertical` \| `horizontal` | `horizontal` | 4.0.0 | | ||||
| | size | Set child component size | `large` \| `middle` \| `small` | `middle` | 4.0.0 | | ||||
|  |  | |||
|  | @ -1,12 +1,15 @@ | |||
| import type { PropType, ExtractPropTypes, CSSProperties } from 'vue'; | ||||
| import type { PropType, ExtractPropTypes, CSSProperties, Plugin, App } from 'vue'; | ||||
| import { defineComponent, computed, ref, watch } from 'vue'; | ||||
| import PropTypes from '../_util/vue-types'; | ||||
| import { filterEmpty } from '../_util/props-util'; | ||||
| import type { SizeType } from '../config-provider'; | ||||
| import { tuple, withInstall } from '../_util/type'; | ||||
| import { booleanType, tuple } from '../_util/type'; | ||||
| import useConfigInject from '../config-provider/hooks/useConfigInject'; | ||||
| import useFlexGapSupport from '../_util/hooks/useFlexGapSupport'; | ||||
| import classNames from '../_util/classNames'; | ||||
| import Compact from './Compact'; | ||||
| 
 | ||||
| import useStyle from './style'; | ||||
| 
 | ||||
| export type SpaceSize = SizeType | number; | ||||
| const spaceSize = { | ||||
|  | @ -21,7 +24,7 @@ export const spaceProps = () => ({ | |||
|   }, | ||||
|   direction: PropTypes.oneOf(tuple('horizontal', 'vertical')).def('horizontal'), | ||||
|   align: PropTypes.oneOf(tuple('start', 'end', 'center', 'baseline')), | ||||
|   wrap: { type: Boolean, default: undefined }, | ||||
|   wrap: booleanType(), | ||||
| }); | ||||
| 
 | ||||
| export type SpaceProps = Partial<ExtractPropTypes<ReturnType<typeof spaceProps>>>; | ||||
|  | @ -33,10 +36,12 @@ function getNumberSize(size: SpaceSize) { | |||
| const Space = defineComponent({ | ||||
|   compatConfig: { MODE: 3 }, | ||||
|   name: 'ASpace', | ||||
|   inheritAttrs: false, | ||||
|   props: spaceProps(), | ||||
|   slots: ['split'], | ||||
|   setup(props, { slots }) { | ||||
|   setup(props, { slots, attrs }) { | ||||
|     const { prefixCls, space, direction: directionConfig } = useConfigInject('space', props); | ||||
|     const [wrapSSR, hashId] = useStyle(prefixCls); | ||||
|     const supportFlexGap = useFlexGapSupport(); | ||||
|     const size = computed(() => props.size ?? space?.value?.size ?? 'small'); | ||||
|     const horizontalSize = ref<number>(); | ||||
|  | @ -58,7 +63,7 @@ const Space = defineComponent({ | |||
|       props.align === undefined && props.direction === 'horizontal' ? 'center' : props.align, | ||||
|     ); | ||||
|     const cn = computed(() => { | ||||
|       return classNames(prefixCls.value, `${prefixCls.value}-${props.direction}`, { | ||||
|       return classNames(prefixCls.value, hashId.value, `${prefixCls.value}-${props.direction}`, { | ||||
|         [`${prefixCls.value}-rtl`]: directionConfig.value === 'rtl', | ||||
|         [`${prefixCls.value}-align-${mergedAlign.value}`]: mergedAlign.value, | ||||
|       }); | ||||
|  | @ -92,7 +97,7 @@ const Space = defineComponent({ | |||
|       const horizontalSizeVal = horizontalSize.value; | ||||
|       const latestIndex = len - 1; | ||||
|       return ( | ||||
|         <div class={cn.value} style={style.value}> | ||||
|         <div {...attrs} class={cn.value} style={style.value}> | ||||
|           {items.map((child, index) => { | ||||
|             let itemStyle: CSSProperties = {}; | ||||
|             if (!supportFlexGap.value) { | ||||
|  | @ -110,7 +115,7 @@ const Space = defineComponent({ | |||
|               } | ||||
|             } | ||||
| 
 | ||||
|             return ( | ||||
|             return wrapSSR( | ||||
|               <> | ||||
|                 <div class={itemClassName} style={itemStyle}> | ||||
|                   {child} | ||||
|  | @ -120,7 +125,7 @@ const Space = defineComponent({ | |||
|                     {split} | ||||
|                   </span> | ||||
|                 )} | ||||
|               </> | ||||
|               </>, | ||||
|             ); | ||||
|           })} | ||||
|         </div> | ||||
|  | @ -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; | ||||
|   }; | ||||
|  |  | |||
|  | @ -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 | | ||||
|  |  | |||
|  | @ -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<SpaceToken> = token => { | ||||
|   const { componentCls } = token; | ||||
| 
 | ||||
|   return { | ||||
|     [componentCls]: { | ||||
|       display: 'inline-flex', | ||||
|       '&-block': { | ||||
|         display: 'flex', | ||||
|         width: '100%', | ||||
|       }, | ||||
|       '&-vertical': { | ||||
|         flexDirection: 'column', | ||||
|       }, | ||||
|     }, | ||||
|   }; | ||||
| }; | ||||
| 
 | ||||
| // ============================== Export ============================== | ||||
| export default genSpaceCompactStyle; | ||||
|  | @ -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'; | ||||
|  | @ -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<SpaceToken> = 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), | ||||
| ]); | ||||
|  |  | |||
|  | @ -1,10 +0,0 @@ | |||
| @import '../../style/themes/index'; | ||||
| @import '../../style/mixins/index'; | ||||
| 
 | ||||
| @space-prefix-cls: ~'@{ant-prefix}-space'; | ||||
| 
 | ||||
| .@{space-prefix-cls} { | ||||
|   &-rtl { | ||||
|     direction: rtl; | ||||
|   } | ||||
| } | ||||
|  | @ -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';
 | ||||
|  |  | |||
|  | @ -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;
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 bqy_fe
						bqy_fe