@aloudata/aloudata-design 3.0.24 → 3.0.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/Button/index.js +9 -3
  2. package/dist/Button/index.js.map +1 -1
  3. package/dist/Checkbox/index.js +7 -1
  4. package/dist/Checkbox/index.js.map +1 -1
  5. package/dist/Collapse/index.js +68 -22
  6. package/dist/Collapse/index.js.map +1 -1
  7. package/dist/Dropdown/index.js +12 -2
  8. package/dist/Dropdown/index.js.map +1 -1
  9. package/dist/Input/components/Input/index.js +7 -1
  10. package/dist/Input/components/Input/index.js.map +1 -1
  11. package/dist/Input/components/TextArea/index.js +7 -1
  12. package/dist/Input/components/TextArea/index.js.map +1 -1
  13. package/dist/InputNumber/index.js +7 -1
  14. package/dist/InputNumber/index.js.map +1 -1
  15. package/dist/Modal/index.js +13 -0
  16. package/dist/Modal/index.js.map +1 -1
  17. package/dist/Pagination/PageSizeChanger.d.ts +1 -0
  18. package/dist/Pagination/PageSizeChanger.js +3 -2
  19. package/dist/Pagination/PageSizeChanger.js.map +1 -1
  20. package/dist/Pagination/index.js +33 -19
  21. package/dist/Pagination/index.js.map +1 -1
  22. package/dist/Pagination/types.d.ts +3 -0
  23. package/dist/Select/BaseSelect.js +12 -12
  24. package/dist/Select/BaseSelect.js.map +1 -1
  25. package/dist/Steps/index.js +66 -14
  26. package/dist/Steps/index.js.map +1 -1
  27. package/dist/Switch/index.js +7 -1
  28. package/dist/Switch/index.js.map +1 -1
  29. package/dist/Table/components/ExpandCell.js +6 -2
  30. package/dist/Table/components/ExpandCell.js.map +1 -1
  31. package/dist/Table/components/Header.js +25 -17
  32. package/dist/Table/components/Header.js.map +1 -1
  33. package/dist/Table/hooks/useFixed.js +5 -1
  34. package/dist/Table/hooks/useFixed.js.map +1 -1
  35. package/dist/Table/hooks/useRowSelection.js +14 -7
  36. package/dist/Table/hooks/useRowSelection.js.map +1 -1
  37. package/dist/Table/index.js +8 -2
  38. package/dist/Table/index.js.map +1 -1
  39. package/dist/Tabs/index.js +7 -1
  40. package/dist/Tabs/index.js.map +1 -1
  41. package/dist/aloudata-design.css +1 -1
  42. package/dist/locale/default.d.ts +6 -0
  43. package/dist/locale/en_US.d.ts +6 -0
  44. package/dist/locale/en_US.js +6 -0
  45. package/dist/locale/en_US.js.map +1 -1
  46. package/dist/locale/zh_CN.d.ts +6 -0
  47. package/dist/locale/zh_CN.js +6 -0
  48. package/dist/locale/zh_CN.js.map +1 -1
  49. package/dist/theme/contract/controlStateColorArtifact.d.ts +73 -0
  50. package/dist/theme/contract/controlStateColorArtifact.js +2 -0
  51. package/dist/theme/contract/focusRingArtifact.d.ts +51 -0
  52. package/dist/theme/contract/focusRingArtifact.js +2 -0
  53. package/dist/theme/contract/tokenOutputContract.d.ts +1 -1
  54. package/dist/theme/contract/tokenOutputContract.js +4 -0
  55. package/dist/theme/contract/tokenOutputContract.js.map +1 -1
  56. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.d.ts +1 -1
  57. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js +3 -0
  58. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js.map +1 -1
  59. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.d.ts +1 -1
  60. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js +3 -0
  61. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js.map +1 -1
  62. package/dist/theme/runtime/themeToCssVars.js +3 -0
  63. package/dist/theme/runtime/themeToCssVars.js.map +1 -1
  64. package/package.json +1 -1
@@ -6,46 +6,52 @@ import Button_default from "../Button/index.js";
6
6
  import { LocaleContext, getTranslator } from "../locale/default.js";
7
7
  import PageSizeChanger from "./PageSizeChanger.js";
8
8
  /* empty css */
9
- import { useCallback, useContext, useEffect, useState } from "react";
9
+ import { useCallback, useContext, useState } from "react";
10
10
  import { jsx, jsxs } from "react/jsx-runtime";
11
11
  import _ from "lodash";
12
12
  //#region src/Pagination/index.tsx
