diff --git a/.dumi/theme/builtins/InstallDependencies/bun.tsx b/.dumi/theme/builtins/InstallDependencies/bun.tsx new file mode 100644 index 0000000000..562c25997d --- /dev/null +++ b/.dumi/theme/builtins/InstallDependencies/bun.tsx @@ -0,0 +1,142 @@ +import React from 'react'; +import { createStyles, css } from 'antd-style'; +import classNames from 'classnames'; + +interface IconProps { + className?: string; + style?: React.CSSProperties; +} + +const useStyle = createStyles(() => ({ + iconWrap: css` + display: inline-flex; + align-items: center; + line-height: 0; + text-align: center; + vertical-align: -0.125em; + `, +})); + +const BunIcon: React.FC = (props) => { + const { className, style } = props; + const { styles } = useStyle(); + return ( + + + Bun Logo + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default BunIcon; diff --git a/.dumi/theme/builtins/InstallDependencies/index.tsx b/.dumi/theme/builtins/InstallDependencies/index.tsx index 777241401f..d1cd32a845 100644 --- a/.dumi/theme/builtins/InstallDependencies/index.tsx +++ b/.dumi/theme/builtins/InstallDependencies/index.tsx @@ -6,15 +6,17 @@ import type { Tab } from 'rc-tabs/lib/interface'; import NpmLogo from './npm'; import PnpmLogo from './pnpm'; import YarnLogo from './yarn'; +import BunLogo from './bun'; interface InstallProps { npm?: string; yarn?: string; pnpm?: string; + bun?: string; } const InstallDependencies: React.FC = (props) => { - const { npm, yarn, pnpm } = props; + const { npm, yarn, pnpm, bun } = props; const items: Tab[] = [ { key: 'npm', @@ -34,6 +36,12 @@ const InstallDependencies: React.FC = (props) => { children: pnpm ? {pnpm} : null, icon: , }, + { + key: 'bun', + label: 'Bun', + children: bun ? {bun} : null, + icon: , + }, ].filter((item) => item.children); return ( diff --git a/.dumi/theme/common/ComponentChangelog/ComponentChangelog.tsx b/.dumi/theme/common/ComponentChangelog/ComponentChangelog.tsx index ebde413d09..f29d40b6c8 100644 --- a/.dumi/theme/common/ComponentChangelog/ComponentChangelog.tsx +++ b/.dumi/theme/common/ComponentChangelog/ComponentChangelog.tsx @@ -1,13 +1,32 @@ /* eslint-disable global-require */ -import React, { useMemo } from 'react'; -import { HistoryOutlined } from '@ant-design/icons'; -import { Button, Drawer, Timeline, Typography, Grid } from 'antd'; +import React from 'react'; +import { BugOutlined, HistoryOutlined } from '@ant-design/icons'; +import { Button, Drawer, Grid, Popover, Timeline, Typography } from 'antd'; +import type { TimelineItemProps } from 'antd'; import { createStyles } from 'antd-style'; +import semver from 'semver'; +import deprecatedVersions from '../../../../BUG_VERSIONS.json'; import useFetch from '../../../hooks/useFetch'; import useLocale from '../../../hooks/useLocale'; import Link from '../Link'; +interface MatchDeprecatedResult { + match?: string; + reason: string[]; +} + +function matchDeprecated(v: string): MatchDeprecatedResult { + const match = Object.keys(deprecatedVersions).find((depreciated) => + semver.satisfies(v, depreciated), + ); + const reason = deprecatedVersions[match as keyof typeof deprecatedVersions] || []; + return { + match, + reason: Array.isArray(reason) ? reason : [reason], + }; +} + const useStyle = createStyles(({ token, css }) => ({ history: css` position: absolute; @@ -20,7 +39,33 @@ const useStyle = createStyles(({ token, css }) => ({ `, ref: css` - margin-left: ${token.marginXS}px; + margin-inline-start: ${token.marginXS}px; + `, + bug: css` + font-size: 14px; + color: #aaa; + margin-inline-start: ${token.marginXS}px; + display: inline-block; + vertical-align: inherit; + cursor: pointer; + &:hover { + color: #333; + } + `, + bugReasonTitle: css` + padding: ${token.paddingXXS}px ${token.paddingXS}px; + `, + bugReasonList: css` + width: 100%; + max-width: 100%; + li { + padding: ${token.paddingXXS}px ${token.paddingXS}px; + a { + display: flex; + align-items: center; + gap: ${token.marginXXS}px; + } + } `, })); @@ -34,16 +79,18 @@ const locales = { changelog: '更新日志', loading: '加载中...', empty: '暂无更新', + bugList: 'Bug 版本', }, en: { full: 'Full Changelog', changelog: 'Changelog', loading: 'loading...', empty: 'Nothing update', + bugList: 'Bug Versions', }, }; -function ParseChangelog(props: { changelog: string; refs: string[]; styles: any }) { +const ParseChangelog: React.FC<{ changelog: string; refs: string[]; styles: any }> = (props) => { const { changelog = '', refs = [], styles } = props; const parsedChangelog = React.useMemo(() => { @@ -78,7 +125,6 @@ function ParseChangelog(props: { changelog: string; refs: string[]; styles: any <> {/* Changelog */} {parsedChangelog} - {/* Refs */} {refs?.map((ref) => ( @@ -87,39 +133,29 @@ function ParseChangelog(props: { changelog: string; refs: string[]; styles: any ))} ); -} +}; -type ChangelogInfo = { +interface ChangelogInfo { version: string; changelog: string; refs: string[]; -}; +} -function useChangelog(componentPath: string, lang: 'cn' | 'en'): ChangelogInfo[] { - const data: any = useFetch( - lang === 'cn' - ? { - key: 'component-changelog-cn', - request: () => import('../../../preset/components-changelog-cn.json'), - } - : { - key: 'component-changelog-en', - request: () => import('../../../preset/components-changelog-en.json'), - }, - ); - - return useMemo(() => { +const useChangelog = (componentPath: string, lang: 'cn' | 'en'): ChangelogInfo[] => { + const data = useFetch({ + key: `component-changelog-${lang}`, + request: () => import(`../../../preset/components-changelog-${lang}.json`), + }); + return React.useMemo(() => { const component = componentPath.replace(/-/g, ''); - const componentName = Object.keys(data).find( (name) => name.toLowerCase() === component.toLowerCase(), ); - - return data[componentName!]; + return data[componentName as keyof typeof data] as ChangelogInfo[]; }, [data, componentPath]); -} +}; -export default function ComponentChangelog(props: ComponentChangelogProps) { +const ComponentChangelog: React.FC = (props) => { const { pathname = '' } = props; const [locale, lang] = useLocale(locales); const [show, setShow] = React.useState(false); @@ -130,7 +166,7 @@ export default function ComponentChangelog(props: ComponentChangelogProps) { const list = useChangelog(componentPath, lang); - const timelineItems = React.useMemo(() => { + const timelineItems = React.useMemo(() => { const changelogMap: Record = {}; list?.forEach((info) => { @@ -140,13 +176,41 @@ export default function ComponentChangelog(props: ComponentChangelogProps) { return Object.keys(changelogMap).map((version) => { const changelogList = changelogMap[version]; - + const bugVersionInfo = matchDeprecated(version); return { children: ( -

{version}

+ + {version} + {bugVersionInfo.match && ( + {locale.bugList}} + content={ +
+ } + > + + + )} +
    - {changelogList.map((info, index) => ( + {changelogList.map((info, index) => (
  • @@ -194,4 +258,6 @@ export default function ComponentChangelog(props: ComponentChangelogProps) { ); -} +}; + +export default ComponentChangelog; diff --git a/.dumi/theme/slots/Content/DocAnchor.tsx b/.dumi/theme/slots/Content/DocAnchor.tsx index f65f0acc1f..27b2568e2f 100644 --- a/.dumi/theme/slots/Content/DocAnchor.tsx +++ b/.dumi/theme/slots/Content/DocAnchor.tsx @@ -1,12 +1,12 @@ -import React, { useMemo } from 'react'; +import React from 'react'; import { Anchor } from 'antd'; import { createStyles, useTheme } from 'antd-style'; +import type { AnchorLinkItemProps } from 'antd/es/anchor/Anchor'; import classNames from 'classnames'; import { useRouteMeta, useTabMeta } from 'dumi'; const useStyle = createStyles(({ token, css }) => { const { antCls } = token; - return { toc: css` ${antCls}-anchor { @@ -20,30 +20,25 @@ const useStyle = createStyles(({ token, css }) => { top: ${token.headerHeight + token.contentMarginTop - 8}px; inset-inline-end: 0; width: 160px; - margin: 0 0 12px 0; - padding: 8px 0; - padding-inline: 4px 8px; - backdrop-filter: blur(8px); + padding: ${token.paddingXS}px; border-radius: ${token.borderRadius}px; box-sizing: border-box; margin-inline-end: calc(16px - 100vw + 100%); z-index: 10; - .toc-debug { color: ${token.purple6}; - &:hover { color: ${token.purple5}; } } - > div { box-sizing: border-box; width: 100%; max-height: calc(100vh - ${token.headerHeight + token.contentMarginTop + 24}px) !important; - margin: 0 auto; + margin: auto; overflow: auto; - padding-inline: 4px; + padding: ${token.paddingXXS}px; + backdrop-filter: blur(8px); } @media only screen and (max-width: ${token.screenLG}px) { @@ -72,11 +67,11 @@ interface DocAnchorProps { debugDemos?: string[]; } -type AnchorItem = { +interface AnchorItem { id: string; title: string; children?: AnchorItem[]; -}; +} const DocAnchor: React.FC = ({ showDebug, debugDemos = [] }) => { const { styles } = useStyle(); @@ -84,24 +79,24 @@ const DocAnchor: React.FC = ({ showDebug, debugDemos = [] }) => const meta = useRouteMeta(); const tab = useTabMeta(); - const renderAnchorItem = (item: AnchorItem) => ({ + const renderAnchorItem = (item: AnchorItem): AnchorLinkItemProps => ({ href: `#${item.id}`, title: item.title, key: item.id, children: item.children ?.filter((child) => showDebug || !debugDemos.includes(child.id)) - .map((child) => ({ + .map((child) => ({ key: child.id, href: `#${child.id}`, title: ( - + {child?.title} ), })), }); - const anchorItems = useMemo( + const anchorItems = React.useMemo( () => (tab?.toc || meta.toc).reduce((result, item) => { if (item.depth === 2) { @@ -129,7 +124,7 @@ const DocAnchor: React.FC = ({ showDebug, debugDemos = [] }) => affix={false} targetOffset={token.anchorTop} showInkInFixed - items={anchorItems.map(renderAnchorItem)} + items={anchorItems.map(renderAnchorItem)} /> ); diff --git a/.dumi/theme/slots/Content/index.tsx b/.dumi/theme/slots/Content/index.tsx index c52f62304d..0af5c91e28 100644 --- a/.dumi/theme/slots/Content/index.tsx +++ b/.dumi/theme/slots/Content/index.tsx @@ -104,7 +104,9 @@ const Content: React.FC = ({ children }) => { version={meta.frontmatter.tag} /> )} -
    {children}
    +
    + {children} +
    + ## List of icons diff --git a/components/icon/index.zh-CN.md b/components/icon/index.zh-CN.md index f32b01544f..97247b4aa7 100644 --- a/components/icon/index.zh-CN.md +++ b/components/icon/index.zh-CN.md @@ -16,7 +16,7 @@ demo: 使用图标组件,你需要安装 [@ant-design/icons](https://github.com/ant-design/ant-design-icons) 图标组件包: - + ## 设计师专属 diff --git a/components/tabs/index.en-US.md b/components/tabs/index.en-US.md index 2ca21046e8..86536359c0 100644 --- a/components/tabs/index.en-US.md +++ b/components/tabs/index.en-US.md @@ -50,7 +50,7 @@ Common props ref:[Common props](/docs/react/common-props) | addIcon | Customize add icon, only works with `type="editable-card"` | ReactNode | `` | 4.4.0 | | animated | Whether to change tabs with animation. | boolean \| { inkBar: boolean, tabPane: boolean } | { inkBar: true, tabPane: false } | | | centered | Centers tabs | boolean | false | 4.4.0 | -| defaultActiveKey | Initial active TabPane's key, if `activeKey` is not set | string | - | | +| defaultActiveKey | Initial active TabPane's key, if `activeKey` is not set | string | `The key of first tab` | | | hideAdd | Hide plus icon or not. Only works while `type="editable-card"` | boolean | false | | | indicator | Customize `size` and `align` of indicator | { size?: number \| (origin: number) => number; align: `start` \| `center` \| `end`; } | - | 5.13.0 | | items | Configure tab content | [TabItemType](#tabitemtype) | [] | 4.23.0 | diff --git a/components/tabs/index.zh-CN.md b/components/tabs/index.zh-CN.md index c25c0170e8..93f15e3acc 100644 --- a/components/tabs/index.zh-CN.md +++ b/components/tabs/index.zh-CN.md @@ -52,7 +52,7 @@ Ant Design 依次提供了三级选项卡,分别用于不同的场景。 | addIcon | 自定义添加按钮,设置 `type="editable-card"` 时有效 | ReactNode | `` | 4.4.0 | | animated | 是否使用动画切换 Tabs | boolean\| { inkBar: boolean, tabPane: boolean } | { inkBar: true, tabPane: false } | | | centered | 标签居中展示 | boolean | false | 4.4.0 | -| defaultActiveKey | 初始化选中面板的 key,如果没有设置 activeKey | string | `第一个面板` | | +| defaultActiveKey | 初始化选中面板的 key,如果没有设置 activeKey | string | `第一个面板的 key` | | | hideAdd | 是否隐藏加号图标,在 `type="editable-card"` 时有效 | boolean | false | | | indicator | 自定义指示条的长度和对齐方式 | { size?: number \| (origin: number) => number; align: `start` \| `center` \| `end`; } | - | 5.13.0 | | items | 配置选项卡内容 | [TabItemType](#tabitemtype) | [] | 4.23.0 | diff --git a/components/tag/index.en-US.md b/components/tag/index.en-US.md index bf793ffa8b..dbbfdc06fa 100644 --- a/components/tag/index.en-US.md +++ b/components/tag/index.en-US.md @@ -44,7 +44,7 @@ Common props ref:[Common props](/docs/react/common-props) | color | Color of the Tag | string | - | | | icon | Set the icon of tag | ReactNode | - | | | bordered | Whether has border style | boolean | true | 5.4.0 | -| onClose | Callback executed when tag is closed | (e) => void | - | | +| onClose | Callback executed when tag is closed | (e: React.MouseEvent) => void | - | | ### Tag.CheckableTag diff --git a/components/tag/index.zh-CN.md b/components/tag/index.zh-CN.md index 3d06daa637..92d15305c0 100644 --- a/components/tag/index.zh-CN.md +++ b/components/tag/index.zh-CN.md @@ -44,7 +44,7 @@ demo: | color | 标签色 | string | - | | | icon | 设置图标 | ReactNode | - | | | bordered | 是否有边框 | boolean | true | 5.4.0 | -| onClose | 关闭时的回调(可通过 `e.preventDefault()` 来阻止默认行为) | (e) => void | - | | +| onClose | 关闭时的回调(可通过 `e.preventDefault()` 来阻止默认行为) | (e: React.MouseEvent) => void | - | | ### Tag.CheckableTag diff --git a/components/upload/__tests__/__snapshots__/demo-extend.test.ts.snap b/components/upload/__tests__/__snapshots__/demo-extend.test.ts.snap index a5011981ad..e8fdc25036 100644 --- a/components/upload/__tests__/__snapshots__/demo-extend.test.ts.snap +++ b/components/upload/__tests__/__snapshots__/demo-extend.test.ts.snap @@ -1,7 +1,9 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`renders components/upload/demo/avatar.tsx extend context correctly 1`] = ` -Array [ +
    @@ -50,7 +52,7 @@ Array [
    -
    , + @@ -99,8 +101,8 @@ Array [ - , -] + + `; exports[`renders components/upload/demo/avatar.tsx extend context correctly 2`] = `[]`; diff --git a/components/upload/__tests__/__snapshots__/demo.test.ts.snap b/components/upload/__tests__/__snapshots__/demo.test.ts.snap index 9585da3019..7039a78620 100644 --- a/components/upload/__tests__/__snapshots__/demo.test.ts.snap +++ b/components/upload/__tests__/__snapshots__/demo.test.ts.snap @@ -1,7 +1,9 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP exports[`renders components/upload/demo/avatar.tsx correctly 1`] = ` -Array [ +
    @@ -50,7 +52,7 @@ Array [
    - , + @@ -99,8 +101,8 @@ Array [ - , -] + + `; exports[`renders components/upload/demo/basic.tsx correctly 1`] = ` diff --git a/components/upload/demo/avatar.tsx b/components/upload/demo/avatar.tsx index 76157e80ba..40346e7bc7 100644 --- a/components/upload/demo/avatar.tsx +++ b/components/upload/demo/avatar.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { LoadingOutlined, PlusOutlined } from '@ant-design/icons'; -import { message, Upload } from 'antd'; +import { Flex, message, Upload } from 'antd'; import type { GetProp, UploadProps } from 'antd'; type FileType = Parameters>[0]; @@ -49,7 +49,7 @@ const App: React.FC = () => { ); return ( - <> + { > {imageUrl ? avatar : uploadButton} - + ); }; diff --git a/contributors.json b/contributors.json index 3fc74141b3..dc9ead3f16 100644 --- a/contributors.json +++ b/contributors.json @@ -1,6 +1,7 @@ [ "+v", "07akioni", + "0xflotus", "17073025", "2724635499", "282159468", @@ -41,6 +42,7 @@ "Alexander Suevalov", "Alexander.Kosov", "Alexandre Kirszenberg", + "Alexey Teterin", "Alexey Vinogradov", "Alexey Yakovlev", "Alfred Qiu", @@ -130,6 +132,7 @@ "Camol", "Cang Ta", "Canwen Xu", + "Carla Paiva", "Carlos Coves Prieto", "Carter Feldman", "Caspian Chen", @@ -145,6 +148,7 @@ "Charles Covey-Brandt", "Charlie Jonas", "Chelsea Huang", + "ChenJiYuan", "ChenXiao", "Cheng Liu", "Chenjia", @@ -176,6 +180,7 @@ "Cordaro", "CornerSkyless", "Curly.Water", + "Cuvii", "D & R", "Daewoong Moon", "Dalton Craven", @@ -247,6 +252,7 @@ "Eli White", "Eliot Sanford", "Ell Bradshaw", + "Eloi0424", "Emerson Laurentino", "Emily Xiong", "Ender Lee", @@ -260,14 +266,17 @@ "Ernest Folch", "Erwann Mest", "Eslam Yahya", + "Eugene", "Eugene Matvejev", "Eugene Molokov", "Eusen", "Evan Charlton", + "Evgeniy Aksyonov", "Evgeny Kuznetsov", "Eward Song", "FJHou", "Fachreza Muslim", + "Fatpandac", "Federico Marcos", "Ferdi Koomen", "Fergus Leung", @@ -320,6 +329,7 @@ "Guichi Zhao", "Gunay", "Gundsambuu", + "Guo Yunhe", "Guojun Wang", "Guru Mahendran", "HJin.me", @@ -379,6 +389,7 @@ "Ivan Tsybulin", "Ivan Yakovlev", "Ivo Stratev", + "JINGLE", "JRoger", "Jabir K.H", "Jack", @@ -407,6 +418,7 @@ "Jase Pellerin", "Jason", "Jason Chung", + "Jason Feng", "Jason Yin", "Jay Fong", "Jean-Luc Sorak", @@ -418,6 +430,7 @@ "Jelle de Jong", "Jenna Van Conett", "Jennie", + "Jeongseok Kang", "JeromeLin", "Jerry Bendy", "Jesper We", @@ -510,6 +523,7 @@ "KingxBeta", "Kirill Alexander Khalitov", "Kirill Stiopin", + "Kirk Ross", "Kiyan", "Knacktus", "Knut Olav Bøhmer", @@ -600,10 +614,10 @@ "Matt Lein", "Matt Wilkinson", "Max", + "Maxim Kolesnikov", "Maximilian Meyer", "Mayowa Sogbein", "Md_ZubairAhmed", - "Mehdi Salem Naraghi", "MeiLin", "MengZhaoFly", "Meow-z", @@ -662,6 +676,7 @@ "Nathan Tavares Nascimento", "Nathan Wells", "Naveen", + "Navid", "Neekey", "Neil", "Nekron", @@ -690,6 +705,7 @@ "Nokecy", "OAwan", "Oceansdeep7", + "OctKun", "Olaniyi Philip Ojeyinka", "Oleg Kuzava", "Oleksandr Kovalchuk", @@ -734,6 +750,7 @@ "QC-L", "Qhan W", "Qiaosen Huang", + "Qin Zan", "QingLance", "Qingrong Ke", "QoVoQ", @@ -745,6 +762,7 @@ "Rain120", "Rainey", "Rainy", + "Rajasekhar Gandavarapu", "Rajil Bajracharya", "Rallets", "Ramsés Moreno", @@ -763,6 +781,7 @@ "Ricardo Raphael Joson", "Richard D. Worth", "Rick Zhou", + "Rickvian Aldi", "Ritesh Makan", "Riyad Elberkawy", "Robert Wilkinson", @@ -773,6 +792,7 @@ "Roman Soroka", "Ron Šmeral", "Rongjian Zhang", + "Roxannej", "Rrrandom", "RunningCoderLee", "Ryan Lee", @@ -820,6 +840,7 @@ "ShuYu Wang", "Shubham Kanodia", "Shun", + "Shunze Chen", "Shuvalov Anton", "SimaQ", "Simo Aleksandrov", @@ -856,6 +877,7 @@ "SyMind", "Sylvain Boulade", "SylvanasGone", + "Sébastien Béal", "TTC", "TangLL", "Tanmoy Bhowmik", @@ -926,6 +948,7 @@ "Wang Zhengchen", "Wang yb", "Warren Seymour", + "WeLong", "Webber Takken", "Wei Zhu", "Wenchao Hu", @@ -950,6 +973,7 @@ "XBTop1!", "XIN HU", "XTY", + "XiaoDong", "XiaoPi", "Xiaoming", "Xie Guanglei", @@ -972,6 +996,7 @@ "Yann Pringault", "Yash Joshi", "Yasin Uslu", + "Yawen Xiao", "Yee", "Yevhen Hryhorevskyi", "Yiming", @@ -1041,6 +1066,7 @@ "alex89lj", "alexchen", "amedora", + "anilpixel", "aoxiang78", "appleshell", "arange", @@ -1103,6 +1129,7 @@ "cwg", "daczczcz1", "dainli", + "daisy", "dally_G", "damon.chen", "david.lv", @@ -1141,6 +1168,7 @@ "fkysly", "flashback313", "flyerH", + "flyflydogdog", "frezc", "gaokaifeis", "gaoryrt", @@ -1175,6 +1203,7 @@ "howard", "huangyan.py", "hugorezende", + "huiliangShen", "huishiyi", "hustcc", "huzzbuzz", @@ -1223,15 +1252,17 @@ "kayw", "kdenz", "kdepp", + "kelvine", "keng", "kenve", "kermolaev", "killa", "kily zhou", - "kiner-tang(文辉)", + "kiner-tang", "klouskingsley", "ko", "konakona", + "konka", "kossel", "kouchao", "kristof0425", @@ -1257,7 +1288,6 @@ "lilun", "limingxin", "linqiqi077", - "linxianxi", "lisenenkov", "littleLane", "littledian", @@ -1281,6 +1311,7 @@ "mArker", "maks", "maomao", + "max", "maximest-pierre", "melchior voidwolf", "memoryza", @@ -1291,6 +1322,7 @@ "mkermani144", "mmmveggies", "mofelee", + "momesana", "moonrailgun", "morning-star", "mraiguo", @@ -1379,6 +1411,7 @@ "tdida", "thegatheringstorm", "thilo-behnke", + "thinkasany", "tianli.zhao", "tom", "toshi1127", @@ -1451,17 +1484,20 @@ "yehq", "yeliex", "yeshan333", + "yexiaolong", "yibu.wang", "yifanwww", "yiminanci", "yiminghe", "yingxirz", "yiwwhl", + "yoshinyan", "youmoo", "youngz", "yuche", "yuezk", "yui", + "yuza", "yykoypj", "z", "zack", @@ -1481,6 +1517,8 @@ "zhaopeidong", "zhenfan.yu", "zhengjitf", + "zhipenglin", + "zhoulixiang", "zhuguibiao", "zhujun24", "zhyupe", @@ -1530,11 +1568,14 @@ "南小北", "只捱宅", "可乐", + "叶枫", "吕立青", "吴泽康", "啸生", "大猫", "子瞻 Luci", + "孙术", + "宋红凯", "宝码", "小哈husky", "小菜", @@ -1568,6 +1609,7 @@ "松子", "林煌东", "柚子男", + "栗康", "梓安", "沐霖", "炒米粉", @@ -1585,6 +1627,7 @@ "社长长", "章鱼怪", "竹尔", + "米家-iOS-张文锋", "米老朱", "精武陈真", "红", @@ -1614,7 +1657,9 @@ "郑国庆", "郑旭", "野迂迂", + "闲夕", "闲耘™", + "阿菜 Cai", "陆离", "陈帅", "陈广亮", diff --git a/docs/react/introduce.en-US.md b/docs/react/introduce.en-US.md index 3a820ab03f..608455b649 100644 --- a/docs/react/introduce.en-US.md +++ b/docs/react/introduce.en-US.md @@ -44,11 +44,11 @@ You can subscribe to this feed for new version notifications: https://github.com ## Installation -### Using npm or yarn or pnpm +### Using npm or yarn or pnpm or bun -**We recommend using [npm](https://www.npmjs.com/) or [yarn](https://github.com/yarnpkg/yarn/) or [pnpm](https://pnpm.io/) to install**, it not only makes development easier, but also allow you to take advantage of the rich ecosystem of Javascript packages and tooling. +**We recommend using [npm](https://www.npmjs.com/) or [yarn](https://github.com/yarnpkg/yarn/) or [pnpm](https://pnpm.io/) or [bun](https://bun.sh/) to install**, it not only makes development easier, but also allow you to take advantage of the rich ecosystem of Javascript packages and tooling. - + If you are in a bad network environment, you can try other registries and tools like [cnpm](https://github.com/cnpm/cnpm). diff --git a/docs/react/introduce.zh-CN.md b/docs/react/introduce.zh-CN.md index ab55a9faf7..93f5e2fdda 100644 --- a/docs/react/introduce.zh-CN.md +++ b/docs/react/introduce.zh-CN.md @@ -44,11 +44,11 @@ title: Ant Design of React ## 安装 -### 使用 npm 或 yarn 或 pnpm 安装 +### 使用 npm 或 yarn 或 pnpm 或 bun 安装 -**我们推荐使用 [npm](https://www.npmjs.com/) 或 [yarn](https://github.com/yarnpkg/yarn/) 或 [pnpm](https://pnpm.io/zh/) 的方式进行开发**,不仅可在开发环境轻松调试,也可放心地在生产环境打包部署使用,享受整个生态圈和工具链带来的诸多好处。 +**我们推荐使用 [npm](https://www.npmjs.com/) 或 [yarn](https://github.com/yarnpkg/yarn/) 或 [pnpm](https://pnpm.io/zh/) 或 [bun](https://bun.sh/) 的方式进行开发**,不仅可在开发环境轻松调试,也可放心地在生产环境打包部署使用,享受整个生态圈和工具链带来的诸多好处。 - + 如果你的网络环境不佳,推荐使用 [cnpm](https://github.com/cnpm/cnpm)。 diff --git a/docs/react/use-with-create-react-app.en-US.md b/docs/react/use-with-create-react-app.en-US.md index 72a81160c6..fad623587d 100644 --- a/docs/react/use-with-create-react-app.en-US.md +++ b/docs/react/use-with-create-react-app.en-US.md @@ -11,9 +11,9 @@ title: Usage with create-react-app ## Install and Initialization -Before all start, you may need install [yarn](https://github.com/yarnpkg/yarn/) or [pnpm](https://pnpm.io/). +Before all start, you may need install [yarn](https://github.com/yarnpkg/yarn/) or [pnpm](https://pnpm.io/) or [bun](https://bun.sh/). - + The tool will create and initialize environment and dependencies automatically, please try config your proxy setting or use another npm registry if any network errors happen during it. @@ -48,13 +48,13 @@ Below is the default directory structure. Now we install `antd` from yarn or npm or pnpm. - + Modify `src/App.js`, import Button component from `antd`. ```tsx -import { Button } from 'antd'; import React from 'react'; +import { Button } from 'antd'; const App: React.FC = () => (
    @@ -72,8 +72,8 @@ OK, you should now see a blue primary button displayed on the page. Next you can Ref to the [Customize Theme documentation](/docs/react/customize-theme). Modify theme with ConfigProvider: ```tsx -import { ConfigProvider } from 'antd'; import React from 'react'; +import { ConfigProvider } from 'antd'; const App: React.FC = () => ( diff --git a/docs/react/use-with-create-react-app.zh-CN.md b/docs/react/use-with-create-react-app.zh-CN.md index e372174b8d..93a8478cee 100644 --- a/docs/react/use-with-create-react-app.zh-CN.md +++ b/docs/react/use-with-create-react-app.zh-CN.md @@ -11,9 +11,9 @@ title: 在 create-react-app 中使用 ## 安装和初始化 -在开始之前,你可能需要安装 [yarn](https://github.com/yarnpkg/yarn/) 或者 [pnpm](https://pnpm.io/zh/)。 +在开始之前,你可能需要安装 [yarn](https://github.com/yarnpkg/yarn/) 或者 [pnpm](https://pnpm.io/zh/) 或者 [bun](https://bun.sh/)。 - + 工具会自动初始化一个脚手架并安装 React 项目的各种必要依赖,如果在过程中出现网络问题,请尝试配置代理或使用其他 npm registry。 @@ -48,7 +48,7 @@ $ npm run start 现在从 yarn 或 npm 或 pnpm 安装并引入 antd。 - + 修改 `src/App.js`,引入 antd 的按钮组件。 diff --git a/docs/react/use-with-next.en-US.md b/docs/react/use-with-next.en-US.md index f9c0ca8024..9f3d83151c 100644 --- a/docs/react/use-with-next.en-US.md +++ b/docs/react/use-with-next.en-US.md @@ -10,9 +10,9 @@ tag: Updated ## Install and Initialization -Before all start, you may need install [yarn](https://github.com/yarnpkg/yarn/) or [pnpm](https://pnpm.io/). +Before all start, you may need install [yarn](https://github.com/yarnpkg/yarn/) or [pnpm](https://pnpm.io/) or [bun](https://bun.sh/). - + The tool will create and initialize environment and dependencies automatically, please try config your proxy setting, or use another npm registry if any network errors happen during it. @@ -27,9 +27,9 @@ Open the browser at http://localhost:3000/. if you see the NEXT logo, it is cons ## Import antd -Now we install `antd` from yarn or npm or pnpm. +Now we install `antd` from yarn or npm or pnpm or bun. - + Modify `src/app/page.tsx`, import Button component from `antd`. @@ -56,7 +56,7 @@ If you are using the App Router in Next.js and using antd as your component libr 1. Install `@ant-design/nextjs-registry` - + 2. Use it in `app/layout.tsx` @@ -94,7 +94,7 @@ If you are using the Pages Router in Next.js and using antd as your component li > > image - + 2. Rewrite `pages/_document.tsx` diff --git a/docs/react/use-with-next.zh-CN.md b/docs/react/use-with-next.zh-CN.md index 16bef1e574..4ad8cdabdd 100644 --- a/docs/react/use-with-next.zh-CN.md +++ b/docs/react/use-with-next.zh-CN.md @@ -10,9 +10,9 @@ tag: Updated ## 安装和初始化 -在开始之前,你可能需要安装 [yarn](https://github.com/yarnpkg/yarn/) 或者 [pnpm](https://pnpm.io/zh/)。 +在开始之前,你可能需要安装 [yarn](https://github.com/yarnpkg/yarn/) 或者 [pnpm](https://pnpm.io/zh/) 或者 [bun](https://bun.sh/)。 - + 工具会自动初始化一个脚手架并安装项目的各种必要依赖,在安装过程中,有一些配置项需要自行选择,如果在过程中出现网络问题,请尝试配置代理,或使用其他 npm registry,例如,你可以切换到淘宝镜像源:`npm config set registry https://registry.npmmirror.com`。 @@ -27,9 +27,9 @@ $ npm run dev ## 引入 antd -现在从 yarn 或 npm 或 pnpm 安装并引入 antd。 +现在从 yarn 或 npm 或 pnpm 或 bun 安装并引入 antd。 - + 修改 `src/app/page.tsx`,引入 antd 的按钮组件。 @@ -56,7 +56,7 @@ export default Home; 1. 安装 `@ant-design/nextjs-registry` - + 2. 在 `app/layout.tsx` 中使用 @@ -94,7 +94,7 @@ export default RootLayout; > > image - + 2. 改写 `pages/_document.tsx` diff --git a/docs/react/use-with-vite.en-US.md b/docs/react/use-with-vite.en-US.md index e104c63ff6..c26ce4cef6 100644 --- a/docs/react/use-with-vite.en-US.md +++ b/docs/react/use-with-vite.en-US.md @@ -9,9 +9,9 @@ title: Usage with Vite ## Install and Initialization -Before all start, you may need install [yarn](https://github.com/yarnpkg/yarn/) or [pnpm](https://pnpm.io/). +Before all start, you may need install [yarn](https://github.com/yarnpkg/yarn/) or [pnpm](https://pnpm.io/) or [bun](https://bun.sh/). - + The tool will create and initialize environment and dependencies automatically, please try config your proxy setting, or use another npm registry if any network errors happen during it. @@ -45,9 +45,9 @@ Below is the default directory structure. └── vite.config.ts ``` -Now we install `antd` from yarn or npm or pnpm. +Now we install `antd` from yarn or npm or pnpm or bun. - + Modify `src/App.js`, import Button component from `antd`. diff --git a/docs/react/use-with-vite.zh-CN.md b/docs/react/use-with-vite.zh-CN.md index 27883b539c..cbf90c7d16 100644 --- a/docs/react/use-with-vite.zh-CN.md +++ b/docs/react/use-with-vite.zh-CN.md @@ -9,9 +9,9 @@ title: 在 Vite 中使用 ## 安装和初始化 -在开始之前,你可能需要安装 [yarn](https://github.com/yarnpkg/yarn/) 或者 [pnpm](https://pnpm.io/zh/)。 +在开始之前,你可能需要安装 [yarn](https://github.com/yarnpkg/yarn/) 或者 [pnpm](https://pnpm.io/zh/) 或者 [bun](https://bun.sh/)。 - + 工具会自动初始化一个脚手架并安装 React 项目的各种必要依赖,如果在过程中出现网络问题,请尝试配置代理,或使用其他 npm registry。 @@ -45,9 +45,9 @@ $ npm run dev └── vite.config.js ``` -现在从 yarn 或 npm 或 pnpm 安装并引入 antd。 +现在从 yarn 或 npm 或 pnpm 或 bun 安装并引入 antd。 - + 修改 `src/App.js`,引入 antd 的按钮组件。 diff --git a/package.json b/package.json index 947f0d98c0..39013d59fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "antd", - "version": "5.16.0", + "version": "5.16.1", "description": "An enterprise-class UI design language and React components implementation", "keywords": [ "ant", @@ -76,7 +76,7 @@ "lint-fix": "npm run lint-fix:script && npm run lint-fix:demo", "lint-fix:demo": "npm run lint:demo -- --fix", "lint-fix:script": "npm run lint:script -- --fix", - "pre-publish": "npm run test-all -- --skip-lint --skip-build --skip-dist --skip-es --skip-lib --skip-test --skip-node && tsx ./scripts/pre-publish.ts", + "pre-publish": "npm run test-all -- --skip-build && tsx ./scripts/pre-publish-notice.ts", "prepare": "is-ci || husky && dumi setup", "prepublishOnly": "antd-tools run guard", "prettier": "prettier -c --write **/* --cache", @@ -119,7 +119,7 @@ "@ant-design/cssinjs": "^1.19.1", "@ant-design/icons": "^5.3.6", "@ant-design/react-slick": "~1.1.2", - "@babel/runtime": "^7.24.1", + "@babel/runtime": "^7.24.4", "@ctrl/tinycolor": "^3.6.1", "@rc-component/color-picker": "~1.5.3", "@rc-component/mutate-observer": "^1.1.0", @@ -180,7 +180,6 @@ "@emotion/server": "^11.11.0", "@ianvs/prettier-plugin-sort-imports": "^4.2.1", "@madccc/duplicate-package-checker-webpack-plugin": "^1.0.0", - "@octokit/rest": "^20.0.2", "@qixian.cs/github-contributors-list": "^2.0.1", "@size-limit/file": "^11.1.2", "@stackblitz/sdk": "^1.9.0", @@ -202,9 +201,8 @@ "@types/jsdom": "^21.1.6", "@types/lodash": "^4.17.0", "@types/minimist": "^1.2.5", - "@types/node": "^20.12.3", + "@types/node": "^20.12.4", "@types/nprogress": "^0.2.3", - "@types/ora": "^3.2.0", "@types/pixelmatch": "^5.2.6", "@types/pngjs": "^6.0.4", "@types/prismjs": "^1.26.3", @@ -212,11 +210,11 @@ "@types/qs": "^6.9.14", "@types/react": "^18.2.74", "@types/react-copy-to-clipboard": "^5.0.7", - "@types/react-dom": "^18.2.23", + "@types/react-dom": "^18.2.24", "@types/react-highlight-words": "^0.16.7", "@types/react-resizable": "^3.0.7", "@types/semver": "^7.5.8", - "@types/tar": "^6.1.11", + "@types/tar": "^6.1.12", "@types/throttle-debounce": "^5.0.2", "@types/warning": "^3.0.3", "@typescript-eslint/eslint-plugin": "^7.5.0", @@ -247,7 +245,7 @@ "eslint-plugin-markdown": "^4.0.1", "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-unicorn": "^51.0.1", + "eslint-plugin-unicorn": "^52.0.0", "fast-glob": "^3.3.2", "fetch-jsonp": "^1.3.0", "fs-extra": "^11.2.0", @@ -282,7 +280,6 @@ "node-notifier": "^10.0.1", "nprogress": "^0.2.0", "open": "^10.1.0", - "ora": "^8.0.1", "pixelmatch": "^5.3.0", "pngjs": "^7.0.0", "prettier": "^3.2.5", @@ -328,9 +325,9 @@ "tar": "^6.2.1", "tar-fs": "^3.0.5", "terser": "^5.30.3", - "tsx": "^4.7.1", + "tsx": "^4.7.2", "typedoc": "^0.25.12", - "typescript": "~5.4.3", + "typescript": "~5.4.4", "vanilla-jsoneditor": "^0.23.1", "vanilla-tilt": "^1.8.1", "webpack": "^5.91.0", diff --git a/scripts/check-commit.ts b/scripts/check-commit.ts index ed702b40b9..1e8773ec6b 100644 --- a/scripts/check-commit.ts +++ b/scripts/check-commit.ts @@ -38,7 +38,7 @@ async function checkBranch({ current }: StatusResult) { version.includes('-experimental.') ) { console.log(chalk.cyan('😃 Alpha version. Skip branch check.')); - } else if (current !== 'master') { + } else if (current !== 'master' && current !== '4.0-prepare') { console.log(chalk.yellow('🤔 You are not in the master branch!')); exitProcess(); } diff --git a/scripts/pre-publish-notice.ts b/scripts/pre-publish-notice.ts new file mode 100644 index 0000000000..8f113e12d9 --- /dev/null +++ b/scripts/pre-publish-notice.ts @@ -0,0 +1,9 @@ +const { Notification: Notifier } = require('node-notifier'); + +new Notifier().notify({ + title: '✅ 准备发布到 npm', + message: '测试用例执行完毕,快回来输入 npm 校验码了!', + sound: 'Crystal', +}); + +process.exit(0); diff --git a/scripts/pre-publish.ts b/scripts/pre-publish.ts deleted file mode 100644 index b6542131eb..0000000000 --- a/scripts/pre-publish.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Octokit } from '@octokit/rest'; -import ora from 'ora'; -import chalk from 'chalk'; - -const simpleGit = require('simple-git'); -const { Notification: Notifier } = require('node-notifier'); - -const emojify = (status: string = '') => { - if (!status) { - return ''; - } - const emoji = { - /* status */ - completed: '✅', - queued: '🕒', - in_progress: '⌛', - /* conclusion */ - success: '✅', - failure: '❌', - neutral: '⚪', - cancelled: '❌', - skipped: '⏭️', - timed_out: '⌛', - action_required: '🔴', - }[status]; - return `${emoji || ''} ${(status || '').padEnd(15)}`; -}; - -const runPrePublish = async () => { - const spinner = ora('Loading unicorns').start(); - spinner.info(chalk.black.bgGreenBright('本次发布将跳过本地 CI 检查,远程 CI 通过后方可发布')); - const git = simpleGit(); - if (!process.env.GITHUB_ACCESS_TOKEN) { - spinner.fail( - '请先设置 GITHUB_ACCESS_TOKEN 环境变量到本地,请不要泄露给任何在线页面: https://octokit.github.io/rest.js/v20#authentication', - ); - process.exit(1); - } - const octokit = new Octokit({ auth: process.env.GITHUB_ACCESS_TOKEN }); - const { current: currentBranch } = await git.branch(); - spinner.start(`正在拉取远程分支 ${currentBranch}`); - await git.pull('origin', currentBranch); - spinner.succeed(`成功拉取远程分支 ${currentBranch}`); - spinner.start(`正在推送本地分支 ${currentBranch}`); - await git.push('origin', currentBranch); - spinner.succeed(`成功推送远程分支 ${currentBranch}`); - spinner.succeed(`已经和远程分支保持同步 ${currentBranch}`); - spinner.succeed(`找到本地最新 commit:`); - const { latest } = await git.log(); - spinner.info(` hash: ${latest.hash}`); - spinner.info(` date: ${latest.date}`); - spinner.info(` message: ${latest.message}`); - spinner.info(` body: ${latest.body}`); - spinner.info(` author_name: ${latest.author_name}`); - const owner = 'ant-design'; - const repo = 'ant-design'; - spinner.start(`开始检查远程分支 CI 状态 ${currentBranch}`); - const result = await octokit.checks.listForRef({ - owner, - repo, - ref: latest.hash, - }); - spinner.succeed(`远程分支 CI 状态:`); - result.data.check_runs.forEach((run) => { - spinner.info( - ` ${run.name.padEnd(30)} ${emojify(run.status)} ${emojify(run.conclusion || '')}`, - ); - }); - const conclusions = result.data.check_runs.map((run) => run.conclusion); - if ( - conclusions.includes('failure') || - conclusions.includes('cancelled') || - conclusions.includes('timed_out') - ) { - spinner.fail('远程分支 CI 执行异常,无法继续发布,请尝试修复或重试'); - spinner.info(` 点此查看状态:https://github.com/${owner}/${repo}/commit/${latest.hash}`); - process.exit(1); - } - const statuses = result.data.check_runs.map((run) => run.status); - if ( - result.data.check_runs.length < 1 || - statuses.includes('queued') || - statuses.includes('in_progress') - ) { - spinner.fail('远程分支 CI 还在执行中,请稍候再试'); - spinner.info(` 点此查看状态:https://github.com/${owner}/${repo}/commit/${latest.hash}`); - process.exit(1); - } - - // 远程分支 CI 跑过才能继续 - spinner.succeed(`远程分支 CI 已通过,准备开始发布`); - new Notifier().notify({ - title: '✅ 准备发布到 npm', - message: '测试用例执行完毕,快回来输入 npm 校验码了!', - sound: 'Crystal', - }); - process.exit(0); -}; - -runPrePublish();