mirror of
https://github.com/ant-design/ant-design.git
synced 2024-12-01 06:49:32 +08:00
commit
5921edd0d5
@ -1,33 +0,0 @@
|
||||
# Use the latest 2.1 version of CircleCI pipeline process engine.
|
||||
# See: https://circleci.com/docs/2.0/configuration-reference
|
||||
version: 2.1
|
||||
|
||||
# Define a job to be invoked later in a workflow.
|
||||
# See: https://circleci.com/docs/2.0/configuration-reference/#jobs
|
||||
jobs:
|
||||
test-argos-ci:
|
||||
docker:
|
||||
- image: cimg/node:21.2-browsers
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
name: Install node_modules
|
||||
command: yarn
|
||||
- run:
|
||||
name: Build dist file
|
||||
command: npm run dist:esbuild
|
||||
- run:
|
||||
name: Run image screenshot tests
|
||||
command: npm run test-image
|
||||
- run:
|
||||
name: Upload screenshots to Argos CI
|
||||
command: npm run argos
|
||||
# The resource_class feature allows configuring CPU and RAM resources for each job. Different resource classes are available for different executors. https://circleci.com/docs/2.0/configuration-reference/#resourceclass
|
||||
resource_class: large
|
||||
|
||||
# Invoke jobs via workflows
|
||||
# See: https://circleci.com/docs/2.0/configuration-reference/#workflows
|
||||
workflows:
|
||||
test-argos-ci-workflow:
|
||||
jobs:
|
||||
- test-argos-ci
|
@ -1,30 +1,39 @@
|
||||
import * as React from 'react';
|
||||
import { createStyles, css, useTheme } from 'antd-style';
|
||||
import classNames from 'classnames';
|
||||
import type { FC } from 'react';
|
||||
import { useContext } from 'react';
|
||||
import { Typography, Skeleton, Carousel, Badge } from 'antd';
|
||||
import type { Extra, Icon } from './util';
|
||||
import SiteContext from '../../../theme/slots/SiteContext';
|
||||
import { getCarouselStyle, useSiteData } from './util';
|
||||
import useLocale from '../../../hooks/useLocale';
|
||||
import { Badge, Carousel, Skeleton, Typography } from 'antd';
|
||||
import { createStyles, useTheme } from 'antd-style';
|
||||
import classNames from 'classnames';
|
||||
|
||||
const useStyle = createStyles(({ token }) => {
|
||||
import useLocale from '../../../hooks/useLocale';
|
||||
import SiteContext from '../../../theme/slots/SiteContext';
|
||||
import type { Extra, Icon } from './util';
|
||||
import { getCarouselStyle, useSiteData } from './util';
|
||||
|
||||
const useStyle = createStyles(({ token, css, cx }) => {
|
||||
const { carousel } = getCarouselStyle();
|
||||
|
||||
const itemBase = css`
|
||||
display: flex;
|
||||
flex: 1 1 0;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
text-decoration: none;
|
||||
background: ${token.colorBgContainer};
|
||||
border: ${token.lineWidth}px solid ${token.colorBorderSecondary};
|
||||
border-radius: ${token.borderRadiusLG}px;
|
||||
transition: all ${token.motionDurationSlow};
|
||||
padding-block: ${token.paddingMD}px;
|
||||
padding-inline: ${token.paddingLG}px;
|
||||
box-sizing: border-box;
|
||||
`;
|
||||
|
||||
return {
|
||||
itemBase: css`
|
||||
display: flex;
|
||||
flex: 1 1 0;
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
text-decoration: none;
|
||||
background: ${token.colorBgContainer};
|
||||
border: ${token.lineWidth}px solid ${token.colorBorderSecondary};
|
||||
border-radius: ${token.borderRadiusLG}px;
|
||||
transition: all ${token.motionDurationSlow};
|
||||
padding-block: ${token.paddingMD}px;
|
||||
padding-inline: ${token.paddingLG}px;
|
||||
itemBase,
|
||||
ribbon: css`
|
||||
& > .${cx(itemBase)} {
|
||||
height: 100%;
|
||||
}
|
||||
`,
|
||||
cardItem: css`
|
||||
&:hover {
|
||||
@ -58,7 +67,7 @@ interface RecommendItemProps {
|
||||
icons: Icon[];
|
||||
className?: string;
|
||||
}
|
||||
const RecommendItem = ({ extra, index, icons, className }: RecommendItemProps) => {
|
||||
const RecommendItem: React.FC<RecommendItemProps> = ({ extra, index, icons, className }) => {
|
||||
const token = useTheme();
|
||||
const { styles } = useStyle();
|
||||
|
||||
@ -88,7 +97,7 @@ const RecommendItem = ({ extra, index, icons, className }: RecommendItemProps) =
|
||||
|
||||
if (index === 0) {
|
||||
return (
|
||||
<Badge.Ribbon text="HOT" color="red">
|
||||
<Badge.Ribbon text="HOT" color="red" rootClassName={styles.ribbon}>
|
||||
{card}
|
||||
</Badge.Ribbon>
|
||||
);
|
||||
@ -120,7 +129,7 @@ export const BannerRecommendsFallback: FC = () => {
|
||||
);
|
||||
};
|
||||
|
||||
export default function BannerRecommends() {
|
||||
const BannerRecommends: React.FC = () => {
|
||||
const { styles } = useStyle();
|
||||
const [, lang] = useLocale();
|
||||
const { isMobile } = React.useContext(SiteContext);
|
||||
@ -159,4 +168,6 @@ export default function BannerRecommends() {
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
export default BannerRecommends;
|
||||
|
@ -367,7 +367,14 @@ const Header: React.FC = () => {
|
||||
</Popover>
|
||||
)}
|
||||
{isZhCN && bannerVisible && (
|
||||
<ConfigProvider theme={{ token: { colorInfoBg: '#ceebf9', colorTextBase: '#000' } }}>
|
||||
<ConfigProvider
|
||||
theme={{
|
||||
token: {
|
||||
colorInfoBg: 'linear-gradient(90deg, #84fab0, #8fd3f4)',
|
||||
colorTextBase: '#000',
|
||||
},
|
||||
}}
|
||||
>
|
||||
<Alert
|
||||
className={styles.banner}
|
||||
message={
|
||||
|
28
.github/workflows/pr-contributor-welcome.yml
vendored
Normal file
28
.github/workflows/pr-contributor-welcome.yml
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
# 当 PR 被合并时,留言欢迎加入共建群
|
||||
name: PullRequest Contributor Welcome
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types:
|
||||
- closed
|
||||
paths:
|
||||
- 'components/**'
|
||||
|
||||
jobs:
|
||||
comment:
|
||||
if: github.event.pull_request.merged == true && github.repository == 'ant-design/ant-design'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Comment on PR
|
||||
uses: actions-cool/maintain-one-comment@v3
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
body: |
|
||||
🎉 Thank you for your contribution! If you have not yet joined our DingTalk community group, please feel free to join us (when joining, please provide the link to this PR).
|
||||
|
||||
🎉 感谢您的贡献!如果您还没有加入钉钉社区群,请扫描下方二维码加入我们(加群时请提供此 PR 链接)。
|
||||
|
||||
<img src="https://github.com/ant-design/ant-design/assets/5378891/e24c6080-bf38-4523-b1cd-f6c43ad7375f" height="200" />
|
||||
|
||||
<!-- WELCOME_CONTRIBUTION -->
|
||||
body-include: '<!-- WELCOME_CONTRIBUTION -->'
|
@ -1,71 +0,0 @@
|
||||
# Due to some special reasons, some accounts are blocked by circleCI
|
||||
# and cannot trigger argos jobs through circleCI.
|
||||
# These accounts can be configured in the whitelist list
|
||||
# and do not need to rely on circleCI to directly trigger argos in the PR workflow
|
||||
|
||||
name: Trigger Argos with white-listed users
|
||||
|
||||
on: [push]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
trigger_argos_with_whitelist_users:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Read white listed users
|
||||
id: read_users
|
||||
run: |
|
||||
whitelist_file="argos-white-listed-users"
|
||||
if [[ -f $whitelist_file ]]; then
|
||||
users=$(cat $whitelist_file)
|
||||
echo "whitelisted_users=$users" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Check if user is whitelisted
|
||||
id: check_user
|
||||
run: |
|
||||
whitelisted_users="${{ steps.read_users.outputs.whitelisted_users }}"
|
||||
current_user="${{ github.actor }}"
|
||||
if grep -Fxq "$current_user" <<< "$whitelisted_users"; then
|
||||
echo "User is whitelisted"
|
||||
echo "whitelisted=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "User is not whitelisted"
|
||||
echo "whitelisted=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: cache package-lock.json
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: package-temp-dir
|
||||
key: lock-${{ github.sha }}
|
||||
|
||||
- name: create package-lock.json
|
||||
run: npm i --package-lock-only --ignore-scripts
|
||||
|
||||
- name: install
|
||||
run: npm install
|
||||
|
||||
- name: Build dist file
|
||||
id: build
|
||||
if: ${{ steps.check_user.outputs.whitelisted == 'true' }}
|
||||
run: npm run dist:esbuild
|
||||
|
||||
- name: Run image screenshot tests
|
||||
id: screenshot
|
||||
if: ${{ steps.check_user.outputs.whitelisted == 'true' }}
|
||||
run: npm run test-image
|
||||
|
||||
- name: Upload screenshots to Argos CI
|
||||
id: upload
|
||||
if: ${{ steps.check_user.outputs.whitelisted == 'true' }}
|
||||
env:
|
||||
ARGOS_TOKEN: ${{ secrets.ARGOS_TOKEN }}
|
||||
ARGOS_PARALLEL_NONCE: ${{ github.run_id }}-${{ github.run_number }}-${{ github.run_attempt }}
|
||||
run: npm run argos
|
@ -12,7 +12,7 @@
|
||||
|
||||
[![CI status][github-action-image]][github-action-url] [![codecov][codecov-image]][codecov-url] [![NPM version][npm-image]][npm-url] [![NPM downloads][download-image]][download-url]
|
||||
|
||||
[![][bundlephobia-image]][bundlephobia-url] [![][bundlesize-js-image]][unpkg-js-url] [![FOSSA Status][fossa-image]][fossa-url] [![Covered by Argos Visual Testing][argos-ci-image]][argos-ci-url]
|
||||
[![][bundlephobia-image]][bundlephobia-url] [![][bundlesize-js-image]][unpkg-js-url] [![FOSSA Status][fossa-image]][fossa-url]
|
||||
|
||||
[![Follow Twitter][twitter-image]][twitter-url] [![Renovate status][renovate-image]][renovate-dashboard-url] [![][issues-helper-image]][issues-helper-url] [![dumi][dumi-image]][dumi-url] [![Issues need help][help-wanted-image]][help-wanted-url]
|
||||
|
||||
@ -40,8 +40,6 @@
|
||||
[renovate-dashboard-url]: https://github.com/ant-design/ant-design/issues/32498
|
||||
[dumi-image]: https://img.shields.io/badge/docs%20by-dumi-blue?style=flat-square
|
||||
[dumi-url]: https://github.com/umijs/dumi
|
||||
[argos-ci-image]: https://argos-ci.com/badge.svg
|
||||
[argos-ci-url]: https://app.argos-ci.com/ant-design/ant-design/reference
|
||||
|
||||
</div>
|
||||
|
||||
|
@ -12,7 +12,7 @@ An enterprise-class UI design language and React UI library.
|
||||
|
||||
[![CI status][github-action-image]][github-action-url] [![codecov][codecov-image]][codecov-url] [![NPM version][npm-image]][npm-url] [![NPM downloads][download-image]][download-url]
|
||||
|
||||
[![][bundlephobia-image]][bundlephobia-url] [![][bundlesize-js-image]][unpkg-js-url] [![FOSSA Status][fossa-image]][fossa-url] [![Covered by Argos Visual Testing][argos-ci-image]][argos-ci-url]
|
||||
[![][bundlephobia-image]][bundlephobia-url] [![][bundlesize-js-image]][unpkg-js-url] [![FOSSA Status][fossa-image]][fossa-url]
|
||||
|
||||
[![Follow Twitter][twitter-image]][twitter-url] [![Renovate status][renovate-image]][renovate-dashboard-url] [![][issues-helper-image]][issues-helper-url] [![dumi][dumi-image]][dumi-url] [![Issues need help][help-wanted-image]][help-wanted-url]
|
||||
|
||||
@ -40,8 +40,6 @@ An enterprise-class UI design language and React UI library.
|
||||
[renovate-dashboard-url]: https://github.com/ant-design/ant-design/issues/32498
|
||||
[dumi-image]: https://img.shields.io/badge/docs%20by-dumi-blue?style=flat-square
|
||||
[dumi-url]: https://github.com/umijs/dumi
|
||||
[argos-ci-image]: https://argos-ci.com/badge.svg
|
||||
[argos-ci-url]: https://app.argos-ci.com/ant-design/ant-design/reference
|
||||
|
||||
</div>
|
||||
|
||||
|
@ -1 +0,0 @@
|
||||
kiner-tang
|
@ -36,7 +36,7 @@ const genAlertTypeStyle = (
|
||||
token: AlertToken,
|
||||
alertCls: string,
|
||||
): CSSObject => ({
|
||||
backgroundColor: bgColor,
|
||||
background: bgColor,
|
||||
border: `${unit(token.lineWidth)} ${token.lineType} ${borderColor}`,
|
||||
[`${alertCls}-icon`]: {
|
||||
color: iconColor,
|
||||
|
@ -10,7 +10,13 @@ import type { ConfigConsumerProps } from '../config-provider';
|
||||
import { ConfigContext } from '../config-provider';
|
||||
import FloatButtonGroupContext from './context';
|
||||
import FloatButton, { floatButtonPrefixCls } from './FloatButton';
|
||||
import type { BackTopProps, FloatButtonProps, FloatButtonRef, FloatButtonShape } from './interface';
|
||||
import type {
|
||||
BackTopProps,
|
||||
FloatButtonElement,
|
||||
FloatButtonProps,
|
||||
FloatButtonRef,
|
||||
FloatButtonShape,
|
||||
} from './interface';
|
||||
|
||||
const BackTop = React.forwardRef<FloatButtonRef, BackTopProps>((props, ref) => {
|
||||
const {
|
||||
@ -57,7 +63,7 @@ const BackTop = React.forwardRef<FloatButtonRef, BackTopProps>((props, ref) => {
|
||||
};
|
||||
}, [target]);
|
||||
|
||||
const scrollToTop: React.MouseEventHandler<HTMLDivElement> = (e) => {
|
||||
const scrollToTop: React.MouseEventHandler<FloatButtonElement> = (e) => {
|
||||
scrollTo(0, { getContainer: target || getDefaultTarget, duration });
|
||||
onClick?.(e);
|
||||
};
|
||||
|
@ -1,4 +1,4 @@
|
||||
import React, { forwardRef, useContext, useMemo } from 'react';
|
||||
import React, { useContext, useMemo } from 'react';
|
||||
import classNames from 'classnames';
|
||||
import omit from 'rc-util/lib/omit';
|
||||
|
||||
@ -13,8 +13,8 @@ import type {
|
||||
CompoundedComponent,
|
||||
FloatButtonBadgeProps,
|
||||
FloatButtonContentProps,
|
||||
FloatButtonElement,
|
||||
FloatButtonProps,
|
||||
FloatButtonRef,
|
||||
FloatButtonShape,
|
||||
} from './interface';
|
||||
import useStyle from './style';
|
||||
@ -22,7 +22,7 @@ import useCSSVarCls from '../config-provider/hooks/useCSSVarCls';
|
||||
|
||||
export const floatButtonPrefixCls = 'float-btn';
|
||||
|
||||
const FloatButton = forwardRef<FloatButtonRef['nativeElement'], FloatButtonProps>((props, ref) => {
|
||||
const FloatButton = React.forwardRef<FloatButtonElement, FloatButtonProps>((props, ref) => {
|
||||
const {
|
||||
prefixCls: customizePrefixCls,
|
||||
className,
|
||||
|
@ -1,4 +1,5 @@
|
||||
import React from 'react';
|
||||
|
||||
import FloatButton from '..';
|
||||
import mountTest from '../../../tests/shared/mountTest';
|
||||
import rtlTest from '../../../tests/shared/rtlTest';
|
||||
@ -38,11 +39,20 @@ describe('FloatButton', () => {
|
||||
rerender(<FloatButton shape={squareShape} />);
|
||||
expect(container.querySelector(`.ant-float-btn-${squareShape}`)).toBeTruthy();
|
||||
});
|
||||
it('support onClick', () => {
|
||||
it('support onClick & onMouseEnter & onMouseLeave', () => {
|
||||
const onClick = jest.fn();
|
||||
const { container } = render(<FloatButton onClick={onClick} />);
|
||||
fireEvent.click(container.querySelector('.ant-float-btn')!);
|
||||
const onMouseEnter = jest.fn();
|
||||
const onMouseLeave = jest.fn();
|
||||
const { container } = render(
|
||||
<FloatButton onClick={onClick} onMouseEnter={onMouseEnter} onMouseLeave={onMouseLeave} />,
|
||||
);
|
||||
const element = container.querySelector('.ant-float-btn')!;
|
||||
fireEvent.click(element);
|
||||
expect(onClick).toHaveBeenCalled();
|
||||
fireEvent.mouseEnter(element);
|
||||
expect(onMouseEnter).toHaveBeenCalled();
|
||||
fireEvent.mouseLeave(element);
|
||||
expect(onMouseLeave).toHaveBeenCalled();
|
||||
});
|
||||
it('should console Error', () => {
|
||||
const errSpy = jest.spyOn(console, 'error').mockImplementation(() => {});
|
||||
|
@ -1,6 +1,6 @@
|
||||
import React from 'react';
|
||||
import { FloatButton } from 'antd';
|
||||
|
||||
const App: React.FC = () => <FloatButton onClick={() => console.log('click')} />;
|
||||
const App: React.FC = () => <FloatButton onClick={() => console.log('onClick')} />;
|
||||
|
||||
export default App;
|
||||
|
@ -6,8 +6,10 @@ import type BackTop from './BackTop';
|
||||
import type Group from './FloatButtonGroup';
|
||||
import type PurePanel from './PurePanel';
|
||||
|
||||
export type FloatButtonElement = HTMLAnchorElement & HTMLButtonElement;
|
||||
|
||||
export interface FloatButtonRef {
|
||||
nativeElement: (HTMLAnchorElement & HTMLButtonElement) | null;
|
||||
nativeElement: FloatButtonElement | null;
|
||||
}
|
||||
|
||||
export type FloatButtonType = 'default' | 'primary';
|
||||
@ -18,7 +20,7 @@ export type FloatButtonGroupTrigger = 'click' | 'hover';
|
||||
|
||||
export type FloatButtonBadgeProps = Omit<BadgeProps, 'status' | 'text' | 'title' | 'children'>;
|
||||
|
||||
export interface FloatButtonProps {
|
||||
export interface FloatButtonProps extends React.DOMAttributes<FloatButtonElement> {
|
||||
prefixCls?: string;
|
||||
className?: string;
|
||||
rootClassName?: string;
|
||||
@ -31,8 +33,7 @@ export interface FloatButtonProps {
|
||||
href?: string;
|
||||
target?: React.HTMLAttributeAnchorTarget;
|
||||
badge?: FloatButtonBadgeProps;
|
||||
onClick?: React.MouseEventHandler<HTMLElement>;
|
||||
['aria-label']?: React.HtmlHTMLAttributes<HTMLButtonElement>['aria-label'];
|
||||
['aria-label']?: React.HtmlHTMLAttributes<HTMLElement>['aria-label'];
|
||||
}
|
||||
|
||||
export interface FloatButtonContentProps extends React.DOMAttributes<HTMLDivElement> {
|
||||
@ -57,7 +58,7 @@ export interface FloatButtonGroupProps extends FloatButtonProps {
|
||||
|
||||
export interface BackTopProps extends Omit<FloatButtonProps, 'target'> {
|
||||
visibilityHeight?: number;
|
||||
onClick?: React.MouseEventHandler<HTMLDivElement>;
|
||||
onClick?: React.MouseEventHandler<FloatButtonElement>;
|
||||
target?: () => HTMLElement | Window | Document;
|
||||
prefixCls?: string;
|
||||
children?: React.ReactNode;
|
||||
@ -68,7 +69,7 @@ export interface BackTopProps extends Omit<FloatButtonProps, 'target'> {
|
||||
}
|
||||
|
||||
export type CompoundedComponent = React.ForwardRefExoticComponent<
|
||||
FloatButtonProps & React.RefAttributes<FloatButtonRef['nativeElement']>
|
||||
FloatButtonProps & React.RefAttributes<FloatButtonElement>
|
||||
> & {
|
||||
Group: typeof Group;
|
||||
BackTop: typeof BackTop;
|
||||
|
@ -102,7 +102,16 @@ const FormItemLabel: React.FC<FormItemLabelProps & { required?: boolean; prefixC
|
||||
const { icon = <QuestionCircleOutlined />, ...restTooltipProps } = tooltipProps;
|
||||
const tooltipNode: React.ReactNode = (
|
||||
<Tooltip {...restTooltipProps}>
|
||||
{React.cloneElement(icon, { className: `${prefixCls}-item-tooltip`, title: '' })}
|
||||
{React.cloneElement(icon, {
|
||||
className: `${prefixCls}-item-tooltip`,
|
||||
title: '',
|
||||
onClick: (e: React.MouseEvent) => {
|
||||
// Prevent label behavior in tooltip icon
|
||||
// https://github.com/ant-design/ant-design/issues/46154
|
||||
e.preventDefault();
|
||||
},
|
||||
tabIndex: null,
|
||||
})}
|
||||
</Tooltip>
|
||||
);
|
||||
|
||||
|
@ -1891,30 +1891,46 @@ exports[`renders components/form/demo/control-hooks.tsx extend context correctly
|
||||
<div
|
||||
class="ant-form-item-control-input-content"
|
||||
>
|
||||
<button
|
||||
class="ant-btn ant-btn-primary"
|
||||
type="submit"
|
||||
<div
|
||||
class="ant-space ant-space-horizontal ant-space-align-center ant-space-gap-row-small ant-space-gap-col-small"
|
||||
>
|
||||
<span>
|
||||
Submit
|
||||
</span>
|
||||
</button>
|
||||
<button
|
||||
class="ant-btn ant-btn-default"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Reset
|
||||
</span>
|
||||
</button>
|
||||
<button
|
||||
class="ant-btn ant-btn-link"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Fill form
|
||||
</span>
|
||||
</button>
|
||||
<div
|
||||
class="ant-space-item"
|
||||
>
|
||||
<button
|
||||
class="ant-btn ant-btn-primary"
|
||||
type="submit"
|
||||
>
|
||||
<span>
|
||||
Submit
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
<div
|
||||
class="ant-space-item"
|
||||
>
|
||||
<button
|
||||
class="ant-btn ant-btn-default"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Reset
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
<div
|
||||
class="ant-space-item"
|
||||
>
|
||||
<button
|
||||
class="ant-btn ant-btn-link"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Fill form
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1418,30 +1418,46 @@ exports[`renders components/form/demo/control-hooks.tsx correctly 1`] = `
|
||||
<div
|
||||
class="ant-form-item-control-input-content"
|
||||
>
|
||||
<button
|
||||
class="ant-btn ant-btn-primary"
|
||||
type="submit"
|
||||
<div
|
||||
class="ant-space ant-space-horizontal ant-space-align-center ant-space-gap-row-small ant-space-gap-col-small"
|
||||
>
|
||||
<span>
|
||||
Submit
|
||||
</span>
|
||||
</button>
|
||||
<button
|
||||
class="ant-btn ant-btn-default"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Reset
|
||||
</span>
|
||||
</button>
|
||||
<button
|
||||
class="ant-btn ant-btn-link"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Fill form
|
||||
</span>
|
||||
</button>
|
||||
<div
|
||||
class="ant-space-item"
|
||||
>
|
||||
<button
|
||||
class="ant-btn ant-btn-primary"
|
||||
type="submit"
|
||||
>
|
||||
<span>
|
||||
Submit
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
<div
|
||||
class="ant-space-item"
|
||||
>
|
||||
<button
|
||||
class="ant-btn ant-btn-default"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Reset
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
<div
|
||||
class="ant-space-item"
|
||||
>
|
||||
<button
|
||||
class="ant-btn ant-btn-link"
|
||||
type="button"
|
||||
>
|
||||
<span>
|
||||
Fill form
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1284,6 +1284,7 @@ describe('Form', () => {
|
||||
);
|
||||
|
||||
fireEvent.mouseEnter(container.querySelector('.anticon-question-circle')!);
|
||||
fireEvent.click(container.querySelector('.anticon-question-circle')!);
|
||||
await waitFakeTimer();
|
||||
|
||||
expect(container.querySelector('.ant-tooltip-inner')).toHaveTextContent('Bamboo');
|
||||
|
@ -1,5 +1,5 @@
|
||||
import React from 'react';
|
||||
import { Button, Form, Input, Select } from 'antd';
|
||||
import { Button, Form, Input, Select, Space } from 'antd';
|
||||
|
||||
const { Option } = Select;
|
||||
|
||||
@ -77,15 +77,17 @@ const App: React.FC = () => {
|
||||
}
|
||||
</Form.Item>
|
||||
<Form.Item {...tailLayout}>
|
||||
<Button type="primary" htmlType="submit">
|
||||
Submit
|
||||
</Button>
|
||||
<Button htmlType="button" onClick={onReset}>
|
||||
Reset
|
||||
</Button>
|
||||
<Button type="link" htmlType="button" onClick={onFill}>
|
||||
Fill form
|
||||
</Button>
|
||||
<Space>
|
||||
<Button type="primary" htmlType="submit">
|
||||
Submit
|
||||
</Button>
|
||||
<Button htmlType="button" onClick={onReset}>
|
||||
Reset
|
||||
</Button>
|
||||
<Button type="link" htmlType="button" onClick={onFill}>
|
||||
Fill form
|
||||
</Button>
|
||||
</Space>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
);
|
||||
|
@ -118,7 +118,7 @@ export const genNoticeStyle = (token: NotificationToken): CSSObject => {
|
||||
[`${noticeCls}-icon`]: {
|
||||
position: 'absolute',
|
||||
fontSize: notificationIconSize,
|
||||
lineHeight: 0,
|
||||
lineHeight: 1,
|
||||
|
||||
// icon-font
|
||||
[`&-success${iconCls}`]: {
|
||||
|
@ -1,4 +1,5 @@
|
||||
import React, { useState } from 'react';
|
||||
|
||||
import QRCode from '..';
|
||||
import mountTest from '../../../tests/shared/mountTest';
|
||||
import rtlTest from '../../../tests/shared/rtlTest';
|
||||
|
@ -1,11 +1,7 @@
|
||||
## zh-CN
|
||||
|
||||
省市联动是典型的例子。
|
||||
|
||||
推荐使用 [Cascader](/components/cascader/) 组件。
|
||||
省市联动是典型的例子,联动场景我们更推荐使用 [Cascader](/components/cascader-cn/) 组件。
|
||||
|
||||
## en-US
|
||||
|
||||
Coordinating the selection of provinces and cities is a common use case and demonstrates how selection can be coordinated.
|
||||
|
||||
Using the [Cascader](/components/cascader) component is strongly recommended instead as it is more flexible and capable.
|
||||
Coordinating the selection of provinces and cities is a common use case and demonstrates how selection can be coordinated. [Cascader](/components/cascader) component is strongly recommended in this case.
|
||||
|
@ -1,7 +1,7 @@
|
||||
## zh-CN
|
||||
|
||||
tags select,随意输入的内容(scroll the menu)。
|
||||
标签形式的多选框,用户亦可自由输入。
|
||||
|
||||
## en-US
|
||||
|
||||
Select with tags, transform input to tag (scroll the menu).
|
||||
Allow user to select tags from list or input custom tag.
|
||||
|
@ -44,7 +44,6 @@
|
||||
],
|
||||
"scripts": {
|
||||
"api-collection": "antd-tools run api-collection",
|
||||
"argos": "tsx scripts/argos-upload.ts",
|
||||
"authors": "tsx scripts/generate-authors.ts",
|
||||
"biome:format": "biome format --write .",
|
||||
"build": "npm run compile && NODE_OPTIONS='--max-old-space-size=4096' npm run dist",
|
||||
@ -166,7 +165,6 @@
|
||||
"@ant-design/happy-work-theme": "^1.0.0",
|
||||
"@ant-design/tools": "^18.0.2",
|
||||
"@antv/g6": "^4.8.23",
|
||||
"@argos-ci/core": "^1.3.0",
|
||||
"@babel/eslint-plugin": "^7.22.10",
|
||||
"@biomejs/biome": "^1.3.3",
|
||||
"@codesandbox/sandpack-react": "^2.10.0",
|
||||
|
@ -1,65 +0,0 @@
|
||||
// Thanks to material-ui ❤️
|
||||
// Create chunks for Argos: https://github.com/mui/material-ui/pull/23518
|
||||
// https://github.com/mui/material-ui/blob/af81aae3b292ed180e7652a665fad1be2b38a7b3/scripts/pushArgos.js
|
||||
import childProcess from 'child_process';
|
||||
import util from 'util';
|
||||
import argos from '@argos-ci/core';
|
||||
import glob from 'fast-glob';
|
||||
import lodashChunk from 'lodash/chunk';
|
||||
|
||||
const execFileNode = util.promisify(childProcess.execFile);
|
||||
|
||||
function execFile(command: string, args: string[]) {
|
||||
return execFileNode(command, args, {
|
||||
cwd: process.cwd(),
|
||||
env: process.env,
|
||||
encoding: 'utf-8',
|
||||
});
|
||||
}
|
||||
|
||||
const screenshotsBase = 'imageSnapshots';
|
||||
const screenshotsChunks = `imageSnapshots-chunks`;
|
||||
const BATCH_SIZE = 128;
|
||||
|
||||
async function cpToTemp(screenshot: string, target: string) {
|
||||
await execFile('mkdir', ['-p', target]);
|
||||
await execFile('cp', [screenshot, target]);
|
||||
}
|
||||
|
||||
async function run() {
|
||||
const screenshots = await glob(`${screenshotsBase}/**/*`);
|
||||
const chunks = lodashChunk<string>(screenshots, BATCH_SIZE);
|
||||
|
||||
await Promise.all(
|
||||
chunks.map((chunk, chunkIndex) =>
|
||||
Promise.all(
|
||||
chunk.map<Promise<void>>((screenshot) =>
|
||||
cpToTemp(screenshot, `${screenshotsChunks}/${chunkIndex}`),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
// eslint-disable-next-line no-console -- pipe stdout
|
||||
console.log('Chunk Size:', chunks.length, '/', 'Total Snapshots:', screenshots.length);
|
||||
|
||||
for (let i = 0; i < chunks.length; i += 1) {
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
const result = await argos.upload({
|
||||
root: `${screenshotsChunks}/${i}`,
|
||||
token: process.env.ARGOS_TOKEN,
|
||||
parallel: {
|
||||
total: chunks.length,
|
||||
nonce: process.env.ARGOS_PARALLEL_NONCE || process.env.CIRCLE_BUILD_NUM || '',
|
||||
},
|
||||
});
|
||||
// eslint-disable-next-line no-console -- pipe stdout
|
||||
console.log(i, '>', result);
|
||||
}
|
||||
}
|
||||
|
||||
run().catch((error) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error(error);
|
||||
process.exit(1);
|
||||
});
|
Loading…
Reference in New Issue
Block a user