// deps-lint-skip-all import { CSSObject } from '@ant-design/cssinjs'; import { TinyColor } from '@ctrl/tinycolor'; import { DerivativeToken, useStyleRegister, useToken, UseComponentStyleResult, GenerateStyle, resetComponent, } from '../../_util/theme'; interface ListToken extends DerivativeToken { listCls: string; minHeight: number; fontSizeSm: number; antPrefix: string; listBorderedCls: string; minWidth: number; marginSM: number; lineHeightBase: number; fontSizeLg: number; height4: number; height14: number; height7: number; height48: number; disabledColor: string; listItemPaddingLg: string; listItemPaddingSm: string; listItemPadding: string; borderColorSplit: string; borderColorBase: string; } const genBorderedStyle = (token: ListToken): CSSObject => { const { listBorderedCls, listCls, paddingLG, margin, padding, listItemPaddingSm, marginLG, borderColorBase, radiusBase, } = token; return { [`${listBorderedCls}`]: { border: `1px solid ${borderColorBase}`, borderRadius: radiusBase, [`${listCls}-header,${listCls}-footer,${listCls}-item`]: { paddingInline: paddingLG, }, [`${listCls}-pagination`]: { margin: `${margin}px ${marginLG}px`, }, }, [`${listBorderedCls}${listCls}-sm`]: { [`${listCls}-item,${listCls}-header,${listCls}-footer`]: { padding: listItemPaddingSm, }, }, [`${listBorderedCls}${listCls}-lg`]: { [`${listCls}-item,${listCls}-header,${listCls}-footer`]: { padding: `${padding}px ${paddingLG}px`, }, }, }; }; const genResponsiveStyle = (token: ListToken): CSSObject => { const { minWidth, listCls, screenSM, screenMD, marginLG, marginSM, margin } = token; return { [`@media screen and (max-width:${screenMD})`]: { [`${listCls}`]: { [`${listCls}-item`]: { [`${listCls}-item-action`]: { marginInlineStart: marginLG, }, }, }, [`${listCls}-vertical`]: { [`${listCls}-item`]: { [`${listCls}-item-extra`]: { marginInlineStart: marginLG, }, }, }, }, [`@media screen and (max-width: ${screenSM})`]: { [`${listCls}`]: { [`${listCls}-item`]: { flexWrap: 'wrap', [`${listCls}-action`]: { marginInlineStart: marginSM, }, }, }, [`${listCls}-vertical`]: { [`${listCls}-item`]: { flexWrap: 'wrap-reverse', [`${listCls}-item-main`]: { minWidth, }, [`${listCls}-item-extra`]: { margin: `auto auto ${margin}px`, }, }, }, }, }; }; // =============================== Base =============================== const genBaseStyle: GenerateStyle = token => { const { listCls, antPrefix, controlHeight, minHeight, height48, fontSizeSm, paddingSM, marginLG, marginSM, padding, disabledColor, lineHeightBase, fontSizeBase, listItemPadding, colorPrimary, borderColorSplit, listItemPaddingSm, listItemPaddingLg, paddingXS, fontSize, fontSizeLg, margin, colorText, colorTextSecondary, lineHeight, height4, motionDurationSlow, lineWidth, height14, height7, } = token; return { [`${listCls}`]: { ...resetComponent({ ...token, colorText, fontSize: fontSizeBase, lineHeight: lineHeightBase, }), position: 'relative', '*': { outline: 'none', }, [`${listCls}-header, ${listCls}-footer`]: { background: 'transparent', paddingBlock: paddingSM, }, [`${listCls}-pagination`]: { marginBlockStart: marginLG, textAlign: 'end', // https://github.com/ant-design/ant-design/issues/20037 [`${antPrefix}-pagination-options`]: { textAlign: 'start', }, }, [`${listCls}-more`]: { marginBlockStart: marginSM, textAlign: 'center', button: { paddingInline: `${controlHeight}px`, }, }, [`${listCls}-spin`]: { minHeight, textAlign: 'center', }, [`${listCls}-items`]: { margin: 0, padding: 0, listStyle: 'none', }, [`${listCls}-item`]: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: listItemPadding, color: colorText, [`${listCls}-item-meta`]: { display: 'flex', flex: 1, alignItems: 'flex-start', maxWidth: '100%', [`${listCls}-item-meta-avatar`]: { marginInlineEnd: padding, }, [`${listCls}-item-meta-content`]: { flex: '1 0', width: 0, color: colorText, }, [`${listCls}-item-meta-title`]: { marginBlockEnd: height4, color: colorText, fontSize, lineHeight: lineHeightBase, '> a': { color: colorText, transition: `all ${motionDurationSlow}`, [`&:hover`]: { color: colorPrimary, }, }, }, [`${listCls}-item-meta-description`]: { color: colorTextSecondary, fontSize: fontSizeBase, lineHeight: lineHeightBase, }, }, [`${listCls}-item-action`]: { flex: '0 0 auto', marginInlineStart: height48, padding: 0, fontSize: 0, listStyle: 'none', [`& > li`]: { position: 'relative', display: 'inline-block', padding: `0 ${paddingXS}px`, color: colorTextSecondary, fontSize: fontSizeBase, lineHeight: lineHeightBase, textAlign: 'center', [`&:first-child`]: { paddingInlineStart: 0, }, }, [`${listCls}-item-action-split`]: { position: 'absolute', insetBlockStart: '50%', insetInlineEnd: 0, width: lineWidth, height: height14, marginBlockStart: -height7, backgroundColor: borderColorSplit, }, }, }, [`${listCls}-empty`]: { padding: `${padding}px 0`, color: colorTextSecondary, fontSize: fontSizeSm, textAlign: 'center', }, [`${listCls}-empty-text`]: { padding, color: disabledColor, fontSize: fontSizeBase, textAlign: 'center', }, // ============================ without flex ============================ [`${listCls}-item-no-flex`]: { display: 'block', }, }, [`${listCls}-grid ${antPrefix}-col > ${listCls}-item`]: { display: 'block', maxWidth: '100%', marginBlockEnd: margin, paddingBlock: 0, borderBlockEnd: 'none', }, [`${listCls}-vertical ${listCls}-item`]: { alignItems: 'initial', [`${listCls}-item-main`]: { display: 'block', flex: 1, }, [`${listCls}-item-extra`]: { marginInlineStart: marginLG, }, [`${listCls}-item-meta`]: { marginBlockEnd: padding, [`${listCls}-item-meta-title`]: { marginBlockEnd: paddingSM, color: colorText, fontSize: fontSizeLg, lineHeight, }, }, [`${listCls}-item-action`]: { marginBlockStart: padding, marginInlineStart: 'auto', '> li': { padding: `0 ${padding}px`, [`&:first-child`]: { paddingInlineStart: 0, }, }, }, }, [`${listCls}-split ${listCls}-item`]: { borderBlockEnd: `1px solid ${borderColorSplit}`, [`&:last-child`]: { borderBlockEnd: 'none', }, }, [`${listCls}-split ${listCls}-header`]: { borderBlockEnd: `1px solid ${borderColorSplit}`, }, [`${listCls}-split${listCls}-empty ${listCls}-footer`]: { borderTop: `1px solid ${borderColorSplit}`, }, [`${listCls}-loading ${listCls}-spin-nested-loading`]: { minHeight: controlHeight, }, [`${listCls}-split${listCls}-something-after-last-item ${antPrefix}-spin-container > ${listCls}-items > ${listCls}-item:last-child`]: { borderBlockEnd: `1px solid ${borderColorSplit}`, }, [`${listCls}-lg ${listCls}-item`]: { padding: listItemPaddingLg, }, [`${listCls}-sm ${listCls}-item`]: { padding: listItemPaddingSm, }, // Horizontal [`${listCls}:not(${listCls}-vertical)`]: { [`${listCls}-item-no-flex`]: { [`${listCls}-item-action`]: { float: 'right', }, }, }, }; }; // ============================== Export ============================== export default function useStyle(prefixCls: string): UseComponentStyleResult { const [theme, token, hashId] = useToken(); const listToken: ListToken = { ...token, listCls: `.${prefixCls}`, listBorderedCls: `.${prefixCls}-bordered`, antPrefix: '.ant', // FIXME: hard code in v4 minHeight: 40, // FIXME: hard code in v4, colorTextSecondary: new TinyColor('#000').setAlpha(0.45).toRgbString(), // FIXME: hard code in v4, borderColorSplit: new TinyColor({ h: 0, s: 0, v: 94 }).toHexString(), // FIXME: hard code in v4, borderColorBase: new TinyColor({ h: 0, s: 0, v: 85 }).toHexString(), // FIXME: hard code in v4, disabledColor: new TinyColor('#000').setAlpha(0.25).toRgbString(), // FIXME: hard code in v4, minWidth: 220, // FIXME: hard code in v4, height4: 4, // FIXME: hard code in v4, height14: 14, // FIXME: hard code in v4, height7: 7, // FIXME: hard code in v4, height48: 48, // FIXME: hard code in v4, fontSizeSm: 12, // FIXME: hard code in v4, fontSize: 14, // FIXME: hard code in v4, fontSizeLg: 16, // FIXME: hard code in v4, listItemPadding: '12px 0', // FIXME: hard code in v4, listItemPaddingSm: '8px 16px', // FIXME: hard code in v4, listItemPaddingLg: '16px 24px', // FIXME: hard code in v4, lineHeightBase: 1.5715, // FIXME: hard code in v4, lineHeight: 1.5, }; return [ useStyleRegister({ theme, token, hashId, path: [prefixCls] }, () => [ genBaseStyle(listToken, hashId), genBorderedStyle(listToken), genResponsiveStyle(listToken), ]), hashId, ]; }