Skip to content

Commit

Permalink
refactor(Input): make TextArea style tree shakeable (#52570)
Browse files Browse the repository at this point in the history
  • Loading branch information
guoyunhe authored Jan 26, 2025
1 parent 9955f43 commit e9a3703
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 89 deletions.
2 changes: 1 addition & 1 deletion components/input/TextArea.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { FormItemInputContext } from '../form/context';
import useVariant from '../form/hooks/useVariants';
import type { InputFocusOptions } from './Input';
import { triggerFocus } from './Input';
import useStyle from './style';
import useStyle from './style/textarea';

export interface TextAreaProps extends Omit<RcTextAreaProps, 'suffix'> {
/** @deprecated Use `variant` instead */
Expand Down
90 changes: 2 additions & 88 deletions components/input/style/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -375,7 +375,7 @@ export const genInputGroupStyle = (token: InputToken): CSSObject => {
};
};

const genInputStyle: GenerateStyle<InputToken> = (token: InputToken) => {
export const genInputStyle: GenerateStyle<InputToken> = (token: InputToken) => {
const { componentCls, controlHeightSM, lineWidth, calc } = token;

const FIXED_CHROME_COLOR_HEIGHT = 16;
Expand Down Expand Up @@ -454,7 +454,7 @@ const genAllowClearStyle = (token: InputToken): CSSObject => {
};
};

const genAffixStyle: GenerateStyle<InputToken> = (token: InputToken) => {
export const genAffixStyle: GenerateStyle<InputToken> = (token: InputToken) => {
const {
componentCls,
inputAffixPadding,
Expand Down Expand Up @@ -779,91 +779,6 @@ const genSearchInputStyle: GenerateStyle<InputToken> = (token: InputToken) => {
};
};

const genTextAreaStyle: GenerateStyle<InputToken> = (token) => {
const { componentCls, paddingLG } = token;
const textareaPrefixCls = `${componentCls}-textarea`;

return {
[textareaPrefixCls]: {
position: 'relative',

'&-show-count': {
// https://github.com/ant-design/ant-design/issues/33049
[`> ${componentCls}`]: {
height: '100%',
},

[`${componentCls}-data-count`]: {
position: 'absolute',
bottom: token.calc(token.fontSize).mul(token.lineHeight).mul(-1).equal(),
insetInlineEnd: 0,
color: token.colorTextDescription,
whiteSpace: 'nowrap',
pointerEvents: 'none',
},
},

[`
&-allow-clear > ${componentCls},
&-affix-wrapper${textareaPrefixCls}-has-feedback ${componentCls}
`]: {
paddingInlineEnd: paddingLG,
},

[`&-affix-wrapper${componentCls}-affix-wrapper`]: {
padding: 0,

[`> textarea${componentCls}`]: {
fontSize: 'inherit',
border: 'none',
outline: 'none',
background: 'transparent',

'&:focus': {
boxShadow: 'none !important',
},
},

[`${componentCls}-suffix`]: {
margin: 0,

'> *:not(:last-child)': {
marginInline: 0,
},

// Clear Icon
[`${componentCls}-clear-icon`]: {
position: 'absolute',
insetInlineEnd: token.paddingInline,
insetBlockStart: token.paddingXS,
},

// Feedback Icon
[`${textareaPrefixCls}-suffix`]: {
position: 'absolute',
top: 0,
insetInlineEnd: token.paddingInline,
bottom: 0,
zIndex: 1,
display: 'inline-flex',
alignItems: 'center',
margin: 'auto',
pointerEvents: 'none',
},
},
},

[`&-affix-wrapper${componentCls}-affix-wrapper-sm`]: {
[`${componentCls}-suffix`]: {
[`${componentCls}-clear-icon`]: {
insetInlineEnd: token.paddingInlineSM,
},
},
},
},
};
};

// ============================== Range ===============================
const genRangeStyle: GenerateStyle<InputToken> = (token) => {
const { componentCls } = token;
Expand All @@ -885,7 +800,6 @@ export default genStyleHooks(

return [
genInputStyle(inputToken),
genTextAreaStyle(inputToken),
genAffixStyle(inputToken),
genGroupStyle(inputToken),
genSearchInputStyle(inputToken),
Expand Down
107 changes: 107 additions & 0 deletions components/input/style/textarea.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import { genAffixStyle, genInputStyle } from '.';
import type { GenerateStyle } from '../../theme/internal';
import { genStyleHooks, mergeToken } from '../../theme/internal';
import type { ComponentToken, InputToken } from './token';
import { initComponentToken, initInputToken } from './token';

export type { ComponentToken };
export { initComponentToken, initInputToken };

const genTextAreaStyle: GenerateStyle<InputToken> = (token) => {
const { componentCls, paddingLG } = token;
const textareaPrefixCls = `${componentCls}-textarea`;

return {
[textareaPrefixCls]: {
position: 'relative',

'&-show-count': {
// https://github.com/ant-design/ant-design/issues/33049
[`> ${componentCls}`]: {
height: '100%',
},

[`${componentCls}-data-count`]: {
position: 'absolute',
bottom: token.calc(token.fontSize).mul(token.lineHeight).mul(-1).equal(),
insetInlineEnd: 0,
color: token.colorTextDescription,
whiteSpace: 'nowrap',
pointerEvents: 'none',
},
},

[`
&-allow-clear > ${componentCls},
&-affix-wrapper${textareaPrefixCls}-has-feedback ${componentCls}
`]: {
paddingInlineEnd: paddingLG,
},

[`&-affix-wrapper${componentCls}-affix-wrapper`]: {
padding: 0,

[`> textarea${componentCls}`]: {
fontSize: 'inherit',
border: 'none',
outline: 'none',
background: 'transparent',

'&:focus': {
boxShadow: 'none !important',
},
},

[`${componentCls}-suffix`]: {
margin: 0,

'> *:not(:last-child)': {
marginInline: 0,
},

// Clear Icon
[`${componentCls}-clear-icon`]: {
position: 'absolute',
insetInlineEnd: token.paddingInline,
insetBlockStart: token.paddingXS,
},

// Feedback Icon
[`${textareaPrefixCls}-suffix`]: {
position: 'absolute',
top: 0,
insetInlineEnd: token.paddingInline,
bottom: 0,
zIndex: 1,
display: 'inline-flex',
alignItems: 'center',
margin: 'auto',
pointerEvents: 'none',
},
},
},

[`&-affix-wrapper${componentCls}-affix-wrapper-sm`]: {
[`${componentCls}-suffix`]: {
[`${componentCls}-clear-icon`]: {
insetInlineEnd: token.paddingInlineSM,
},
},
},
},
};
};

// ============================== Export ==============================
export default genStyleHooks(
'Input',
(token) => {
const inputToken = mergeToken<InputToken>(token, initInputToken(token));

return [genInputStyle(inputToken), genAffixStyle(inputToken), genTextAreaStyle(inputToken)];
},
initComponentToken,
{
resetFont: false,
},
);

0 comments on commit e9a3703

Please sign in to comment.