13
13
  function Pagination(props) {
14
- const { current: currPage = 1, pageSize, total, onChange, hideOnSinglePage, showSizeChanger = false, pageSizeOptions = [
14
+ const { current: controlledCurrent, defaultCurrent = 1, pageSize, total, onChange, hideOnSinglePage, showSizeChanger = false, pageSizeOptions = [
15
15
  10,
16
16
  20,
17
17
  30,
18
18
  50
19
- ], onShowSizeChange, showTotal = false } = props;
19
+ ], onShowSizeChange, showTotal = false, disabled = false, "aria-label": ariaLabel } = props;
20
20
  const { locale } = useContext(LocaleContext);
21
21
  const t = getTranslator(locale);
22
+ const a11y = t.Pagination;
23
+ const [uncontrolledCurrent, setUncontrolledCurrent] = useState(defaultCurrent);
24
+ if (pageSize <= 0) throw new Error("pageSize must be greater than 0");
22
25
  const totalPage = getTotalPage(total, pageSize);
23
- const [current, setCurrent] = useState(getSafeCurrent(totalPage, currPage));
24
- useEffect(() => {
25
- setCurrent(getSafeCurrent(totalPage, currPage));
26
- }, [currPage, totalPage]);
27
- if (pageSize === 0) throw new Error("pageSize must be greater than 0");
26
+ const current = getSafeCurrent(totalPage, controlledCurrent ?? uncontrolledCurrent);
28
27
  const onChangePage = useCallback((page) => {
29
28
  return () => {
30
- if (page === current) return;
31
- setCurrent(page);
29
+ if (disabled || page === current || page < 1 || page > totalPage) return;
30
+ if (controlledCurrent === void 0) setUncontrolledCurrent(page);
32
31
  onChange(page, pageSize);
33
32
  };
34
33
  }, [
34
+ controlledCurrent,
35
+ disabled,
35
36
  onChange,
36
37
  current,
37
- pageSize
38
+ pageSize,
39
+ totalPage
38
40
  ]);
39
41
  const handlePageSizeChange = useCallback((newPageSize) => {
42
+ if (disabled || newPageSize <= 0 || newPageSize === pageSize) return;
40
43
  const safeCurrent = getSafeCurrent(getTotalPage(total, newPageSize), current);
41
- setCurrent(safeCurrent);
44
+ if (controlledCurrent === void 0) setUncontrolledCurrent(safeCurrent);
42
45
  if (onShowSizeChange) onShowSizeChange(safeCurrent, newPageSize);
43
46
  onChange(safeCurrent, newPageSize);
44
47
  }, [
45
- total,
48
+ controlledCurrent,
46
49
  current,
50
+ disabled,
51
+ onChange,
47
52
  onShowSizeChange,
48
- onChange
53
+ pageSize,
54
+ total
49
55
  ]);
50
56
  const pageRange = getPaginationRange(totalPage, current);
51
57
  if (hideOnSinglePage) {
@@ -58,8 +64,9 @@ function Pagination(props) {
58
64
  if (showTotal === true) return t.Pagination.totalItems(total, range);
59
65
  return null;
60
66
  };
61
- return /* @__PURE__ */ jsxs("div", {
67
+ return /* @__PURE__ */ jsxs("nav", {
62
68
  className: containerClassName,
69
+ "aria-label": ariaLabel ?? a11y.navigationLabel,
63
70
  children: [
64
71
  showTotal && /* @__PURE__ */ jsx("div", {
65
72
  className: prefixCls("total"),
@@ -71,7 +78,8 @@ function Pagination(props) {
71
78
  /* @__PURE__ */ jsx(Button_default, {
72
79
  icon: /* @__PURE__ */ jsx(Memo, { size: 16 }),
73
80
  onClick: onChangePage(current - 1),
74
- disabled: current === 1
81
+ disabled: disabled || current === 1,
82
+ "aria-label": a11y.previousPage
75
83
  }),
76
84
  _.map(pageRange, (page, index) => {
77
85
  if (page === "...") return /* @__PURE__ */ jsx("span", {
@@ -81,20 +89,26 @@ function Pagination(props) {
81
89
  return /* @__PURE__ */ jsx(Button_default, {
82
90
  icon: /* @__PURE__ */ jsx("span", { children: page }),
83
91
  className: cn(prefixCls("button"), { [prefixCls("active")]: page === current }),
84
- onClick: onChangePage(page)
92
+ onClick: onChangePage(page),
93
+ disabled,
94
+ "aria-label": page === current ? a11y.currentPage(page) : a11y.page(page),
95
+ ...page === current ? { "aria-current": "page" } : {}
85
96
  }, index);
86
97
  }),
87
98
  /* @__PURE__ */ jsx(Button_default, {
88
99
  icon: /* @__PURE__ */ jsx(Memo$1, { size: 16 }),
89
100
  onClick: onChangePage(current + 1),
90
- disabled: current >= totalPage
101
+ disabled: disabled || current >= totalPage,
102
+ "aria-label": a11y.nextPage
91
103
  })
92
104
  ]
93
105
  }),
94
106
  showSizeChanger && /* @__PURE__ */ jsx(PageSizeChanger, {
95
107
  pageSize,
96
108
  pageSizeOptions,
97
- onChange: handlePageSizeChange
109
+ onChange: handlePageSizeChange,
110
+ disabled,
111
+ ariaLabel: a11y.pageSize
98
112
  })
99
113
  ]
100
114
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/Pagination/index.tsx"],"sourcesContent":["import { cn } from '../lib/utils';\nimport _ from 'lodash';\nimport React, { useCallback, useContext, useEffect, useState } from 'react';\nimport Button from '../Button';\nimport { ChevronLeftLine, ChevronRightLine, Ellipsis } from '../Icon';\nimport { LocaleContext, getTranslator } from '../locale/default';\nimport { IPaginationProps } from './types';\nimport PageSizeChanger from './PageSizeChanger';\nimport './pagination.css';\n\nfunction Pagination(props: IPaginationProps) {\n const {\n current: currPage = 1,\n pageSize,\n total,\n onChange,\n hideOnSinglePage,\n showSizeChanger = false,\n pageSizeOptions = [10, 20, 30, 50],\n onShowSizeChange,\n showTotal = false,\n } = props;\n\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n const totalPage = getTotalPage(total, pageSize);\n\n const [current, setCurrent] = useState(getSafeCurrent(totalPage, currPage));\n\n useEffect(() => {\n const safeCurrent = getSafeCurrent(totalPage, currPage);\n setCurrent(safeCurrent);\n }, [currPage, totalPage]);\n\n if (pageSize === 0) {\n throw new Error('pageSize must be greater than 0');\n }\n\n const onChangePage = useCallback(\n (page: number) => {\n return () => {\n if (page === current) {\n return;\n }\n setCurrent(page);\n onChange(page, pageSize);\n };\n },\n [onChange, current, pageSize],\n );\n\n const handlePageSizeChange = useCallback(\n (newPageSize: number) => {\n const newTotalPage = getTotalPage(total, newPageSize);\n // 确保当前页在有效范围内\n const safeCurrent = getSafeCurrent(newTotalPage, current);\n\n setCurrent(safeCurrent);\n\n // 调用回调函数\n if (onShowSizeChange) {\n onShowSizeChange(safeCurrent, newPageSize);\n }\n\n // 也调用 onChange 以保持一致性\n onChange(safeCurrent, newPageSize);\n },\n [total, current, onShowSizeChange, onChange],\n );\n\n const pageRange = getPaginationRange(totalPage, current);\n\n if (hideOnSinglePage) {\n if (totalPage <= 1 && !showSizeChanger && !showTotal) {\n return null;\n }\n }\n\n // 计算当前显示的数据范围\n const startIndex = (current - 1) * pageSize + 1;\n const endIndex = Math.min(current * pageSize, total);\n const range: [number, number] = [startIndex, endIndex];\n\n const containerClassName = prefixCls('container');\n\n // 获取显示总数的函数\n const getShowTotalContent = () => {\n if (typeof showTotal === 'function') {\n return showTotal(total, range);\n }\n if (showTotal === true) {\n return t.Pagination.totalItems(total, range);\n }\n return null;\n };\n\n return (\n <div className={containerClassName}>\n {/* 显示总数和当前范围 */}\n {showTotal && (\n <div className={prefixCls('total')}>{getShowTotalContent()}</div>\n )}\n\n {/* 主要的分页控件 */}\n <div className={prefixCls('main')}>\n <Button\n icon={<ChevronLeftLine size={16} />}\n onClick={onChangePage(current - 1)}\n disabled={current === 1}\n />\n {_.map(pageRange, (page, index: number) => {\n if (page === ELLIPSIS) {\n return (\n <span key={index} className={prefixCls('ellipsis')}>\n <Ellipsis size={20} />\n </span>\n );\n }\n return (\n <Button\n key={index}\n icon={<span>{page}</span>}\n className={cn(prefixCls('button'), {\n [prefixCls('active')]: page === current,\n })}\n onClick={onChangePage(page)}\n />\n );\n })}\n <Button\n icon={<ChevronRightLine size={16} />}\n onClick={onChangePage(current + 1)}\n disabled={current >= totalPage}\n />\n </div>\n\n {/* 页面大小选择器 */}\n {showSizeChanger && (\n <PageSizeChanger\n pageSize={pageSize}\n pageSizeOptions={pageSizeOptions}\n onChange={handlePageSizeChange}\n />\n )}\n </div>\n );\n}\n\nexport default Pagination;\n\n/**\n * 获取在安全范围内的当前页数\n */\nexport function getSafeCurrent(totalPage: number, current?: number) {\n if (current === undefined) {\n return 1;\n }\n return Math.max(1, Math.min(current, totalPage));\n}\n\nfunction getTotalPage(total: number, pageSize: number) {\n return Math.max(1, Math.ceil(total / pageSize));\n}\n\nexport const ELLIPSIS = '...';\n\nexport type PaginationItemType = number | typeof ELLIPSIS;\n\n/**\n * 获取分页组件需要显示的页码范围。\n *\n * @param totalPage 最大页码。\n * @param currentPage 当前所在的页码。\n *\n * 如果总页数不超过5页,直接返回所有页码。\n * 否则,在生成页码时,除了第一页和最后一页,还会显示以当前页为中心的连续页码,数量为 `surroundCount`*2 个,\n * 当当前页码距离边界过近时,会在页码前后添加省略号。\n * 当前页码 `currentPage` 的值必须介于 1 和总页数之间,如果超出这个范围,会自动修正。\n *\n * @returns 一个包含了所有要显示的页码和省略号的数组。\n */\nexport function getPaginationRange(\n totalPage: number,\n currentPage: number,\n): PaginationItemType[] {\n // 如果总页数不超过5页,直接返回所有页码\n if (totalPage <= 5) {\n return Array.from({ length: totalPage }, (_, i) => i + 1);\n }\n\n const surroundCount = 2;\n\n const current = Math.max(1, Math.min(currentPage, totalPage));\n\n let start = Math.max(2, current - surroundCount);\n let end = Math.min(totalPage - 1, current + surroundCount);\n\n // Adjust start and end based on current page\n if (current - start < surroundCount) {\n end = Math.min(end + (surroundCount - (current - start)), totalPage - 1);\n }\n if (end - current < surroundCount) {\n start = Math.max(start - (surroundCount - (end - current)), 2);\n }\n\n // Check if current page is out of range\n if (current < start || current > end) {\n start = Math.max(2, current - surroundCount);\n end = Math.min(totalPage - 1, current + surroundCount);\n }\n\n const range: PaginationItemType[] = [];\n for (let i = start; i <= end; i++) {\n range.push(i);\n }\n\n range.unshift(1);\n if (start > 2 && range[1] !== ELLIPSIS) {\n range.splice(1, 0, ELLIPSIS);\n }\n\n if (totalPage !== range[range.length - 1]) {\n if (end < totalPage - 1 && range[range.length - 1] !== ELLIPSIS) {\n range.splice(range.length, 0, ELLIPSIS);\n }\n range.push(totalPage);\n }\n\n return range;\n}\n\nfunction prefixCls(name: string) {\n return `ald-pagination-${name}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/Pagination/index.tsx"],"sourcesContent":["import { cn } from '../lib/utils';\nimport _ from 'lodash';\nimport React, { useCallback, useContext, useState } from 'react';\nimport Button from '../Button';\nimport { ChevronLeftLine, ChevronRightLine, Ellipsis } from '../Icon';\nimport { LocaleContext, getTranslator } from '../locale/default';\nimport { IPaginationProps } from './types';\nimport PageSizeChanger from './PageSizeChanger';\nimport './pagination.css';\n\nfunction Pagination(props: IPaginationProps) {\n const {\n current: controlledCurrent,\n defaultCurrent = 1,\n pageSize,\n total,\n onChange,\n hideOnSinglePage,\n showSizeChanger = false,\n pageSizeOptions = [10, 20, 30, 50],\n onShowSizeChange,\n showTotal = false,\n disabled = false,\n 'aria-label': ariaLabel,\n } = props;\n\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n const a11y = t.Pagination;\n const [uncontrolledCurrent, setUncontrolledCurrent] =\n useState(defaultCurrent);\n\n if (pageSize <= 0) {\n throw new Error('pageSize must be greater than 0');\n }\n\n const totalPage = getTotalPage(total, pageSize);\n const current = getSafeCurrent(\n totalPage,\n controlledCurrent ?? uncontrolledCurrent,\n );\n\n const onChangePage = useCallback(\n (page: number) => {\n return () => {\n if (disabled || page === current || page < 1 || page > totalPage) {\n return;\n }\n if (controlledCurrent === undefined) {\n setUncontrolledCurrent(page);\n }\n onChange(page, pageSize);\n };\n },\n [controlledCurrent, disabled, onChange, current, pageSize, totalPage],\n );\n\n const handlePageSizeChange = useCallback(\n (newPageSize: number) => {\n if (disabled || newPageSize <= 0 || newPageSize === pageSize) {\n return;\n }\n const newTotalPage = getTotalPage(total, newPageSize);\n const safeCurrent = getSafeCurrent(newTotalPage, current);\n\n if (controlledCurrent === undefined) {\n setUncontrolledCurrent(safeCurrent);\n }\n if (onShowSizeChange) {\n onShowSizeChange(safeCurrent, newPageSize);\n }\n\n onChange(safeCurrent, newPageSize);\n },\n [\n controlledCurrent,\n current,\n disabled,\n onChange,\n onShowSizeChange,\n pageSize,\n total,\n ],\n );\n\n const pageRange = getPaginationRange(totalPage, current);\n\n if (hideOnSinglePage) {\n if (totalPage <= 1 && !showSizeChanger && !showTotal) {\n return null;\n }\n }\n\n // 计算当前显示的数据范围\n const startIndex = (current - 1) * pageSize + 1;\n const endIndex = Math.min(current * pageSize, total);\n const range: [number, number] = [startIndex, endIndex];\n\n const containerClassName = prefixCls('container');\n\n // 获取显示总数的函数\n const getShowTotalContent = () => {\n if (typeof showTotal === 'function') {\n return showTotal(total, range);\n }\n if (showTotal === true) {\n return t.Pagination.totalItems(total, range);\n }\n return null;\n };\n\n return (\n <nav\n className={containerClassName}\n aria-label={ariaLabel ?? a11y.navigationLabel}\n >\n {/* 显示总数和当前范围 */}\n {showTotal && (\n <div className={prefixCls('total')}>{getShowTotalContent()}</div>\n )}\n\n {/* 主要的分页控件 */}\n <div className={prefixCls('main')}>\n <Button\n icon={<ChevronLeftLine size={16} />}\n onClick={onChangePage(current - 1)}\n disabled={disabled || current === 1}\n aria-label={a11y.previousPage}\n />\n {_.map(pageRange, (page, index: number) => {\n if (page === ELLIPSIS) {\n return (\n <span key={index} className={prefixCls('ellipsis')}>\n <Ellipsis size={20} />\n </span>\n );\n }\n return (\n <Button\n key={index}\n icon={<span>{page}</span>}\n className={cn(prefixCls('button'), {\n [prefixCls('active')]: page === current,\n })}\n onClick={onChangePage(page)}\n disabled={disabled}\n aria-label={\n page === current ? a11y.currentPage(page) : a11y.page(page)\n }\n {...(page === current\n ? ({ 'aria-current': 'page' } as React.AriaAttributes)\n : {})}\n />\n );\n })}\n <Button\n icon={<ChevronRightLine size={16} />}\n onClick={onChangePage(current + 1)}\n disabled={disabled || current >= totalPage}\n aria-label={a11y.nextPage}\n />\n </div>\n\n {/* 页面大小选择器 */}\n {showSizeChanger && (\n <PageSizeChanger\n pageSize={pageSize}\n pageSizeOptions={pageSizeOptions}\n onChange={handlePageSizeChange}\n disabled={disabled}\n ariaLabel={a11y.pageSize}\n />\n )}\n </nav>\n );\n}\n\nexport default Pagination;\n\n/**\n * 获取在安全范围内的当前页数\n */\nexport function getSafeCurrent(totalPage: number, current?: number) {\n if (current === undefined) {\n return 1;\n }\n return Math.max(1, Math.min(current, totalPage));\n}\n\nfunction getTotalPage(total: number, pageSize: number) {\n return Math.max(1, Math.ceil(total / pageSize));\n}\n\nexport const ELLIPSIS = '...';\n\nexport type PaginationItemType = number | typeof ELLIPSIS;\n\n/**\n * 获取分页组件需要显示的页码范围。\n *\n * @param totalPage 最大页码。\n * @param currentPage 当前所在的页码。\n *\n * 如果总页数不超过5页,直接返回所有页码。\n * 否则,在生成页码时,除了第一页和最后一页,还会显示以当前页为中心的连续页码,数量为 `surroundCount`*2 个,\n * 当当前页码距离边界过近时,会在页码前后添加省略号。\n * 当前页码 `currentPage` 的值必须介于 1 和总页数之间,如果超出这个范围,会自动修正。\n *\n * @returns 一个包含了所有要显示的页码和省略号的数组。\n */\nexport function getPaginationRange(\n totalPage: number,\n currentPage: number,\n): PaginationItemType[] {\n // 如果总页数不超过5页,直接返回所有页码\n if (totalPage <= 5) {\n return Array.from({ length: totalPage }, (_, i) => i + 1);\n }\n\n const surroundCount = 2;\n\n const current = Math.max(1, Math.min(currentPage, totalPage));\n\n let start = Math.max(2, current - surroundCount);\n let end = Math.min(totalPage - 1, current + surroundCount);\n\n // Adjust start and end based on current page\n if (current - start < surroundCount) {\n end = Math.min(end + (surroundCount - (current - start)), totalPage - 1);\n }\n if (end - current < surroundCount) {\n start = Math.max(start - (surroundCount - (end - current)), 2);\n }\n\n // Check if current page is out of range\n if (current < start || current > end) {\n start = Math.max(2, current - surroundCount);\n end = Math.min(totalPage - 1, current + surroundCount);\n }\n\n const range: PaginationItemType[] = [];\n for (let i = start; i <= end; i++) {\n range.push(i);\n }\n\n range.unshift(1);\n if (start > 2 && range[1] !== ELLIPSIS) {\n range.splice(1, 0, ELLIPSIS);\n }\n\n if (totalPage !== range[range.length - 1]) {\n if (end < totalPage - 1 && range[range.length - 1] !== ELLIPSIS) {\n range.splice(range.length, 0, ELLIPSIS);\n }\n range.push(totalPage);\n }\n\n return range;\n}\n\nfunction prefixCls(name: string) {\n return `ald-pagination-${name}`;\n}\n"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  export interface IPaginationProps {
3
3
  current?: number;
4
+ defaultCurrent?: number;
4
5
  pageSize: number;
5
6
  total: number;
6
7
  onChange: (current: number, pageSize?: number) => void;
@@ -9,4 +10,6 @@ export interface IPaginationProps {
9
10
  pageSizeOptions?: (string | number)[];
10
11
  onShowSizeChange?: (current: number, size: number) => void;
11
12
  showTotal?: boolean | ((total: number, range: [number, number]) => React.ReactNode);
13
+ disabled?: boolean;
14
+ 'aria-label'?: string;
12
15
  }
@@ -30,6 +30,7 @@ var BaseSelect = React$1.forwardRef((props, ref) => {
30
30
  const { id, className, displayValues, onDisplayValuesChange, displayMenu, notFoundContent, onClear, width, mode, status: customStatus, onOptionSelect, onClick, size: customSize, borderLess = false, disabled, placeholder, loading = false, open, defaultOpen, onOpenChange, showSearch, innerSearchValue, setInnerSearchValue, allowClear, showArrow = true, prefix, suffixIcon, dropdownRender, overlayStyle, dropdownStyle, popupMatchSelectWidth = true, placement, popupClassName, allowOverlap, style, "data-testid": dataTestid, "aria-label": ariaLabel, ...restProps } = props;
31
31
  const setClassNames = prefixCls("select");
32
32
  const selectRef = useRef(null);
33
+ const triggerRef = useRef(null);
33
34
  const widthStyle = getWidthStyle(width);
34
35
  const dropdownRef = useRef(null);
35
36
  const [matchedPopupWidth, setMatchedPopupWidth] = useState();
@@ -43,15 +44,14 @@ var BaseSelect = React$1.forwardRef((props, ref) => {
43
44
  const { status: contextStatus } = useContext(FormItemInputContext);
44
45
  const mergedStatus = customStatus === null ? void 0 : customStatus || contextStatus;
45
46
  React$1.useImperativeHandle(ref, () => ({
46
- focus: () => setFocus(true),
47
- blur: () => setFocus(false),
47
+ focus: () => triggerRef.current?.focus(),
48
+ blur: () => triggerRef.current?.blur(),
48
49
  open: () => onToggleOpen(true),
49
50
  close: () => {
50
51
  console.log("ref close");
51
52
  onToggleOpen(false);
52
53
  }
53
54
  }));
54
- const [focus, setFocus] = useState(false);
55
55
  const [isHover, setIsHover] = useState(false);
56
56
  const [innerOpen, setInnerOpen] = useMergedState(false, {
57
57
  defaultValue: defaultOpen,
@@ -67,10 +67,7 @@ var BaseSelect = React$1.forwardRef((props, ref) => {
67
67
  const onToggleOpen = React$1.useCallback((newOpen) => {
68
68
  const nextOpen = newOpen !== void 0 ? newOpen : !mergedOpen;
69
69
  if (nextOpen) updateMatchedPopupWidth();
70
- if (!nextOpen) {
71
- setShowResponsiveSelectedSection(false);
72
- setFocus(false);
73
- }
70
+ if (!nextOpen) setShowResponsiveSelectedSection(false);
74
71
  if (mergedOpen !== nextOpen && !disabled) {
75
72
  setInnerOpen(nextOpen);
76
73
  onOpenChange?.(nextOpen);
@@ -121,7 +118,8 @@ var BaseSelect = React$1.forwardRef((props, ref) => {
121
118
  });
122
119
  };
123
120
  const mergedClassName = cn(setClassNames("beta-ald-select", size, {
124
- active: mergedOpen || focus,
121
+ open: mergedOpen,
122
+ active: mergedOpen,
125
123
  borderless: borderLess,
126
124
  disabled,
127
125
  loading,
@@ -137,10 +135,7 @@ var BaseSelect = React$1.forwardRef((props, ref) => {
137
135
  onClick: (info) => {
138
136
  displayMenu?.onClick?.(info);
139
137
  if (isMultipleMode) info.keepOpen = info.keepOpen ?? true;
140
- else if (displayMenu) {
141
- onToggleOpen(false);
142
- setFocus(false);
143
- }
138
+ else if (displayMenu) onToggleOpen(false);
144
139
  setIsHover(false);
145
140
  onOptionSelect?.(info.key);
146
141
  }
@@ -202,6 +197,11 @@ var BaseSelect = React$1.forwardRef((props, ref) => {
202
197
  else onToggleOpen(open);
203
198
  },
204
199
  children: /* @__PURE__ */ jsxs("div", {
200
+ ref: triggerRef,
201
+ tabIndex: disabled ? void 0 : 0,
202
+ role: "combobox",
203
+ "aria-disabled": disabled || void 0,
204
+ "aria-expanded": mergedOpen,
205
205
  className: cn(setClassNames("trigger"), "ant-select-selector"),
206
206
  children: [
207
207
  prefix && /* @__PURE__ */ jsx("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"BaseSelect.js","names":[],"sources":["../../src/Select/BaseSelect.tsx"],"sourcesContent":["import './ald-select.css';\nimport * as React from 'react';\nimport useMergedState from 'rc-util/es/hooks/useMergedState';\nimport { cn } from '../lib/utils';\nimport prefixCls from '../_utils/prefixCls';\n\n/** Align config type (locally defined to avoid rc-trigger dependency) */\nexport interface AlignType {\n points?: string[];\n offset?: (number | string)[];\n targetOffset?: (number | string)[];\n overflow?: { adjustX?: boolean; adjustY?: boolean };\n _experimental?: Record<string, any>;\n}\nimport SelectTrigger, { RefTriggerProps } from './SelectTrigger';\nimport Selector from './Selector';\nimport _ from 'lodash';\nimport { useContext, useRef, useState } from 'react';\nimport { FormItemInputContext } from '../Form/FormItemContext';\nimport getWidthStyle from './utils/getWidthStyle';\nimport Suffix from './components/Suffix';\nimport { PlacementType } from '../Dropdown';\nimport {\n BaseSelectRef,\n DisplayValueType,\n ISelectProps,\n LabelInValueType,\n SelectMenuProps,\n} from './interface';\nimport SizeContext from '../ConfigProvider/sizeContext';\nimport { ConfigContext } from '../ConfigProvider';\nimport { useCompactItemContext } from '../Space/CompactContext';\nimport { MenuInfo } from '../Menu';\nimport { toString } from './utils/commonUtil';\n\nexport type RenderNode = React.ReactNode | ((props: any) => React.ReactNode);\n\nexport type RenderDOMFunc = (props: any) => HTMLElement;\n\nexport type Mode =\n | 'multiple'\n | {\n type: 'multiple';\n responsive?: boolean;\n maxRows?: number;\n showSelectedSection?: boolean;\n };\n\nexport type RawValueType = string | number;\n\nexport type CustomTagProps = {\n label: React.ReactNode;\n value: any;\n disabled: boolean;\n onClose: (event?: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n closable: boolean;\n};\nexport interface BaseSelectPrivateProps {\n // >>> MISC\n omitDomProps?: string[];\n\n // >>> Value\n displayValues: LabelInValueType[];\n onDisplayValuesChange: (\n values: LabelInValueType[],\n info: {\n type: 'add' | 'remove' | 'clear';\n values: LabelInValueType[];\n },\n ) => void;\n\n // >>> Active\n /** Current dropdown list active item string value */\n activeValue?: string;\n /** Link search input with target element */\n activeDescendantId?: string;\n onActiveValueChange?: (value: string | null) => void;\n}\n\nexport type BaseSelectPropsWithoutPrivate = Omit<\n BaseSelectProps,\n keyof BaseSelectPrivateProps\n>;\n\nexport interface BaseSelectProps\n extends BaseSelectPrivateProps,\n ISelectProps,\n React.AriaAttributes {\n className?: string;\n style?: React.CSSProperties;\n notFoundContent?: React.ReactNode;\n onClear?: () => void;\n innerSearchValue?: string;\n setInnerSearchValue?: (value: string) => void;\n displayMenu?: SelectMenuProps;\n // >>> Open\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n onOptionSelect?: (val: RawValueType) => void;\n\n // >>> Icons\n allowClear?: boolean;\n showArrow?: boolean;\n suffixIcon?: React.ReactNode;\n\n // >>> Dropdown\n dropdownAlign?: AlignType;\n placement?: PlacementType;\n getPopupContainer?: () => HTMLElement;\n\n // >>> Focus\n onBlur?: React.FocusEventHandler<HTMLElement>;\n onFocus?: React.FocusEventHandler<HTMLElement>;\n\n // >>> Rest Events\n onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;\n onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;\n onMouseDown?: React.MouseEventHandler<HTMLDivElement>;\n onPopupScroll?: React.UIEventHandler<HTMLDivElement>;\n onInputKeyDown?: React.KeyboardEventHandler<\n HTMLInputElement | HTMLTextAreaElement\n >;\n onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLDivElement>;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n}\n\nexport function isMultiple(mode?: Mode) {\n return !!mode;\n}\nexport function isResponsive(mode?: Mode) {\n return mode === 'multiple' || (typeof mode === 'object' && mode?.responsive);\n}\nexport function isShowSelectedSection(mode?: Mode) {\n if (!mode || mode === 'multiple') {\n return false;\n }\n\n return (\n typeof mode === 'object' && mode.showSelectedSection && mode.responsive\n );\n}\nconst BaseSelect = React.forwardRef(\n (props: BaseSelectProps, ref: React.Ref<BaseSelectRef>) => {\n const {\n id,\n className,\n // Value\n displayValues,\n onDisplayValuesChange,\n displayMenu,\n notFoundContent,\n onClear,\n width,\n mode,\n status: customStatus,\n onOptionSelect,\n onClick,\n size: customSize,\n borderLess = false,\n // Status\n disabled,\n placeholder,\n loading = false,\n\n // Open\n open,\n defaultOpen,\n onOpenChange,\n showSearch,\n innerSearchValue,\n setInnerSearchValue,\n // Icons\n allowClear,\n showArrow = true,\n prefix,\n suffixIcon,\n dropdownRender,\n overlayStyle,\n dropdownStyle,\n popupMatchSelectWidth = true,\n placement,\n popupClassName,\n allowOverlap,\n style,\n 'data-testid': dataTestid,\n 'aria-label': ariaLabel,\n ...restProps\n // Rest Props\n } = props;\n const setClassNames = prefixCls('select');\n const selectRef = useRef<HTMLDivElement>(null);\n const widthStyle = getWidthStyle(width);\n const dropdownRef = useRef<RefTriggerProps>(null);\n const [matchedPopupWidth, setMatchedPopupWidth] = useState<\n number | undefined\n >();\n const isResponsiveMode = isResponsive(mode);\n const isMultipleMode = isMultiple(mode);\n /** Used for component focused management */\n const contentSize = useContext(SizeContext);\n const { direction } = React.useContext(ConfigContext);\n // ===================== Compact Item =====================\n const { compactSize, compactItemClassnames } = useCompactItemContext(\n 'ald-select',\n direction,\n );\n const size = compactSize || customSize || contentSize || 'middle';\n const {\n status: contextStatus,\n // hasFeedback,\n // isFormItemInput,\n // feedbackIcon,\n } = useContext(FormItemInputContext);\n\n const mergedStatus =\n customStatus === null ? undefined : customStatus || contextStatus;\n\n // =========================== Imperative ===========================\n React.useImperativeHandle(ref, () => ({\n focus: () => setFocus(true),\n blur: () => setFocus(false),\n open: () => onToggleOpen(true),\n close: () => {\n console.log('ref close');\n onToggleOpen(false);\n },\n }));\n const [focus, setFocus] = useState(false);\n const [isHover, setIsHover] = useState(false);\n // ============================== Open ==============================\n const [innerOpen, setInnerOpen] = useMergedState<boolean>(false, {\n defaultValue: defaultOpen,\n value: open,\n });\n const mergedOpen = innerOpen;\n const shouldMatchPopupWidth =\n !!popupMatchSelectWidth && typeof popupMatchSelectWidth !== 'number';\n const updateMatchedPopupWidth = React.useCallback(() => {\n if (!shouldMatchPopupWidth) {\n return;\n }\n\n const nextWidth = selectRef.current?.getBoundingClientRect().width;\n if (nextWidth !== undefined) {\n setMatchedPopupWidth((currentWidth) =>\n currentWidth === nextWidth ? currentWidth : nextWidth,\n );\n }\n }, [shouldMatchPopupWidth]);\n const onToggleOpen = React.useCallback(\n (newOpen?: boolean) => {\n const nextOpen = newOpen !== undefined ? newOpen : !mergedOpen;\n if (nextOpen) {\n updateMatchedPopupWidth();\n }\n if (!nextOpen) {\n setShowResponsiveSelectedSection(false);\n setFocus(false);\n }\n if (mergedOpen !== nextOpen && !disabled) {\n setInnerOpen(nextOpen);\n onOpenChange?.(nextOpen);\n }\n },\n [\n mergedOpen,\n disabled,\n setInnerOpen,\n onOpenChange,\n updateMatchedPopupWidth,\n ],\n );\n React.useLayoutEffect(() => {\n if (!mergedOpen || !shouldMatchPopupWidth) {\n return;\n }\n\n const element = selectRef.current;\n if (!element) {\n return;\n }\n\n const updateMatchedWidth = () => {\n const nextWidth = element.getBoundingClientRect().width;\n setMatchedPopupWidth((currentWidth) =>\n currentWidth === nextWidth ? currentWidth : nextWidth,\n );\n };\n\n updateMatchedWidth();\n\n if (typeof ResizeObserver === 'undefined') {\n window.addEventListener('resize', updateMatchedWidth);\n return () => {\n window.removeEventListener('resize', updateMatchedWidth);\n };\n }\n\n let resizeAnimationFrame: number | undefined;\n const scheduleMatchedWidthUpdate = () => {\n if (resizeAnimationFrame !== undefined) {\n cancelAnimationFrame(resizeAnimationFrame);\n }\n resizeAnimationFrame = requestAnimationFrame(updateMatchedWidth);\n };\n\n const observer = new ResizeObserver(scheduleMatchedWidthUpdate);\n observer.observe(element);\n\n return () => {\n if (resizeAnimationFrame !== undefined) {\n cancelAnimationFrame(resizeAnimationFrame);\n }\n observer.disconnect();\n };\n }, [mergedOpen, shouldMatchPopupWidth]);\n const [showResponsiveSelectedSection, setShowResponsiveSelectedSection] =\n useState(false);\n // 多选 responsive 进入 -1 收纳态(仅\"首 tag + +N\")时为 true,\n // width:auto 下据此给根节点加 overflow-collapsed 钳住 min-width 链,\n // 抵抗父 flex 行因 intrinsic 低估造成的假压缩(详见 ald-select.css 对应段)\n const [overflowCollapsed, setOverflowCollapsed] = useState(false);\n\n // ============================ Selector ============================\n const onSelectorRemove = (val: DisplayValueType) => {\n const newValues = displayValues.filter(\n (item) => toString(item.value) !== toString(val.value),\n );\n\n onDisplayValuesChange(newValues, {\n type: 'remove',\n values: [\n {\n label: val.label,\n value: val.value as RawValueType,\n },\n ],\n });\n };\n\n const mergedClassName = cn(\n setClassNames('beta-ald-select', size, {\n active: mergedOpen || focus,\n borderless: borderLess,\n disabled: disabled,\n loading: loading,\n [`${mergedStatus}`]: !!mergedStatus,\n 'multiple-responsive': isResponsiveMode,\n 'multiple-default': isMultipleMode && !isResponsiveMode,\n // 仅 width:auto 生效:固定宽度下 -1 收纳态的收缩省略是预期行为,\n // 钳 min-width 反而会把固定宽撑破\n 'overflow-collapsed':\n overflowCollapsed && width === 'auto' && !_.isEmpty(displayValues),\n }),\n 'tw-text-typography-body-dense',\n className,\n compactItemClassnames,\n );\n const showMenu = React.useMemo(() => {\n if (!displayMenu) {\n return undefined;\n }\n\n return {\n ...displayMenu,\n onClick: (info: MenuInfo) => {\n displayMenu?.onClick?.(info);\n if (isMultipleMode) {\n // 多选默认选中后不收起下拉:Dropdown 在 menu.onClick 之后读\n // info.keepOpen 决定是否 onChangeOpen(false),不设则每次点击都被\n // 当成关闭信号。用 ?? 保留用户在自己的 onClick 里显式设 false 的能力\n info.keepOpen = info.keepOpen ?? true;\n } else if (displayMenu) {\n onToggleOpen(false);\n setFocus(false);\n }\n setIsHover(false);\n onOptionSelect?.(info.key);\n },\n };\n }, [displayMenu, isMultipleMode, onToggleOpen, onOptionSelect]);\n const onSelectClick = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) {\n return;\n }\n onClick?.(e);\n },\n [disabled, onClick],\n );\n React.useEffect(() => {\n const element = selectRef.current;\n if (element) {\n const handleMouseOver = () => setIsHover(true);\n const handleMouseOut = () => setIsHover(false);\n\n element.addEventListener('mouseover', handleMouseOver);\n element.addEventListener('mouseout', handleMouseOut);\n\n return () => {\n element.removeEventListener('mouseover', handleMouseOver);\n element.removeEventListener('mouseout', handleMouseOut);\n };\n }\n }, []);\n const mergedPopupMatchSelectWidth =\n shouldMatchPopupWidth && matchedPopupWidth !== undefined\n ? matchedPopupWidth\n : popupMatchSelectWidth;\n return (\n <div\n className={mergedClassName}\n style={{\n ...widthStyle,\n // width:auto 且无选中值时锁 shrink:Chromium 对该子树给父 flex 行的\n // intrinsic 宽度贡献恒少约 14px,父行按低估值布局后回头压缩根节点,\n // placeholder 右侧会被裁;有选中值时必须保持可压缩,rc-overflow\n // 才能在父行变窄时把放不下的 tag 收纳成 \"+N\"\n ...(width === 'auto' && _.isEmpty(displayValues)\n ? { flexShrink: 0 }\n : {}),\n ...style,\n }}\n ref={selectRef}\n id={id}\n onClick={onSelectClick}\n data-testid={dataTestid}\n aria-label={ariaLabel}\n >\n <SelectTrigger\n {...restProps}\n open={!!mergedOpen}\n notFoundContent={notFoundContent}\n menu={showMenu}\n ref={dropdownRef}\n showSearch={showSearch}\n searchValue={innerSearchValue}\n setInnerSearchValue={setInnerSearchValue}\n popupMatchSelectWidth={mergedPopupMatchSelectWidth}\n overlayClassName={popupClassName}\n // @ts-ignore\n dropdownRender={dropdownRender}\n overlayStyle={overlayStyle || dropdownStyle}\n placement={placement}\n allowOverlap={allowOverlap}\n onOpenChange={(open) => {\n if (isResponsiveMode) {\n if (\n !mergedOpen &&\n !showResponsiveSelectedSection &&\n displayValues.length > 0 &&\n isShowSelectedSection(mode)\n ) {\n setShowResponsiveSelectedSection(true);\n } else {\n onToggleOpen(open);\n }\n } else {\n onToggleOpen(open);\n }\n }}\n >\n {/* antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器 */}\n <div className={cn(setClassNames('trigger'), 'ant-select-selector')}>\n {prefix && <div className={setClassNames('prefix')}>{prefix}</div>}\n {_.isEmpty(displayValues) && (\n <div\n className={cn(\n setClassNames('placeholder'),\n 'ant-select-selection-placeholder',\n )}\n >\n {placeholder}\n </div>\n )}\n {!_.isEmpty(displayValues) && (\n <Selector\n {...restProps}\n suffixIcon={suffixIcon}\n size={size}\n disabled={disabled}\n mode={mode}\n dropdownRef={dropdownRef}\n displayValues={displayValues}\n onToggleOpen={onToggleOpen}\n onRemove={onSelectorRemove}\n showResponsiveSelectedSection={showResponsiveSelectedSection}\n onOverflowCollapsedChange={setOverflowCollapsed}\n ></Selector>\n )}\n </div>\n </SelectTrigger>\n <Suffix\n showArrow={showArrow}\n allowClear={allowClear}\n disabled={disabled}\n loading={loading}\n isHover={isHover}\n onClear={() => {\n onToggleOpen(false);\n\n onDisplayValuesChange([], {\n type: 'clear',\n values: displayValues,\n });\n onClear?.();\n }}\n isActive={innerOpen}\n icon={suffixIcon}\n displayValues={displayValues}\n ></Suffix>\n </div>\n );\n },\n);\n\nexport default BaseSelect;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BaseSelect.js","names":[],"sources":["../../src/Select/BaseSelect.tsx"],"sourcesContent":["import './ald-select.css';\nimport * as React from 'react';\nimport useMergedState from 'rc-util/es/hooks/useMergedState';\nimport { cn } from '../lib/utils';\nimport prefixCls from '../_utils/prefixCls';\n\n/** Align config type (locally defined to avoid rc-trigger dependency) */\nexport interface AlignType {\n points?: string[];\n offset?: (number | string)[];\n targetOffset?: (number | string)[];\n overflow?: { adjustX?: boolean; adjustY?: boolean };\n _experimental?: Record<string, any>;\n}\nimport SelectTrigger, { RefTriggerProps } from './SelectTrigger';\nimport Selector from './Selector';\nimport _ from 'lodash';\nimport { useContext, useRef, useState } from 'react';\nimport { FormItemInputContext } from '../Form/FormItemContext';\nimport getWidthStyle from './utils/getWidthStyle';\nimport Suffix from './components/Suffix';\nimport { PlacementType } from '../Dropdown';\nimport {\n BaseSelectRef,\n DisplayValueType,\n ISelectProps,\n LabelInValueType,\n SelectMenuProps,\n} from './interface';\nimport SizeContext from '../ConfigProvider/sizeContext';\nimport { ConfigContext } from '../ConfigProvider';\nimport { useCompactItemContext } from '../Space/CompactContext';\nimport { MenuInfo } from '../Menu';\nimport { toString } from './utils/commonUtil';\n\nexport type RenderNode = React.ReactNode | ((props: any) => React.ReactNode);\n\nexport type RenderDOMFunc = (props: any) => HTMLElement;\n\nexport type Mode =\n | 'multiple'\n | {\n type: 'multiple';\n responsive?: boolean;\n maxRows?: number;\n showSelectedSection?: boolean;\n };\n\nexport type RawValueType = string | number;\n\nexport type CustomTagProps = {\n label: React.ReactNode;\n value: any;\n disabled: boolean;\n onClose: (event?: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n closable: boolean;\n};\nexport interface BaseSelectPrivateProps {\n // >>> MISC\n omitDomProps?: string[];\n\n // >>> Value\n displayValues: LabelInValueType[];\n onDisplayValuesChange: (\n values: LabelInValueType[],\n info: {\n type: 'add' | 'remove' | 'clear';\n values: LabelInValueType[];\n },\n ) => void;\n\n // >>> Active\n /** Current dropdown list active item string value */\n activeValue?: string;\n /** Link search input with target element */\n activeDescendantId?: string;\n onActiveValueChange?: (value: string | null) => void;\n}\n\nexport type BaseSelectPropsWithoutPrivate = Omit<\n BaseSelectProps,\n keyof BaseSelectPrivateProps\n>;\n\nexport interface BaseSelectProps\n extends BaseSelectPrivateProps,\n ISelectProps,\n React.AriaAttributes {\n className?: string;\n style?: React.CSSProperties;\n notFoundContent?: React.ReactNode;\n onClear?: () => void;\n innerSearchValue?: string;\n setInnerSearchValue?: (value: string) => void;\n displayMenu?: SelectMenuProps;\n // >>> Open\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n onOptionSelect?: (val: RawValueType) => void;\n\n // >>> Icons\n allowClear?: boolean;\n showArrow?: boolean;\n suffixIcon?: React.ReactNode;\n\n // >>> Dropdown\n dropdownAlign?: AlignType;\n placement?: PlacementType;\n getPopupContainer?: () => HTMLElement;\n\n // >>> Focus\n onBlur?: React.FocusEventHandler<HTMLElement>;\n onFocus?: React.FocusEventHandler<HTMLElement>;\n\n // >>> Rest Events\n onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;\n onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;\n onMouseDown?: React.MouseEventHandler<HTMLDivElement>;\n onPopupScroll?: React.UIEventHandler<HTMLDivElement>;\n onInputKeyDown?: React.KeyboardEventHandler<\n HTMLInputElement | HTMLTextAreaElement\n >;\n onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLDivElement>;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n}\n\nexport function isMultiple(mode?: Mode) {\n return !!mode;\n}\nexport function isResponsive(mode?: Mode) {\n return mode === 'multiple' || (typeof mode === 'object' && mode?.responsive);\n}\nexport function isShowSelectedSection(mode?: Mode) {\n if (!mode || mode === 'multiple') {\n return false;\n }\n\n return (\n typeof mode === 'object' && mode.showSelectedSection && mode.responsive\n );\n}\nconst BaseSelect = React.forwardRef(\n (props: BaseSelectProps, ref: React.Ref<BaseSelectRef>) => {\n const {\n id,\n className,\n // Value\n displayValues,\n onDisplayValuesChange,\n displayMenu,\n notFoundContent,\n onClear,\n width,\n mode,\n status: customStatus,\n onOptionSelect,\n onClick,\n size: customSize,\n borderLess = false,\n // Status\n disabled,\n placeholder,\n loading = false,\n\n // Open\n open,\n defaultOpen,\n onOpenChange,\n showSearch,\n innerSearchValue,\n setInnerSearchValue,\n // Icons\n allowClear,\n showArrow = true,\n prefix,\n suffixIcon,\n dropdownRender,\n overlayStyle,\n dropdownStyle,\n popupMatchSelectWidth = true,\n placement,\n popupClassName,\n allowOverlap,\n style,\n 'data-testid': dataTestid,\n 'aria-label': ariaLabel,\n ...restProps\n // Rest Props\n } = props;\n const setClassNames = prefixCls('select');\n const selectRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const widthStyle = getWidthStyle(width);\n const dropdownRef = useRef<RefTriggerProps>(null);\n const [matchedPopupWidth, setMatchedPopupWidth] = useState<\n number | undefined\n >();\n const isResponsiveMode = isResponsive(mode);\n const isMultipleMode = isMultiple(mode);\n /** Used for component focused management */\n const contentSize = useContext(SizeContext);\n const { direction } = React.useContext(ConfigContext);\n // ===================== Compact Item =====================\n const { compactSize, compactItemClassnames } = useCompactItemContext(\n 'ald-select',\n direction,\n );\n const size = compactSize || customSize || contentSize || 'middle';\n const {\n status: contextStatus,\n // hasFeedback,\n // isFormItemInput,\n // feedbackIcon,\n } = useContext(FormItemInputContext);\n\n const mergedStatus =\n customStatus === null ? undefined : customStatus || contextStatus;\n\n // =========================== Imperative ===========================\n React.useImperativeHandle(ref, () => ({\n // The trigger is the Select focus owner. Keeping this as a real DOM\n // focus target makes keyboard focus, the Focus State Layer, and the\n // public imperative API describe the same element.\n focus: () => triggerRef.current?.focus(),\n blur: () => triggerRef.current?.blur(),\n open: () => onToggleOpen(true),\n close: () => {\n console.log('ref close');\n onToggleOpen(false);\n },\n }));\n const [isHover, setIsHover] = useState(false);\n // ============================== Open ==============================\n const [innerOpen, setInnerOpen] = useMergedState<boolean>(false, {\n defaultValue: defaultOpen,\n value: open,\n });\n const mergedOpen = innerOpen;\n const shouldMatchPopupWidth =\n !!popupMatchSelectWidth && typeof popupMatchSelectWidth !== 'number';\n const updateMatchedPopupWidth = React.useCallback(() => {\n if (!shouldMatchPopupWidth) {\n return;\n }\n\n const nextWidth = selectRef.current?.getBoundingClientRect().width;\n if (nextWidth !== undefined) {\n setMatchedPopupWidth((currentWidth) =>\n currentWidth === nextWidth ? currentWidth : nextWidth,\n );\n }\n }, [shouldMatchPopupWidth]);\n const onToggleOpen = React.useCallback(\n (newOpen?: boolean) => {\n const nextOpen = newOpen !== undefined ? newOpen : !mergedOpen;\n if (nextOpen) {\n updateMatchedPopupWidth();\n }\n if (!nextOpen) {\n setShowResponsiveSelectedSection(false);\n }\n if (mergedOpen !== nextOpen && !disabled) {\n setInnerOpen(nextOpen);\n onOpenChange?.(nextOpen);\n }\n },\n [\n mergedOpen,\n disabled,\n setInnerOpen,\n onOpenChange,\n updateMatchedPopupWidth,\n ],\n );\n React.useLayoutEffect(() => {\n if (!mergedOpen || !shouldMatchPopupWidth) {\n return;\n }\n\n const element = selectRef.current;\n if (!element) {\n return;\n }\n\n const updateMatchedWidth = () => {\n const nextWidth = element.getBoundingClientRect().width;\n setMatchedPopupWidth((currentWidth) =>\n currentWidth === nextWidth ? currentWidth : nextWidth,\n );\n };\n\n updateMatchedWidth();\n\n if (typeof ResizeObserver === 'undefined') {\n window.addEventListener('resize', updateMatchedWidth);\n return () => {\n window.removeEventListener('resize', updateMatchedWidth);\n };\n }\n\n let resizeAnimationFrame: number | undefined;\n const scheduleMatchedWidthUpdate = () => {\n if (resizeAnimationFrame !== undefined) {\n cancelAnimationFrame(resizeAnimationFrame);\n }\n resizeAnimationFrame = requestAnimationFrame(updateMatchedWidth);\n };\n\n const observer = new ResizeObserver(scheduleMatchedWidthUpdate);\n observer.observe(element);\n\n return () => {\n if (resizeAnimationFrame !== undefined) {\n cancelAnimationFrame(resizeAnimationFrame);\n }\n observer.disconnect();\n };\n }, [mergedOpen, shouldMatchPopupWidth]);\n const [showResponsiveSelectedSection, setShowResponsiveSelectedSection] =\n useState(false);\n // 多选 responsive 进入 -1 收纳态(仅\"首 tag + +N\")时为 true,\n // width:auto 下据此给根节点加 overflow-collapsed 钳住 min-width 链,\n // 抵抗父 flex 行因 intrinsic 低估造成的假压缩(详见 ald-select.css 对应段)\n const [overflowCollapsed, setOverflowCollapsed] = useState(false);\n\n // ============================ Selector ============================\n const onSelectorRemove = (val: DisplayValueType) => {\n const newValues = displayValues.filter(\n (item) => toString(item.value) !== toString(val.value),\n );\n\n onDisplayValuesChange(newValues, {\n type: 'remove',\n values: [\n {\n label: val.label,\n value: val.value as RawValueType,\n },\n ],\n });\n };\n\n const mergedClassName = cn(\n setClassNames('beta-ald-select', size, {\n // Popup visibility is not focus. The trigger's :focus-visible state\n // owns the Focus State Layer in ald-select.css.\n open: mergedOpen,\n // Retain the legacy hook for consumers that style the open state.\n // It no longer represents trigger focus.\n active: mergedOpen,\n borderless: borderLess,\n disabled: disabled,\n loading: loading,\n [`${mergedStatus}`]: !!mergedStatus,\n 'multiple-responsive': isResponsiveMode,\n 'multiple-default': isMultipleMode && !isResponsiveMode,\n // 仅 width:auto 生效:固定宽度下 -1 收纳态的收缩省略是预期行为,\n // 钳 min-width 反而会把固定宽撑破\n 'overflow-collapsed':\n overflowCollapsed && width === 'auto' && !_.isEmpty(displayValues),\n }),\n 'tw-text-typography-body-dense',\n className,\n compactItemClassnames,\n );\n const showMenu = React.useMemo(() => {\n if (!displayMenu) {\n return undefined;\n }\n\n return {\n ...displayMenu,\n onClick: (info: MenuInfo) => {\n displayMenu?.onClick?.(info);\n if (isMultipleMode) {\n // 多选默认选中后不收起下拉:Dropdown 在 menu.onClick 之后读\n // info.keepOpen 决定是否 onChangeOpen(false),不设则每次点击都被\n // 当成关闭信号。用 ?? 保留用户在自己的 onClick 里显式设 false 的能力\n info.keepOpen = info.keepOpen ?? true;\n } else if (displayMenu) {\n onToggleOpen(false);\n }\n setIsHover(false);\n onOptionSelect?.(info.key);\n },\n };\n }, [displayMenu, isMultipleMode, onToggleOpen, onOptionSelect]);\n const onSelectClick = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) {\n return;\n }\n onClick?.(e);\n },\n [disabled, onClick],\n );\n React.useEffect(() => {\n const element = selectRef.current;\n if (element) {\n const handleMouseOver = () => setIsHover(true);\n const handleMouseOut = () => setIsHover(false);\n\n element.addEventListener('mouseover', handleMouseOver);\n element.addEventListener('mouseout', handleMouseOut);\n\n return () => {\n element.removeEventListener('mouseover', handleMouseOver);\n element.removeEventListener('mouseout', handleMouseOut);\n };\n }\n }, []);\n const mergedPopupMatchSelectWidth =\n shouldMatchPopupWidth && matchedPopupWidth !== undefined\n ? matchedPopupWidth\n : popupMatchSelectWidth;\n return (\n <div\n className={mergedClassName}\n style={{\n ...widthStyle,\n // width:auto 且无选中值时锁 shrink:Chromium 对该子树给父 flex 行的\n // intrinsic 宽度贡献恒少约 14px,父行按低估值布局后回头压缩根节点,\n // placeholder 右侧会被裁;有选中值时必须保持可压缩,rc-overflow\n // 才能在父行变窄时把放不下的 tag 收纳成 \"+N\"\n ...(width === 'auto' && _.isEmpty(displayValues)\n ? { flexShrink: 0 }\n : {}),\n ...style,\n }}\n ref={selectRef}\n id={id}\n onClick={onSelectClick}\n data-testid={dataTestid}\n aria-label={ariaLabel}\n >\n <SelectTrigger\n {...restProps}\n open={!!mergedOpen}\n notFoundContent={notFoundContent}\n menu={showMenu}\n ref={dropdownRef}\n showSearch={showSearch}\n searchValue={innerSearchValue}\n setInnerSearchValue={setInnerSearchValue}\n popupMatchSelectWidth={mergedPopupMatchSelectWidth}\n overlayClassName={popupClassName}\n // @ts-ignore\n dropdownRender={dropdownRender}\n overlayStyle={overlayStyle || dropdownStyle}\n placement={placement}\n allowOverlap={allowOverlap}\n onOpenChange={(open) => {\n if (isResponsiveMode) {\n if (\n !mergedOpen &&\n !showResponsiveSelectedSection &&\n displayValues.length > 0 &&\n isShowSelectedSection(mode)\n ) {\n setShowResponsiveSelectedSection(true);\n } else {\n onToggleOpen(open);\n }\n } else {\n onToggleOpen(open);\n }\n }}\n >\n {/* antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器 */}\n <div\n ref={triggerRef}\n tabIndex={disabled ? undefined : 0}\n role=\"combobox\"\n aria-disabled={disabled || undefined}\n aria-expanded={mergedOpen}\n className={cn(setClassNames('trigger'), 'ant-select-selector')}\n >\n {prefix && <div className={setClassNames('prefix')}>{prefix}</div>}\n {_.isEmpty(displayValues) && (\n <div\n className={cn(\n setClassNames('placeholder'),\n 'ant-select-selection-placeholder',\n )}\n >\n {placeholder}\n </div>\n )}\n {!_.isEmpty(displayValues) && (\n <Selector\n {...restProps}\n suffixIcon={suffixIcon}\n size={size}\n disabled={disabled}\n mode={mode}\n dropdownRef={dropdownRef}\n displayValues={displayValues}\n onToggleOpen={onToggleOpen}\n onRemove={onSelectorRemove}\n showResponsiveSelectedSection={showResponsiveSelectedSection}\n onOverflowCollapsedChange={setOverflowCollapsed}\n ></Selector>\n )}\n </div>\n </SelectTrigger>\n <Suffix\n showArrow={showArrow}\n allowClear={allowClear}\n disabled={disabled}\n loading={loading}\n isHover={isHover}\n onClear={() => {\n onToggleOpen(false);\n\n onDisplayValuesChange([], {\n type: 'clear',\n values: displayValues,\n });\n onClear?.();\n }}\n isActive={innerOpen}\n icon={suffixIcon}\n displayValues={displayValues}\n ></Suffix>\n </div>\n );\n },\n);\n\nexport default BaseSelect;\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { cn } from "../lib/utils.js";
2
+ import { ELangType, LocaleContext } from "../locale/default.js";
2
3
  import { CustomDot } from "./components/CustomDot/index.js";
3
4
  import { Step } from "./components/Step/index.js";
4
5
  import React from "react";
@@ -9,8 +10,31 @@ function getStepStatus(index, current, globalStatus) {
9
10
  if (index === current) return globalStatus || "process";
10
11
  return "wait";
11
12
  }
13
+ var stepsA11yText = {
14
+ [ELangType.ZH_CN]: {
15
+ workflowProgress: "工作流进度",
16
+ status: {
17
+ finish: "已完成",
18
+ process: "进行中",
19
+ wait: "未开始",
20
+ error: "错误"
21
+ }
22
+ },
23
+ [ELangType.EN]: {
24
+ workflowProgress: "Workflow progress",
25
+ status: {
26
+ finish: "Completed",
27
+ process: "In progress",
28
+ wait: "Not started",
29
+ error: "Error"
30
+ }
31
+ }
32
+ };
12
33
  function Steps({ className, current: controlledCurrent, direction = "horizontal", defaultCurrent = 0, status, items, children }) {
13
34
  const current = controlledCurrent ?? defaultCurrent;
35
+ const accessibleIdPrefix = React.useId();
36
+ const { locale } = React.useContext(LocaleContext);
37
+ const a11yText = locale === ELangType.EN ? stepsA11yText[ELangType.EN] : stepsA11yText[ELangType.ZH_CN];
14
38
  const resolvedItems = items || React.Children.toArray(children).filter(React.isValidElement).map((child) => ({
15
39
  title: child.props.title,
16
40
  description: child.props.description,
@@ -20,11 +44,21 @@ function Steps({ className, current: controlledCurrent, direction = "horizontal"
20
44
  }));
21
45
  return /* @__PURE__ */ jsx("div", {
22
46
  className: cn("ald-steps ant-steps ant-steps-dot ant-steps-label-vertical tw-flex", direction === "vertical" ? "ant-steps-vertical" : "ant-steps-horizontal", direction === "vertical" ? "tw-flex-col" : "tw-flex-row tw-items-start", className),
47
+ role: "list",
48
+ "aria-label": a11yText.workflowProgress,
23
49
  children: resolvedItems.map((item, index) => {
24
50
  const stepStatus = item.status || getStepStatus(index, current, status);
25
51
  const isLast = index === resolvedItems.length - 1;
52
+ const titleId = `${accessibleIdPrefix}-step-${index}-title`;
53
+ const statusId = `${accessibleIdPrefix}-step-${index}-status`;
26
54
  return /* @__PURE__ */ jsx("div", {
27
55
  className: cn("ald-steps-item ant-steps-item tw-flex", direction === "horizontal" ? "tw-flex-1 tw-flex-col tw-items-center tw-text-center" : "tw-flex-row tw-gap-3 tw-py-2", `ald-steps-item-${stepStatus}`, `ant-steps-item-${stepStatus}`, item.disabled && "ald-steps-item-disabled tw-pointer-events-none tw-opacity-50", item.disabled && "ant-steps-item-disabled"),
56
+ role: "listitem",
57
+ "aria-current": index === current ? "step" : void 0,
58
+ "aria-labelledby": titleId,
59
+ "aria-describedby": statusId,
60
+ "aria-posinset": index + 1,
61
+ "aria-setsize": resolvedItems.length,
28
62
  children: direction === "horizontal" ? /* @__PURE__ */ jsxs("div", {
29
63
  className: "ant-steps-item-container tw-flex tw-w-full tw-flex-col tw-items-center",
30
64
  children: [/* @__PURE__ */ jsxs("div", {
@@ -51,13 +85,22 @@ function Steps({ className, current: controlledCurrent, direction = "horizontal"
51
85
  ]
52
86
  }), /* @__PURE__ */ jsxs("div", {
53
87
  className: "ald-steps-item-content ant-steps-item-content tw-mt-2 tw-flex tw-flex-col tw-items-center",
54
- children: [/* @__PURE__ */ jsx("div", {
55
- className: cn("ald-steps-item-title ant-steps-item-title tw-text-sm tw-font-medium tw-leading-5", stepStatus === "finish" && "tw-text-[var(--content-tertiary)]", stepStatus === "process" && "tw-text-[var(--content-brand-primary)]", stepStatus === "wait" && "tw-text-[var(--content-primary)]", stepStatus === "error" && "tw-text-[var(--content-negative-secondary)]"),
56
- children: item.title
57
- }), item.description && /* @__PURE__ */ jsx("div", {
58
- className: cn("ald-steps-item-description ant-steps-item-description tw-mt-1 tw-max-w-[264px] tw-break-all tw-text-xs tw-leading-4", stepStatus === "finish" || stepStatus === "error" ? "tw-text-[var(--content-tertiary)]" : "tw-text-[var(--content-secondary)]"),
59
- children: item.description
60
- })]
88
+ children: [
89
+ /* @__PURE__ */ jsx("div", {
90
+ id: titleId,
91
+ className: cn("ald-steps-item-title ant-steps-item-title tw-text-sm tw-font-medium tw-leading-5", stepStatus === "finish" && "tw-text-[var(--content-tertiary)]", stepStatus === "process" && "tw-text-[var(--content-brand-primary)]", stepStatus === "wait" && "tw-text-[var(--content-primary)]", stepStatus === "error" && "tw-text-[var(--content-negative-secondary)]"),
92
+ children: item.title
93
+ }),
94
+ /* @__PURE__ */ jsx("span", {
95
+ id: statusId,
96
+ className: "tw-sr-only",
97
+ children: a11yText.status[stepStatus]
98
+ }),
99
+ item.description && /* @__PURE__ */ jsx("div", {
100
+ className: cn("ald-steps-item-description ant-steps-item-description tw-mt-1 tw-max-w-[264px] tw-break-all tw-text-xs tw-leading-4", stepStatus === "finish" || stepStatus === "error" ? "tw-text-[var(--content-tertiary)]" : "tw-text-[var(--content-secondary)]"),
101
+ children: item.description
102
+ })
103
+ ]
61
104
  })]
62
105
  }) : /* @__PURE__ */ jsxs("div", {
63
106
  className: "ant-steps-item-container tw-flex tw-min-h-16 tw-flex-row tw-gap-3",
@@ -81,13 +124,22 @@ function Steps({ className, current: controlledCurrent, direction = "horizontal"
81
124
  })]
82
125
  }), /* @__PURE__ */ jsxs("div", {
83
126
  className: "ald-steps-item-content ant-steps-item-content",
84
- children: [/* @__PURE__ */ jsx("div", {
85
- className: cn("ald-steps-item-title ant-steps-item-title tw-text-sm tw-font-medium tw-leading-5", stepStatus === "finish" && "tw-text-[var(--content-tertiary)]", stepStatus === "process" && "tw-text-[var(--content-brand-primary)]", stepStatus === "wait" && "tw-text-[var(--content-primary)]", stepStatus === "error" && "tw-text-[var(--content-negative-secondary)]"),
86
- children: item.title
87
- }), item.description && /* @__PURE__ */ jsx("div", {
88
- className: cn("ald-steps-item-description ant-steps-item-description tw-mt-1 tw-max-w-[264px] tw-break-all tw-text-xs tw-leading-4 tw-text-[var(--content-secondary)]"),
89
- children: item.description
90
- })]
127
+ children: [
128
+ /* @__PURE__ */ jsx("div", {
129
+ id: titleId,
130
+ className: cn("ald-steps-item-title ant-steps-item-title tw-text-sm tw-font-medium tw-leading-5", stepStatus === "finish" && "tw-text-[var(--content-tertiary)]", stepStatus === "process" && "tw-text-[var(--content-brand-primary)]", stepStatus === "wait" && "tw-text-[var(--content-primary)]", stepStatus === "error" && "tw-text-[var(--content-negative-secondary)]"),
131
+ children: item.title
132
+ }),
133
+ /* @__PURE__ */ jsx("span", {
134
+ id: statusId,
135
+ className: "tw-sr-only",
136
+ children: a11yText.status[stepStatus]
137
+ }),
138
+ item.description && /* @__PURE__ */ jsx("div", {
139
+ className: cn("ald-steps-item-description ant-steps-item-description tw-mt-1 tw-max-w-[264px] tw-break-all tw-text-xs tw-leading-4 tw-text-[var(--content-secondary)]"),
140
+ children: item.description
141
+ })
142
+ ]
91
143
  })]
92
144
  })
93
145
  }, index);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/Steps/index.tsx"],"sourcesContent":["import React, { ReactElement, ReactNode } from 'react';\nimport { cn } from '../lib/utils';\nimport { CustomDot } from './components/CustomDot';\nimport { IStepProps, Step } from './components/Step';\n\nexport type { IStepProps };\nexport type TStatus = 'wait' | 'process' | 'finish' | 'error';\n\nexport interface IStepItem {\n description?: ReactNode;\n disabled?: boolean;\n icon?: ReactNode;\n status?: TStatus;\n subTitle?: ReactNode;\n title: ReactNode;\n}\n\nexport interface IStepsProps {\n className?: string;\n current?: number;\n direction?: 'horizontal' | 'vertical';\n defaultCurrent?: number;\n status?: TStatus;\n items?: IStepItem[];\n children?: ReactElement<IStepProps>[] | ReactElement<IStepProps>;\n}\n\nfunction getStepStatus(\n index: number,\n current: number,\n globalStatus?: TStatus,\n): TStatus {\n if (index < current) return 'finish';\n if (index === current) return globalStatus || 'process';\n return 'wait';\n}\n\nfunction Steps({\n className,\n current: controlledCurrent,\n direction = 'horizontal',\n defaultCurrent = 0,\n status,\n items,\n children,\n}: IStepsProps) {\n const current = controlledCurrent ?? defaultCurrent;\n // Support children-based API: convert children to items\n const resolvedItems: IStepItem[] =\n items ||\n React.Children.toArray(children)\n .filter(React.isValidElement)\n .map((child: any) => ({\n title: child.props.title,\n description: child.props.description,\n disabled: child.props.disabled,\n status: child.props.status,\n icon: child.props.icon,\n }));\n\n return (\n <div\n className={cn(\n 'ald-steps ant-steps ant-steps-dot ant-steps-label-vertical tw-flex',\n direction === 'vertical'\n ? 'ant-steps-vertical'\n : 'ant-steps-horizontal',\n direction === 'vertical' ? 'tw-flex-col' : 'tw-flex-row tw-items-start',\n className,\n )}\n >\n {resolvedItems.map((item, index) => {\n const stepStatus = item.status || getStepStatus(index, current, status);\n const isLast = index === resolvedItems.length - 1;\n\n return (\n <div\n key={index}\n className={cn(\n 'ald-steps-item ant-steps-item tw-flex',\n direction === 'horizontal'\n ? 'tw-flex-1 tw-flex-col tw-items-center tw-text-center'\n : 'tw-flex-row tw-gap-3 tw-py-2',\n `ald-steps-item-${stepStatus}`,\n `ant-steps-item-${stepStatus}`,\n item.disabled &&\n 'ald-steps-item-disabled tw-pointer-events-none tw-opacity-50',\n item.disabled && 'ant-steps-item-disabled',\n )}\n >\n {direction === 'horizontal' ? (\n <div className=\"ant-steps-item-container tw-flex tw-w-full tw-flex-col tw-items-center\">\n <div className=\"tw-flex tw-w-full tw-items-center\">\n {index > 0 && (\n <div\n className={cn(\n 'ant-steps-item-tail tw-flex-1',\n index <= current\n ? 'tw-bg-[var(--border-brand-strong)]'\n : 'tw-bg-[var(--border-default)]',\n )}\n style={{ height: 1.5 }}\n />\n )}\n <div className=\"ald-steps-item-icon ant-steps-item-icon tw-shrink-0\">\n <span className=\"ant-steps-icon\">\n <span className=\"ant-steps-icon-dot\">\n {item.icon || CustomDot(null, { status: stepStatus })}\n </span>\n </span>\n </div>\n {!isLast && (\n <div\n className={cn(\n index === 0 && 'ant-steps-item-tail',\n 'tw-flex-1',\n index < current\n ? 'tw-bg-[var(--border-brand-strong)]'\n : 'tw-bg-[var(--border-default)]',\n )}\n style={{ height: 1.5 }}\n />\n )}\n </div>\n {/* antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器 */}\n <div className=\"ald-steps-item-content ant-steps-item-content tw-mt-2 tw-flex tw-flex-col tw-items-center\">\n <div\n className={cn(\n // antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器\n 'ald-steps-item-title ant-steps-item-title tw-text-sm tw-font-medium tw-leading-5',\n stepStatus === 'finish' &&\n 'tw-text-[var(--content-tertiary)]',\n stepStatus === 'process' &&\n 'tw-text-[var(--content-brand-primary)]',\n stepStatus === 'wait' &&\n 'tw-text-[var(--content-primary)]',\n stepStatus === 'error' &&\n 'tw-text-[var(--content-negative-secondary)]',\n )}\n >\n {item.title}\n </div>\n {item.description && (\n <div\n className={cn(\n // antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器\n 'ald-steps-item-description ant-steps-item-description tw-mt-1 tw-max-w-[264px] tw-break-all tw-text-xs tw-leading-4',\n stepStatus === 'finish' || stepStatus === 'error'\n ? 'tw-text-[var(--content-tertiary)]'\n : 'tw-text-[var(--content-secondary)]',\n )}\n >\n {item.description}\n </div>\n )}\n </div>\n </div>\n ) : (\n <div className=\"ant-steps-item-container tw-flex tw-min-h-16 tw-flex-row tw-gap-3\">\n <div className=\"ald-steps-item-axis tw-relative tw-flex tw-w-4 tw-shrink-0 tw-justify-center\">\n {!isLast && (\n <div\n className={cn(\n 'ald-steps-item-tail ant-steps-item-tail',\n index < current\n ? 'ald-steps-item-tail-finish'\n : 'ald-steps-item-tail-wait',\n 'tw-absolute tw-left-1/2 tw-top-2 tw-z-0 tw--translate-x-1/2',\n index < current\n ? 'tw-bg-[var(--border-brand-strong)]'\n : 'tw-bg-[var(--border-default)]',\n )}\n style={{ width: 1.5, bottom: -24 }}\n />\n )}\n <div className=\"ald-steps-item-icon ant-steps-item-icon tw-relative tw-z-[1] tw-flex tw-size-4 tw-shrink-0 tw-items-center tw-justify-center tw-leading-none\">\n <span className=\"ant-steps-icon tw-flex tw-size-4 tw-items-center tw-justify-center tw-leading-none\">\n <span className=\"ant-steps-icon-dot tw-flex tw-size-4 tw-items-center tw-justify-center\">\n {item.icon || CustomDot(null, { status: stepStatus })}\n </span>\n </span>\n </div>\n </div>\n {/* antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器 */}\n <div className=\"ald-steps-item-content ant-steps-item-content\">\n <div\n className={cn(\n // antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器\n 'ald-steps-item-title ant-steps-item-title tw-text-sm tw-font-medium tw-leading-5',\n stepStatus === 'finish' &&\n 'tw-text-[var(--content-tertiary)]',\n stepStatus === 'process' &&\n 'tw-text-[var(--content-brand-primary)]',\n stepStatus === 'wait' &&\n 'tw-text-[var(--content-primary)]',\n stepStatus === 'error' &&\n 'tw-text-[var(--content-negative-secondary)]',\n )}\n >\n {item.title}\n </div>\n {item.description && (\n <div\n className={cn(\n // antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器\n 'ald-steps-item-description ant-steps-item-description tw-mt-1 tw-max-w-[264px] tw-break-all tw-text-xs tw-leading-4 tw-text-[var(--content-secondary)]',\n )}\n >\n {item.description}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nSteps.Step = Step;\n\nexport default Steps;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/Steps/index.tsx"],"sourcesContent":["import React, { ReactElement, ReactNode } from 'react';\nimport { cn } from '../lib/utils';\nimport { ELangType, LocaleContext } from '../locale/default';\nimport { CustomDot } from './components/CustomDot';\nimport { IStepProps, Step } from './components/Step';\n\nexport type { IStepProps };\nexport type TStatus = 'wait' | 'process' | 'finish' | 'error';\n\nexport interface IStepItem {\n description?: ReactNode;\n disabled?: boolean;\n icon?: ReactNode;\n status?: TStatus;\n subTitle?: ReactNode;\n title: ReactNode;\n}\n\nexport interface IStepsProps {\n className?: string;\n current?: number;\n direction?: 'horizontal' | 'vertical';\n defaultCurrent?: number;\n status?: TStatus;\n items?: IStepItem[];\n children?: ReactElement<IStepProps>[] | ReactElement<IStepProps>;\n}\n\nfunction getStepStatus(\n index: number,\n current: number,\n globalStatus?: TStatus,\n): TStatus {\n if (index < current) return 'finish';\n if (index === current) return globalStatus || 'process';\n return 'wait';\n}\n\n/* eslint-disable i18n/no-chinese-character -- Steps accessibility copy stays local to this bounded component migration. */\nconst stepsA11yText = {\n [ELangType.ZH_CN]: {\n workflowProgress: '工作流进度',\n status: {\n finish: '已完成',\n process: '进行中',\n wait: '未开始',\n error: '错误',\n },\n },\n [ELangType.EN]: {\n workflowProgress: 'Workflow progress',\n status: {\n finish: 'Completed',\n process: 'In progress',\n wait: 'Not started',\n error: 'Error',\n },\n },\n};\n/* eslint-enable i18n/no-chinese-character */\n\nfunction Steps({\n className,\n current: controlledCurrent,\n direction = 'horizontal',\n defaultCurrent = 0,\n status,\n items,\n children,\n}: IStepsProps) {\n const current = controlledCurrent ?? defaultCurrent;\n const accessibleIdPrefix = React.useId();\n const { locale } = React.useContext(LocaleContext);\n const a11yText =\n locale === ELangType.EN\n ? stepsA11yText[ELangType.EN]\n : stepsA11yText[ELangType.ZH_CN];\n // Support children-based API: convert children to items\n const resolvedItems: IStepItem[] =\n items ||\n React.Children.toArray(children)\n .filter(React.isValidElement)\n .map((child: any) => ({\n title: child.props.title,\n description: child.props.description,\n disabled: child.props.disabled,\n status: child.props.status,\n icon: child.props.icon,\n }));\n\n return (\n <div\n className={cn(\n 'ald-steps ant-steps ant-steps-dot ant-steps-label-vertical tw-flex',\n direction === 'vertical'\n ? 'ant-steps-vertical'\n : 'ant-steps-horizontal',\n direction === 'vertical' ? 'tw-flex-col' : 'tw-flex-row tw-items-start',\n className,\n )}\n role=\"list\"\n aria-label={a11yText.workflowProgress}\n >\n {resolvedItems.map((item, index) => {\n const stepStatus = item.status || getStepStatus(index, current, status);\n const isLast = index === resolvedItems.length - 1;\n const titleId = `${accessibleIdPrefix}-step-${index}-title`;\n const statusId = `${accessibleIdPrefix}-step-${index}-status`;\n\n return (\n <div\n key={index}\n className={cn(\n 'ald-steps-item ant-steps-item tw-flex',\n direction === 'horizontal'\n ? 'tw-flex-1 tw-flex-col tw-items-center tw-text-center'\n : 'tw-flex-row tw-gap-3 tw-py-2',\n `ald-steps-item-${stepStatus}`,\n `ant-steps-item-${stepStatus}`,\n item.disabled &&\n 'ald-steps-item-disabled tw-pointer-events-none tw-opacity-50',\n item.disabled && 'ant-steps-item-disabled',\n )}\n role=\"listitem\"\n aria-current={index === current ? 'step' : undefined}\n aria-labelledby={titleId}\n aria-describedby={statusId}\n aria-posinset={index + 1}\n aria-setsize={resolvedItems.length}\n >\n {direction === 'horizontal' ? (\n <div className=\"ant-steps-item-container tw-flex tw-w-full tw-flex-col tw-items-center\">\n <div className=\"tw-flex tw-w-full tw-items-center\">\n {index > 0 && (\n <div\n className={cn(\n 'ant-steps-item-tail tw-flex-1',\n index <= current\n ? 'tw-bg-[var(--border-brand-strong)]'\n : 'tw-bg-[var(--border-default)]',\n )}\n style={{ height: 1.5 }}\n />\n )}\n <div className=\"ald-steps-item-icon ant-steps-item-icon tw-shrink-0\">\n <span className=\"ant-steps-icon\">\n <span className=\"ant-steps-icon-dot\">\n {item.icon || CustomDot(null, { status: stepStatus })}\n </span>\n </span>\n </div>\n {!isLast && (\n <div\n className={cn(\n index === 0 && 'ant-steps-item-tail',\n 'tw-flex-1',\n index < current\n ? 'tw-bg-[var(--border-brand-strong)]'\n : 'tw-bg-[var(--border-default)]',\n )}\n style={{ height: 1.5 }}\n />\n )}\n </div>\n {/* antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器 */}\n <div className=\"ald-steps-item-content ant-steps-item-content tw-mt-2 tw-flex tw-flex-col tw-items-center\">\n <div\n id={titleId}\n className={cn(\n // antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器\n 'ald-steps-item-title ant-steps-item-title tw-text-sm tw-font-medium tw-leading-5',\n stepStatus === 'finish' &&\n 'tw-text-[var(--content-tertiary)]',\n stepStatus === 'process' &&\n 'tw-text-[var(--content-brand-primary)]',\n stepStatus === 'wait' &&\n 'tw-text-[var(--content-primary)]',\n stepStatus === 'error' &&\n 'tw-text-[var(--content-negative-secondary)]',\n )}\n >\n {item.title}\n </div>\n <span id={statusId} className=\"tw-sr-only\">\n {a11yText.status[stepStatus]}\n </span>\n {item.description && (\n <div\n className={cn(\n // antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器\n 'ald-steps-item-description ant-steps-item-description tw-mt-1 tw-max-w-[264px] tw-break-all tw-text-xs tw-leading-4',\n stepStatus === 'finish' || stepStatus === 'error'\n ? 'tw-text-[var(--content-tertiary)]'\n : 'tw-text-[var(--content-secondary)]',\n )}\n >\n {item.description}\n </div>\n )}\n </div>\n </div>\n ) : (\n <div className=\"ant-steps-item-container tw-flex tw-min-h-16 tw-flex-row tw-gap-3\">\n <div className=\"ald-steps-item-axis tw-relative tw-flex tw-w-4 tw-shrink-0 tw-justify-center\">\n {!isLast && (\n <div\n className={cn(\n 'ald-steps-item-tail ant-steps-item-tail',\n index < current\n ? 'ald-steps-item-tail-finish'\n : 'ald-steps-item-tail-wait',\n 'tw-absolute tw-left-1/2 tw-top-2 tw-z-0 tw--translate-x-1/2',\n index < current\n ? 'tw-bg-[var(--border-brand-strong)]'\n : 'tw-bg-[var(--border-default)]',\n )}\n style={{ width: 1.5, bottom: -24 }}\n />\n )}\n <div className=\"ald-steps-item-icon ant-steps-item-icon tw-relative tw-z-[1] tw-flex tw-size-4 tw-shrink-0 tw-items-center tw-justify-center tw-leading-none\">\n <span className=\"ant-steps-icon tw-flex tw-size-4 tw-items-center tw-justify-center tw-leading-none\">\n <span className=\"ant-steps-icon-dot tw-flex tw-size-4 tw-items-center tw-justify-center\">\n {item.icon || CustomDot(null, { status: stepStatus })}\n </span>\n </span>\n </div>\n </div>\n {/* antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器 */}\n <div className=\"ald-steps-item-content ant-steps-item-content\">\n <div\n id={titleId}\n className={cn(\n // antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器\n 'ald-steps-item-title ant-steps-item-title tw-text-sm tw-font-medium tw-leading-5',\n stepStatus === 'finish' &&\n 'tw-text-[var(--content-tertiary)]',\n stepStatus === 'process' &&\n 'tw-text-[var(--content-brand-primary)]',\n stepStatus === 'wait' &&\n 'tw-text-[var(--content-primary)]',\n stepStatus === 'error' &&\n 'tw-text-[var(--content-negative-secondary)]',\n )}\n >\n {item.title}\n </div>\n <span id={statusId} className=\"tw-sr-only\">\n {a11yText.status[stepStatus]}\n </span>\n {item.description && (\n <div\n className={cn(\n // antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器\n 'ald-steps-item-description ant-steps-item-description tw-mt-1 tw-max-w-[264px] tw-break-all tw-text-xs tw-leading-4 tw-text-[var(--content-secondary)]',\n )}\n >\n {item.description}\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nSteps.Step = Step;\n\nexport default Steps;\n"],"mappings":";;;;;;;AA4BA,SAAS,cACP,OACA,SACA,cACS;AACT,KAAI,QAAQ,QAAS,QAAO;AAC5B,KAAI,UAAU,QAAS,QAAO,gBAAgB;AAC9C,QAAO;;AAIT,IAAM,gBAAgB;EACnB,UAAU,QAAQ;EACjB,kBAAkB;EAClB,QAAQ;GACN,QAAQ;GACR,SAAS;GACT,MAAM;GACN,OAAO;GACR;EACF;EACA,UAAU,KAAK;EACd,kBAAkB;EAClB,QAAQ;GACN,QAAQ;GACR,SAAS;GACT,MAAM;GACN,OAAO;GACR;EACF;CACF;AAGD,SAAS,MAAM,EACb,WACA,SAAS,mBACT,YAAY,cACZ,iBAAiB,GACjB,QACA,OACA,YACc;CACd,MAAM,UAAU,qBAAqB;CACrC,MAAM,qBAAqB,MAAM,OAAO;CACxC,MAAM,EAAE,WAAW,MAAM,WAAW,cAAc;CAClD,MAAM,WACJ,WAAW,UAAU,KACjB,cAAc,UAAU,MACxB,cAAc,UAAU;CAE9B,MAAM,gBACJ,SACA,MAAM,SAAS,QAAQ,SAAS,CAC7B,OAAO,MAAM,eAAe,CAC5B,KAAK,WAAgB;EACpB,OAAO,MAAM,MAAM;EACnB,aAAa,MAAM,MAAM;EACzB,UAAU,MAAM,MAAM;EACtB,QAAQ,MAAM,MAAM;EACpB,MAAM,MAAM,MAAM;EACnB,EAAE;AAEP,QACE,oBAAC,OAAD;EACE,WAAW,GACT,sEACA,cAAc,aACV,uBACA,wBACJ,cAAc,aAAa,gBAAgB,8BAC3C,UACD;EACD,MAAK;EACL,cAAY,SAAS;YAEpB,cAAc,KAAK,MAAM,UAAU;GAClC,MAAM,aAAa,KAAK,UAAU,cAAc,OAAO,SAAS,OAAO;GACvE,MAAM,SAAS,UAAU,cAAc,SAAS;GAChD,MAAM,UAAU,GAAG,mBAAmB,QAAQ,MAAM;GACpD,MAAM,WAAW,GAAG,mBAAmB,QAAQ,MAAM;AAErD,UACE,oBAAC,OAAD;IAEE,WAAW,GACT,yCACA,cAAc,eACV,yDACA,gCACJ,kBAAkB,cAClB,kBAAkB,cAClB,KAAK,YACH,gEACF,KAAK,YAAY,0BAClB;IACD,MAAK;IACL,gBAAc,UAAU,UAAU,SAAS;IAC3C,mBAAiB;IACjB,oBAAkB;IAClB,iBAAe,QAAQ;IACvB,gBAAc,cAAc;cAE3B,cAAc,eACb,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,OAAD;MAAK,WAAU;gBAAf;OACG,QAAQ,KACP,oBAAC,OAAD;QACE,WAAW,GACT,iCACA,SAAS,UACL,uCACA,gCACL;QACD,OAAO,EAAE,QAAQ,KAAK;QACtB,CAAA;OAEJ,oBAAC,OAAD;QAAK,WAAU;kBACb,oBAAC,QAAD;SAAM,WAAU;mBACd,oBAAC,QAAD;UAAM,WAAU;oBACb,KAAK,QAAQ,UAAU,MAAM,EAAE,QAAQ,YAAY,CAAC;UAChD,CAAA;SACF,CAAA;QACH,CAAA;OACL,CAAC,UACA,oBAAC,OAAD;QACE,WAAW,GACT,UAAU,KAAK,uBACf,aACA,QAAQ,UACJ,uCACA,gCACL;QACD,OAAO,EAAE,QAAQ,KAAK;QACtB,CAAA;OAEA;SAEN,qBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,oBAAC,OAAD;QACE,IAAI;QACJ,WAAW,GAET,oFACA,eAAe,YACb,qCACF,eAAe,aACb,0CACF,eAAe,UACb,oCACF,eAAe,WACb,8CACH;kBAEA,KAAK;QACF,CAAA;OACN,oBAAC,QAAD;QAAM,IAAI;QAAU,WAAU;kBAC3B,SAAS,OAAO;QACZ,CAAA;OACN,KAAK,eACJ,oBAAC,OAAD;QACE,WAAW,GAET,uHACA,eAAe,YAAY,eAAe,UACtC,sCACA,qCACL;kBAEA,KAAK;QACF,CAAA;OAEJ;QACF;SAEN,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACG,CAAC,UACA,oBAAC,OAAD;OACE,WAAW,GACT,2CACA,QAAQ,UACJ,+BACA,4BACJ,+DACA,QAAQ,UACJ,uCACA,gCACL;OACD,OAAO;QAAE,OAAO;QAAK,QAAQ;QAAK;OAClC,CAAA,EAEJ,oBAAC,OAAD;OAAK,WAAU;iBACb,oBAAC,QAAD;QAAM,WAAU;kBACd,oBAAC,QAAD;SAAM,WAAU;mBACb,KAAK,QAAQ,UAAU,MAAM,EAAE,QAAQ,YAAY,CAAC;SAChD,CAAA;QACF,CAAA;OACH,CAAA,CACF;SAEN,qBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,oBAAC,OAAD;QACE,IAAI;QACJ,WAAW,GAET,oFACA,eAAe,YACb,qCACF,eAAe,aACb,0CACF,eAAe,UACb,oCACF,eAAe,WACb,8CACH;kBAEA,KAAK;QACF,CAAA;OACN,oBAAC,QAAD;QAAM,IAAI;QAAU,WAAU;kBAC3B,SAAS,OAAO;QACZ,CAAA;OACN,KAAK,eACJ,oBAAC,OAAD;QACE,WAAW,GAET,yJACD;kBAEA,KAAK;QACF,CAAA;OAEJ;QACF;;IAEJ,EAvJC,MAuJD;IAER;EACE,CAAA;;AAIV,MAAM,OAAO"}
@@ -53,7 +53,13 @@ var Switch = ({ className = "", disabled: customDisabled, loading = false, size:
53
53
  "data-testid": dataTestid,
54
54
  "aria-label": ariaLabel,
55
55
  disabled: currentDisabled,
56
- className: cn("ald-switch-btn tw-relative tw-inline-flex tw-cursor-pointer tw-items-center tw-rounded-full tw-border-0 tw-p-0 tw-transition-colors tw-duration-200", userChecked ? "tw-bg-[var(--action-primary-normal)] hover:tw-bg-[var(--action-primary-hover)]" : "tw-bg-[var(--action-neutral-subtle-normal)] hover:tw-bg-[var(--action-neutral-subtle-hover)]", currentDisabled && "tw-cursor-not-allowed tw-opacity-40"),
56
+ className: cn("ald-switch-btn tw-relative tw-inline-flex tw-cursor-pointer tw-items-center tw-rounded-full tw-border-0 tw-p-0 tw-transition-colors tw-duration-200", userChecked ? "tw-bg-[var(--control-state-selected)]" : "tw-bg-[var(--control-state-unselected)]", !currentDisabled && [
57
+ "focus-visible:tw-shadow-[0_0_0_2px_var(--focus-ring)]",
58
+ "forced-colors:focus-visible:tw-outline",
59
+ "forced-colors:focus-visible:tw-outline-2",
60
+ "forced-colors:focus-visible:tw-outline-offset-2",
61
+ "forced-colors:focus-visible:tw-outline-[Highlight]"
62
+ ], currentDisabled && "tw-cursor-not-allowed tw-opacity-40"),
57
63
  style: {
58
64
  width: trackW,
59
65
  height: trackH
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/Switch/index.tsx"],"sourcesContent":["import React, { useContext, useEffect, useState } from 'react';\nimport DisabledContext from '../ConfigProvider/DisabledContext';\nimport SizeContext from '../ConfigProvider/sizeContext';\nimport { cn } from '../lib/utils';\n\nexport type SwitchChangeEventHandler = (\n checked: boolean,\n event: React.MouseEvent<HTMLButtonElement>,\n) => void;\nexport type SwitchClickEventHandler = SwitchChangeEventHandler;\nexport type SwitchSize = 'large' | 'middle' | 'small';\n\nexport interface ISwitchProps {\n className?: string;\n checked?: boolean;\n defaultChecked?: boolean;\n disabled?: boolean;\n loading?: boolean;\n size?: SwitchSize;\n onClick?: SwitchChangeEventHandler;\n onChange?: SwitchChangeEventHandler;\n children?: React.ReactNode;\n /** 透传到内部 switch 按钮元素的 data-testid,用于自动化测试定位 */\n 'data-testid'?: string;\n /** 透传到内部 switch 按钮元素的 aria-label,用于可访问性与自动化测试定位 */\n 'aria-label'?: string;\n}\n\nconst switchSizeConfig: Record<\n SwitchSize,\n {\n trackW: number;\n trackH: number;\n thumbSize: number;\n }\n> = {\n large: {\n trackW: 36,\n trackH: 20,\n thumbSize: 16,\n },\n middle: {\n trackW: 28,\n trackH: 16,\n thumbSize: 12,\n },\n small: {\n trackW: 22,\n trackH: 12,\n thumbSize: 8,\n },\n};\n\nconst Switch: React.FC<ISwitchProps> = ({\n className = '',\n disabled: customDisabled,\n loading = false,\n size: customSize,\n checked,\n defaultChecked,\n onChange,\n onClick,\n children,\n 'data-testid': dataTestid,\n 'aria-label': ariaLabel,\n}) => {\n const contentSize = useContext(SizeContext);\n const size = customSize || contentSize || 'middle';\n\n const [userChecked, setUserChecked] = useState(\n typeof checked === 'undefined' ? defaultChecked : checked,\n );\n\n const disabled = useContext(DisabledContext);\n const mergedDisabled = customDisabled ?? disabled;\n\n const currentDisabled = loading ? true : mergedDisabled;\n\n useEffect(() => {\n if (typeof checked === 'boolean') {\n setUserChecked(checked);\n }\n }, [checked]);\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (currentDisabled) return;\n const newChecked = !userChecked;\n if (checked === undefined) {\n setUserChecked(newChecked);\n }\n onChange?.(newChecked, e);\n onClick?.(newChecked, e);\n };\n\n const { trackW, trackH, thumbSize } = switchSizeConfig[size];\n const thumbOffset = 2;\n const thumbTranslate = trackW - thumbSize - thumbOffset * 2;\n\n return (\n <span\n className={cn(\n className,\n 'ald-switch tw-inline-flex tw-items-center tw-gap-1.5 tw-text-[0]',\n `ald-switch-${size}`,\n currentDisabled && 'tw-pointer-events-none tw-cursor-default',\n {\n 'ald-switch-disabled': currentDisabled,\n 'ald-switch-checked': userChecked,\n },\n )}\n >\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={!!userChecked}\n aria-busy={loading || undefined}\n data-testid={dataTestid}\n aria-label={ariaLabel}\n disabled={currentDisabled}\n className={cn(\n 'ald-switch-btn tw-relative tw-inline-flex tw-cursor-pointer tw-items-center tw-rounded-full tw-border-0 tw-p-0 tw-transition-colors tw-duration-200',\n userChecked\n ? 'tw-bg-[var(--action-primary-normal)] hover:tw-bg-[var(--action-primary-hover)]'\n : 'tw-bg-[var(--action-neutral-subtle-normal)] hover:tw-bg-[var(--action-neutral-subtle-hover)]',\n currentDisabled && 'tw-cursor-not-allowed tw-opacity-40',\n )}\n style={{ width: trackW, height: trackH }}\n onClick={handleClick}\n >\n <span\n className={cn(\n 'tw-block tw-rounded-full tw-bg-[var(--background-default)] tw-shadow-sm tw-transition-transform tw-duration-200',\n )}\n style={{\n width: thumbSize,\n height: thumbSize,\n marginLeft: thumbOffset,\n transform: userChecked\n ? `translateX(${thumbTranslate}px)`\n : 'translateX(0)',\n }}\n />\n </button>\n {children && (\n <span\n className={cn(\n 'ald-switch-text tw-inline-flex tw-items-center tw-align-middle tw-text-[var(--content-primary)]',\n size === 'large' && 'tw-h-5 tw-text-base tw-leading-5',\n size === 'middle' && 'tw-h-4 tw-text-sm tw-leading-4',\n size === 'small' && 'tw-h-3 tw-text-xs tw-leading-3',\n currentDisabled && 'tw-opacity-50',\n )}\n >\n {children}\n </span>\n )}\n </span>\n );\n};\n\nexport default Switch;\n"],"mappings":";;;;;;AA4BA,IAAM,mBAOF;CACF,OAAO;EACL,QAAQ;EACR,QAAQ;EACR,WAAW;EACZ;CACD,QAAQ;EACN,QAAQ;EACR,QAAQ;EACR,WAAW;EACZ;CACD,OAAO;EACL,QAAQ;EACR,QAAQ;EACR,WAAW;EACZ;CACF;AAED,IAAM,UAAkC,EACtC,YAAY,IACZ,UAAU,gBACV,UAAU,OACV,MAAM,YACN,SACA,gBACA,UACA,SACA,UACA,eAAe,YACf,cAAc,gBACV;CACJ,MAAM,cAAc,WAAW,YAAY;CAC3C,MAAM,OAAO,cAAc,eAAe;CAE1C,MAAM,CAAC,aAAa,kBAAkB,SACpC,OAAO,YAAY,cAAc,iBAAiB,QACnD;CAED,MAAM,WAAW,WAAW,gBAAgB;CAG5C,MAAM,kBAAkB,UAAU,OAFX,kBAAkB;AAIzC,iBAAgB;AACd,MAAI,OAAO,YAAY,UACrB,gBAAe,QAAQ;IAExB,CAAC,QAAQ,CAAC;CAEb,MAAM,eAAe,MAA2C;AAC9D,MAAI,gBAAiB;EACrB,MAAM,aAAa,CAAC;AACpB,MAAI,YAAY,OACd,gBAAe,WAAW;AAE5B,aAAW,YAAY,EAAE;AACzB,YAAU,YAAY,EAAE;;CAG1B,MAAM,EAAE,QAAQ,QAAQ,cAAc,iBAAiB;CACvD,MAAM,cAAc;CACpB,MAAM,iBAAiB,SAAS,YAAY,cAAc;AAE1D,QACE,qBAAC,QAAD;EACE,WAAW,GACT,WACA,oEACA,cAAc,QACd,mBAAmB,4CACnB;GACE,uBAAuB;GACvB,sBAAsB;GACvB,CACF;YAVH,CAYE,oBAAC,UAAD;GACE,MAAK;GACL,MAAK;GACL,gBAAc,CAAC,CAAC;GAChB,aAAW,WAAW;GACtB,eAAa;GACb,cAAY;GACZ,UAAU;GACV,WAAW,GACT,uJACA,cACI,mFACA,gGACJ,mBAAmB,sCACpB;GACD,OAAO;IAAE,OAAO;IAAQ,QAAQ;IAAQ;GACxC,SAAS;aAET,oBAAC,QAAD;IACE,WAAW,GACT,kHACD;IACD,OAAO;KACL,OAAO;KACP,QAAQ;KACR,YAAY;KACZ,WAAW,cACP,cAAc,eAAe,OAC7B;KACL;IACD,CAAA;GACK,CAAA,EACR,YACC,oBAAC,QAAD;GACE,WAAW,GACT,mGACA,SAAS,WAAW,oCACpB,SAAS,YAAY,kCACrB,SAAS,WAAW,kCACpB,mBAAmB,gBACpB;GAEA;GACI,CAAA,CAEJ"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/Switch/index.tsx"],"sourcesContent":["import React, { useContext, useEffect, useState } from 'react';\nimport DisabledContext from '../ConfigProvider/DisabledContext';\nimport SizeContext from '../ConfigProvider/sizeContext';\nimport { cn } from '../lib/utils';\n\nexport type SwitchChangeEventHandler = (\n checked: boolean,\n event: React.MouseEvent<HTMLButtonElement>,\n) => void;\nexport type SwitchClickEventHandler = SwitchChangeEventHandler;\nexport type SwitchSize = 'large' | 'middle' | 'small';\n\nexport interface ISwitchProps {\n className?: string;\n checked?: boolean;\n defaultChecked?: boolean;\n disabled?: boolean;\n loading?: boolean;\n size?: SwitchSize;\n onClick?: SwitchChangeEventHandler;\n onChange?: SwitchChangeEventHandler;\n children?: React.ReactNode;\n /** 透传到内部 switch 按钮元素的 data-testid,用于自动化测试定位 */\n 'data-testid'?: string;\n /** 透传到内部 switch 按钮元素的 aria-label,用于可访问性与自动化测试定位 */\n 'aria-label'?: string;\n}\n\nconst switchSizeConfig: Record<\n SwitchSize,\n {\n trackW: number;\n trackH: number;\n thumbSize: number;\n }\n> = {\n large: {\n trackW: 36,\n trackH: 20,\n thumbSize: 16,\n },\n middle: {\n trackW: 28,\n trackH: 16,\n thumbSize: 12,\n },\n small: {\n trackW: 22,\n trackH: 12,\n thumbSize: 8,\n },\n};\n\nconst Switch: React.FC<ISwitchProps> = ({\n className = '',\n disabled: customDisabled,\n loading = false,\n size: customSize,\n checked,\n defaultChecked,\n onChange,\n onClick,\n children,\n 'data-testid': dataTestid,\n 'aria-label': ariaLabel,\n}) => {\n const contentSize = useContext(SizeContext);\n const size = customSize || contentSize || 'middle';\n\n const [userChecked, setUserChecked] = useState(\n typeof checked === 'undefined' ? defaultChecked : checked,\n );\n\n const disabled = useContext(DisabledContext);\n const mergedDisabled = customDisabled ?? disabled;\n\n const currentDisabled = loading ? true : mergedDisabled;\n\n useEffect(() => {\n if (typeof checked === 'boolean') {\n setUserChecked(checked);\n }\n }, [checked]);\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (currentDisabled) return;\n const newChecked = !userChecked;\n if (checked === undefined) {\n setUserChecked(newChecked);\n }\n onChange?.(newChecked, e);\n onClick?.(newChecked, e);\n };\n\n const { trackW, trackH, thumbSize } = switchSizeConfig[size];\n const thumbOffset = 2;\n const thumbTranslate = trackW - thumbSize - thumbOffset * 2;\n\n return (\n <span\n className={cn(\n className,\n 'ald-switch tw-inline-flex tw-items-center tw-gap-1.5 tw-text-[0]',\n `ald-switch-${size}`,\n currentDisabled && 'tw-pointer-events-none tw-cursor-default',\n {\n 'ald-switch-disabled': currentDisabled,\n 'ald-switch-checked': userChecked,\n },\n )}\n >\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={!!userChecked}\n aria-busy={loading || undefined}\n data-testid={dataTestid}\n aria-label={ariaLabel}\n disabled={currentDisabled}\n className={cn(\n 'ald-switch-btn tw-relative tw-inline-flex tw-cursor-pointer tw-items-center tw-rounded-full tw-border-0 tw-p-0 tw-transition-colors tw-duration-200',\n userChecked\n ? 'tw-bg-[var(--control-state-selected)]'\n : 'tw-bg-[var(--control-state-unselected)]',\n // Focus is an independent layer on the interactive button. The\n // selected/unselected Control State Color contract remains intact.\n !currentDisabled && [\n 'focus-visible:tw-shadow-[0_0_0_2px_var(--focus-ring)]',\n 'forced-colors:focus-visible:tw-outline',\n 'forced-colors:focus-visible:tw-outline-2',\n 'forced-colors:focus-visible:tw-outline-offset-2',\n 'forced-colors:focus-visible:tw-outline-[Highlight]',\n ],\n currentDisabled && 'tw-cursor-not-allowed tw-opacity-40',\n )}\n style={{ width: trackW, height: trackH }}\n onClick={handleClick}\n >\n <span\n className={cn(\n 'tw-block tw-rounded-full tw-bg-[var(--background-default)] tw-shadow-sm tw-transition-transform tw-duration-200',\n )}\n style={{\n width: thumbSize,\n height: thumbSize,\n marginLeft: thumbOffset,\n transform: userChecked\n ? `translateX(${thumbTranslate}px)`\n : 'translateX(0)',\n }}\n />\n </button>\n {children && (\n <span\n className={cn(\n 'ald-switch-text tw-inline-flex tw-items-center tw-align-middle tw-text-[var(--content-primary)]',\n size === 'large' && 'tw-h-5 tw-text-base tw-leading-5',\n size === 'middle' && 'tw-h-4 tw-text-sm tw-leading-4',\n size === 'small' && 'tw-h-3 tw-text-xs tw-leading-3',\n currentDisabled && 'tw-opacity-50',\n )}\n >\n {children}\n </span>\n )}\n </span>\n );\n};\n\nexport default Switch;\n"],"mappings":";;;;;;AA4BA,IAAM,mBAOF;CACF,OAAO;EACL,QAAQ;EACR,QAAQ;EACR,WAAW;EACZ;CACD,QAAQ;EACN,QAAQ;EACR,QAAQ;EACR,WAAW;EACZ;CACD,OAAO;EACL,QAAQ;EACR,QAAQ;EACR,WAAW;EACZ;CACF;AAED,IAAM,UAAkC,EACtC,YAAY,IACZ,UAAU,gBACV,UAAU,OACV,MAAM,YACN,SACA,gBACA,UACA,SACA,UACA,eAAe,YACf,cAAc,gBACV;CACJ,MAAM,cAAc,WAAW,YAAY;CAC3C,MAAM,OAAO,cAAc,eAAe;CAE1C,MAAM,CAAC,aAAa,kBAAkB,SACpC,OAAO,YAAY,cAAc,iBAAiB,QACnD;CAED,MAAM,WAAW,WAAW,gBAAgB;CAG5C,MAAM,kBAAkB,UAAU,OAFX,kBAAkB;AAIzC,iBAAgB;AACd,MAAI,OAAO,YAAY,UACrB,gBAAe,QAAQ;IAExB,CAAC,QAAQ,CAAC;CAEb,MAAM,eAAe,MAA2C;AAC9D,MAAI,gBAAiB;EACrB,MAAM,aAAa,CAAC;AACpB,MAAI,YAAY,OACd,gBAAe,WAAW;AAE5B,aAAW,YAAY,EAAE;AACzB,YAAU,YAAY,EAAE;;CAG1B,MAAM,EAAE,QAAQ,QAAQ,cAAc,iBAAiB;CACvD,MAAM,cAAc;CACpB,MAAM,iBAAiB,SAAS,YAAY,cAAc;AAE1D,QACE,qBAAC,QAAD;EACE,WAAW,GACT,WACA,oEACA,cAAc,QACd,mBAAmB,4CACnB;GACE,uBAAuB;GACvB,sBAAsB;GACvB,CACF;YAVH,CAYE,oBAAC,UAAD;GACE,MAAK;GACL,MAAK;GACL,gBAAc,CAAC,CAAC;GAChB,aAAW,WAAW;GACtB,eAAa;GACb,cAAY;GACZ,UAAU;GACV,WAAW,GACT,uJACA,cACI,0CACA,2CAGJ,CAAC,mBAAmB;IAClB;IACA;IACA;IACA;IACA;IACD,EACD,mBAAmB,sCACpB;GACD,OAAO;IAAE,OAAO;IAAQ,QAAQ;IAAQ;GACxC,SAAS;aAET,oBAAC,QAAD;IACE,WAAW,GACT,kHACD;IACD,OAAO;KACL,OAAO;KACP,QAAQ;KACR,YAAY;KACZ,WAAW,cACP,cAAc,eAAe,OAC7B;KACL;IACD,CAAA;GACK,CAAA,EACR,YACC,oBAAC,QAAD;GACE,WAAW,GACT,mGACA,SAAS,WAAW,oCACpB,SAAS,YAAY,kCACrB,SAAS,WAAW,kCACpB,mBAAmB,gBACpB;GAEA;GACI,CAAA,CAEJ"}