1
This commit is contained in:
+5
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
});
|
||||
Reference in New Issue
Block a user