@aloudata/aloudata-design 3.0.27 → 3.1.1

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 (224) 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 +29 -9
  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 +25 -4
  17. package/dist/Checkbox/index.js.map +1 -1
  18. package/dist/Checkbox/type.d.ts +10 -2
  19. package/dist/Collapse/index.js +68 -22
  20. package/dist/Collapse/index.js.map +1 -1
  21. package/dist/ColorPicker/index.js +112 -46
  22. package/dist/ColorPicker/index.js.map +1 -1
  23. package/dist/DataPreviewTable/components/Body/Cell.d.ts +2 -0
  24. package/dist/DataPreviewTable/components/Body/Cell.js +9 -1
  25. package/dist/DataPreviewTable/components/Body/Cell.js.map +1 -1
  26. package/dist/DataPreviewTable/components/Body/index.d.ts +1 -0
  27. package/dist/DataPreviewTable/components/Body/index.js +35 -23
  28. package/dist/DataPreviewTable/components/Body/index.js.map +1 -1
  29. package/dist/DataPreviewTable/components/Header/index.d.ts +1 -0
  30. package/dist/DataPreviewTable/components/Header/index.js +36 -28
  31. package/dist/DataPreviewTable/components/Header/index.js.map +1 -1
  32. package/dist/DataPreviewTable/index.js +19 -2
  33. package/dist/DataPreviewTable/index.js.map +1 -1
  34. package/dist/Drawer/index.d.ts +4 -0
  35. package/dist/Drawer/index.js +91 -78
  36. package/dist/Drawer/index.js.map +1 -1
  37. package/dist/Dropdown/index.d.ts +1 -1
  38. package/dist/Dropdown/index.js +116 -98
  39. package/dist/Dropdown/index.js.map +1 -1
  40. package/dist/Form/FormItemContext.d.ts +1 -1
  41. package/dist/Form/FormItemContext.js.map +1 -1
  42. package/dist/Form/index.js +50 -7
  43. package/dist/Form/index.js.map +1 -1
  44. package/dist/IconButton/index.d.ts +2 -2
  45. package/dist/IconButton/index.js +9 -3
  46. package/dist/IconButton/index.js.map +1 -1
  47. package/dist/Input/components/Input/index.js +23 -7
  48. package/dist/Input/components/Input/index.js.map +1 -1
  49. package/dist/Input/components/TextArea/index.js +20 -2
  50. package/dist/Input/components/TextArea/index.js.map +1 -1
  51. package/dist/Input/privateSemanticOwner.d.ts +2 -0
  52. package/dist/Input/privateSemanticOwner.js +1 -0
  53. package/dist/InputNumber/index.js +19 -5
  54. package/dist/InputNumber/index.js.map +1 -1
  55. package/dist/InputNumber/type.d.ts +2 -2
  56. package/dist/LogicTree/components/LogicItem/index.d.ts +2 -1
  57. package/dist/LogicTree/components/LogicItem/index.js +13 -2
  58. package/dist/LogicTree/components/LogicItem/index.js.map +1 -1
  59. package/dist/LogicTree/index.js +2 -0
  60. package/dist/LogicTree/index.js.map +1 -1
  61. package/dist/MemberPicker/components/MemberSelection.d.ts +1 -0
  62. package/dist/MemberPicker/components/MemberSelection.js +83 -94
  63. package/dist/MemberPicker/components/MemberSelection.js.map +1 -1
  64. package/dist/MemberPicker/components/MultipleOption.js +12 -0
  65. package/dist/MemberPicker/components/MultipleOption.js.map +1 -1
  66. package/dist/MemberPicker/components/Panel.d.ts +1 -0
  67. package/dist/MemberPicker/components/Panel.js +4 -1
  68. package/dist/MemberPicker/components/Panel.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 +2 -1
  74. package/dist/MemberPicker/components/UserGroupSelection.js +61 -48
  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/PageSizeChanger.d.ts +1 -0
  87. package/dist/Pagination/PageSizeChanger.js +3 -2
  88. package/dist/Pagination/PageSizeChanger.js.map +1 -1
  89. package/dist/Pagination/index.js +34 -19
  90. package/dist/Pagination/index.js.map +1 -1
  91. package/dist/Pagination/types.d.ts +3 -0
  92. package/dist/Popconfirm/index.js +9 -1
  93. package/dist/Popconfirm/index.js.map +1 -1
  94. package/dist/Popover/index.js +52 -1
  95. package/dist/Popover/index.js.map +1 -1
  96. package/dist/Progress/index.js +4 -0
  97. package/dist/Progress/index.js.map +1 -1
  98. package/dist/Radio/components/Group/index.d.ts +5 -1
  99. package/dist/Radio/components/Group/index.js +7 -2
  100. package/dist/Radio/components/Group/index.js.map +1 -1
  101. package/dist/Radio/components/Radio/index.js +27 -1
  102. package/dist/Radio/components/Radio/index.js.map +1 -1
  103. package/dist/Radio/interface/radio.d.ts +7 -0
  104. package/dist/Radio/interface/radioGroup.d.ts +2 -0
  105. package/dist/RenameInput/index.js +11 -0
  106. package/dist/RenameInput/index.js.map +1 -1
  107. package/dist/Select/BaseSelect.d.ts +3 -0
  108. package/dist/Select/BaseSelect.js +235 -38
  109. package/dist/Select/BaseSelect.js.map +1 -1
  110. package/dist/Select/SelectTrigger.d.ts +2 -0
  111. package/dist/Select/SelectTrigger.js +13 -5
  112. package/dist/Select/SelectTrigger.js.map +1 -1
  113. package/dist/Select/Selector/FixedOverflow.d.ts +1 -0
  114. package/dist/Select/Selector/FixedOverflow.js +3 -3
  115. package/dist/Select/Selector/FixedOverflow.js.map +1 -1
  116. package/dist/Select/Selector/MultipleSelector.js +1 -0
  117. package/dist/Select/Selector/MultipleSelector.js.map +1 -1
  118. package/dist/Select/components/OptionCollection.d.ts +41 -0
  119. package/dist/Select/components/OptionCollection.js +124 -0
  120. package/dist/Select/components/OptionCollection.js.map +1 -0
  121. package/dist/Select/index.js +45 -3
  122. package/dist/Select/index.js.map +1 -1
  123. package/dist/Select/interface.d.ts +1 -1
  124. package/dist/Skeleton/index.js +1 -1
  125. package/dist/Skeleton/index.js.map +1 -1
  126. package/dist/Spin/index.d.ts +1 -1
  127. package/dist/Spin/index.js +22 -7
  128. package/dist/Spin/index.js.map +1 -1
  129. package/dist/Steps/index.js +66 -14
  130. package/dist/Steps/index.js.map +1 -1
  131. package/dist/Switch/index.d.ts +5 -0
  132. package/dist/Switch/index.js +22 -5
  133. package/dist/Switch/index.js.map +1 -1
  134. package/dist/Table/components/Cell.js +8 -3
  135. package/dist/Table/components/Cell.js.map +1 -1
  136. package/dist/Table/components/ExpandCell.js +6 -2
  137. package/dist/Table/components/ExpandCell.js.map +1 -1
  138. package/dist/Table/components/Footer/index.js +2 -1
  139. package/dist/Table/components/Footer/index.js.map +1 -1
  140. package/dist/Table/components/Header.js +25 -18
  141. package/dist/Table/components/Header.js.map +1 -1
  142. package/dist/Table/hooks/useRowSelection.js +14 -7
  143. package/dist/Table/hooks/useRowSelection.js.map +1 -1
  144. package/dist/Table/index.js +50 -29
  145. package/dist/Table/index.js.map +1 -1
  146. package/dist/Tabs/index.d.ts +1 -1
  147. package/dist/Tabs/index.js +92 -11
  148. package/dist/Tabs/index.js.map +1 -1
  149. package/dist/Tag/index.js +20 -1
  150. package/dist/Tag/index.js.map +1 -1
  151. package/dist/Tooltip/index.js +34 -5
  152. package/dist/Tooltip/index.js.map +1 -1
  153. package/dist/Tour/index.js +13 -1
  154. package/dist/Tour/index.js.map +1 -1
  155. package/dist/Tree/Tree2.js +2 -0
  156. package/dist/Tree/Tree2.js.map +1 -1
  157. package/dist/_utils/dialogAccessibility.d.ts +17 -0
  158. package/dist/_utils/dialogAccessibility.js +110 -0
  159. package/dist/_utils/dialogAccessibility.js.map +1 -0
  160. package/dist/_utils/formControlSemanticOwner.d.ts +3 -0
  161. package/dist/_utils/formControlSemanticOwner.js +17 -0
  162. package/dist/_utils/formControlSemanticOwner.js.map +1 -0
  163. package/dist/_utils/overlayCoordinator.js +1 -11
  164. package/dist/_utils/overlayCoordinator.js.map +1 -1
  165. package/dist/aloudata-design.css +1 -1
  166. package/dist/locale/default.d.ts +6 -0
  167. package/dist/locale/en_US.d.ts +6 -0
  168. package/dist/locale/en_US.js +6 -0
  169. package/dist/locale/en_US.js.map +1 -1
  170. package/dist/locale/zh_CN.d.ts +6 -0
  171. package/dist/locale/zh_CN.js +6 -0
  172. package/dist/locale/zh_CN.js.map +1 -1
  173. package/dist/theme/contract/baselineResolvedTokenValueManifest.d.ts +1 -1
  174. package/dist/theme/contract/controlStateColorArtifact.d.ts +73 -0
  175. package/dist/theme/contract/controlStateColorArtifact.js +2 -0
  176. package/dist/theme/contract/darkResolvedTokenValueManifest.d.ts +1 -1
  177. package/dist/theme/contract/focusRingArtifact.d.ts +51 -0
  178. package/dist/theme/contract/focusRingArtifact.js +2 -0
  179. package/dist/theme/contract/tokenOutputContract.d.ts +1 -1
  180. package/dist/theme/contract/tokenOutputContract.js +4 -0
  181. package/dist/theme/contract/tokenOutputContract.js.map +1 -1
  182. package/dist/theme/generator/acceptedColorValues.d.ts +2 -1
  183. package/dist/theme/generator/baselineTokenValueDelivery.d.ts +9 -1
  184. package/dist/theme/generator/minimalAcceptedColorValues.d.ts +2 -2
  185. package/dist/theme/generator/neutralSourceResolver.d.ts +28 -0
  186. package/dist/theme/generator/neutralSourceResolver.js +2 -0
  187. package/dist/theme/generator/neutralSourceValues.d.ts +27 -0
  188. package/dist/theme/generator/neutralSourceValues.js +2 -0
  189. package/dist/theme/index.d.ts +2 -0
  190. package/dist/theme/index.js +1 -0
  191. package/dist/theme/neutralSourceContract.d.ts +3 -0
  192. package/dist/theme/neutralSourceContract.js +11 -0
  193. package/dist/theme/neutralSourceContract.js.map +1 -0
  194. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.d.ts +1 -1
  195. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js +47 -44
  196. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js.map +1 -1
  197. package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.d.ts +3 -0
  198. package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.js +2 -0
  199. package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.d.ts +3 -0
  200. package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.js +2 -0
  201. package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.d.ts +3 -0
  202. package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.js +2 -0
  203. package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.d.ts +3 -0
  204. package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.js +2 -0
  205. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.d.ts +1 -1
  206. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js +43 -40
  207. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js.map +1 -1
  208. package/dist/theme/runtime/colorValueMode/index.js +2 -12
  209. package/dist/theme/runtime/colorValueMode/index.js.map +1 -1
  210. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.d.ts +2 -0
  211. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js +48 -0
  212. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js.map +1 -0
  213. package/dist/theme/runtime/colorValueMode/registry.d.ts +1 -1
  214. package/dist/theme/runtime/colorValueMode/registry.js +2 -1
  215. package/dist/theme/runtime/colorValueMode/registry.js.map +1 -1
  216. package/dist/theme/runtime/initAldTheme.js +1 -3
  217. package/dist/theme/runtime/initAldTheme.js.map +1 -1
  218. package/dist/theme/runtime/neutralSource/index.d.ts +6 -0
  219. package/dist/theme/runtime/neutralSource/index.js +11 -0
  220. package/dist/theme/runtime/neutralSource/index.js.map +1 -0
  221. package/dist/theme/runtime/neutralSource.d.ts +2 -0
  222. package/dist/theme/runtime/themeToCssVars.js +3 -0
  223. package/dist/theme/runtime/themeToCssVars.js.map +1 -1
  224. package/package.json +1 -1
