This commit is contained in:
2026-05-25 17:08:18 +08:00
parent df501f6151
commit f1259b71b5
9178 changed files with 1626125 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
import type { CSSObject } from '@ant-design/cssinjs';
import type { FloatButtonToken } from '.';
import type { GenerateStyle } from '../../theme/interface';
declare const genFloatButtonStyle: GenerateStyle<FloatButtonToken, CSSObject>;
export default genFloatButtonStyle;
+103
View File
@@ -0,0 +1,103 @@
import { unit } from '@ant-design/cssinjs';
import { genCssVar } from '../../theme/util/genStyleUtils';
const genFloatButtonStyle = token => {
const {
componentCls,
floatButtonSize,
iconCls,
antCls,
floatButtonIconSize
} = token;
const [varName, varRef] = genCssVar(antCls, 'float-btn');
const badgeCls = `${componentCls}-badge`;
const R = Math.SQRT2;
const offsetR = (R - 1) / R;
const offsetSquare = token.calc(token.borderRadius).mul(offsetR).equal();
const offsetCircle = token.calc(token.controlHeight).div(2).mul(offsetR).equal();
return {
[componentCls]: [
// ==============================================================
// == Variable ==
// ==============================================================
{
[varName('size')]: unit(floatButtonSize)
},
// ==============================================================
// == Template ==
// ==============================================================
{
flexDirection: 'column',
margin: 0,
padding: `${unit(token.paddingXXS)} 0`,
width: varRef('size'),
minHeight: varRef('size'),
height: 'auto',
wordBreak: 'break-word',
whiteSpace: 'normal',
gap: token.calc(token.paddingXXS).div(2).equal(),
'&-rtl': {
direction: 'rtl'
},
// ======================== Individual ========================
// Not in group
[`&${componentCls}-individual`]: {
position: 'fixed',
zIndex: token.zIndexPopupBase,
insetInlineEnd: token.floatButtonInsetInlineEnd,
bottom: token.floatButtonInsetBlockEnd,
boxShadow: token.boxShadowSecondary
},
// =========================== Pure ===========================
[`&${componentCls}-pure`]: {
position: 'relative',
inset: 'auto'
},
// ========================== Empty ===========================
'&:empty': {
display: 'none'
},
// =========================== Icon ===========================
[`${componentCls}-icon`]: {
lineHeight: 1
},
// Icon Only will has large icon Size
[`&${componentCls}-icon-only`]: {
[iconCls]: {
fontSize: floatButtonIconSize
}
},
// =========================== Desc ===========================
[`${componentCls}-content`]: {
fontSize: token.fontSizeSM
},
// ========================== Badge ===========================
[badgeCls]: {
position: 'absolute',
top: 0,
insetInlineEnd: 0,
[`&:not(${badgeCls}-dot)`]: {
transform: 'translate(50%, -50%)'
}
},
// RTL
[`&-rtl ${badgeCls}:not(${badgeCls}-dot)`]: {
transform: 'translate(-50%, -50%)'
},
// Shape: square
'&-square': {
[`${badgeCls}-dot`]: {
marginTop: offsetSquare,
marginInlineEnd: offsetSquare
}
},
// Shape: circle
'&-circle': {
[badgeCls]: {
marginTop: offsetCircle,
marginInlineEnd: offsetCircle
}
}
}]
};
};
export default genFloatButtonStyle;
+5
View File
@@ -0,0 +1,5 @@
import type { CSSObject } from '@ant-design/cssinjs';
import type { FloatButtonToken } from '.';
import type { GenerateStyle } from '../../theme/interface';
declare const genGroupStyle: GenerateStyle<FloatButtonToken, CSSObject>;
export default genGroupStyle;
+111
View File
@@ -0,0 +1,111 @@
import { unit } from '@ant-design/cssinjs';
import { resetComponent } from '../../style';
import { genCssVar } from '../../theme/util/genStyleUtils';
const genGroupStyle = token => {
const {
componentCls,
antCls,
floatButtonSize,
padding
} = token;
const groupCls = `${componentCls}-group`;
const listCls = `${groupCls}-list`;
const [varName, varRef] = genCssVar(antCls, 'float-btn');
return {
[groupCls]: [
// ==============================================================
// == Variable ==
// ==============================================================
{
[varName('list-transform-start')]: `translate(0,${unit(floatButtonSize)})`,
[varName('list-trigger-offset')]: `calc(${unit(floatButtonSize)} + ${unit(padding)})`
},
// ==============================================================
// == Template ==
// ==============================================================
{
...resetComponent(token),
position: 'fixed',
zIndex: token.zIndexPopupBase,
insetInlineEnd: token.floatButtonInsetInlineEnd,
bottom: token.floatButtonInsetBlockEnd,
gap: padding,
'&-rtl': {
direction: 'rtl'
},
// =========================== Pure ===========================
[`&${componentCls}-pure`]: {
position: 'relative',
inset: 'auto'
},
// ========================== Button ==========================
[componentCls]: {
position: 'relative',
inset: 'auto'
}
},
// ==============================================================
// == List ==
// ==============================================================
{
// ======================== Individual ========================
// Not in group
[`&:not(${groupCls}-individual) ${listCls}`]: {
boxShadow: token.boxShadowSecondary
},
[`&${groupCls}-individual ${listCls}`]: {
gap: padding
},
// =========================== Menu ===========================
[`&-menu-mode ${listCls}`]: {
position: 'absolute'
},
// ========================== Motion ==========================
[listCls]: {
borderRadius: token.borderRadiusLG,
'&-motion': {
transition: `all ${token.motionDurationSlow}`,
'&-enter, &-appear': {
opacity: 0,
transform: varRef('list-transform-start'),
'&-active': {
opacity: 1,
transform: `translate(0, 0)`
}
},
'&-leave': {
'&-active': {
opacity: 0,
transform: varRef('list-transform-start')
}
}
}
},
// ======================== Placements ========================
'&-top': {
[listCls]: {
bottom: varRef('list-trigger-offset')
}
},
'&-bottom': {
[listCls]: {
[varName('list-transform-start')]: `translate(0, calc(${unit(floatButtonSize)} * -1))`,
top: varRef('list-trigger-offset')
}
},
'&-left': {
[listCls]: {
[varName('list-transform-start')]: `translate(${unit(floatButtonSize)}, 0)`,
right: varRef('list-trigger-offset')
}
},
'&-right': {
[listCls]: {
[varName('list-transform-start')]: `translate(calc(${unit(floatButtonSize)} * -1), 0)`,
left: varRef('list-trigger-offset')
}
}
}]
};
};
export default genGroupStyle;
+32
View File
@@ -0,0 +1,32 @@
import type { FullToken, GetDefaultToken } from '../../theme/internal';
/** Component only token. Which will handle additional calculation of alias token */
export type ComponentToken = object;
/**
* @desc FloatButton 组件的 Token
* @descEN Token for FloatButton component
*/
export type FloatButtonToken = FullToken<'FloatButton'> & {
/**
* @desc FloatButton 尺寸
* @descEN Size of FloatButton
*/
floatButtonSize: number;
/**
* @desc FloatButton 图标尺寸
* @descEN Icon size of FloatButton
*/
floatButtonIconSize: number | string;
/**
* @desc FloatButton 底部内边距
* @descEN Bottom inset of FloatButton
*/
floatButtonInsetBlockEnd: number;
/**
* @desc FloatButton 右侧内边距
* @descEN Right inset of FloatButton
*/
floatButtonInsetInlineEnd: number;
};
export declare const prepareComponentToken: GetDefaultToken<'FloatButton'>;
declare const _default: (prefixCls: string, rootCls?: string) => readonly [string, string];
export default _default;
+25
View File
@@ -0,0 +1,25 @@
import { initFadeMotion } from '../../style/motion/fade';
import { genStyleHooks, mergeToken } from '../../theme/internal';
import genFloatButtonStyle from './button';
import genGroupStyle from './group';
// ============================== Export ==============================
export const prepareComponentToken = () => ({});
export default genStyleHooks('FloatButton', token => {
const {
controlHeightLG,
marginXXL,
marginLG,
fontSizeIcon,
calc
} = token;
const floatButtonToken = mergeToken(token, {
floatButtonIconSize: calc(fontSizeIcon).mul(1.5).equal(),
floatButtonSize: controlHeightLG,
floatButtonInsetBlockEnd: marginXXL,
floatButtonInsetInlineEnd: marginLG
});
return [genFloatButtonStyle(floatButtonToken), genGroupStyle(floatButtonToken), initFadeMotion(token)];
}, prepareComponentToken, {
// Should be higher than Button (-999)
order: -998
});