@aloudata/aloudata-design 3.1.0 → 3.1.2

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 (196) hide show
  1. package/dist/AProgress/index.js +10 -0
  2. package/dist/AProgress/index.js.map +1 -1
  3. package/dist/Alert/index.js +3 -1
  4. package/dist/Alert/index.js.map +1 -1
  5. package/dist/Badge/index.js +37 -11
  6. package/dist/Badge/index.js.map +1 -1
  7. package/dist/Breadcrumb/index.js +12 -2
  8. package/dist/Breadcrumb/index.js.map +1 -1
  9. package/dist/Button/index.d.ts +1 -1
  10. package/dist/Button/index.js +20 -6
  11. package/dist/Button/index.js.map +1 -1
  12. package/dist/Card/index.js +1 -1
  13. package/dist/Card/index.js.map +1 -1
  14. package/dist/Carousel/index.js +9 -1
  15. package/dist/Carousel/index.js.map +1 -1
  16. package/dist/Checkbox/index.js +17 -2
  17. package/dist/Checkbox/index.js.map +1 -1
  18. package/dist/Checkbox/type.d.ts +10 -2
  19. package/dist/ColorPicker/index.js +112 -46
  20. package/dist/ColorPicker/index.js.map +1 -1
  21. package/dist/DataPreviewTable/components/Body/Cell.d.ts +2 -0
  22. package/dist/DataPreviewTable/components/Body/Cell.js +9 -1
  23. package/dist/DataPreviewTable/components/Body/Cell.js.map +1 -1
  24. package/dist/DataPreviewTable/components/Body/index.d.ts +1 -0
  25. package/dist/DataPreviewTable/components/Body/index.js +35 -23
  26. package/dist/DataPreviewTable/components/Body/index.js.map +1 -1
  27. package/dist/DataPreviewTable/components/Header/index.d.ts +1 -0
  28. package/dist/DataPreviewTable/components/Header/index.js +36 -28
  29. package/dist/DataPreviewTable/components/Header/index.js.map +1 -1
  30. package/dist/DataPreviewTable/index.js +19 -2
  31. package/dist/DataPreviewTable/index.js.map +1 -1
  32. package/dist/Drawer/index.d.ts +4 -0
  33. package/dist/Drawer/index.js +93 -79
  34. package/dist/Drawer/index.js.map +1 -1
  35. package/dist/Dropdown/index.d.ts +1 -1
  36. package/dist/Dropdown/index.js +64 -13
  37. package/dist/Dropdown/index.js.map +1 -1
  38. package/dist/Form/FormItemContext.d.ts +1 -1
  39. package/dist/Form/FormItemContext.js.map +1 -1
  40. package/dist/Form/index.js +50 -7
  41. package/dist/Form/index.js.map +1 -1
  42. package/dist/IconButton/index.d.ts +2 -2
  43. package/dist/IconButton/index.js +9 -3
  44. package/dist/IconButton/index.js.map +1 -1
  45. package/dist/Input/components/Input/index.js +18 -8
  46. package/dist/Input/components/Input/index.js.map +1 -1
  47. package/dist/Input/components/TextArea/index.js +18 -7
  48. package/dist/Input/components/TextArea/index.js.map +1 -1
  49. package/dist/Input/privateSemanticOwner.d.ts +2 -0
  50. package/dist/Input/privateSemanticOwner.js +1 -0
  51. package/dist/InputNumber/index.js +16 -9
  52. package/dist/InputNumber/index.js.map +1 -1
  53. package/dist/InputNumber/type.d.ts +2 -2
  54. package/dist/LogicTree/components/LogicItem/index.d.ts +2 -1
  55. package/dist/LogicTree/components/LogicItem/index.js +13 -2
  56. package/dist/LogicTree/components/LogicItem/index.js.map +1 -1
  57. package/dist/LogicTree/index.js +2 -0
  58. package/dist/LogicTree/index.js.map +1 -1
  59. package/dist/MemberPicker/components/MemberSelection.d.ts +2 -0
  60. package/dist/MemberPicker/components/MemberSelection.js +15 -13
  61. package/dist/MemberPicker/components/MemberSelection.js.map +1 -1
  62. package/dist/MemberPicker/components/MultipleOption.js +12 -0
  63. package/dist/MemberPicker/components/MultipleOption.js.map +1 -1
  64. package/dist/MemberPicker/components/Panel.d.ts +2 -0
  65. package/dist/MemberPicker/components/Panel.js +11 -1
  66. package/dist/MemberPicker/components/Panel.js.map +1 -1
  67. package/dist/MemberPicker/components/PanelWrapper.js +2 -0
  68. package/dist/MemberPicker/components/PanelWrapper.js.map +1 -1
  69. package/dist/MemberPicker/components/SelectedMemberTags.js +14 -6
  70. package/dist/MemberPicker/components/SelectedMemberTags.js.map +1 -1
  71. package/dist/MemberPicker/components/SingleOption.js +12 -0
  72. package/dist/MemberPicker/components/SingleOption.js.map +1 -1
  73. package/dist/MemberPicker/components/UserGroupSelection.d.ts +3 -1
  74. package/dist/MemberPicker/components/UserGroupSelection.js +65 -42
  75. package/dist/MemberPicker/components/UserGroupSelection.js.map +1 -1
  76. package/dist/MemberPicker/index.js +134 -108
  77. package/dist/MemberPicker/index.js.map +1 -1
  78. package/dist/Menu/index.d.ts +8 -0
  79. package/dist/Menu/index.js +33 -3
  80. package/dist/Menu/index.js.map +1 -1
  81. package/dist/Modal/index.d.ts +4 -0
  82. package/dist/Modal/index.js +55 -66
  83. package/dist/Modal/index.js.map +1 -1
  84. package/dist/OverflowCount/index.js +10 -0
  85. package/dist/OverflowCount/index.js.map +1 -1
  86. package/dist/Pagination/index.js +1 -0
  87. package/dist/Pagination/index.js.map +1 -1
  88. package/dist/Popconfirm/index.js +9 -1
  89. package/dist/Popconfirm/index.js.map +1 -1
  90. package/dist/Popover/index.js +52 -1
  91. package/dist/Popover/index.js.map +1 -1
  92. package/dist/Progress/index.js +4 -0
  93. package/dist/Progress/index.js.map +1 -1
  94. package/dist/Radio/components/Group/index.d.ts +5 -1
  95. package/dist/Radio/components/Group/index.js +7 -2
  96. package/dist/Radio/components/Group/index.js.map +1 -1
  97. package/dist/Radio/components/Radio/index.js +26 -0
  98. package/dist/Radio/components/Radio/index.js.map +1 -1
  99. package/dist/Radio/interface/radio.d.ts +7 -0
  100. package/dist/Radio/interface/radioGroup.d.ts +2 -0
  101. package/dist/RenameInput/index.js +11 -0
  102. package/dist/RenameInput/index.js.map +1 -1
  103. package/dist/Select/BaseSelect.d.ts +3 -0
  104. package/dist/Select/BaseSelect.js +229 -32
  105. package/dist/Select/BaseSelect.js.map +1 -1
  106. package/dist/Select/SelectTrigger.d.ts +2 -0
  107. package/dist/Select/SelectTrigger.js +13 -5
  108. package/dist/Select/SelectTrigger.js.map +1 -1
  109. package/dist/Select/components/OptionCollection.d.ts +41 -0
  110. package/dist/Select/components/OptionCollection.js +124 -0
  111. package/dist/Select/components/OptionCollection.js.map +1 -0
  112. package/dist/Select/index.js +45 -3
  113. package/dist/Select/index.js.map +1 -1
  114. package/dist/Select/interface.d.ts +1 -1
  115. package/dist/Skeleton/index.js +1 -1
  116. package/dist/Skeleton/index.js.map +1 -1
  117. package/dist/Spin/index.d.ts +1 -1
  118. package/dist/Spin/index.js +22 -7
  119. package/dist/Spin/index.js.map +1 -1
  120. package/dist/Switch/index.d.ts +5 -0
  121. package/dist/Switch/index.js +15 -5
  122. package/dist/Switch/index.js.map +1 -1
  123. package/dist/Table/components/Header.js +0 -1
  124. package/dist/Table/components/Header.js.map +1 -1
  125. package/dist/Table/index.js +42 -27
  126. package/dist/Table/index.js.map +1 -1
  127. package/dist/Tabs/index.js +1 -0
  128. package/dist/Tabs/index.js.map +1 -1
  129. package/dist/Tag/index.js +20 -1
  130. package/dist/Tag/index.js.map +1 -1
  131. package/dist/Tooltip/index.js +34 -5
  132. package/dist/Tooltip/index.js.map +1 -1
  133. package/dist/Tour/index.js +13 -1
  134. package/dist/Tour/index.js.map +1 -1
  135. package/dist/Tree/Tree2.js +2 -0
  136. package/dist/Tree/Tree2.js.map +1 -1
  137. package/dist/_utils/dialogAccessibility.d.ts +17 -0
  138. package/dist/_utils/dialogAccessibility.js +110 -0
  139. package/dist/_utils/dialogAccessibility.js.map +1 -0
  140. package/dist/_utils/formControlSemanticOwner.d.ts +3 -0
  141. package/dist/_utils/formControlSemanticOwner.js +17 -0
  142. package/dist/_utils/formControlSemanticOwner.js.map +1 -0
  143. package/dist/_utils/overlayCoordinator.js +1 -11
  144. package/dist/_utils/overlayCoordinator.js.map +1 -1
  145. package/dist/aloudata-design.css +1 -1
  146. package/dist/governance/semantic.d.ts +1 -0
  147. package/dist/governance/semantic.js +2 -0
  148. package/dist/governance/semantic.json +1737 -0
  149. package/dist/theme/contract/baselineResolvedTokenValueManifest.d.ts +1 -1
  150. package/dist/theme/contract/darkResolvedTokenValueManifest.d.ts +1 -1
  151. package/dist/theme/contract/tokenOutputContract.js +1 -0
  152. package/dist/theme/contract/tokenOutputContract.js.map +1 -1
  153. package/dist/theme/generator/acceptedColorValues.d.ts +2 -1
  154. package/dist/theme/generator/baselineTokenValueDelivery.d.ts +9 -1
  155. package/dist/theme/generator/minimalAcceptedColorValues.d.ts +2 -2
  156. package/dist/theme/generator/neutralSourceResolver.d.ts +28 -0
  157. package/dist/theme/generator/neutralSourceResolver.js +2 -0
  158. package/dist/theme/generator/neutralSourceValues.d.ts +28 -0
  159. package/dist/theme/generator/neutralSourceValues.js +2 -0
  160. package/dist/theme/governance/semanticGovernanceContract.d.ts +91 -0
  161. package/dist/theme/governance/semanticGovernanceContract.js +342 -0
  162. package/dist/theme/governance/semanticGovernanceContract.js.map +1 -0
  163. package/dist/theme/index.d.ts +2 -0
  164. package/dist/theme/index.js +1 -0
  165. package/dist/theme/neutralSourceContract.d.ts +3 -0
  166. package/dist/theme/neutralSourceContract.js +11 -0
  167. package/dist/theme/neutralSourceContract.js.map +1 -0
  168. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.d.ts +1 -1
  169. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js +46 -45
  170. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js.map +1 -1
  171. package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.d.ts +3 -0
  172. package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.js +2 -0
  173. package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.d.ts +3 -0
  174. package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.js +2 -0
  175. package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.d.ts +3 -0
  176. package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.js +2 -0
  177. package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.d.ts +3 -0
  178. package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.js +2 -0
  179. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.d.ts +1 -1
  180. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js +42 -41
  181. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js.map +1 -1
  182. package/dist/theme/runtime/colorValueMode/index.js +2 -12
  183. package/dist/theme/runtime/colorValueMode/index.js.map +1 -1
  184. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.d.ts +2 -0
  185. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js +48 -0
  186. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js.map +1 -0
  187. package/dist/theme/runtime/colorValueMode/registry.d.ts +1 -1
  188. package/dist/theme/runtime/colorValueMode/registry.js +2 -1
  189. package/dist/theme/runtime/colorValueMode/registry.js.map +1 -1
  190. package/dist/theme/runtime/initAldTheme.js +1 -3
  191. package/dist/theme/runtime/initAldTheme.js.map +1 -1
  192. package/dist/theme/runtime/neutralSource/index.d.ts +6 -0
  193. package/dist/theme/runtime/neutralSource/index.js +11 -0
  194. package/dist/theme/runtime/neutralSource/index.js.map +1 -0
  195. package/dist/theme/runtime/neutralSource.d.ts +2 -0
  196. package/package.json +12 -2