@@ -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;
@@ -4,38 +4,46 @@ import "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region src/DataPreviewTable/components/Header/index.tsx
6
6
  function Header(props) {
7
- const { contentWidth, columns, columnLayout, setWidth, columnRange: [startIndex, endIndex], headerHeight } = props;
7
+ const { tableId, contentWidth, columns, columnLayout, setWidth, columnRange: [startIndex, endIndex], headerHeight } = props;
8
8
  return /* @__PURE__ */ jsx("div", {
9
+ role: "rowgroup",
9
10
  className: "ald-data-preview-header tw-z-[2] tw-w-full",
10
11
  style: { width: contentWidth },
11
- children: columns.slice(startIndex, endIndex + 1).map((column) => {
12
- const innerCell = column.renderHeader?.(column);
13
- const style = {
14
- height: headerHeight,
15
- width: columnLayout[column.id].width,
16
- top: 0,
17
- left: columnLayout[column.id].left,
18
- position: "absolute"
19
- };
20
- return /* @__PURE__ */ jsxs("div", {
21
- className: cn("ald-data-preview-header-cell", "tw-flex tw-items-center tw-border tw-border-l-0 tw-border-t-0 tw-border-solid tw-border-[var(--border-default)]", "tw-bg-[var(--background-neutral-surface)] tw-font-medium tw-text-[var(--content-primary)]"),
22
- style,
23
- children: [innerCell ? innerCell : /* @__PURE__ */ jsxs("div", {
24
- className: "ald-data-preview-header-default tw-flex tw-size-full tw-items-center tw-bg-[var(--background-neutral-surface)] tw-p-1 tw-leading-6",
25
- children: [/* @__PURE__ */ jsx("div", {
26
- className: "ald-data-preview-header-left tw-mr-1 tw-flex tw-h-full tw-items-center tw-justify-center tw-text-xs tw-text-[var(--content-secondary)]",
27
- children: column.icon !== void 0 ? column.icon : /* @__PURE__ */ jsx("span", {})
28
- }), /* @__PURE__ */ jsx("div", {
29
- className: "ald-data-preview-header-name tw-m-auto tw-truncate tw-text-left",
30
- children: column.name
12
+ children: /* @__PURE__ */ jsx("div", {
13
+ role: "row",
14
+ style: { display: "contents" },
15
+ children: columns.slice(startIndex, endIndex + 1).map((column) => {
16
+ const innerCell = column.renderHeader?.(column);
17
+ const style = {
18
+ height: headerHeight,
19
+ width: columnLayout[column.id].width,
20
+ top: 0,
21
+ left: columnLayout[column.id].left,
22
+ position: "absolute"
23
+ };
24
+ return /* @__PURE__ */ jsxs("div", {
25
+ id: `${tableId}-column-${encodeURIComponent(column.id)}`,
26
+ role: "columnheader",
27
+ "aria-label": column.name,
28
+ className: cn("ald-data-preview-header-cell", "tw-flex tw-items-center tw-border tw-border-l-0 tw-border-t-0 tw-border-solid tw-border-[var(--border-default)]", "tw-bg-[var(--background-neutral-surface)] tw-font-medium tw-text-[var(--content-primary)]"),
29
+ style,
30
+ children: [innerCell ? innerCell : /* @__PURE__ */ jsxs("div", {
31
+ className: "ald-data-preview-header-default tw-flex tw-size-full tw-items-center tw-bg-[var(--background-neutral-surface)] tw-p-1 tw-leading-6",
32
+ children: [/* @__PURE__ */ jsx("div", {
33
+ className: "ald-data-preview-header-left tw-mr-1 tw-flex tw-h-full tw-items-center tw-justify-center tw-text-xs tw-text-[var(--content-secondary)]",
34
+ children: column.icon !== void 0 ? column.icon : /* @__PURE__ */ jsx("span", {})
35
+ }), /* @__PURE__ */ jsx("div", {
36
+ className: "ald-data-preview-header-name tw-m-auto tw-truncate tw-text-left",
37
+ children: column.name
38
+ })]
39
+ }), /* @__PURE__ */ jsx(DragBar_default, {
40
+ columnId: column.id,
41
+ wrapWidth: columnLayout[column.id].width,
42
+ onChange: setWidth,
43
+ headerHeight
31
44
  })]
32
- }), /* @__PURE__ */ jsx(DragBar_default, {
33
- columnId: column.id,
34
- wrapWidth: columnLayout[column.id].width,
35
- onChange: setWidth,
36
- headerHeight
37
- })]
38
- }, column.id);
45
+ }, column.id);
46
+ })
39
47
  })
40
48
  });
41
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/DataPreviewTable/components/Header/index.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../../lib/utils';\nimport { IColumnLayout, PreviewColumn } from '../../interface';\nimport DragBar from '../DragBar';\ninterface IHeader {\n contentWidth: number;\n columns: PreviewColumn[];\n columnLayout: IColumnLayout;\n setWidth: (columnId: string, width: number) => void;\n columnRange: [number, number];\n headerHeight: number;\n}\nexport default function Header(props: IHeader) {\n const {\n contentWidth,\n columns,\n columnLayout,\n setWidth,\n columnRange: [startIndex, endIndex],\n headerHeight,\n } = props;\n return (\n <div\n className=\"ald-data-preview-header tw-z-[2] tw-w-full\"\n style={{ width: contentWidth }}\n >\n {columns.slice(startIndex, endIndex + 1).map((column) => {\n const innerCell = column.renderHeader?.(column);\n const style: React.CSSProperties = {\n height: headerHeight,\n width: columnLayout[column.id].width,\n top: 0,\n left: columnLayout[column.id].left,\n position: 'absolute',\n };\n\n return (\n <div\n className={cn(\n 'ald-data-preview-header-cell',\n 'tw-flex tw-items-center tw-border tw-border-l-0 tw-border-t-0 tw-border-solid tw-border-[var(--border-default)]',\n 'tw-bg-[var(--background-neutral-surface)] tw-font-medium tw-text-[var(--content-primary)]',\n )}\n key={column.id}\n style={style}\n >\n {innerCell ? (\n innerCell\n ) : (\n <div className=\"ald-data-preview-header-default tw-flex tw-size-full tw-items-center tw-bg-[var(--background-neutral-surface)] tw-p-1 tw-leading-6\">\n <div className=\"ald-data-preview-header-left tw-mr-1 tw-flex tw-h-full tw-items-center tw-justify-center tw-text-xs tw-text-[var(--content-secondary)]\">\n {column.icon !== undefined ? column.icon : <span></span>}\n </div>\n <div className=\"ald-data-preview-header-name tw-m-auto tw-truncate tw-text-left\">\n {column.name}\n </div>\n </div>\n )}\n <DragBar\n columnId={column.id}\n wrapWidth={columnLayout[column.id].width}\n onChange={setWidth}\n headerHeight={headerHeight}\n ></DragBar>\n </div>\n );\n })}\n </div>\n );\n}\n"],"mappings":";;;;;AAYA,SAAwB,OAAO,OAAgB;CAC7C,MAAM,EACJ,cACA,SACA,cACA,UACA,aAAa,CAAC,YAAY,WAC1B,iBACE;AACJ,QACE,oBAAC,OAAD;EACE,WAAU;EACV,OAAO,EAAE,OAAO,cAAc;YAE7B,QAAQ,MAAM,YAAY,WAAW,EAAE,CAAC,KAAK,WAAW;GACvD,MAAM,YAAY,OAAO,eAAe,OAAO;GAC/C,MAAM,QAA6B;IACjC,QAAQ;IACR,OAAO,aAAa,OAAO,IAAI;IAC/B,KAAK;IACL,MAAM,aAAa,OAAO,IAAI;IAC9B,UAAU;IACX;AAED,UACE,qBAAC,OAAD;IACE,WAAW,GACT,gCACA,mHACA,4FACD;IAEM;cAPT,CASG,YACC,YAEA,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,OAAD;MAAK,WAAU;gBACZ,OAAO,SAAS,SAAY,OAAO,OAAO,oBAAC,QAAD,EAAa,CAAA;MACpD,CAAA,EACN,oBAAC,OAAD;MAAK,WAAU;gBACZ,OAAO;MACJ,CAAA,CACF;QAER,oBAAC,iBAAD;KACE,UAAU,OAAO;KACjB,WAAW,aAAa,OAAO,IAAI;KACnC,UAAU;KACI;KACL,CAAA,CACP;MArBC,OAAO,GAqBR;IAER;EACE,CAAA"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/DataPreviewTable/components/Header/index.tsx"],"sourcesContent":["import React from 'react';\nimport { cn } from '../../../lib/utils';\nimport { IColumnLayout, PreviewColumn } from '../../interface';\nimport DragBar from '../DragBar';\ninterface IHeader {\n tableId: string;\n contentWidth: number;\n columns: PreviewColumn[];\n columnLayout: IColumnLayout;\n setWidth: (columnId: string, width: number) => void;\n columnRange: [number, number];\n headerHeight: number;\n}\nexport default function Header(props: IHeader) {\n const {\n tableId,\n contentWidth,\n columns,\n columnLayout,\n setWidth,\n columnRange: [startIndex, endIndex],\n headerHeight,\n } = props;\n return (\n <div\n role=\"rowgroup\"\n className=\"ald-data-preview-header tw-z-[2] tw-w-full\"\n style={{ width: contentWidth }}\n >\n <div role=\"row\" style={{ display: 'contents' }}>\n {columns.slice(startIndex, endIndex + 1).map((column) => {\n const innerCell = column.renderHeader?.(column);\n const style: React.CSSProperties = {\n height: headerHeight,\n width: columnLayout[column.id].width,\n top: 0,\n left: columnLayout[column.id].left,\n position: 'absolute',\n };\n\n return (\n <div\n id={`${tableId}-column-${encodeURIComponent(column.id)}`}\n role=\"columnheader\"\n aria-label={column.name}\n className={cn(\n 'ald-data-preview-header-cell',\n 'tw-flex tw-items-center tw-border tw-border-l-0 tw-border-t-0 tw-border-solid tw-border-[var(--border-default)]',\n 'tw-bg-[var(--background-neutral-surface)] tw-font-medium tw-text-[var(--content-primary)]',\n )}\n key={column.id}\n style={style}\n >\n {innerCell ? (\n innerCell\n ) : (\n <div className=\"ald-data-preview-header-default tw-flex tw-size-full tw-items-center tw-bg-[var(--background-neutral-surface)] tw-p-1 tw-leading-6\">\n <div className=\"ald-data-preview-header-left tw-mr-1 tw-flex tw-h-full tw-items-center tw-justify-center tw-text-xs tw-text-[var(--content-secondary)]\">\n {column.icon !== undefined ? column.icon : <span></span>}\n </div>\n <div className=\"ald-data-preview-header-name tw-m-auto tw-truncate tw-text-left\">\n {column.name}\n </div>\n </div>\n )}\n <DragBar\n columnId={column.id}\n wrapWidth={columnLayout[column.id].width}\n onChange={setWidth}\n headerHeight={headerHeight}\n ></DragBar>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;AAaA,SAAwB,OAAO,OAAgB;CAC7C,MAAM,EACJ,SACA,cACA,SACA,cACA,UACA,aAAa,CAAC,YAAY,WAC1B,iBACE;AACJ,QACE,oBAAC,OAAD;EACE,MAAK;EACL,WAAU;EACV,OAAO,EAAE,OAAO,cAAc;YAE9B,oBAAC,OAAD;GAAK,MAAK;GAAM,OAAO,EAAE,SAAS,YAAY;aAC3C,QAAQ,MAAM,YAAY,WAAW,EAAE,CAAC,KAAK,WAAW;IACvD,MAAM,YAAY,OAAO,eAAe,OAAO;IAC/C,MAAM,QAA6B;KACjC,QAAQ;KACR,OAAO,aAAa,OAAO,IAAI;KAC/B,KAAK;KACL,MAAM,aAAa,OAAO,IAAI;KAC9B,UAAU;KACX;AAED,WACE,qBAAC,OAAD;KACE,IAAI,GAAG,QAAQ,UAAU,mBAAmB,OAAO,GAAG;KACtD,MAAK;KACL,cAAY,OAAO;KACnB,WAAW,GACT,gCACA,mHACA,4FACD;KAEM;eAVT,CAYG,YACC,YAEA,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,OAAD;OAAK,WAAU;iBACZ,OAAO,SAAS,SAAY,OAAO,OAAO,oBAAC,QAAD,EAAa,CAAA;OACpD,CAAA,EACN,oBAAC,OAAD;OAAK,WAAU;iBACZ,OAAO;OACJ,CAAA,CACF;SAER,oBAAC,iBAAD;MACE,UAAU,OAAO;MACjB,WAAW,aAAa,OAAO,IAAI;MACnC,UAAU;MACI;MACL,CAAA,CACP;OArBC,OAAO,GAqBR;KAER;GACE,CAAA;EACF,CAAA"}
@@ -7,13 +7,17 @@ import Body_default from "./components/Body/index.js";
7
7
  import Error_default from "./components/Body/Error.js";
8
8
  import Header from "./components/Header/index.js";
9
9
  import useDirection from "./hooks/useDirection.js";
10
- import { forwardRef, memo, useContext, useImperativeHandle, useMemo, useRef } from "react";
10
+ import React, { forwardRef, memo, useContext, useImperativeHandle, useMemo, useRef } from "react";
11
11
  import { jsx, jsxs } from "react/jsx-runtime";
12
+ //#region src/DataPreviewTable/index.tsx
13
+ var EMPTY_COLUMNS = [];
14
+ var EMPTY_DATASOURCE = [];
12
15
  var DataPreviewTable_default = memo(forwardRef(function(props, ref) {
13
16
  const { locale } = useContext(LocaleContext);
14
17
  const t = getTranslator(locale);
15
- const { columns = [], datasource = [], width, height, headerHeight = 0, loading, dataStatus, errorMsg = t.DataPreviewTable.dataLoadFailed } = props;
18
+ const { columns = EMPTY_COLUMNS, datasource = EMPTY_DATASOURCE, width, height, headerHeight = 0, loading, dataStatus, errorMsg = t.DataPreviewTable.dataLoadFailed } = props;
16
19
  const realHeaderHeight = Math.max(headerHeight, 32);
20
+ const tableId = `ald-data-preview-${React.useId().replace(/:/g, "")}`;
17
21
  const contentHeight = useMemo(() => {
18
22
  return datasource.length * 20 + realHeaderHeight;
19
23
  }, [datasource, realHeaderHeight]);
@@ -46,6 +50,9 @@ var DataPreviewTable_default = memo(forwardRef(function(props, ref) {
46
50
  return rows - 1 < 0 ? 0 : rows - 1;
47
51
  }, [realHeaderHeight]);
48
52
  return /* @__PURE__ */ jsxs("div", {
53
+ role: "table",
54
+ "aria-label": "Data preview table",
55
+ "aria-busy": loading || dataStatus === "pending" || void 0,
49
56
  style: {
50
57
  width,
51
58
  height
@@ -73,6 +80,7 @@ var DataPreviewTable_default = memo(forwardRef(function(props, ref) {
73
80
  /* @__PURE__ */ jsx("div", {
74
81
  className: "ald-data-preview-sticky tw-sticky tw-top-0 tw-z-[1]",
75
82
  children: /* @__PURE__ */ jsx(Header, {
83
+ tableId,
76
84
  contentWidth,
77
85
  headerHeight: realHeaderHeight,
78
86
  columns: tableColumns,
@@ -82,10 +90,13 @@ var DataPreviewTable_default = memo(forwardRef(function(props, ref) {
82
90
  })
83
91
  }),
84
92
  dataStatus === "pending" && tableColumns.length > 0 && /* @__PURE__ */ jsx("div", {
93
+ role: "status",
94
+ "aria-live": "polite",
85
95
  className: "ald-data-preview-loading tw-fixed tw-flex tw-size-full tw-items-center tw-justify-center",
86
96
  children: /* @__PURE__ */ jsx(CustomSpin, {})
87
97
  }),
88
98
  dataStatus === "success" && /* @__PURE__ */ jsx(Body_default, {
99
+ tableId,
89
100
  columns: tableColumns,
90
101
  columnRange,
91
102
  columnLayout,
@@ -98,6 +109,12 @@ var DataPreviewTable_default = memo(forwardRef(function(props, ref) {
98
109
  wrapWidth: wrapRef.current?.clientWidth || 0,
99
110
  wrapHeight: wrapRef.current?.clientHeight || 0,
100
111
  headerHeight: realHeaderHeight
112
+ }),
113
+ dataStatus === "success" && datasource.length === 0 && /* @__PURE__ */ jsx("div", {
114
+ role: "status",
115
+ "aria-live": "polite",
116
+ className: "tw-sr-only",
117
+ children: "No data"
101
118
  })
102
119
  ]
103
120
  })
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/DataPreviewTable/index.tsx"],"sourcesContent":["import { cn } from '../lib/utils';\nimport React, {\n forwardRef,\n memo,\n useContext,\n useImperativeHandle,\n useMemo,\n useRef,\n} from 'react';\nimport Progress, { IProgressRef } from '../Progress';\nimport ScrollArea from '../ScrollArea';\nimport Spin from '../Spin';\nimport { LocaleContext, getTranslator } from '../locale/default';\nimport Body from './components/Body';\nimport Error from './components/Body/Error';\nimport Header from './components/Header';\nimport { CELL_HEIGHT, DEFAULT_HEADER_HEIGHT } from './constant';\nimport useDirection from './hooks/useDirection';\nimport { DataPreviewTableRef, ITableProps } from './interface';\n\nconst DataPreviewTable = forwardRef(function (\n props: ITableProps,\n ref: React.Ref<DataPreviewTableRef>,\n) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const {\n columns = [],\n datasource = [],\n width,\n height,\n headerHeight = 0,\n loading,\n dataStatus,\n errorMsg = t.DataPreviewTable.dataLoadFailed,\n } = props;\n\n const realHeaderHeight = Math.max(headerHeight, DEFAULT_HEADER_HEIGHT);\n const contentHeight = useMemo(() => {\n return datasource.length * CELL_HEIGHT + realHeaderHeight;\n }, [datasource, realHeaderHeight]);\n const wrapRef = useRef<HTMLDivElement>(null);\n const progressRef = useRef<IProgressRef>(null);\n const {\n columnRange,\n rowRange,\n onScroll,\n columnLayout,\n setColumnsWidth,\n tableColumns,\n contentWidth,\n } = useDirection(columns, wrapRef);\n\n useImperativeHandle(ref, () => ({\n scrollToColumnInView: (columnId: string) => {\n // 实现scrollTo方法\n const columnPos = columnLayout[columnId];\n if (!columnPos) return;\n // 根据容器的宽度,容器的scrollLeft,columnPos,判断当前列是否在可视区域内\n const { scrollLeft } = wrapRef.current as HTMLDivElement;\n const { left, width } = columnPos;\n const containerWidth = wrapRef.current?.clientWidth || 0;\n if (left < scrollLeft) {\n // 左边不可见\n wrapRef.current?.scrollTo({\n left,\n behavior: 'smooth',\n });\n } else if (left + width > scrollLeft + containerWidth) {\n // 右边不可见\n wrapRef.current?.scrollTo({\n left: left + width - containerWidth,\n behavior: 'smooth',\n });\n }\n },\n progressRestart: () => {\n progressRef.current?.restart();\n },\n }));\n\n const skeletonRows = useMemo(() => {\n if (!wrapRef.current) return 0;\n const rows = Math.ceil(\n ((wrapRef.current?.clientHeight || 0) - realHeaderHeight) / CELL_HEIGHT,\n );\n return rows - 1 < 0 ? 0 : rows - 1;\n }, [realHeaderHeight]);\n\n return (\n <div\n style={{ width, height }}\n className={cn(\n props.className,\n 'ald-data-preview-table tw-relative tw-box-border tw-border tw-border-solid tw-border-[var(--border-default)] tw-text-xs tw-tabular-nums [&_*]:tw-box-border',\n {\n 'ald-data-preview-table-show-skeleton': dataStatus === 'pending',\n },\n )}\n >\n <div className=\"ald-data-preview-progress tw-absolute tw-left-0 tw-top-0 tw-z-[3] tw-w-full\">\n <Progress loading={!!loading} ref={progressRef} />\n </div>\n <ScrollArea\n ref={wrapRef}\n style={{ willChange: 'transform' }}\n onViewportScroll={() => {\n // const { scrollTop, scrollLeft } = e.target as HTMLDivElement;\n onScroll();\n }}\n >\n <div\n style={{\n height:\n dataStatus === 'pending'\n ? skeletonRows * CELL_HEIGHT + realHeaderHeight\n : contentHeight,\n position: 'relative',\n width: 'fit-content',\n }}\n >\n <div className=\"ald-data-preview-sticky tw-sticky tw-top-0 tw-z-[1]\">\n <Header\n contentWidth={contentWidth}\n headerHeight={realHeaderHeight}\n columns={tableColumns}\n columnLayout={columnLayout}\n setWidth={setColumnsWidth}\n columnRange={columnRange}\n />\n </div>\n {dataStatus === 'pending' && tableColumns.length > 0 && (\n <div className=\"ald-data-preview-loading tw-fixed tw-flex tw-size-full tw-items-center tw-justify-center\">\n <Spin />\n </div>\n )}\n {dataStatus === 'success' && (\n <Body\n columns={tableColumns}\n columnRange={columnRange}\n columnLayout={columnLayout}\n datasource={datasource}\n rowRange={rowRange}\n headerHeight={realHeaderHeight}\n />\n )}\n {dataStatus === 'error' && (\n <Error\n errorMsg={errorMsg}\n wrapWidth={wrapRef.current?.clientWidth || 0}\n wrapHeight={wrapRef.current?.clientHeight || 0}\n headerHeight={realHeaderHeight}\n />\n )}\n </div>\n </ScrollArea>\n </div>\n );\n});\n\nexport default memo(DataPreviewTable);\n"],"mappings":";;;;;;;;;;;AAiKA,IAAA,2BAAe,KA7IU,WAAW,SAClC,OACA,KACA;CACA,MAAM,EAAE,WAAW,WAAW,cAAc;CAC5C,MAAM,IAAI,cAAc,OAAO;CAE/B,MAAM,EACJ,UAAU,EAAE,EACZ,aAAa,EAAE,EACf,OACA,QACA,eAAe,GACf,SACA,YACA,WAAW,EAAE,iBAAiB,mBAC5B;CAEJ,MAAM,mBAAmB,KAAK,IAAI,cAAA,GAAoC;CACtE,MAAM,gBAAgB,cAAc;AAClC,SAAO,WAAW,SAAA,KAAuB;IACxC,CAAC,YAAY,iBAAiB,CAAC;CAClC,MAAM,UAAU,OAAuB,KAAK;CAC5C,MAAM,cAAc,OAAqB,KAAK;CAC9C,MAAM,EACJ,aACA,UACA,UACA,cACA,iBACA,cACA,iBACE,aAAa,SAAS,QAAQ;AAElC,qBAAoB,YAAY;EAC9B,uBAAuB,aAAqB;GAE1C,MAAM,YAAY,aAAa;AAC/B,OAAI,CAAC,UAAW;GAEhB,MAAM,EAAE,eAAe,QAAQ;GAC/B,MAAM,EAAE,MAAM,UAAU;GACxB,MAAM,iBAAiB,QAAQ,SAAS,eAAe;AACvD,OAAI,OAAO,WAET,SAAQ,SAAS,SAAS;IACxB;IACA,UAAU;IACX,CAAC;YACO,OAAO,QAAQ,aAAa,eAErC,SAAQ,SAAS,SAAS;IACxB,MAAM,OAAO,QAAQ;IACrB,UAAU;IACX,CAAC;;EAGN,uBAAuB;AACrB,eAAY,SAAS,SAAS;;EAEjC,EAAE;CAEH,MAAM,eAAe,cAAc;AACjC,MAAI,CAAC,QAAQ,QAAS,QAAO;EAC7B,MAAM,OAAO,KAAK,OACd,QAAQ,SAAS,gBAAgB,KAAK,oBAAA,GACzC;AACD,SAAO,OAAO,IAAI,IAAI,IAAI,OAAO;IAChC,CAAC,iBAAiB,CAAC;AAEtB,QACE,qBAAC,OAAD;EACE,OAAO;GAAE;GAAO;GAAQ;EACxB,WAAW,GACT,MAAM,WACN,+JACA,EACE,wCAAwC,eAAe,WACxD,CACF;YARH,CAUE,oBAAC,OAAD;GAAK,WAAU;aACb,oBAAC,kBAAD;IAAU,SAAS,CAAC,CAAC;IAAS,KAAK;IAAe,CAAA;GAC9C,CAAA,EACN,oBAAC,oBAAD;GACE,KAAK;GACL,OAAO,EAAE,YAAY,aAAa;GAClC,wBAAwB;AAEtB,cAAU;;aAGZ,qBAAC,OAAD;IACE,OAAO;KACL,QACE,eAAe,YACX,eAAA,KAA6B,mBAC7B;KACN,UAAU;KACV,OAAO;KACR;cARH;KAUE,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,QAAD;OACgB;OACd,cAAc;OACd,SAAS;OACK;OACd,UAAU;OACG;OACb,CAAA;MACE,CAAA;KACL,eAAe,aAAa,aAAa,SAAS,KACjD,oBAAC,OAAD;MAAK,WAAU;gBACb,oBAAC,YAAD,EAAQ,CAAA;MACJ,CAAA;KAEP,eAAe,aACd,oBAAC,cAAD;MACE,SAAS;MACI;MACC;MACF;MACF;MACV,cAAc;MACd,CAAA;KAEH,eAAe,WACd,oBAAC,eAAD;MACY;MACV,WAAW,QAAQ,SAAS,eAAe;MAC3C,YAAY,QAAQ,SAAS,gBAAgB;MAC7C,cAAc;MACd,CAAA;KAEA;;GACK,CAAA,CACT;;EAER,CAEmC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/DataPreviewTable/index.tsx"],"sourcesContent":["import { cn } from '../lib/utils';\nimport React, {\n forwardRef,\n memo,\n useContext,\n useImperativeHandle,\n useMemo,\n useRef,\n} from 'react';\nimport Progress, { IProgressRef } from '../Progress';\nimport ScrollArea from '../ScrollArea';\nimport Spin from '../Spin';\nimport { LocaleContext, getTranslator } from '../locale/default';\nimport Body from './components/Body';\nimport Error from './components/Body/Error';\nimport Header from './components/Header';\nimport { CELL_HEIGHT, DEFAULT_HEADER_HEIGHT } from './constant';\nimport useDirection from './hooks/useDirection';\nimport {\n DataPreviewTableRef,\n ITableProps,\n PreviewColumn,\n TValue,\n} from './interface';\n\nconst EMPTY_COLUMNS: PreviewColumn[] = [];\nconst EMPTY_DATASOURCE: TValue[][] = [];\n\nconst DataPreviewTable = forwardRef(function (\n props: ITableProps,\n ref: React.Ref<DataPreviewTableRef>,\n) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const {\n columns = EMPTY_COLUMNS,\n datasource = EMPTY_DATASOURCE,\n width,\n height,\n headerHeight = 0,\n loading,\n dataStatus,\n errorMsg = t.DataPreviewTable.dataLoadFailed,\n } = props;\n\n const realHeaderHeight = Math.max(headerHeight, DEFAULT_HEADER_HEIGHT);\n const tableId = `ald-data-preview-${React.useId().replace(/:/g, '')}`;\n const contentHeight = useMemo(() => {\n return datasource.length * CELL_HEIGHT + realHeaderHeight;\n }, [datasource, realHeaderHeight]);\n const wrapRef = useRef<HTMLDivElement>(null);\n const progressRef = useRef<IProgressRef>(null);\n const {\n columnRange,\n rowRange,\n onScroll,\n columnLayout,\n setColumnsWidth,\n tableColumns,\n contentWidth,\n } = useDirection(columns, wrapRef);\n\n useImperativeHandle(ref, () => ({\n scrollToColumnInView: (columnId: string) => {\n // 实现scrollTo方法\n const columnPos = columnLayout[columnId];\n if (!columnPos) return;\n // 根据容器的宽度,容器的scrollLeft,columnPos,判断当前列是否在可视区域内\n const { scrollLeft } = wrapRef.current as HTMLDivElement;\n const { left, width } = columnPos;\n const containerWidth = wrapRef.current?.clientWidth || 0;\n if (left < scrollLeft) {\n // 左边不可见\n wrapRef.current?.scrollTo({\n left,\n behavior: 'smooth',\n });\n } else if (left + width > scrollLeft + containerWidth) {\n // 右边不可见\n wrapRef.current?.scrollTo({\n left: left + width - containerWidth,\n behavior: 'smooth',\n });\n }\n },\n progressRestart: () => {\n progressRef.current?.restart();\n },\n }));\n\n const skeletonRows = useMemo(() => {\n if (!wrapRef.current) return 0;\n const rows = Math.ceil(\n ((wrapRef.current?.clientHeight || 0) - realHeaderHeight) / CELL_HEIGHT,\n );\n return rows - 1 < 0 ? 0 : rows - 1;\n }, [realHeaderHeight]);\n\n return (\n <div\n role=\"table\"\n aria-label=\"Data preview table\"\n aria-busy={loading || dataStatus === 'pending' || undefined}\n style={{ width, height }}\n className={cn(\n props.className,\n 'ald-data-preview-table tw-relative tw-box-border tw-border tw-border-solid tw-border-[var(--border-default)] tw-text-xs tw-tabular-nums [&_*]:tw-box-border',\n {\n 'ald-data-preview-table-show-skeleton': dataStatus === 'pending',\n },\n )}\n >\n <div className=\"ald-data-preview-progress tw-absolute tw-left-0 tw-top-0 tw-z-[3] tw-w-full\">\n <Progress loading={!!loading} ref={progressRef} />\n </div>\n <ScrollArea\n ref={wrapRef}\n style={{ willChange: 'transform' }}\n onViewportScroll={() => {\n // const { scrollTop, scrollLeft } = e.target as HTMLDivElement;\n onScroll();\n }}\n >\n <div\n style={{\n height:\n dataStatus === 'pending'\n ? skeletonRows * CELL_HEIGHT + realHeaderHeight\n : contentHeight,\n position: 'relative',\n width: 'fit-content',\n }}\n >\n <div className=\"ald-data-preview-sticky tw-sticky tw-top-0 tw-z-[1]\">\n <Header\n tableId={tableId}\n contentWidth={contentWidth}\n headerHeight={realHeaderHeight}\n columns={tableColumns}\n columnLayout={columnLayout}\n setWidth={setColumnsWidth}\n columnRange={columnRange}\n />\n </div>\n {dataStatus === 'pending' && tableColumns.length > 0 && (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className=\"ald-data-preview-loading tw-fixed tw-flex tw-size-full tw-items-center tw-justify-center\"\n >\n <Spin />\n </div>\n )}\n {dataStatus === 'success' && (\n <Body\n tableId={tableId}\n columns={tableColumns}\n columnRange={columnRange}\n columnLayout={columnLayout}\n datasource={datasource}\n rowRange={rowRange}\n headerHeight={realHeaderHeight}\n />\n )}\n {dataStatus === 'error' && (\n <Error\n errorMsg={errorMsg}\n wrapWidth={wrapRef.current?.clientWidth || 0}\n wrapHeight={wrapRef.current?.clientHeight || 0}\n headerHeight={realHeaderHeight}\n />\n )}\n {dataStatus === 'success' && datasource.length === 0 && (\n <div role=\"status\" aria-live=\"polite\" className=\"tw-sr-only\">\n No data\n </div>\n )}\n </div>\n </ScrollArea>\n </div>\n );\n});\n\nexport default memo(DataPreviewTable);\n"],"mappings":"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"}
@@ -14,6 +14,10 @@ export interface DrawerProps {
14
14
  destroyOnClose?: boolean;
15
15
  className?: string;
16
16
  rootClassName?: string;
17
+ /** Pass through to the drawer content root for automated testing. */
18
+ 'data-testid'?: string;
19
+ /** Pass through to the drawer content root when no title is rendered. */
20
+ 'aria-label'?: string;
17
21
  style?: React.CSSProperties;
18
22
  contentWrapperStyle?: React.CSSProperties;
19
23
  bodyStyle?: React.CSSProperties;