@flatbiz/antd
Version:
272 lines (261 loc) • 8.6 kB
JavaScript
/* eslint-disable */
import './index.css';
/*! @flatjs/forge MIT @flatbiz/antd */
import { classNames } from '@dimjs/utils/class-names/class-names';
import { b as _objectSpread2, a as _slicedToArray } from '../_rollupPluginBabelHelpers-BYm17lo8.js';
import { createContext, useContext, useMemo, Children, cloneElement, useRef, useEffect } from 'react';
import { jsx } from 'react/jsx-runtime';
import { isNumber } from '@dimjs/lang/is-number';
import { useSize } from 'ahooks';
var PresetDefaultGrid = {
xs: 24,
sm: 12,
md: 12,
lg: 8,
xl: 8,
xxl: 6
};
var DefaultGutter = {
xs: 8,
sm: 16,
md: 16,
lg: 24,
xl: 24,
xxl: 32
};
var alignPropsMap = {
top: 'flex-start',
middle: 'center',
bottom: 'flex-end',
stretch: 'stretch'
};
var justifyPropsMap = {
start: 'flex-start',
end: 'flex-end',
center: 'center',
'space-around': 'space-around',
'space-between': 'space-between',
'space-evenly': 'space-evenly'
};
var defaultCtx = {
boxBreakpoint: 'lg',
defaultGrid: PresetDefaultGrid,
horizontalGap: 10,
verticalGap: 10
};
var BoxGridProviderCtx = /*#__PURE__*/createContext(defaultCtx);
var Col = function Col(props) {
var children = props.children,
className = props.className,
style = props.style,
removeWrapper = props.removeWrapper;
var _useContext = useContext(BoxGridProviderCtx),
defaultGrid = _useContext.defaultGrid,
horizontalGap = _useContext.horizontalGap,
boxBreakpoint = _useContext.boxBreakpoint;
var span = useMemo(function () {
return props.span || props[boxBreakpoint || 'lg'] || (defaultGrid === null || defaultGrid === void 0 ? void 0 : defaultGrid[boxBreakpoint || 'lg']) || 8;
}, [props, boxBreakpoint, defaultGrid]);
var styles = _objectSpread2(_objectSpread2({}, style), {}, {
flex: "0 0 ".concat(span / 24 * 100, "%"),
maxWidth: "".concat(span / 24 * 100, "%"),
padding: "0 ".concat(horizontalGap / 2, "px")
});
if (removeWrapper && Children.count(children) === 1) {
var _children$props, _children$props2;
var innerStyle = (children === null || children === void 0 || (_children$props = children['props']) === null || _children$props === void 0 ? void 0 : _children$props.style) || {};
var innerClassName = (children === null || children === void 0 || (_children$props2 = children['props']) === null || _children$props2 === void 0 ? void 0 : _children$props2.className) || {};
return /*#__PURE__*/cloneElement(children, _objectSpread2(_objectSpread2({}, children === null || children === void 0 ? void 0 : children['props']), {}, {
style: _objectSpread2(_objectSpread2({}, styles), innerStyle),
className: classNames('box-grad-col', innerClassName, className)
}));
}
return /*#__PURE__*/jsx("div", {
className: classNames(className, 'box-grad-col'),
style: styles,
children: children
});
};
Col['domTypeName'] = 'BoxGridCol';
/**
* 监听盒子大小变化,返回当前的断点
* @param dom
* @returns
*/
var useBoxBreakpoint = function useBoxBreakpoint(dom) {
var _ref = useSize(dom) || {},
width = _ref.width;
var boxBreakpoint = useMemo(function () {
var w = width || (dom === null || dom === void 0 ? void 0 : dom.clientWidth);
if (!w) {
return 'lg';
}
if (w >= 1600) {
return 'xxl';
} else if (w >= 1200) {
return 'xl';
} else if (w >= 992) {
return 'lg';
} else if (w >= 768) {
return 'md';
} else if (w >= 576) {
return 'sm';
} else {
return 'xs';
}
}, [width]);
return {
boxBreakpoint: boxBreakpoint,
/**
* @deprecated
* 使用 haveWidth 替代
*/
isInit: !!width,
/** width为0,或者不存在 */
haveWidth: !!width
};
};
/**
* 处理间距
* @param gutter
* @param boxBreakpoint
* @returns
*/
var useGutter = function useGutter() {
var gutter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DefaultGutter;
var boxBreakpoint = arguments.length > 1 ? arguments[1] : undefined;
return useMemo(function () {
var horizontalGap;
var verticalGap;
var getCommonGutter = function getCommonGutter(gutter) {
if (typeof gutter === 'number') {
return gutter;
}
if (typeof gutter === 'object') {
return _objectSpread2(_objectSpread2({}, DefaultGutter), gutter)[boxBreakpoint];
}
};
if (Array.isArray(gutter)) {
var _gutter = _slicedToArray(gutter, 2),
h = _gutter[0],
v = _gutter[1];
horizontalGap = getCommonGutter(h);
verticalGap = getCommonGutter(v);
} else {
horizontalGap = getCommonGutter(gutter);
verticalGap = defaultCtx.verticalGap;
}
return {
horizontalGap: isNumber(horizontalGap) ? horizontalGap : defaultCtx.horizontalGap,
verticalGap: isNumber(verticalGap) ? verticalGap : defaultCtx.verticalGap
};
}, [gutter, boxBreakpoint]);
};
var Row = function Row(props) {
var _props$defaultGrid = props.defaultGrid,
defaultGrid = _props$defaultGrid === void 0 ? PresetDefaultGrid : _props$defaultGrid,
children = props.children,
className = props.className,
style = props.style,
gutter = props.gutter,
align = props.align,
justify = props.justify,
onBoxBreakpointChange = props.onBoxBreakpointChange;
var comRef = useRef(null);
var _useBoxBreakpoint = useBoxBreakpoint(comRef),
boxBreakpoint = _useBoxBreakpoint.boxBreakpoint,
haveWidth = _useBoxBreakpoint.haveWidth;
var _useGutter = useGutter(gutter, boxBreakpoint),
horizontalGap = _useGutter.horizontalGap,
verticalGap = _useGutter.verticalGap;
useEffect(function () {
onBoxBreakpointChange === null || onBoxBreakpointChange === void 0 || onBoxBreakpointChange(boxBreakpoint);
}, [boxBreakpoint]);
return /*#__PURE__*/jsx(BoxGridProviderCtx.Provider, {
value: _objectSpread2(_objectSpread2({}, defaultCtx), {}, {
defaultGrid: _objectSpread2(_objectSpread2({}, PresetDefaultGrid), defaultGrid),
boxBreakpoint: boxBreakpoint,
horizontalGap: horizontalGap,
verticalGap: verticalGap
}),
children: /*#__PURE__*/jsx("div", {
className: classNames('box-grad-root', className),
ref: comRef,
style: style,
children: /*#__PURE__*/jsx("div", {
className: "box-grad-row",
style: {
alignItems: align ? alignPropsMap[align] : 'normal',
justifyContent: justify ? justifyPropsMap[justify] : 'normal',
marginLeft: "-".concat(horizontalGap / 2, "px"),
marginRight: "-".concat(horizontalGap / 2, "px"),
rowGap: "".concat(verticalGap, "px"),
/**
* fix: boxBreakpoint多次变化,闪一下的问题
* 子元素拿不到宽度,boxBreakpoint 会快速变化,导致元素闪烁
* 场景:
* 1. 使用 Tabs 组件时,任意父级元素disabled,子元素拿不到宽度
* 2. 初始渲染,拿不到宽度
*/
opacity: haveWidth ? 1 : 0
},
children: children
})
})
});
};
/**
* 获取栅格响应式布局的配置
* @param minSize 元素的最小可接受宽度
* @returns
*/
var getGridMapByRange = function getGridMapByRange(minSize) {
var getSpan = function getSpan(threshold) {
var result = Math.ceil(minSize * 24 / threshold);
return [1, 2, 3, 4, 6, 8, 12, 24].find(function (item) {
return item >= result;
}) || 24;
};
return {
xxl: getSpan(1600),
xl: getSpan(1200),
lg: getSpan(992),
md: getSpan(768),
sm: getSpan(576),
xs: getSpan(200)
};
};
var BoxGrid = {
/**
* 网格响应式布局
*```
* 1. 应用场景:根据盒子大小决定内部元素的布局
* 2. 子元素只能是 BoxGrid.Col
*/
Row: Row,
/**
* 网格响应式布局,
* 默认值:
* { xs: 24, sm: 12, md: 12, lg: 8, xl: 8, xxl: 6 }
* xs={24} sm={12} md={12} lg={8} xl={8} xxl={6}
*```
* 1. 设置 span 栅格占位格数,0 ~ 24
* 2. grid 自定义响应式网格布局
* xs: 容器尺寸 < 576px
* sm: 容器尺寸 ≥ 576px
* md: 容器尺寸 ≥ 768px
* lg: 容器尺寸 ≥ 992px
* xl: 容器尺寸 ≥ 1200px
* xxl: 容器尺寸 ≥ 1600px
* ```
*/
Col: Col,
/**
* 获取栅格响应式布局的配置
* @param minSize 元素的最小可接受宽度
* @returns { xs: num, sm: num, md: num, lg: num, xl: num, xxl: num }
*/
getGridMapByRange: getGridMapByRange
};
export { BoxGrid, useBoxBreakpoint };
//# sourceMappingURL=index.js.map