@@ -1,11 +1,12 @@
1
1
  import { cn } from "../lib/utils.js";
2
2
  import DisabledContext from "../ConfigProvider/DisabledContext.js";
3
+ import { getSemanticOwnerAriaProps } from "../_utils/formControlSemanticOwner.js";
3
4
  import { createContext, useContext, useEffect, useRef, useState } from "react";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
5
6
  //#region src/Checkbox/index.tsx
6
7
  var CheckboxGroupContext = createContext(null);
7
8
  function Checkbox(props) {
8
- const { className, disabled: customDisabled, alert, bold, size, checked: controlledChecked, defaultChecked, indeterminate, onChange, onClick, autoFocus, children, value, name, style, "data-testid": dataTestid, "aria-label": ariaLabel } = props;
9
+ const { className, disabled: customDisabled, alert, bold, size, checked: controlledChecked, defaultChecked, indeterminate, onChange, onClick, autoFocus, children, value, name, required, style, "data-testid": dataTestid, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, "aria-invalid": ariaInvalid, "aria-required": ariaRequired, "aria-disabled": ariaDisabled } = props;
9
10
  const disabled = useContext(DisabledContext);
10
11
  const group = useContext(CheckboxGroupContext);
11
12
  const isGroupCheckbox = group !== null && value !== void 0;
@@ -58,6 +59,16 @@ function Checkbox(props) {
58
59
  className: "tw-absolute tw-inset-0 tw-m-0 tw-cursor-pointer tw-opacity-0 disabled:tw-cursor-default",
59
60
  checked: !!checked,
60
61
  disabled: mergedDisabled,
62
+ required,
63
+ "aria-checked": indeterminate ? "mixed" : void 0,
64
+ ...getSemanticOwnerAriaProps({
65
+ "aria-label": ariaLabel,
66
+ "aria-labelledby": ariaLabelledBy,
67
+ "aria-describedby": ariaDescribedBy,
68
+ "aria-invalid": ariaInvalid,
69
+ "aria-required": ariaRequired,
70
+ "aria-disabled": ariaDisabled
71
+ }),
61
72
  onChange: handleChange,
62
73
  autoFocus,
63
74
  name: group?.name ?? name,
@@ -76,7 +87,7 @@ function Checkbox(props) {
76
87
  });
77
88
  }
