ant-design/components/cascader/style/index.tsx

178 lines
5.3 KiB
TypeScript
Raw Normal View History

2022-03-09 00:29:00 +08:00
// import '../../style/index.less';
// import './index.less';
2022-03-09 00:29:00 +08:00
// // style dependencies
// import '../../empty/style';
// import '../../select/style';
2022-03-09 00:29:00 +08:00
// // deps-lint-skip: form
// deps-lint-skip-all
import {
DerivativeToken,
useStyleRegister,
useToken,
UseComponentStyleResult,
GenerateStyle,
2022-03-09 00:29:00 +08:00
} from '../../_util/theme';
import { getStyle as getCheckboxStyle } from '../../checkbox/style';
interface CascaderToken extends DerivativeToken {
prefixCls: string;
2022-03-09 00:29:00 +08:00
cascaderCls: string;
}
// =============================== Base ===============================
const genBaseStyle: GenerateStyle<CascaderToken> = (token, hashId) => {
const { prefixCls, cascaderCls } = token;
2022-03-09 00:29:00 +08:00
const cascaderMenuItemCls = `${cascaderCls}-menu-item`;
const iconCls = `
${cascaderMenuItemCls}-expand ${cascaderMenuItemCls}-expand-icon,
${cascaderMenuItemCls}-loading-icon
`;
const itemPaddingVertical = Math.round(
(token.controlHeight - token.fontSize * token.lineHeight) / 2,
);
return [
// =====================================================
// == Control ==
// =====================================================
{
[cascaderCls]: {
width: 184, // FIXME: hardcode in v4
},
},
// =====================================================
// == Popup ==
// =====================================================
{
[`${cascaderCls}-dropdown`]: [
// ==================== Checkbox ====================
getCheckboxStyle(`${prefixCls}-checkbox`, token, hashId!),
{
[cascaderCls]: {
// ================== Checkbox ==================
'&-checkbox': {
top: 0,
marginInlineEnd: token.paddingXS,
2022-03-09 00:29:00 +08:00
},
// ==================== Menu ====================
// >>> Menus
'&-menus': {
2022-03-09 00:29:00 +08:00
display: 'flex',
flexWrap: 'nowrap',
alignItems: 'flex-start',
[`&${cascaderCls}-menu-empty`]: {
[`${cascaderCls}-menu`]: {
width: '100%',
height: 'auto',
[cascaderMenuItemCls]: {
color: token.colorTextDisabled,
cursor: 'default',
pointerEvents: 'none',
},
},
2022-03-09 00:29:00 +08:00
},
},
// >>> Menu
'&-menu': {
minWidth: 111, // FIXME: hardcode in v4
height: 180, // FIXME: hardcode in v4
margin: `-${token.paddingXS}px 0`,
padding: `${token.paddingXS}px 0`,
overflow: 'auto',
verticalAlign: 'top',
listStyle: 'none',
borderInlineEnd: `${token.controlLineWidth}px ${token.controlLineType} ${token.colorSplit}`,
'-ms-overflow-style': '-ms-autohiding-scrollbar', // https://github.com/ant-design/ant-design/issues/11857
'&-item': {
display: 'flex',
flexWrap: 'nowrap',
alignItems: 'center',
padding: `${itemPaddingVertical}px ${token.paddingSM}px`,
overflow: 'hidden',
lineHeight: token.lineHeight,
whiteSpace: 'nowrap',
textOverflow: 'ellipsis',
cursor: 'pointer',
transition: `all ${token.motionDurationSlow}`,
2022-03-09 00:29:00 +08:00
'&:hover': {
background: token.controlItemBgHover,
2022-03-09 00:29:00 +08:00
},
' &-disabled': {
color: token.colorTextDisabled,
cursor: 'not-allowed',
'&:hover': {
background: 'transparent',
},
[iconCls]: {
color: token.colorTextDisabled,
},
2022-03-09 00:29:00 +08:00
},
[`&-active:not(${cascaderMenuItemCls}-disabled)`]: {
[`&, &:hover`]: {
fontWeight: token.fontWeightStrong,
backgroundColor: token.controlItemBgActive,
},
2022-03-09 00:29:00 +08:00
},
'&-content': {
flex: 'auto',
},
2022-03-09 00:29:00 +08:00
[iconCls]: {
marginInlineStart: token.paddingXXS,
color: token.colorTextSecondary,
fontSize: 10, // FIXME: hardcode in v4
},
2022-03-09 00:29:00 +08:00
'&-keyword': {
color: token.colorHighlight,
},
2022-03-09 00:29:00 +08:00
},
},
},
},
],
2022-03-09 00:29:00 +08:00
},
// =====================================================
// == RTL ==
// =====================================================
{
[`${cascaderCls}-dropdown-rtl`]: {
direction: 'rtl',
},
},
];
};
// ============================== Export ==============================
export default function useStyle(prefixCls: string): UseComponentStyleResult {
const [theme, token, hashId] = useToken();
const cascaderToken: CascaderToken = {
...token,
prefixCls,
2022-03-09 00:29:00 +08:00
cascaderCls: `.${prefixCls}`,
};
return [
useStyleRegister({ theme, token, hashId, path: [prefixCls] }, () => [
genBaseStyle(cascaderToken, hashId),
2022-03-09 00:29:00 +08:00
]),
hashId,
];
}