78
89
  function CheckboxGroup(props) {
79
- const { className, disabled: customDisabled, size, options, value: controlledValue, defaultValue, onChange, direction, name, children, style } = props;
90
+ const { className, disabled: customDisabled, size, options, value: controlledValue, defaultValue, onChange, direction, name, children, style, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy } = props;
80
91
  const disabled = useContext(DisabledContext);
81
92
  const mergedDisabled = customDisabled ?? disabled;
82
93
  const isControlled = "value" in props;
@@ -106,6 +117,10 @@ function CheckboxGroup(props) {
106
117
  return /* @__PURE__ */ jsx("div", {
107
118
  className: cn("ald-checkbox-group tw-flex tw-flex-wrap tw-gap-3", direction === "vertical" && "ald-checkbox-group-vertical tw-flex-col", size === "small" && "ald-checkbox-group-small", className),
108
119
  style,
120
+ role: "group",
121
+ "aria-label": ariaLabel,
122
+ "aria-labelledby": ariaLabelledBy,
123
+ "aria-describedby": ariaDescribedBy,
109
124
  children: /* @__PURE__ */ jsx(CheckboxGroupContext.Provider, {
110
125
  value: {
111
126
  value,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/Checkbox/index.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport DisabledContext from '../ConfigProvider/DisabledContext';\nimport { cn } from '../lib/utils';\nimport {\n CheckboxChangeEvent,\n CheckboxValueType,\n ICheckboxGroupProps,\n ICheckboxProps,\n} from './type';\n\nexport type { CheckboxChangeEvent, CheckboxValueType };\nexport type { CheckboxOptionType } from './type';\nexport type { ICheckboxProps, ICheckboxGroupProps };\n\ninterface CheckboxGroupContextValue {\n value: CheckboxValueType[];\n disabled?: boolean;\n name?: string;\n toggleOption: (value: CheckboxValueType, checked: boolean) => void;\n}\n\nconst CheckboxGroupContext = createContext<CheckboxGroupContextValue | null>(\n null,\n);\n\nfunction Checkbox(props: ICheckboxProps) {\n const {\n className,\n disabled: customDisabled,\n alert,\n bold,\n size,\n checked: controlledChecked,\n defaultChecked,\n indeterminate,\n onChange,\n onClick,\n autoFocus,\n children,\n value,\n name,\n style,\n 'data-testid': dataTestid,\n 'aria-label': ariaLabel,\n } = props;\n\n const disabled = useContext(DisabledContext);\n const group = useContext(CheckboxGroupContext);\n const isGroupCheckbox = group !== null && value !== undefined;\n const mergedDisabled = group?.disabled || customDisabled || disabled;\n\n const isControlled = isGroupCheckbox || 'checked' in props;\n const [innerChecked, setInnerChecked] = useState(defaultChecked ?? false);\n const checked = isGroupCheckbox\n ? group.value.includes(value)\n : isControlled\n ? controlledChecked\n : innerChecked;\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = !!indeterminate;\n }\n }, [indeterminate]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (mergedDisabled) return;\n const newChecked = e.target.checked;\n if (isGroupCheckbox) {\n group.toggleOption(value, newChecked);\n } else if (!isControlled) {\n setInnerChecked(newChecked);\n }\n onChange?.({\n target: { checked: newChecked, value },\n nativeEvent: e.nativeEvent,\n });\n };\n\n const handleLabelClick = (e: React.MouseEvent) => {\n if (mergedDisabled) return;\n if (onClick) {\n // Table row selection uses onClick — prevent label from also toggling input\n e.preventDefault();\n e.stopPropagation();\n onClick(e);\n }\n };\n\n return (\n <label\n onClick={handleLabelClick}\n data-testid={dataTestid}\n aria-label={ariaLabel}\n className={cn(\n 'ald-checkbox-wrapper ald-checkbox tw-inline-flex tw-cursor-pointer tw-items-center tw-gap-2 tw-leading-5',\n mergedDisabled && 'tw-cursor-default',\n size === 'small' && 'ald-checkbox-small',\n !mergedDisabled &&\n '[&:hover_.ald-checkbox-inner]:tw-border-2 [&:hover_.ald-checkbox-inner]:tw-border-[var(--border-brand-strong)]',\n !mergedDisabled &&\n checked &&\n '[&:hover_.ald-checkbox-inner]:tw-border-[var(--action-ghost-normal)] [&:hover_.ald-checkbox-inner]:tw-bg-[var(--action-primary-hover)]',\n className,\n )}\n style={style}\n >\n <span\n className={cn(\n 'ald-checkbox-inner tw-relative tw-box-border tw-flex tw-size-4 tw-min-h-4 tw-min-w-4 tw-items-center tw-justify-center tw-rounded-r-50 tw-border-2 tw-border-solid tw-transition-colors tw-duration-200',\n // The native input owns focus and its visual control owns the\n // Focus State Layer. Checked, indeterminate, and alert styling\n // remain independent control states.\n !mergedDisabled && [\n 'has-[input:focus-visible]:tw-shadow-[0_0_0_2px_var(--focus-ring)]',\n 'forced-colors:has-[input:focus-visible]:tw-outline',\n 'forced-colors:has-[input:focus-visible]:tw-outline-2',\n 'forced-colors:has-[input:focus-visible]:tw-outline-offset-2',\n 'forced-colors:has-[input:focus-visible]:tw-outline-[Highlight]',\n ],\n checked && 'ald-checkbox-checked',\n checked &&\n !mergedDisabled &&\n 'tw-border-[var(--action-ghost-normal)] tw-bg-[var(--action-primary-normal)]',\n checked &&\n mergedDisabled &&\n 'tw-border-[var(--content-disabled)] tw-bg-[var(--content-disabled)]',\n !checked &&\n !indeterminate &&\n mergedDisabled &&\n 'tw-border-[var(--content-disabled)] tw-bg-[var(--background-neutral-on-subtle)]',\n !checked &&\n !indeterminate &&\n !mergedDisabled &&\n !alert &&\n 'tw-border-[var(--border-neutral-subtle)] tw-bg-[var(--background-default)]',\n !checked &&\n !indeterminate &&\n !mergedDisabled &&\n alert &&\n 'tw-border-[var(--border-negative-strong)] tw-bg-[var(--background-default)]',\n indeterminate && !checked && 'ald-checkbox-indeterminate',\n indeterminate &&\n !checked &&\n !mergedDisabled &&\n 'tw-border-[var(--action-ghost-normal)] tw-bg-[var(--action-primary-normal)]',\n indeterminate &&\n !checked &&\n mergedDisabled &&\n 'tw-border-[var(--content-disabled)] tw-bg-[var(--content-disabled)]',\n )}\n >\n <input\n ref={inputRef}\n type=\"checkbox\"\n className=\"tw-absolute tw-inset-0 tw-m-0 tw-cursor-pointer tw-opacity-0 disabled:tw-cursor-default\"\n checked={!!checked}\n disabled={mergedDisabled}\n onChange={handleChange}\n autoFocus={autoFocus}\n name={group?.name ?? name}\n value={value as string}\n />\n {(checked || (indeterminate && !checked)) && (\n <span\n className=\"tw-absolute tw-inset-0 tw-bg-center tw-bg-no-repeat\"\n style={{\n backgroundImage:\n indeterminate && !checked\n ? 'url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMiIgdmlld0JveD0iMCAwIDEwIDIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGlkPSJWZWN0b3IgMSAoU3Ryb2tlKSIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wLjc1IDFDMC43NSAwLjU4NTc4NiAxLjA4NTc5IDAuMjUgMS41IDAuMjVIOC41QzguOTE0MjEgMC4yNSA5LjI1IDAuNTg1Nzg2IDkuMjUgMUM5LjI1IDEuNDE0MjEgOC45MTQyMSAxLjc1IDguNSAxLjc1SDEuNUMxLjA4NTc5IDEuNzUgMC43NSAxLjQxNDIxIDAuNzUgMVoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=\")'\n : 'url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iOCIgdmlld0JveD0iMCAwIDEwIDgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGlkPSJJY29uIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNTMwMzMgMC45Njk2N0M5LjgyMzIyIDEuMjYyNTYgOS44MjMyMiAxLjczNzQ0IDkuNTMwMzMgMi4wMzAzM0w0LjUzMDMzIDcuMDMwMzNDNC4yMzc0NCA3LjMyMzIyIDMuNzYyNTYgNy4zMjMyMiAzLjQ2OTY3IDcuMDMwMzNMMC45Njk2NyA0LjUzMDMzQzAuNjc2Nzc3IDQuMjM3NDQgMC42NzY3NzcgMy43NjI1NiAwLjk2OTY3IDMuNDY5NjdDMS4yNjI1NiAzLjE3Njc4IDEuNzM3NDQgMy4xNzY3OCAyLjAzMDMzIDMuNDY5NjdMNCA1LjQzOTM0TDguNDY5NjcgMC45Njk2N0M4Ljc2MjU2IDAuNjc2Nzc3IDkuMjM3NDQgMC42NzY3NzcgOS41MzAzMyAwLjk2OTY3WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==\")',\n backgroundSize:\n indeterminate && !checked ? '10px 2px' : '10px 8px',\n }}\n />\n )}\n </span>\n {children && (\n <span\n className={cn(\n 'ald-checkbox-label tw-inline-flex tw-select-none tw-items-center tw-gap-1 tw-text-[var(--content-primary)] [&_svg]:tw-inline-block [&_svg]:tw-shrink-0',\n 'tw-text-typography-label',\n bold && 'tw-font-medium',\n mergedDisabled &&\n 'tw-cursor-default tw-text-[var(--content-disabled)]',\n )}\n >\n {children}\n </span>\n )}\n </label>\n );\n}\n\nfunction CheckboxGroup(props: ICheckboxGroupProps) {\n const {\n className,\n disabled: customDisabled,\n size,\n options,\n value: controlledValue,\n defaultValue,\n onChange,\n direction,\n name,\n children,\n style,\n } = props;\n\n const disabled = useContext(DisabledContext);\n const mergedDisabled = customDisabled ?? disabled;\n\n const isControlled = 'value' in props;\n const [innerValue, setInnerValue] = useState<CheckboxValueType[]>(\n defaultValue ?? [],\n );\n const value = isControlled ? controlledValue ?? [] : innerValue;\n\n const handleGroupChange = (\n itemValue: CheckboxValueType,\n itemChecked: boolean,\n ) => {\n const newValue = itemChecked\n ? [...value, itemValue]\n : value.filter((v) => v !== itemValue);\n if (!isControlled) {\n setInnerValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const renderOptions = () => {\n if (!options) return children;\n return options.map((opt) => {\n const optObj =\n typeof opt === 'object' ? opt : { label: String(opt), value: opt };\n return (\n <Checkbox\n key={String(optObj.value)}\n value={optObj.value}\n disabled={optObj.disabled}\n size={size}\n onChange={optObj.onChange}\n >\n {optObj.label}\n </Checkbox>\n );\n });\n };\n\n return (\n <div\n className={cn(\n 'ald-checkbox-group tw-flex tw-flex-wrap tw-gap-3',\n direction === 'vertical' && 'ald-checkbox-group-vertical tw-flex-col',\n size === 'small' && 'ald-checkbox-group-small',\n className,\n )}\n style={style}\n >\n <CheckboxGroupContext.Provider\n value={{\n value,\n disabled: mergedDisabled,\n name,\n toggleOption: handleGroupChange,\n }}\n >\n {renderOptions()}\n </CheckboxGroupContext.Provider>\n </div>\n );\n}\n\nCheckbox.Group = CheckboxGroup;\n\nexport default Checkbox;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/Checkbox/index.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport DisabledContext from '../ConfigProvider/DisabledContext';\nimport { getSemanticOwnerAriaProps } from '../_utils/formControlSemanticOwner';\nimport { cn } from '../lib/utils';\nimport {\n CheckboxChangeEvent,\n CheckboxValueType,\n ICheckboxGroupProps,\n ICheckboxProps,\n} from './type';\n\nexport type { CheckboxChangeEvent, CheckboxValueType };\nexport type { CheckboxOptionType } from './type';\nexport type { ICheckboxProps, ICheckboxGroupProps };\n\ninterface CheckboxGroupContextValue {\n value: CheckboxValueType[];\n disabled?: boolean;\n name?: string;\n toggleOption: (value: CheckboxValueType, checked: boolean) => void;\n}\n\nconst CheckboxGroupContext = createContext<CheckboxGroupContextValue | null>(\n null,\n);\n\nfunction Checkbox(props: ICheckboxProps) {\n const {\n className,\n disabled: customDisabled,\n alert,\n bold,\n size,\n checked: controlledChecked,\n defaultChecked,\n indeterminate,\n onChange,\n onClick,\n autoFocus,\n children,\n value,\n name,\n required,\n style,\n 'data-testid': dataTestid,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n 'aria-disabled': ariaDisabled,\n } = props;\n\n const disabled = useContext(DisabledContext);\n const group = useContext(CheckboxGroupContext);\n const isGroupCheckbox = group !== null && value !== undefined;\n const mergedDisabled = group?.disabled || customDisabled || disabled;\n\n const isControlled = isGroupCheckbox || 'checked' in props;\n const [innerChecked, setInnerChecked] = useState(defaultChecked ?? false);\n const checked = isGroupCheckbox\n ? group.value.includes(value)\n : isControlled\n ? controlledChecked\n : innerChecked;\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.indeterminate = !!indeterminate;\n }\n }, [indeterminate]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (mergedDisabled) return;\n const newChecked = e.target.checked;\n if (isGroupCheckbox) {\n group.toggleOption(value, newChecked);\n } else if (!isControlled) {\n setInnerChecked(newChecked);\n }\n onChange?.({\n target: { checked: newChecked, value },\n nativeEvent: e.nativeEvent,\n });\n };\n\n const handleLabelClick = (e: React.MouseEvent) => {\n if (mergedDisabled) return;\n if (onClick) {\n // Table row selection uses onClick — prevent label from also toggling input\n e.preventDefault();\n e.stopPropagation();\n onClick(e);\n }\n };\n\n return (\n <label\n onClick={handleLabelClick}\n data-testid={dataTestid}\n aria-label={ariaLabel}\n className={cn(\n 'ald-checkbox-wrapper ald-checkbox tw-inline-flex tw-cursor-pointer tw-items-center tw-gap-2 tw-leading-5',\n mergedDisabled && 'tw-cursor-default',\n size === 'small' && 'ald-checkbox-small',\n !mergedDisabled &&\n '[&:hover_.ald-checkbox-inner]:tw-border-2 [&:hover_.ald-checkbox-inner]:tw-border-[var(--border-brand-strong)]',\n !mergedDisabled &&\n checked &&\n '[&:hover_.ald-checkbox-inner]:tw-border-[var(--action-ghost-normal)] [&:hover_.ald-checkbox-inner]:tw-bg-[var(--action-primary-hover)]',\n className,\n )}\n style={style}\n >\n <span\n className={cn(\n 'ald-checkbox-inner tw-relative tw-box-border tw-flex tw-size-4 tw-min-h-4 tw-min-w-4 tw-items-center tw-justify-center tw-rounded-r-50 tw-border-2 tw-border-solid tw-transition-colors tw-duration-200',\n // The native input owns focus and its visual control owns the\n // Focus State Layer. Checked, indeterminate, and alert styling\n // remain independent control states.\n !mergedDisabled && [\n 'has-[input:focus-visible]:tw-shadow-[0_0_0_2px_var(--focus-ring)]',\n 'forced-colors:has-[input:focus-visible]:tw-outline',\n 'forced-colors:has-[input:focus-visible]:tw-outline-2',\n 'forced-colors:has-[input:focus-visible]:tw-outline-offset-2',\n 'forced-colors:has-[input:focus-visible]:tw-outline-[Highlight]',\n ],\n checked && 'ald-checkbox-checked',\n checked &&\n !mergedDisabled &&\n 'tw-border-[var(--action-ghost-normal)] tw-bg-[var(--action-primary-normal)]',\n checked &&\n mergedDisabled &&\n 'tw-border-[var(--content-disabled)] tw-bg-[var(--content-disabled)]',\n !checked &&\n !indeterminate &&\n mergedDisabled &&\n 'tw-border-[var(--content-disabled)] tw-bg-[var(--background-neutral-on-subtle)]',\n !checked &&\n !indeterminate &&\n !mergedDisabled &&\n !alert &&\n 'tw-border-[var(--border-neutral-subtle)] tw-bg-[var(--background-default)]',\n !checked &&\n !indeterminate &&\n !mergedDisabled &&\n alert &&\n 'tw-border-[var(--border-negative-strong)] tw-bg-[var(--background-default)]',\n indeterminate && !checked && 'ald-checkbox-indeterminate',\n indeterminate &&\n !checked &&\n !mergedDisabled &&\n 'tw-border-[var(--action-ghost-normal)] tw-bg-[var(--action-primary-normal)]',\n indeterminate &&\n !checked &&\n mergedDisabled &&\n 'tw-border-[var(--content-disabled)] tw-bg-[var(--content-disabled)]',\n )}\n >\n <input\n ref={inputRef}\n type=\"checkbox\"\n className=\"tw-absolute tw-inset-0 tw-m-0 tw-cursor-pointer tw-opacity-0 disabled:tw-cursor-default\"\n checked={!!checked}\n disabled={mergedDisabled}\n required={required}\n aria-checked={indeterminate ? 'mixed' : undefined}\n {...getSemanticOwnerAriaProps({\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n 'aria-disabled': ariaDisabled,\n })}\n onChange={handleChange}\n autoFocus={autoFocus}\n name={group?.name ?? name}\n value={value as string}\n />\n {(checked || (indeterminate && !checked)) && (\n <span\n className=\"tw-absolute tw-inset-0 tw-bg-center tw-bg-no-repeat\"\n style={{\n backgroundImage:\n indeterminate && !checked\n ? 'url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iMiIgdmlld0JveD0iMCAwIDEwIDIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGlkPSJWZWN0b3IgMSAoU3Ryb2tlKSIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wLjc1IDFDMC43NSAwLjU4NTc4NiAxLjA4NTc5IDAuMjUgMS41IDAuMjVIOC41QzguOTE0MjEgMC4yNSA5LjI1IDAuNTg1Nzg2IDkuMjUgMUM5LjI1IDEuNDE0MjEgOC45MTQyMSAxLjc1IDguNSAxLjc1SDEuNUMxLjA4NTc5IDEuNzUgMC43NSAxLjQxNDIxIDAuNzUgMVoiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=\")'\n : 'url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAiIGhlaWdodD0iOCIgdmlld0JveD0iMCAwIDEwIDgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGlkPSJJY29uIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTkuNTMwMzMgMC45Njk2N0M5LjgyMzIyIDEuMjYyNTYgOS44MjMyMiAxLjczNzQ0IDkuNTMwMzMgMi4wMzAzM0w0LjUzMDMzIDcuMDMwMzNDNC4yMzc0NCA3LjMyMzIyIDMuNzYyNTYgNy4zMjMyMiAzLjQ2OTY3IDcuMDMwMzNMMC45Njk2NyA0LjUzMDMzQzAuNjc2Nzc3IDQuMjM3NDQgMC42NzY3NzcgMy43NjI1NiAwLjk2OTY3IDMuNDY5NjdDMS4yNjI1NiAzLjE3Njc4IDEuNzM3NDQgMy4xNzY3OCAyLjAzMDMzIDMuNDY5NjdMNCA1LjQzOTM0TDguNDY5NjcgMC45Njk2N0M4Ljc2MjU2IDAuNjc2Nzc3IDkuMjM3NDQgMC42NzY3NzcgOS41MzAzMyAwLjk2OTY3WiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg==\")',\n backgroundSize:\n indeterminate && !checked ? '10px 2px' : '10px 8px',\n }}\n />\n )}\n </span>\n {children && (\n <span\n className={cn(\n 'ald-checkbox-label tw-inline-flex tw-select-none tw-items-center tw-gap-1 tw-text-[var(--content-primary)] [&_svg]:tw-inline-block [&_svg]:tw-shrink-0',\n 'tw-text-typography-label',\n bold && 'tw-font-medium',\n mergedDisabled &&\n 'tw-cursor-default tw-text-[var(--content-disabled)]',\n )}\n >\n {children}\n </span>\n )}\n </label>\n );\n}\n\nfunction CheckboxGroup(props: ICheckboxGroupProps) {\n const {\n className,\n disabled: customDisabled,\n size,\n options,\n value: controlledValue,\n defaultValue,\n onChange,\n direction,\n name,\n children,\n style,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n } = props;\n\n const disabled = useContext(DisabledContext);\n const mergedDisabled = customDisabled ?? disabled;\n\n const isControlled = 'value' in props;\n const [innerValue, setInnerValue] = useState<CheckboxValueType[]>(\n defaultValue ?? [],\n );\n const value = isControlled ? controlledValue ?? [] : innerValue;\n\n const handleGroupChange = (\n itemValue: CheckboxValueType,\n itemChecked: boolean,\n ) => {\n const newValue = itemChecked\n ? [...value, itemValue]\n : value.filter((v) => v !== itemValue);\n if (!isControlled) {\n setInnerValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const renderOptions = () => {\n if (!options) return children;\n return options.map((opt) => {\n const optObj =\n typeof opt === 'object' ? opt : { label: String(opt), value: opt };\n return (\n <Checkbox\n key={String(optObj.value)}\n value={optObj.value}\n disabled={optObj.disabled}\n size={size}\n onChange={optObj.onChange}\n >\n {optObj.label}\n </Checkbox>\n );\n });\n };\n\n return (\n <div\n className={cn(\n 'ald-checkbox-group tw-flex tw-flex-wrap tw-gap-3',\n direction === 'vertical' && 'ald-checkbox-group-vertical tw-flex-col',\n size === 'small' && 'ald-checkbox-group-small',\n className,\n )}\n style={style}\n role=\"group\"\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n >\n <CheckboxGroupContext.Provider\n value={{\n value,\n disabled: mergedDisabled,\n name,\n toggleOption: handleGroupChange,\n }}\n >\n {renderOptions()}\n </CheckboxGroupContext.Provider>\n </div>\n );\n}\n\nCheckbox.Group = CheckboxGroup;\n\nexport default Checkbox;\n"],"mappings":"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"}
@@ -35,10 +35,15 @@ export interface ICheckboxProps {
35
35
  children?: React.ReactNode;
36
36
  value?: CheckboxValueType;
37
37
  name?: string;
38
+ required?: boolean;
39
+ 'aria-label'?: string;
40
+ 'aria-labelledby'?: string;
41
+ 'aria-describedby'?: string;
42
+ 'aria-invalid'?: React.AriaAttributes['aria-invalid'];
43
+ 'aria-required'?: React.AriaAttributes['aria-required'];
44
+ 'aria-disabled'?: React.AriaAttributes['aria-disabled'];
38
45
  /** 透传到根 label 元素的 data-testid,用于自动化测试定位 */
39
46
  'data-testid'?: string;
40
- /** 透传到根 label 元素的 aria-label,用于可访问性与自动化测试定位 */
41
- 'aria-label'?: string;
42
47
  }
43
48
  export interface ICheckboxGroupProps {
44
49
  defaultValue?: Array<CheckboxValueType>;
@@ -52,4 +57,7 @@ export interface ICheckboxGroupProps {
52
57
  style?: React.CSSProperties;
53
58
  size?: TSize;
54
59
  children?: React.ReactNode;
60
+ 'aria-label'?: string;
61
+ 'aria-labelledby'?: string;
62
+ 'aria-describedby'?: string;
55
63
  }
@@ -5,7 +5,7 @@ import { LocaleContext, getTranslator } from "../locale/default.js";
5
5
  import { colors, specialColors } from "./constant.js";
6
6
  /* empty css */
7
7
  import ColorPicker$1 from "./ComplexColorPicker/index.js";
8
- import { useContext, useEffect, useRef, useState } from "react";
8
+ import { useContext, useEffect, useId, useRef, useState } from "react";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
10
  //#region src/ColorPicker/index.tsx
11
11
  function getLocalRecentColors(localStorageKey) {
@@ -26,6 +26,15 @@ function ColorPicker({ className, value, icon, onChange, defaultColor = colors[0
26
26
  const [recentColors, setRecentColors] = useState([]);
27
27
  const overlayRef = useRef(null);
28
28
  const wrapRef = useRef(null);
29
+ const triggerRef = useRef(null);
30
+ const swatchRefs = useRef({});
31
+ const triggerId = `ald-color-picker-trigger-${useId().replace(/:/g, "")}`;
32
+ const popupId = `ald-color-picker-popup-${useId().replace(/:/g, "")}`;
33
+ const swatchOrder = Array.from(new Set([
34
+ defaultColor,
35
+ ...colors,
36
+ ...recentColors
37
+ ]));
29
38
  useEffect(() => {
30
39
  setRecentColors(getLocalRecentColors(localStorageKey));
31
40
  }, [localStorageKey]);
@@ -36,76 +45,115 @@ function ColorPicker({ className, value, icon, onChange, defaultColor = colors[0
36
45
  setLocalRecentColors(localStorageKey, newRecentColors);
37
46
  onChange?.(color);
38
47
  setOpen(false);
48
+ window.setTimeout(() => triggerRef.current?.focus(), 0);
39
49
  };
40
50
  useEffect(() => {
41
51
  const handleClick = (e) => {
42
- if (wrapRef.current?.contains(e.target)) return setOpen(!open);
43
- if (!overlayRef.current?.contains(e.target)) return setOpen(false);
52
+ if (!wrapRef.current?.contains(e.target) && !overlayRef.current?.contains(e.target)) return setOpen(false);
44
53
  };
45
54
  document.addEventListener("click", handleClick);
46
55
  return () => {
47
56
  document.removeEventListener("click", handleClick);
48
57
  };
49
- }, [open]);
58
+ }, []);
59
+ useEffect(() => {
60
+ if (!open) return;
61
+ const selectedIndex = Math.max(0, swatchOrder.indexOf(value ?? defaultColor));
62
+ window.setTimeout(() => {
63
+ swatchRefs.current[swatchOrder[selectedIndex]]?.focus();
64
+ }, 0);
65
+ }, [
66
+ defaultColor,
67
+ open,
68
+ swatchOrder,
69
+ value
70
+ ]);
71
+ useEffect(() => {
72
+ triggerRef.current?.setAttribute("aria-expanded", String(open));
73
+ triggerRef.current?.setAttribute("aria-controls", popupId);
74
+ }, [open, popupId]);
75
+ const renderSwatch = (color, label) => {
76
+ const selected = color === value;
77
+ const index = swatchOrder.indexOf(color);
78
+ const selectedIndex = Math.max(0, swatchOrder.indexOf(value ?? defaultColor));
79
+ return /* @__PURE__ */ jsx("button", {
80
+ type: "button",
81
+ id: `${popupId}-swatch-${encodeURIComponent(color)}`,
82
+ ref: (node) => {
83
+ swatchRefs.current[color] = node;
84
+ },
85
+ role: "radio",
86
+ "aria-label": label,
87
+ "aria-checked": selected,
88
+ tabIndex: index === selectedIndex ? 0 : -1,
89
+ disabled,
90
+ className: cn("tw-box-border tw-h-[21px] tw-w-[21px] tw-cursor-pointer tw-border tw-border-solid tw-border-[var(--background-default)] tw-bg-transparent tw-p-0", { "tw-border-[var(--border-neutral-strong)]": selected }),
91
+ onClick: () => {
92
+ if (!selected) onColorSelect(color);
93
+ },
94
+ onKeyDown: (event) => {
95
+ if (event.key === "Escape") {
96
+ event.preventDefault();
97
+ setOpen(false);
98
+ triggerRef.current?.focus();
99
+ return;
100
+ }
101
+ if (event.key === "ArrowRight" || event.key === "ArrowDown") {
102
+ event.preventDefault();
103
+ swatchRefs.current[swatchOrder[(index + 1) % swatchOrder.length]]?.focus();
104
+ return;
105
+ }
106
+ if (event.key === "ArrowLeft" || event.key === "ArrowUp") {
107
+ event.preventDefault();
108
+ swatchRefs.current[swatchOrder[(index - 1 + swatchOrder.length) % swatchOrder.length]]?.focus();
109
+ return;
110
+ }
111
+ if (event.key === "Home" || event.key === "End") {
112
+ event.preventDefault();
113
+ swatchRefs.current[swatchOrder[event.key === "Home" ? 0 : swatchOrder.length - 1]]?.focus();
114
+ }
115
+ },
116
+ style: { borderColor: selected ? "var(--border-neutral-strong)" : specialColors.includes(color) ? "var(--border-neutral-subtle)" : color },
117
+ children: /* @__PURE__ */ jsx("span", {
118
+ "aria-hidden": "true",
119
+ className: cn("tw-block tw-h-full tw-w-full", { "tw-m-px tw-h-[17px] tw-w-[17px]": selected }),
120
+ style: { backgroundColor: color }
121
+ })
122
+ }, `${label}-${color}`);
123
+ };
50
124
  const overlay = /* @__PURE__ */ jsxs("div", {
125
+ id: popupId,
126
+ role: "radiogroup",
127
+ "aria-label": t.ColorPicker.standardColor,
51
128
  className: "tw-relative tw-box-border tw-w-[253px] tw-rounded-sm tw-bg-[var(--background-default)] tw-p-[8px_7px]",
52
129
  ref: overlayRef,
130
+ onKeyDown: (event) => {
131
+ if (event.key === "Escape") {
132
+ event.preventDefault();
133
+ setOpen(false);
134
+ triggerRef.current?.focus();
135
+ }
136
+ },
53
137
  children: [
54
138
  /* @__PURE__ */ jsxs("div", {
55
139
  className: "tw-flex tw-items-center tw-text-xs",
56
140
  children: [/* @__PURE__ */ jsx("div", {
57
- className: cn("tw-mr-2 tw-box-border tw-h-[21px] tw-w-[21px] tw-cursor-pointer tw-border tw-border-solid tw-border-[var(--background-default)]", { "tw-border-[var(--border-neutral-strong)]": defaultColor === value }),
58
- onClick: () => {
59
- if (disabled) return;
60
- if (defaultColor === value) return;
61
- onColorSelect(defaultColor);
62
- },
63
- children: /* @__PURE__ */ jsx("div", {
64
- className: "tw-size-full",
65
- style: { backgroundColor: defaultColor }
66
- })
141
+ className: "tw-mr-2",
142
+ children: renderSwatch(defaultColor, t.ColorPicker.default)
67
143
  }), t.ColorPicker.default]
68
144
  }),
69
145
  /* @__PURE__ */ jsxs("div", {
70
146
  className: "tw-mt-1.5 tw-text-xs",
71
147
  children: [/* @__PURE__ */ jsx("p", { children: t.ColorPicker.standardColor }), /* @__PURE__ */ jsx("div", {
72
148
  className: "tw-mt-0.5 tw-flex tw-flex-wrap tw-justify-evenly tw-gap-[4px_2px] tw-text-[0px]",
73
- children: colors.map((color) => {
74
- const isSelected = color === value;
75
- return /* @__PURE__ */ jsx("div", {
76
- className: cn("tw-box-border tw-h-[21px] tw-w-[21px] tw-cursor-pointer tw-border tw-border-solid tw-border-[var(--background-default)]", { "tw-border-[var(--border-neutral-strong)]": isSelected }),
77
- onClick: () => {
78
- if (color === value) return;
79
- onColorSelect(color);
80
- },
81
- style: { borderColor: isSelected ? "var(--border-neutral-strong)" : specialColors.includes(color) ? "var(--border-neutral-subtle)" : color },
82
- children: /* @__PURE__ */ jsx("div", {
83
- className: cn("tw-h-full tw-w-full", { "tw-m-px tw-h-[17px] tw-w-[17px]": isSelected }),
84
- style: { backgroundColor: color }
85
- })
86
- }, color);
87
- })
149
+ children: colors.map((color) => renderSwatch(color, color))
88
150
  })]
89
151
  }),
90
152
  /* @__PURE__ */ jsxs("div", {
91
153
  className: "tw-mt-1.5 tw-text-xs",
92
154
  children: [/* @__PURE__ */ jsx("p", { children: t.ColorPicker.recentlyUsed }), /* @__PURE__ */ jsx("div", {
93
155
  className: "tw-mt-0.5 tw-flex tw-flex-wrap tw-justify-start tw-gap-[4px_2px] tw-text-[0px]",
94
- children: recentColors.map((color) => {
95
- const isSelected = color === value;
96
- return /* @__PURE__ */ jsx("div", {
97
- className: cn("tw-box-border tw-h-[21px] tw-w-[21px] tw-cursor-pointer tw-border tw-border-solid tw-border-[var(--background-default)]", { "tw-border-[var(--border-neutral-strong)]": isSelected }),
98
- onClick: () => {
99
- if (color === value) return;
100
- onColorSelect(color);
101
- },
102
- style: { borderColor: isSelected ? "var(--border-neutral-strong)" : specialColors.includes(color) ? "var(--border-neutral-subtle)" : color },
103
- children: /* @__PURE__ */ jsx("div", {
104
- className: cn("tw-h-full tw-w-full", { "tw-m-px tw-h-[17px] tw-w-[17px]": isSelected }),
105
- style: { backgroundColor: color }
106
- })
107
- }, color);
108
- })
156
+ children: recentColors.map((color) => renderSwatch(color, color))
109
157
  })]
110
158
  })
111
159
  ]
@@ -116,13 +164,20 @@ function ColorPicker({ className, value, icon, onChange, defaultColor = colors[0
116
164
  children: /* @__PURE__ */ jsx(Dropdown, {
117
165
  trigger: "click",
118
166
  open,
167
+ onOpenChange: setOpen,
119
168
  disabled,
120
169
  placement: "bottom-start",
121
170
  overlayClassName: "ald-color-picker-overlay-wrapper",
122
171
  dropdownRender: () => {
123
172
  return overlay;
124
173
  },
125
- children: /* @__PURE__ */ jsxs("div", {
174
+ children: /* @__PURE__ */ jsxs("button", {
175
+ type: "button",
176
+ id: triggerId,
177
+ ref: triggerRef,
178
+ "aria-label": t.ColorPicker.default,
179
+ "aria-controls": popupId,
180
+ "aria-expanded": open,
126
181
  className: cn("ald-color-picker-wrapper", "tw-flex tw-flex-row tw-items-center tw-justify-between tw-gap-1 tw-h-7 tw-px-2.5 tw-py-1.5 tw-bg-[var(--background-default)] tw-border tw-border-solid tw-border-[var(--border-neutral-subtle)] tw-box-border tw-cursor-pointer tw-rounded tw-text-[var(--content-primary)] tw-transition-[border] tw-duration-500 tw-ease-in-out", {
127
182
  "tw-border-[var(--border-brand-subtle)]": open && bordered !== false,
128
183
  "tw-border-[var(--border-neutral-subtle)] tw-bg-[var(--background-neutral-on-subtle)]": disabled,
@@ -131,7 +186,18 @@ function ColorPicker({ className, value, icon, onChange, defaultColor = colors[0
131
186
  "hover:tw-border-[var(--action-ghost-normal)]": bordered === false
132
187
  }),
133
188
  onClick: (e) => {
134
- if (disabled) e.stopPropagation();
189
+ if (disabled) {
190
+ e.stopPropagation();
191
+ return;
192
+ }
193
+ setOpen((current) => !current);
194
+ },
195
+ onKeyDown: (event) => {
196
+ if (disabled) return;
197
+ if (event.key === "ArrowDown" || event.key === "ArrowUp" || event.key === "Enter" || event.key === " ") {
198
+ event.preventDefault();
199
+ setOpen(true);
200
+ }
135
201
  },
136
202
  children: [icon ? /* @__PURE__ */ jsxs("div", {
137
203
  className: "tw-relative -tw-top-px",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/ColorPicker/index.tsx"],"sourcesContent":["import { cn as cls } from '../lib/utils';\nimport React, { useContext, useEffect, useRef, useState } from 'react';\nimport Dropdown from '../Dropdown';\nimport { FoldDownFill } from '../Icon';\nimport { LocaleContext, getTranslator } from '../locale/default';\nimport { colors as defaultColors, specialColors } from './constant';\nimport type { ColorPickerProps } from './interface';\nimport InnerColorPicker from './ComplexColorPicker';\nimport './color-picker.css';\n\nexport interface IColorPickerProps {\n className?: string;\n value?: string;\n defaultColor?: string;\n localStorageKey?: string;\n onChange?: (color: string) => void;\n icon?: React.ReactNode;\n bordered?: boolean;\n disabled?: boolean;\n mode?: 'simple' | 'complex';\n complexModeProps?: ColorPickerProps;\n}\n\nfunction getLocalRecentColors(localStorageKey: string) {\n if (!window.localStorage) {\n return [];\n }\n const colorStr = localStorage.getItem(localStorageKey);\n if (!colorStr) {\n return [];\n }\n\n return colorStr.split(',');\n}\n\nfunction setLocalRecentColors(localStorageKey: string, colors: string[]) {\n if (!window.localStorage) {\n return;\n }\n localStorage.setItem(localStorageKey, colors.join(','));\n}\n\nconst MAX_RECENT_COLORS = 10;\nexport default function ColorPicker({\n className,\n value,\n icon,\n onChange,\n defaultColor = defaultColors[0],\n localStorageKey = 'ald_recent_colors',\n disabled = false,\n mode = 'simple',\n complexModeProps,\n bordered = true,\n}: IColorPickerProps) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const [open, setOpen] = useState(false);\n const [recentColors, setRecentColors] = useState<string[]>([]);\n const overlayRef = useRef<HTMLDivElement>(null);\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setRecentColors(getLocalRecentColors(localStorageKey));\n }, [localStorageKey]);\n\n const onColorSelect = (color: string) => {\n const newRecentColors = [color, ...recentColors.filter((c) => c !== color)];\n if (newRecentColors.length > MAX_RECENT_COLORS) {\n newRecentColors.pop();\n }\n\n setRecentColors(newRecentColors);\n setLocalRecentColors(localStorageKey, newRecentColors);\n onChange?.(color);\n setOpen(false);\n };\n\n useEffect(() => {\n const handleClick = (e: MouseEvent) => {\n if (wrapRef.current?.contains(e.target as Node)) {\n return setOpen(!open);\n }\n if (!overlayRef.current?.contains(e.target as Node)) {\n return setOpen(false);\n }\n };\n\n document.addEventListener('click', handleClick);\n\n return () => {\n document.removeEventListener('click', handleClick);\n };\n }, [open]);\n\n const overlay = (\n <div\n className=\"tw-relative tw-box-border tw-w-[253px] tw-rounded-sm tw-bg-[var(--background-default)] tw-p-[8px_7px]\"\n ref={overlayRef}\n >\n <div className=\"tw-flex tw-items-center tw-text-xs\">\n <div\n className={cls(\n 'tw-mr-2 tw-box-border tw-h-[21px] tw-w-[21px] tw-cursor-pointer tw-border tw-border-solid tw-border-[var(--background-default)]',\n {\n 'tw-border-[var(--border-neutral-strong)]':\n defaultColor === value,\n },\n )}\n onClick={() => {\n if (disabled) return;\n if (defaultColor === value) return;\n onColorSelect(defaultColor);\n }}\n >\n <div\n className=\"tw-size-full\"\n style={{ backgroundColor: defaultColor }}\n />\n </div>\n {t.ColorPicker.default}\n </div>\n <div className=\"tw-mt-1.5 tw-text-xs\">\n <p>{t.ColorPicker.standardColor}</p>\n <div className=\"tw-mt-0.5 tw-flex tw-flex-wrap tw-justify-evenly tw-gap-[4px_2px] tw-text-[0px]\">\n {defaultColors.map((color) => {\n const isSelected = color === value;\n return (\n <div\n key={color}\n className={cls(\n 'tw-box-border tw-h-[21px] tw-w-[21px] tw-cursor-pointer tw-border tw-border-solid tw-border-[var(--background-default)]',\n {\n 'tw-border-[var(--border-neutral-strong)]': isSelected,\n },\n )}\n onClick={() => {\n if (color === value) return;\n onColorSelect(color);\n }}\n style={{\n borderColor: isSelected\n ? 'var(--border-neutral-strong)'\n : specialColors.includes(color)\n ? 'var(--border-neutral-subtle)'\n : color,\n }}\n >\n <div\n className={cls('tw-h-full tw-w-full', {\n 'tw-m-px tw-h-[17px] tw-w-[17px]': isSelected,\n })}\n style={{ backgroundColor: color }}\n />\n </div>\n );\n })}\n </div>\n </div>\n <div className=\"tw-mt-1.5 tw-text-xs\">\n <p>{t.ColorPicker.recentlyUsed}</p>\n <div className=\"tw-mt-0.5 tw-flex tw-flex-wrap tw-justify-start tw-gap-[4px_2px] tw-text-[0px]\">\n {recentColors.map((color) => {\n const isSelected = color === value;\n return (\n <div\n key={color}\n className={cls(\n 'tw-box-border tw-h-[21px] tw-w-[21px] tw-cursor-pointer tw-border tw-border-solid tw-border-[var(--background-default)]',\n {\n 'tw-border-[var(--border-neutral-strong)]': isSelected,\n },\n )}\n onClick={() => {\n if (color === value) return;\n onColorSelect(color);\n }}\n style={{\n borderColor: isSelected\n ? 'var(--border-neutral-strong)'\n : specialColors.includes(color)\n ? 'var(--border-neutral-subtle)'\n : color,\n }}\n >\n <div\n className={cls('tw-h-full tw-w-full', {\n 'tw-m-px tw-h-[17px] tw-w-[17px]': isSelected,\n })}\n style={{ backgroundColor: color }}\n />\n </div>\n );\n })}\n </div>\n </div>\n </div>\n );\n if (mode === 'simple') {\n return (\n <div\n className={cls(className, 'tw-relative tw-w-14', {\n 'tw-cursor-default [&_.ald-color-picker-wrapper]:tw-cursor-default':\n disabled,\n })}\n ref={wrapRef}\n >\n <Dropdown\n trigger={'click'}\n open={open}\n disabled={disabled}\n placement={'bottom-start'}\n overlayClassName={'ald-color-picker-overlay-wrapper'}\n dropdownRender={() => {\n return overlay;\n }}\n >\n <div\n className={cls(\n 'ald-color-picker-wrapper',\n 'tw-flex tw-flex-row tw-items-center tw-justify-between tw-gap-1 tw-h-7 tw-px-2.5 tw-py-1.5 tw-bg-[var(--background-default)] tw-border tw-border-solid tw-border-[var(--border-neutral-subtle)] tw-box-border tw-cursor-pointer tw-rounded tw-text-[var(--content-primary)] tw-transition-[border] tw-duration-500 tw-ease-in-out',\n {\n 'tw-border-[var(--border-brand-subtle)]':\n open && bordered !== false,\n 'tw-border-[var(--border-neutral-subtle)] tw-bg-[var(--background-neutral-on-subtle)]':\n disabled,\n 'tw-border-[var(--action-ghost-normal)]': bordered === false,\n 'hover:tw-border-[var(--border-brand-subtle)]':\n !disabled && bordered !== false,\n 'hover:tw-border-[var(--action-ghost-normal)]':\n bordered === false,\n },\n )}\n onClick={(e) => {\n if (disabled) {\n e.stopPropagation();\n }\n }}\n >\n {icon ? (\n <div className=\"tw-relative -tw-top-px\">\n <div className=\"tw-mb-px\">{icon}</div>\n <div\n className=\"tw-absolute tw-bottom-[3px] tw-left-1/2 tw-h-0.5 tw-w-2.5 -tw-translate-x-1/2\"\n style={{\n backgroundColor: value ?? 'var(--content-secondary)',\n }}\n />\n </div>\n ) : (\n <div className=\"tw-relative -tw-top-px tw-ml-0.5 tw-mr-[3px]\">\n A\n <div\n className=\"tw-absolute tw-bottom-[3px] tw-h-0.5 tw-w-2.5\"\n style={{\n backgroundColor: value ?? 'var(--content-secondary)',\n }}\n />\n </div>\n )}\n <FoldDownFill size={14} color={'var(--content-secondary)'} />\n </div>\n </Dropdown>\n </div>\n );\n }\n if (mode === 'complex') {\n return <InnerColorPicker {...complexModeProps} />;\n }\n\n return null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/ColorPicker/index.tsx"],"sourcesContent":["import { cn as cls } from '../lib/utils';\nimport React, { useContext, useEffect, useId, useRef, useState } from 'react';\nimport Dropdown from '../Dropdown';\nimport { FoldDownFill } from '../Icon';\nimport { LocaleContext, getTranslator } from '../locale/default';\nimport { colors as defaultColors, specialColors } from './constant';\nimport type { ColorPickerProps } from './interface';\nimport InnerColorPicker from './ComplexColorPicker';\nimport './color-picker.css';\n\nexport interface IColorPickerProps {\n className?: string;\n value?: string;\n defaultColor?: string;\n localStorageKey?: string;\n onChange?: (color: string) => void;\n icon?: React.ReactNode;\n bordered?: boolean;\n disabled?: boolean;\n mode?: 'simple' | 'complex';\n complexModeProps?: ColorPickerProps;\n}\n\nfunction getLocalRecentColors(localStorageKey: string) {\n if (!window.localStorage) {\n return [];\n }\n const colorStr = localStorage.getItem(localStorageKey);\n if (!colorStr) {\n return [];\n }\n\n return colorStr.split(',');\n}\n\nfunction setLocalRecentColors(localStorageKey: string, colors: string[]) {\n if (!window.localStorage) {\n return;\n }\n localStorage.setItem(localStorageKey, colors.join(','));\n}\n\nconst MAX_RECENT_COLORS = 10;\nexport default function ColorPicker({\n className,\n value,\n icon,\n onChange,\n defaultColor = defaultColors[0],\n localStorageKey = 'ald_recent_colors',\n disabled = false,\n mode = 'simple',\n complexModeProps,\n bordered = true,\n}: IColorPickerProps) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const [open, setOpen] = useState(false);\n const [recentColors, setRecentColors] = useState<string[]>([]);\n const overlayRef = useRef<HTMLDivElement>(null);\n const wrapRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const swatchRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n const triggerId = `ald-color-picker-trigger-${useId().replace(/:/g, '')}`;\n const popupId = `ald-color-picker-popup-${useId().replace(/:/g, '')}`;\n const swatchOrder = Array.from(\n new Set([defaultColor, ...defaultColors, ...recentColors]),\n );\n\n useEffect(() => {\n setRecentColors(getLocalRecentColors(localStorageKey));\n }, [localStorageKey]);\n\n const onColorSelect = (color: string) => {\n const newRecentColors = [color, ...recentColors.filter((c) => c !== color)];\n if (newRecentColors.length > MAX_RECENT_COLORS) {\n newRecentColors.pop();\n }\n\n setRecentColors(newRecentColors);\n setLocalRecentColors(localStorageKey, newRecentColors);\n onChange?.(color);\n setOpen(false);\n window.setTimeout(() => triggerRef.current?.focus(), 0);\n };\n\n useEffect(() => {\n const handleClick = (e: MouseEvent) => {\n if (\n !wrapRef.current?.contains(e.target as Node) &&\n !overlayRef.current?.contains(e.target as Node)\n ) {\n return setOpen(false);\n }\n };\n\n document.addEventListener('click', handleClick);\n\n return () => {\n document.removeEventListener('click', handleClick);\n };\n }, []);\n\n useEffect(() => {\n if (!open) return;\n const selectedIndex = Math.max(\n 0,\n swatchOrder.indexOf(value ?? defaultColor),\n );\n window.setTimeout(() => {\n swatchRefs.current[swatchOrder[selectedIndex]]?.focus();\n }, 0);\n }, [defaultColor, open, swatchOrder, value]);\n\n useEffect(() => {\n triggerRef.current?.setAttribute('aria-expanded', String(open));\n triggerRef.current?.setAttribute('aria-controls', popupId);\n }, [open, popupId]);\n\n const renderSwatch = (color: string, label: string) => {\n const selected = color === value;\n const index = swatchOrder.indexOf(color);\n const selectedIndex = Math.max(\n 0,\n swatchOrder.indexOf(value ?? defaultColor),\n );\n return (\n <button\n type=\"button\"\n key={`${label}-${color}`}\n id={`${popupId}-swatch-${encodeURIComponent(color)}`}\n ref={(node) => {\n swatchRefs.current[color] = node;\n }}\n role=\"radio\"\n aria-label={label}\n aria-checked={selected}\n tabIndex={index === selectedIndex ? 0 : -1}\n disabled={disabled}\n className={cls(\n 'tw-box-border tw-h-[21px] tw-w-[21px] tw-cursor-pointer tw-border tw-border-solid tw-border-[var(--background-default)] tw-bg-transparent tw-p-0',\n {\n 'tw-border-[var(--border-neutral-strong)]': selected,\n },\n )}\n onClick={() => {\n if (!selected) onColorSelect(color);\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n return;\n }\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n event.preventDefault();\n swatchRefs.current[\n swatchOrder[(index + 1) % swatchOrder.length]\n ]?.focus();\n return;\n }\n if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n event.preventDefault();\n swatchRefs.current[\n swatchOrder[(index - 1 + swatchOrder.length) % swatchOrder.length]\n ]?.focus();\n return;\n }\n if (event.key === 'Home' || event.key === 'End') {\n event.preventDefault();\n swatchRefs.current[\n swatchOrder[event.key === 'Home' ? 0 : swatchOrder.length - 1]\n ]?.focus();\n }\n }}\n style={{\n borderColor: selected\n ? 'var(--border-neutral-strong)'\n : specialColors.includes(color)\n ? 'var(--border-neutral-subtle)'\n : color,\n }}\n >\n <span\n aria-hidden=\"true\"\n className={cls('tw-block tw-h-full tw-w-full', {\n 'tw-m-px tw-h-[17px] tw-w-[17px]': selected,\n })}\n style={{ backgroundColor: color }}\n />\n </button>\n );\n };\n\n const overlay = (\n <div\n id={popupId}\n role=\"radiogroup\"\n aria-label={t.ColorPicker.standardColor}\n className=\"tw-relative tw-box-border tw-w-[253px] tw-rounded-sm tw-bg-[var(--background-default)] tw-p-[8px_7px]\"\n ref={overlayRef}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n }\n }}\n >\n <div className=\"tw-flex tw-items-center tw-text-xs\">\n <div className=\"tw-mr-2\">\n {renderSwatch(defaultColor, t.ColorPicker.default)}\n </div>\n {t.ColorPicker.default}\n </div>\n <div className=\"tw-mt-1.5 tw-text-xs\">\n <p>{t.ColorPicker.standardColor}</p>\n <div className=\"tw-mt-0.5 tw-flex tw-flex-wrap tw-justify-evenly tw-gap-[4px_2px] tw-text-[0px]\">\n {defaultColors.map((color) => renderSwatch(color, color))}\n </div>\n </div>\n <div className=\"tw-mt-1.5 tw-text-xs\">\n <p>{t.ColorPicker.recentlyUsed}</p>\n <div className=\"tw-mt-0.5 tw-flex tw-flex-wrap tw-justify-start tw-gap-[4px_2px] tw-text-[0px]\">\n {recentColors.map((color) => renderSwatch(color, color))}\n </div>\n </div>\n </div>\n );\n if (mode === 'simple') {\n return (\n <div\n className={cls(className, 'tw-relative tw-w-14', {\n 'tw-cursor-default [&_.ald-color-picker-wrapper]:tw-cursor-default':\n disabled,\n })}\n ref={wrapRef}\n >\n <Dropdown\n trigger={'click'}\n open={open}\n onOpenChange={setOpen}\n disabled={disabled}\n placement={'bottom-start'}\n overlayClassName={'ald-color-picker-overlay-wrapper'}\n dropdownRender={() => {\n return overlay;\n }}\n >\n <button\n type=\"button\"\n id={triggerId}\n ref={triggerRef}\n aria-label={t.ColorPicker.default}\n aria-controls={popupId}\n aria-expanded={open}\n className={cls(\n 'ald-color-picker-wrapper',\n 'tw-flex tw-flex-row tw-items-center tw-justify-between tw-gap-1 tw-h-7 tw-px-2.5 tw-py-1.5 tw-bg-[var(--background-default)] tw-border tw-border-solid tw-border-[var(--border-neutral-subtle)] tw-box-border tw-cursor-pointer tw-rounded tw-text-[var(--content-primary)] tw-transition-[border] tw-duration-500 tw-ease-in-out',\n {\n 'tw-border-[var(--border-brand-subtle)]':\n open && bordered !== false,\n 'tw-border-[var(--border-neutral-subtle)] tw-bg-[var(--background-neutral-on-subtle)]':\n disabled,\n 'tw-border-[var(--action-ghost-normal)]': bordered === false,\n 'hover:tw-border-[var(--border-brand-subtle)]':\n !disabled && bordered !== false,\n 'hover:tw-border-[var(--action-ghost-normal)]':\n bordered === false,\n },\n )}\n onClick={(e) => {\n if (disabled) {\n e.stopPropagation();\n return;\n }\n setOpen((current) => !current);\n }}\n onKeyDown={(event) => {\n if (disabled) return;\n if (\n event.key === 'ArrowDown' ||\n event.key === 'ArrowUp' ||\n event.key === 'Enter' ||\n event.key === ' '\n ) {\n event.preventDefault();\n setOpen(true);\n }\n }}\n >\n {icon ? (\n <div className=\"tw-relative -tw-top-px\">\n <div className=\"tw-mb-px\">{icon}</div>\n <div\n className=\"tw-absolute tw-bottom-[3px] tw-left-1/2 tw-h-0.5 tw-w-2.5 -tw-translate-x-1/2\"\n style={{\n backgroundColor: value ?? 'var(--content-secondary)',\n }}\n />\n </div>\n ) : (\n <div className=\"tw-relative -tw-top-px tw-ml-0.5 tw-mr-[3px]\">\n A\n <div\n className=\"tw-absolute tw-bottom-[3px] tw-h-0.5 tw-w-2.5\"\n style={{\n backgroundColor: value ?? 'var(--content-secondary)',\n }}\n />\n </div>\n )}\n <FoldDownFill size={14} color={'var(--content-secondary)'} />\n </button>\n </Dropdown>\n </div>\n );\n }\n if (mode === 'complex') {\n return <InnerColorPicker {...complexModeProps} />;\n }\n\n return null;\n}\n"],"mappings":"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"}
@@ -3,6 +3,8 @@ import { TValue } from '../../interface';
3
3
  interface ICell {
4
4
  value: TValue;
5
5
  style?: React.CSSProperties;
6
+ role?: 'cell';
7
+ 'aria-labelledby'?: string;
6
8
  }
7
9
  export default function Cell(props: ICell): import("react/jsx-runtime").JSX.Element;
8
10
  export {};
@@ -4,18 +4,25 @@ import { jsx } from "react/jsx-runtime";
4
4
  //#region src/DataPreviewTable/components/Body/Cell.tsx
5
5
  var bodyCellClassName = "ald-data-preview-body-cell tw-overflow-hidden tw-whitespace-nowrap tw-border tw-border-l-0 tw-border-t-0 tw-border-solid tw-border-[var(--border-neutral-subtle)] tw-px-1 tw-py-0.5 tw-text-xs tw-leading-4 tw-text-[var(--content-primary)]";
6
6
  function Cell(props) {
7
- const { style, value } = props;
7
+ const { style, value, role, "aria-labelledby": labelledBy } = props;
8
+ const cellProps = {
9
+ role,
10
+ "aria-labelledby": labelledBy
11
+ };
8
12
  if (typeof value === "string") return /* @__PURE__ */ jsx("div", {
13
+ ...cellProps,
9
14
  style,
10
15
  className: bodyCellClassName,
11
16
  children: value
12
17
  });
13
18
  if (typeof value === "number" || typeof value === "boolean") return /* @__PURE__ */ jsx("div", {
19
+ ...cellProps,
14
20
  style,
15
21
  className: bodyCellClassName,
16
22
  children: JSON.stringify(value)
17
23
  });
18
24
  if (typeof value === "object" && value === null) return /* @__PURE__ */ jsx("div", {
25
+ ...cellProps,
19
26
  style: {
20
27
  fontStyle: "italic",
21
28
  color: "var(--content-secondary)",
@@ -25,6 +32,7 @@ function Cell(props) {
25
32
  children: "null"
26
33
  });
27
34
  return /* @__PURE__ */ jsx("div", {
35
+ ...cellProps,
28
36
  style,
29
37
  className: bodyCellClassName,
30
38
  children: value
@@ -1 +1 @@
1
- {"version":3,"file":"Cell.js","names":[],"sources":["../../../../src/DataPreviewTable/components/Body/Cell.tsx"],"sourcesContent":["interface ICell {\n value: TValue;\n style?: React.CSSProperties;\n}\nimport { cn } from '../../../lib/utils';\nimport React from 'react';\nimport { TValue } from '../../interface';\n\nconst bodyCellClassName =\n 'ald-data-preview-body-cell tw-overflow-hidden tw-whitespace-nowrap tw-border tw-border-l-0 tw-border-t-0 tw-border-solid tw-border-[var(--border-neutral-subtle)] tw-px-1 tw-py-0.5 tw-text-xs tw-leading-4 tw-text-[var(--content-primary)]';\n\nexport default function Cell(props: ICell) {\n const { style, value } = props;\n if (typeof value === 'string') {\n return (\n <div style={style} className={bodyCellClassName}>\n {value}\n </div>\n );\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return (\n <div style={style} className={bodyCellClassName}>\n {JSON.stringify(value)}\n </div>\n );\n }\n if (typeof value === 'object' && value === null) {\n return (\n <div\n style={{\n fontStyle: 'italic',\n color: 'var(--content-secondary)',\n ...style,\n }}\n className={cn(bodyCellClassName, 'ald-data-preview-body-cell-null')}\n >\n null\n </div>\n );\n }\n return (\n <div style={style} className={bodyCellClassName}>\n {value}\n </div>\n );\n}\n"],"mappings":";;;;AAQA,IAAM,oBACJ;AAEF,SAAwB,KAAK,OAAc;CACzC,MAAM,EAAE,OAAO,UAAU;AACzB,KAAI,OAAO,UAAU,SACnB,QACE,oBAAC,OAAD;EAAY;EAAO,WAAW;YAC3B;EACG,CAAA;AAGV,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAChD,QACE,oBAAC,OAAD;EAAY;EAAO,WAAW;YAC3B,KAAK,UAAU,MAAM;EAClB,CAAA;AAGV,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QACE,oBAAC,OAAD;EACE,OAAO;GACL,WAAW;GACX,OAAO;GACP,GAAG;GACJ;EACD,WAAW,GAAG,mBAAmB,kCAAkC;YACpE;EAEK,CAAA;AAGV,QACE,oBAAC,OAAD;EAAY;EAAO,WAAW;YAC3B;EACG,CAAA"}
1
+ {"version":3,"file":"Cell.js","names":[],"sources":["../../../../src/DataPreviewTable/components/Body/Cell.tsx"],"sourcesContent":["interface ICell {\n value: TValue;\n style?: React.CSSProperties;\n role?: 'cell';\n 'aria-labelledby'?: string;\n}\nimport { cn } from '../../../lib/utils';\nimport React from 'react';\nimport { TValue } from '../../interface';\n\nconst bodyCellClassName =\n 'ald-data-preview-body-cell tw-overflow-hidden tw-whitespace-nowrap tw-border tw-border-l-0 tw-border-t-0 tw-border-solid tw-border-[var(--border-neutral-subtle)] tw-px-1 tw-py-0.5 tw-text-xs tw-leading-4 tw-text-[var(--content-primary)]';\n\nexport default function Cell(props: ICell) {\n const { style, value, role, 'aria-labelledby': labelledBy } = props;\n const cellProps = { role, 'aria-labelledby': labelledBy };\n if (typeof value === 'string') {\n return (\n <div {...cellProps} style={style} className={bodyCellClassName}>\n {value}\n </div>\n );\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return (\n <div {...cellProps} style={style} className={bodyCellClassName}>\n {JSON.stringify(value)}\n </div>\n );\n }\n if (typeof value === 'object' && value === null) {\n return (\n <div\n {...cellProps}\n style={{\n fontStyle: 'italic',\n color: 'var(--content-secondary)',\n ...style,\n }}\n className={cn(bodyCellClassName, 'ald-data-preview-body-cell-null')}\n >\n null\n </div>\n );\n }\n return (\n <div {...cellProps} style={style} className={bodyCellClassName}>\n {value}\n </div>\n );\n}\n"],"mappings":";;;;AAUA,IAAM,oBACJ;AAEF,SAAwB,KAAK,OAAc;CACzC,MAAM,EAAE,OAAO,OAAO,MAAM,mBAAmB,eAAe;CAC9D,MAAM,YAAY;EAAE;EAAM,mBAAmB;EAAY;AACzD,KAAI,OAAO,UAAU,SACnB,QACE,oBAAC,OAAD;EAAK,GAAI;EAAkB;EAAO,WAAW;YAC1C;EACG,CAAA;AAGV,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAChD,QACE,oBAAC,OAAD;EAAK,GAAI;EAAkB;EAAO,WAAW;YAC1C,KAAK,UAAU,MAAM;EAClB,CAAA;AAGV,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QACE,oBAAC,OAAD;EACE,GAAI;EACJ,OAAO;GACL,WAAW;GACX,OAAO;GACP,GAAG;GACJ;EACD,WAAW,GAAG,mBAAmB,kCAAkC;YACpE;EAEK,CAAA;AAGV,QACE,oBAAC,OAAD;EAAK,GAAI;EAAkB;EAAO,WAAW;YAC1C;EACG,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { default as React } from 'react';
2
2
  import { IColumnLayout, PreviewColumn, TValue } from '../../interface';
3
3
  interface IHeader {
4
+ tableId: string;
4
5
  columns: PreviewColumn[];
5
6
  columnLayout: IColumnLayout;
6
7
  columnRange: [number, number];
@@ -1,35 +1,47 @@
1
1
  import { cn } from "../../../lib/utils.js";
2
2
  import Cell from "./Cell.js";
3
- import React, { memo } from "react";
3
+ import { createElement, memo } from "react";
4
4
  import { jsx } from "react/jsx-runtime";
5
5
  //#region src/DataPreviewTable/components/Body/index.tsx
6
6
  function Body(props) {
7
- const { columns, columnLayout, datasource, columnRange: [startIndex, endIndex], rowRange: [startRowIndex, endRowIndex], headerHeight } = props;
7
+ const { tableId, columns, columnLayout, datasource, columnRange: [startIndex, endIndex], rowRange: [startRowIndex, endRowIndex], headerHeight } = props;
8
8
  return /* @__PURE__ */ jsx("div", {
9
+ role: "rowgroup",
9
10
  className: "ald-data-preview-table-body",
10
11
  children: datasource.slice(startRowIndex, endRowIndex).map((row, rowIndex) => {
11
12
  const currentRowIndex = startRowIndex + rowIndex;
12
- return /* @__PURE__ */ jsx(React.Fragment, { children: row.slice(startIndex, endIndex + 1).map((cell, index) => {
13
- const columnIndex = startIndex + index;
14
- const style = {
15
- height: 20,
16
- width: columnLayout[columns[columnIndex].id].width,
17
- top: currentRowIndex * 20 + headerHeight,
18
- left: columnLayout[columns[columnIndex].id].left,
19
- position: "absolute",
20
- textAlign: columns[columnIndex].align || "left"
21
- };
22
- const render = columns[columnIndex].render;
23
- if (render) return /* @__PURE__ */ jsx("div", {
24
- className: cn("ald-data-preview-body-cell ald-data-preview-body-cell-custom", "tw-overflow-hidden tw-whitespace-nowrap tw-border tw-border-l-0 tw-border-t-0 tw-border-solid tw-border-[var(--border-neutral-subtle)] tw-text-xs tw-leading-4 tw-text-[var(--content-primary)]"),
25
- style,
26
- children: render(cell)
27
- }, columnIndex);
28
- return /* @__PURE__ */ jsx(Cell, {
29
- style,
30
- value: cell
31
- }, columnIndex);
32
- }) }, currentRowIndex);
13
+ return /* @__PURE__ */ jsx("div", {
14
+ role: "row",
15
+ "aria-rowindex": currentRowIndex + 2,
16
+ style: { display: "contents" },
17
+ children: row.slice(startIndex, endIndex + 1).map((cell, index) => {
18
+ const columnIndex = startIndex + index;
19
+ const style = {
20
+ height: 20,
21
+ width: columnLayout[columns[columnIndex].id].width,
22
+ top: currentRowIndex * 20 + headerHeight,
23
+ left: columnLayout[columns[columnIndex].id].left,
24
+ position: "absolute",
25
+ textAlign: columns[columnIndex].align || "left"
26
+ };
27
+ const render = columns[columnIndex].render;
28
+ const cellProps = {
29
+ role: "cell",
30
+ "aria-labelledby": `${tableId}-column-${encodeURIComponent(columns[columnIndex].id)}`
31
+ };
32
+ if (render) return /* @__PURE__ */ createElement("div", {
33
+ ...cellProps,
34
+ className: cn("ald-data-preview-body-cell ald-data-preview-body-cell-custom", "tw-overflow-hidden tw-whitespace-nowrap tw-border tw-border-l-0 tw-border-t-0 tw-border-solid tw-border-[var(--border-neutral-subtle)] tw-text-xs tw-leading-4 tw-text-[var(--content-primary)]"),
35
+ style,
36
+ key: columnIndex
37
+ }, render(cell));
38
+ return /* @__PURE__ */ jsx(Cell, {
39
+ style,
40
+ value: cell,
41
+ ...cellProps
42
+ }, columnIndex);
43
+ })
44
+ }, currentRowIndex);
33
45
  })
34
46
  });
35
47
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/DataPreviewTable/components/Body/index.tsx"],"sourcesContent":["import React, { memo } from 'react';\nimport { cn } from '../../../lib/utils';\nimport { CELL_HEIGHT } from '../../constant';\nimport { IColumnLayout, PreviewColumn, TValue } from '../../interface';\nimport Cell from './Cell';\ninterface IHeader {\n columns: PreviewColumn[];\n columnLayout: IColumnLayout;\n columnRange: [number, number];\n datasource: TValue[][];\n rowRange: [number, number];\n headerHeight: number;\n}\nfunction Body(props: IHeader) {\n const {\n columns,\n columnLayout,\n datasource,\n columnRange: [startIndex, endIndex],\n rowRange: [startRowIndex, endRowIndex],\n headerHeight,\n } = props;\n\n return (\n <div className=\"ald-data-preview-table-body\">\n {datasource.slice(startRowIndex, endRowIndex).map((row, rowIndex) => {\n const currentRowIndex = startRowIndex + rowIndex;\n\n return (\n <React.Fragment key={currentRowIndex}>\n {row.slice(startIndex, endIndex + 1).map((cell, index) => {\n const columnIndex = startIndex + index;\n const style: React.CSSProperties = {\n height: CELL_HEIGHT,\n width: columnLayout[columns[columnIndex].id].width,\n top: currentRowIndex * CELL_HEIGHT + headerHeight,\n left: columnLayout[columns[columnIndex].id].left,\n position: 'absolute',\n textAlign: columns[columnIndex].align || 'left',\n };\n const render = columns[columnIndex].render;\n if (render) {\n return (\n <div\n className={cn(\n 'ald-data-preview-body-cell ald-data-preview-body-cell-custom',\n 'tw-overflow-hidden tw-whitespace-nowrap tw-border tw-border-l-0 tw-border-t-0 tw-border-solid tw-border-[var(--border-neutral-subtle)] tw-text-xs tw-leading-4 tw-text-[var(--content-primary)]',\n )}\n style={style}\n key={columnIndex}\n >\n {render(cell)}\n </div>\n );\n }\n return <Cell key={columnIndex} style={style} value={cell} />;\n })}\n </React.Fragment>\n );\n })}\n </div>\n );\n}\nexport default memo(Body);\n"],"mappings":";;;;;AAaA,SAAS,KAAK,OAAgB;CAC5B,MAAM,EACJ,SACA,cACA,YACA,aAAa,CAAC,YAAY,WAC1B,UAAU,CAAC,eAAe,cAC1B,iBACE;AAEJ,QACE,oBAAC,OAAD;EAAK,WAAU;YACZ,WAAW,MAAM,eAAe,YAAY,CAAC,KAAK,KAAK,aAAa;GACnE,MAAM,kBAAkB,gBAAgB;AAExC,UACE,oBAAC,MAAM,UAAP,EAAA,UACG,IAAI,MAAM,YAAY,WAAW,EAAE,CAAC,KAAK,MAAM,UAAU;IACxD,MAAM,cAAc,aAAa;IACjC,MAAM,QAA6B;KACjC,QAAA;KACA,OAAO,aAAa,QAAQ,aAAa,IAAI;KAC7C,KAAK,kBAAA,KAAgC;KACrC,MAAM,aAAa,QAAQ,aAAa,IAAI;KAC5C,UAAU;KACV,WAAW,QAAQ,aAAa,SAAS;KAC1C;IACD,MAAM,SAAS,QAAQ,aAAa;AACpC,QAAI,OACF,QACE,oBAAC,OAAD;KACE,WAAW,GACT,gEACA,kMACD;KACM;eAGN,OAAO,KAAK;KACT,EAHC,YAGD;AAGV,WAAO,oBAAC,MAAD;KAA+B;KAAO,OAAO;KAAQ,EAA1C,YAA0C;KAC5D,EACa,EA5BI,gBA4BJ;IAEnB;EACE,CAAA;;AAGV,IAAA,eAAe,KAAK,KAAK"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/DataPreviewTable/components/Body/index.tsx"],"sourcesContent":["import React, { memo } from 'react';\nimport { cn } from '../../../lib/utils';\nimport { CELL_HEIGHT } from '../../constant';\nimport { IColumnLayout, PreviewColumn, TValue } from '../../interface';\nimport Cell from './Cell';\ninterface IHeader {\n tableId: string;\n columns: PreviewColumn[];\n columnLayout: IColumnLayout;\n columnRange: [number, number];\n datasource: TValue[][];\n rowRange: [number, number];\n headerHeight: number;\n}\nfunction Body(props: IHeader) {\n const {\n tableId,\n columns,\n columnLayout,\n datasource,\n columnRange: [startIndex, endIndex],\n rowRange: [startRowIndex, endRowIndex],\n headerHeight,\n } = props;\n\n return (\n <div role=\"rowgroup\" className=\"ald-data-preview-table-body\">\n {datasource.slice(startRowIndex, endRowIndex).map((row, rowIndex) => {\n const currentRowIndex = startRowIndex + rowIndex;\n\n return (\n <div\n role=\"row\"\n aria-rowindex={currentRowIndex + 2}\n key={currentRowIndex}\n style={{ display: 'contents' }}\n >\n {row.slice(startIndex, endIndex + 1).map((cell, index) => {\n const columnIndex = startIndex + index;\n const style: React.CSSProperties = {\n height: CELL_HEIGHT,\n width: columnLayout[columns[columnIndex].id].width,\n top: currentRowIndex * CELL_HEIGHT + headerHeight,\n left: columnLayout[columns[columnIndex].id].left,\n position: 'absolute',\n textAlign: columns[columnIndex].align || 'left',\n };\n const render = columns[columnIndex].render;\n const cellProps = {\n role: 'cell' as const,\n 'aria-labelledby': `${tableId}-column-${encodeURIComponent(\n columns[columnIndex].id,\n )}`,\n };\n if (render) {\n return (\n <div\n {...cellProps}\n className={cn(\n 'ald-data-preview-body-cell ald-data-preview-body-cell-custom',\n 'tw-overflow-hidden tw-whitespace-nowrap tw-border tw-border-l-0 tw-border-t-0 tw-border-solid tw-border-[var(--border-neutral-subtle)] tw-text-xs tw-leading-4 tw-text-[var(--content-primary)]',\n )}\n style={style}\n key={columnIndex}\n >\n {render(cell)}\n </div>\n );\n }\n return (\n <Cell\n key={columnIndex}\n style={style}\n value={cell}\n {...cellProps}\n />\n );\n })}\n </div>\n );\n })}\n </div>\n );\n}\nexport default memo(Body);\n"],"mappings":";;;;;AAcA,SAAS,KAAK,OAAgB;CAC5B,MAAM,EACJ,SACA,SACA,cACA,YACA,aAAa,CAAC,YAAY,WAC1B,UAAU,CAAC,eAAe,cAC1B,iBACE;AAEJ,QACE,oBAAC,OAAD;EAAK,MAAK;EAAW,WAAU;YAC5B,WAAW,MAAM,eAAe,YAAY,CAAC,KAAK,KAAK,aAAa;GACnE,MAAM,kBAAkB,gBAAgB;AAExC,UACE,oBAAC,OAAD;IACE,MAAK;IACL,iBAAe,kBAAkB;IAEjC,OAAO,EAAE,SAAS,YAAY;cAE7B,IAAI,MAAM,YAAY,WAAW,EAAE,CAAC,KAAK,MAAM,UAAU;KACxD,MAAM,cAAc,aAAa;KACjC,MAAM,QAA6B;MACjC,QAAA;MACA,OAAO,aAAa,QAAQ,aAAa,IAAI;MAC7C,KAAK,kBAAA,KAAgC;MACrC,MAAM,aAAa,QAAQ,aAAa,IAAI;MAC5C,UAAU;MACV,WAAW,QAAQ,aAAa,SAAS;MAC1C;KACD,MAAM,SAAS,QAAQ,aAAa;KACpC,MAAM,YAAY;MAChB,MAAM;MACN,mBAAmB,GAAG,QAAQ,UAAU,mBACtC,QAAQ,aAAa,GACtB;MACF;AACD,SAAI,OACF,QACE,8BAAC,OAAD;MACE,GAAI;MACJ,WAAW,GACT,gEACA,kMACD;MACM;MACP,KAAK;MAGD,EADH,OAAO,KAAK,CACT;AAGV,YACE,oBAAC,MAAD;MAES;MACP,OAAO;MACP,GAAI;MACJ,EAJK,YAIL;MAEJ;IACE,EA5CC,gBA4CD;IAER;EACE,CAAA;;AAGV,IAAA,eAAe,KAAK,KAAK"}
@@ -1,5 +1,6 @@
1
1
  import { IColumnLayout, PreviewColumn } from '../../interface';
2
2
  interface IHeader {
3
+ tableId: string;
3
4
  contentWidth: number;
4
5
  columns: PreviewColumn[];
5
6
  columnLayout: IColumnLayout;