@superad/ui 0.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 (343) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/es/Button/Button.d.mts +7 -0
  4. package/es/Button/Button.mjs +29 -0
  5. package/es/Button/Button.mjs.map +1 -0
  6. package/es/Button/index.d.mts +3 -0
  7. package/es/Button/index.d.ts +1 -0
  8. package/es/Button/index.js +1 -0
  9. package/es/Button/index.mjs +2 -0
  10. package/es/Button/style.mjs +33 -0
  11. package/es/Button/style.mjs.map +1 -0
  12. package/es/Button/type.d.mts +21 -0
  13. package/es/ConfigProvider/index.d.mts +9 -0
  14. package/es/ConfigProvider/index.d.ts +1 -0
  15. package/es/ConfigProvider/index.js +1 -0
  16. package/es/ConfigProvider/index.mjs +82 -0
  17. package/es/ConfigProvider/index.mjs.map +1 -0
  18. package/es/ConfigProvider/type.d.mts +24 -0
  19. package/es/DraggablePanel/DraggablePanel.d.mts +6 -0
  20. package/es/DraggablePanel/DraggablePanel.mjs +104 -0
  21. package/es/DraggablePanel/DraggablePanel.mjs.map +1 -0
  22. package/es/DraggablePanel/index.d.mts +3 -0
  23. package/es/DraggablePanel/index.d.ts +1 -0
  24. package/es/DraggablePanel/index.js +1 -0
  25. package/es/DraggablePanel/index.mjs +3 -0
  26. package/es/DraggablePanel/style.mjs +86 -0
  27. package/es/DraggablePanel/style.mjs.map +1 -0
  28. package/es/DraggablePanel/type.d.mts +27 -0
  29. package/es/Flex/Center.d.mts +7 -0
  30. package/es/Flex/Center.mjs +14 -0
  31. package/es/Flex/Center.mjs.map +1 -0
  32. package/es/Flex/FlexBasic.d.mts +6 -0
  33. package/es/Flex/FlexBasic.mjs +46 -0
  34. package/es/Flex/FlexBasic.mjs.map +1 -0
  35. package/es/Flex/Flexbox.d.mts +2 -0
  36. package/es/Flex/index.d.mts +5 -0
  37. package/es/Flex/index.d.ts +1 -0
  38. package/es/Flex/index.js +1 -0
  39. package/es/Flex/index.mjs +3 -0
  40. package/es/Flex/type.d.mts +35 -0
  41. package/es/Flex/utils.mjs +24 -0
  42. package/es/Flex/utils.mjs.map +1 -0
  43. package/es/FontLoader/index.d.mts +9 -0
  44. package/es/FontLoader/index.d.ts +1 -0
  45. package/es/FontLoader/index.js +1 -0
  46. package/es/FontLoader/index.mjs +23 -0
  47. package/es/FontLoader/index.mjs.map +1 -0
  48. package/es/GlobalFocusRing/index.d.mts +6 -0
  49. package/es/GlobalFocusRing/index.d.ts +1 -0
  50. package/es/GlobalFocusRing/index.js +1 -0
  51. package/es/GlobalFocusRing/index.mjs +204 -0
  52. package/es/GlobalFocusRing/index.mjs.map +1 -0
  53. package/es/GlobalFocusRing/style.mjs +35 -0
  54. package/es/GlobalFocusRing/style.mjs.map +1 -0
  55. package/es/Provider.d.mts +5 -0
  56. package/es/Table/canvas/canvasPalette.mjs +11 -0
  57. package/es/Table/canvas/canvasPalette.mjs.map +1 -0
  58. package/es/Table/canvas/chipPainters.mjs +408 -0
  59. package/es/Table/canvas/chipPainters.mjs.map +1 -0
  60. package/es/Table/canvas/controlPainters.mjs +193 -0
  61. package/es/Table/canvas/controlPainters.mjs.map +1 -0
  62. package/es/Table/canvas/groupTitle.mjs +181 -0
  63. package/es/Table/canvas/groupTitle.mjs.map +1 -0
  64. package/es/Table/canvas/paintUtils.mjs +70 -0
  65. package/es/Table/canvas/paintUtils.mjs.map +1 -0
  66. package/es/Table/canvas/rowSeries.mjs +130 -0
  67. package/es/Table/canvas/rowSeries.mjs.map +1 -0
  68. package/es/Table/canvas/textPainters.mjs +97 -0
  69. package/es/Table/canvas/textPainters.mjs.map +1 -0
  70. package/es/Table/canvas/theme.d.mts +14 -0
  71. package/es/Table/canvas/theme.mjs +276 -0
  72. package/es/Table/canvas/theme.mjs.map +1 -0
  73. package/es/Table/core/cellValue.d.mts +1 -0
  74. package/es/Table/core/cellValue.mjs +240 -0
  75. package/es/Table/core/cellValue.mjs.map +1 -0
  76. package/es/Table/core/rowSelection.mjs +138 -0
  77. package/es/Table/core/rowSelection.mjs.map +1 -0
  78. package/es/Table/core/size.mjs +60 -0
  79. package/es/Table/core/size.mjs.map +1 -0
  80. package/es/Table/core/tableI18n.d.mts +11 -0
  81. package/es/Table/core/tableI18n.mjs +123 -0
  82. package/es/Table/core/tableI18n.mjs.map +1 -0
  83. package/es/Table/core/tagTone.mjs +245 -0
  84. package/es/Table/core/tagTone.mjs.map +1 -0
  85. package/es/Table/core/zIndex.mjs +7 -0
  86. package/es/Table/core/zIndex.mjs.map +1 -0
  87. package/es/Table/index.d.mts +6 -0
  88. package/es/Table/index.d.ts +1 -0
  89. package/es/Table/index.js +1 -0
  90. package/es/Table/index.mjs +6 -0
  91. package/es/Table/react/Table.d.mts +9 -0
  92. package/es/Table/react/Table.mjs +407 -0
  93. package/es/Table/react/Table.mjs.map +1 -0
  94. package/es/Table/react/TableColumnSettings.mjs +65 -0
  95. package/es/Table/react/TableColumnSettings.mjs.map +1 -0
  96. package/es/Table/react/a11y.mjs +72 -0
  97. package/es/Table/react/a11y.mjs.map +1 -0
  98. package/es/Table/react/editors/base.mjs +427 -0
  99. package/es/Table/react/editors/base.mjs.map +1 -0
  100. package/es/Table/react/editors/inline.mjs +225 -0
  101. package/es/Table/react/editors/inline.mjs.map +1 -0
  102. package/es/Table/react/editors/picker.mjs +368 -0
  103. package/es/Table/react/editors/picker.mjs.map +1 -0
  104. package/es/Table/react/overlayChips.mjs +50 -0
  105. package/es/Table/react/overlayChips.mjs.map +1 -0
  106. package/es/Table/react/sameRenderInputs.mjs +50 -0
  107. package/es/Table/react/sameRenderInputs.mjs.map +1 -0
  108. package/es/Table/react/style.mjs +650 -0
  109. package/es/Table/react/style.mjs.map +1 -0
  110. package/es/Table/react/useTableCellEvents.mjs +32 -0
  111. package/es/Table/react/useTableCellEvents.mjs.map +1 -0
  112. package/es/Table/react/useTableColumnSettings.mjs +107 -0
  113. package/es/Table/react/useTableColumnSettings.mjs.map +1 -0
  114. package/es/Table/react/useTableEditorSync.mjs +41 -0
  115. package/es/Table/react/useTableEditorSync.mjs.map +1 -0
  116. package/es/Table/react/useTableHoverHint.mjs +62 -0
  117. package/es/Table/react/useTableHoverHint.mjs.map +1 -0
  118. package/es/Table/react/useTableKeyboard.mjs +41 -0
  119. package/es/Table/react/useTableKeyboard.mjs.map +1 -0
  120. package/es/Table/react/useTableRenderState.mjs +194 -0
  121. package/es/Table/react/useTableRenderState.mjs.map +1 -0
  122. package/es/Table/react/useTableScroll.mjs +33 -0
  123. package/es/Table/react/useTableScroll.mjs.map +1 -0
  124. package/es/Table/react/useTableSelectionInfo.mjs +48 -0
  125. package/es/Table/react/useTableSelectionInfo.mjs.map +1 -0
  126. package/es/Table/react/useTableVTableEvents.mjs +132 -0
  127. package/es/Table/react/useTableVTableEvents.mjs.map +1 -0
  128. package/es/Table/type.d.mts +279 -0
  129. package/es/Table/type.mjs +34 -0
  130. package/es/Table/type.mjs.map +1 -0
  131. package/es/Table/vtable/columns.d.mts +17 -0
  132. package/es/Table/vtable/columns.mjs +381 -0
  133. package/es/Table/vtable/columns.mjs.map +1 -0
  134. package/es/Table/vtable/frozenShadow.mjs +27 -0
  135. package/es/Table/vtable/frozenShadow.mjs.map +1 -0
  136. package/es/Table/vtable/interaction.mjs +175 -0
  137. package/es/Table/vtable/interaction.mjs.map +1 -0
  138. package/es/Table/vtable/option.d.mts +39 -0
  139. package/es/Table/vtable/option.mjs +232 -0
  140. package/es/Table/vtable/option.mjs.map +1 -0
  141. package/es/Table/vtable/seriesSelection.mjs +374 -0
  142. package/es/Table/vtable/seriesSelection.mjs.map +1 -0
  143. package/es/Table/vtable/vtableAdapter.mjs +96 -0
  144. package/es/Table/vtable/vtableAdapter.mjs.map +1 -0
  145. package/es/ThemeProvider/AppElementContext.d.mts +5 -0
  146. package/es/ThemeProvider/AppElementContext.mjs +10 -0
  147. package/es/ThemeProvider/AppElementContext.mjs.map +1 -0
  148. package/es/ThemeProvider/ConfigProvider.mjs +29 -0
  149. package/es/ThemeProvider/ConfigProvider.mjs.map +1 -0
  150. package/es/ThemeProvider/GlobalStyle/antdOverride.mjs +73 -0
  151. package/es/ThemeProvider/GlobalStyle/antdOverride.mjs.map +1 -0
  152. package/es/ThemeProvider/GlobalStyle/essential.mjs +50 -0
  153. package/es/ThemeProvider/GlobalStyle/essential.mjs.map +1 -0
  154. package/es/ThemeProvider/GlobalStyle/global.mjs +90 -0
  155. package/es/ThemeProvider/GlobalStyle/global.mjs.map +1 -0
  156. package/es/ThemeProvider/GlobalStyle/index.mjs +14 -0
  157. package/es/ThemeProvider/GlobalStyle/index.mjs.map +1 -0
  158. package/es/ThemeProvider/Meta.d.mts +7 -0
  159. package/es/ThemeProvider/Meta.mjs +48 -0
  160. package/es/ThemeProvider/Meta.mjs.map +1 -0
  161. package/es/ThemeProvider/ThemeProvider.d.mts +6 -0
  162. package/es/ThemeProvider/ThemeProvider.mjs +89 -0
  163. package/es/ThemeProvider/ThemeProvider.mjs.map +1 -0
  164. package/es/ThemeProvider/constants.d.mts +5 -0
  165. package/es/ThemeProvider/constants.mjs +6 -0
  166. package/es/ThemeProvider/constants.mjs.map +1 -0
  167. package/es/ThemeProvider/index.d.mts +6 -0
  168. package/es/ThemeProvider/index.d.ts +1 -0
  169. package/es/ThemeProvider/index.js +1 -0
  170. package/es/ThemeProvider/index.mjs +5 -0
  171. package/es/ThemeProvider/type.d.mts +48 -0
  172. package/es/_virtual/_rolldown/runtime.mjs +13 -0
  173. package/es/color/colors/blue.d.mts +6 -0
  174. package/es/color/colors/blue.mjs +67 -0
  175. package/es/color/colors/blue.mjs.map +1 -0
  176. package/es/color/colors/cyan.d.mts +6 -0
  177. package/es/color/colors/cyan.mjs +67 -0
  178. package/es/color/colors/cyan.mjs.map +1 -0
  179. package/es/color/colors/geekblue.d.mts +6 -0
  180. package/es/color/colors/geekblue.mjs +67 -0
  181. package/es/color/colors/geekblue.mjs.map +1 -0
  182. package/es/color/colors/gold.d.mts +6 -0
  183. package/es/color/colors/gold.mjs +67 -0
  184. package/es/color/colors/gold.mjs.map +1 -0
  185. package/es/color/colors/gray.d.mts +6 -0
  186. package/es/color/colors/gray.mjs +67 -0
  187. package/es/color/colors/gray.mjs.map +1 -0
  188. package/es/color/colors/green.d.mts +6 -0
  189. package/es/color/colors/green.mjs +67 -0
  190. package/es/color/colors/green.mjs.map +1 -0
  191. package/es/color/colors/index.d.mts +22 -0
  192. package/es/color/colors/index.mjs +35 -0
  193. package/es/color/colors/index.mjs.map +1 -0
  194. package/es/color/colors/lime.d.mts +6 -0
  195. package/es/color/colors/lime.mjs +67 -0
  196. package/es/color/colors/lime.mjs.map +1 -0
  197. package/es/color/colors/magenta.d.mts +6 -0
  198. package/es/color/colors/magenta.mjs +67 -0
  199. package/es/color/colors/magenta.mjs.map +1 -0
  200. package/es/color/colors/orange.d.mts +6 -0
  201. package/es/color/colors/orange.mjs +67 -0
  202. package/es/color/colors/orange.mjs.map +1 -0
  203. package/es/color/colors/primary.d.mts +6 -0
  204. package/es/color/colors/primary.mjs +67 -0
  205. package/es/color/colors/primary.mjs.map +1 -0
  206. package/es/color/colors/purple.d.mts +6 -0
  207. package/es/color/colors/purple.mjs +67 -0
  208. package/es/color/colors/purple.mjs.map +1 -0
  209. package/es/color/colors/red.d.mts +6 -0
  210. package/es/color/colors/red.mjs +67 -0
  211. package/es/color/colors/red.mjs.map +1 -0
  212. package/es/color/colors/volcano.d.mts +6 -0
  213. package/es/color/colors/volcano.mjs +67 -0
  214. package/es/color/colors/volcano.mjs.map +1 -0
  215. package/es/color/colors/yellow.d.mts +6 -0
  216. package/es/color/colors/yellow.mjs +67 -0
  217. package/es/color/colors/yellow.mjs.map +1 -0
  218. package/es/color/index.d.mts +23 -0
  219. package/es/color/index.d.ts +1 -0
  220. package/es/color/index.js +1 -0
  221. package/es/color/index.mjs +22 -0
  222. package/es/color/neutrals/index.d.mts +13 -0
  223. package/es/color/neutrals/index.mjs +17 -0
  224. package/es/color/neutrals/index.mjs.map +1 -0
  225. package/es/color/neutrals/mauve.d.mts +6 -0
  226. package/es/color/neutrals/mauve.mjs +67 -0
  227. package/es/color/neutrals/mauve.mjs.map +1 -0
  228. package/es/color/neutrals/olive.d.mts +6 -0
  229. package/es/color/neutrals/olive.mjs +67 -0
  230. package/es/color/neutrals/olive.mjs.map +1 -0
  231. package/es/color/neutrals/sage.d.mts +6 -0
  232. package/es/color/neutrals/sage.mjs +67 -0
  233. package/es/color/neutrals/sage.mjs.map +1 -0
  234. package/es/color/neutrals/sand.d.mts +6 -0
  235. package/es/color/neutrals/sand.mjs +67 -0
  236. package/es/color/neutrals/sand.mjs.map +1 -0
  237. package/es/color/neutrals/slate.d.mts +6 -0
  238. package/es/color/neutrals/slate.mjs +67 -0
  239. package/es/color/neutrals/slate.mjs.map +1 -0
  240. package/es/color/types.d.mts +16 -0
  241. package/es/eslint/index.d.mts +26 -0
  242. package/es/eslint/index.d.ts +1 -0
  243. package/es/eslint/index.js +1 -0
  244. package/es/eslint/index.mjs +11 -0
  245. package/es/eslint/index.mjs.map +1 -0
  246. package/es/hooks/useIsClient.d.mts +8 -0
  247. package/es/hooks/useIsClient.mjs +13 -0
  248. package/es/hooks/useIsClient.mjs.map +1 -0
  249. package/es/i18n/context.d.mts +7 -0
  250. package/es/i18n/context.mjs +16 -0
  251. package/es/i18n/context.mjs.map +1 -0
  252. package/es/i18n/index.d.mts +6 -0
  253. package/es/i18n/index.d.ts +1 -0
  254. package/es/i18n/index.js +1 -0
  255. package/es/i18n/index.mjs +5 -0
  256. package/es/i18n/resources/en/common.d.mts +35 -0
  257. package/es/i18n/resources/en/common.mjs +36 -0
  258. package/es/i18n/resources/en/common.mjs.map +1 -0
  259. package/es/i18n/resources/en/index.d.mts +7 -0
  260. package/es/i18n/resources/en/index.mjs +8 -0
  261. package/es/i18n/resources/en/index.mjs.map +1 -0
  262. package/es/i18n/resources/zhCn/common.d.mts +35 -0
  263. package/es/i18n/resources/zhCn/common.mjs +36 -0
  264. package/es/i18n/resources/zhCn/common.mjs.map +1 -0
  265. package/es/i18n/resources/zhCn/index.d.mts +7 -0
  266. package/es/i18n/resources/zhCn/index.mjs +8 -0
  267. package/es/i18n/resources/zhCn/index.mjs.map +1 -0
  268. package/es/i18n/types.d.mts +22 -0
  269. package/es/i18n/useTranslation.d.mts +12 -0
  270. package/es/i18n/useTranslation.mjs +22 -0
  271. package/es/i18n/useTranslation.mjs.map +1 -0
  272. package/es/index.d.mts +43 -0
  273. package/es/index.mjs +26 -0
  274. package/es/storybook/StoryBook/StoryBook.d.mts +7 -0
  275. package/es/storybook/StoryBook/StoryBook.mjs +52 -0
  276. package/es/storybook/StoryBook/StoryBook.mjs.map +1 -0
  277. package/es/storybook/StoryBook/index.d.mts +3 -0
  278. package/es/storybook/StoryBook/style.mjs +97 -0
  279. package/es/storybook/StoryBook/style.mjs.map +1 -0
  280. package/es/storybook/StoryBook/type.d.mts +13 -0
  281. package/es/storybook/index.d.mts +4 -0
  282. package/es/storybook/index.d.ts +1 -0
  283. package/es/storybook/index.js +1 -0
  284. package/es/storybook/index.mjs +2 -0
  285. package/es/styles/classNames.d.mts +11 -0
  286. package/es/styles/classNames.mjs +12 -0
  287. package/es/styles/classNames.mjs.map +1 -0
  288. package/es/styles/customTheme.d.mts +36 -0
  289. package/es/styles/customTheme.mjs +71 -0
  290. package/es/styles/customTheme.mjs.map +1 -0
  291. package/es/styles/index.d.mts +6 -0
  292. package/es/styles/index.d.ts +1 -0
  293. package/es/styles/index.js +1 -0
  294. package/es/styles/index.mjs +6 -0
  295. package/es/styles/theme/algorithms/darkAlgorithm.mjs +18 -0
  296. package/es/styles/theme/algorithms/darkAlgorithm.mjs.map +1 -0
  297. package/es/styles/theme/algorithms/lightAlgorithm.mjs +18 -0
  298. package/es/styles/theme/algorithms/lightAlgorithm.mjs.map +1 -0
  299. package/es/styles/theme/algorithms/resolveScales.mjs +25 -0
  300. package/es/styles/theme/algorithms/resolveScales.mjs.map +1 -0
  301. package/es/styles/theme/antdTheme.mjs +31 -0
  302. package/es/styles/theme/antdTheme.mjs.map +1 -0
  303. package/es/styles/theme/customStylish.d.mts +7 -0
  304. package/es/styles/theme/customStylish.mjs +158 -0
  305. package/es/styles/theme/customStylish.mjs.map +1 -0
  306. package/es/styles/theme/customStylishStatic.d.mts +6 -0
  307. package/es/styles/theme/customStylishStatic.mjs +156 -0
  308. package/es/styles/theme/customStylishStatic.mjs.map +1 -0
  309. package/es/styles/theme/customToken.d.mts +7 -0
  310. package/es/styles/theme/customToken.mjs +127 -0
  311. package/es/styles/theme/customToken.mjs.map +1 -0
  312. package/es/styles/theme/generateColorPalette.d.mts +16 -0
  313. package/es/styles/theme/generateColorPalette.mjs +170 -0
  314. package/es/styles/theme/generateColorPalette.mjs.map +1 -0
  315. package/es/styles/theme/token/base.mjs +64 -0
  316. package/es/styles/theme/token/base.mjs.map +1 -0
  317. package/es/styles/theme/token/dark.mjs +37 -0
  318. package/es/styles/theme/token/dark.mjs.map +1 -0
  319. package/es/styles/theme/token/light.mjs +37 -0
  320. package/es/styles/theme/token/light.mjs.map +1 -0
  321. package/es/types/customStylish.d.mts +28 -0
  322. package/es/types/customToken.d.mts +34 -0
  323. package/es/types/customToken.mjs +32 -0
  324. package/es/types/customToken.mjs.map +1 -0
  325. package/es/types/index.d.mts +15 -0
  326. package/es/types/index.d.ts +1 -0
  327. package/es/types/index.js +1 -0
  328. package/es/types/index.mjs +2 -0
  329. package/es/utils/composeEventHandlers.d.mts +5 -0
  330. package/es/utils/composeEventHandlers.mjs +10 -0
  331. package/es/utils/composeEventHandlers.mjs.map +1 -0
  332. package/es/utils/copyToClipboard.d.mts +5 -0
  333. package/es/utils/copyToClipboard.mjs +28 -0
  334. package/es/utils/copyToClipboard.mjs.map +1 -0
  335. package/es/utils/dom.d.mts +15 -0
  336. package/es/utils/dom.mjs +16 -0
  337. package/es/utils/dom.mjs.map +1 -0
  338. package/es/utils/genCdnUrl.d.mts +12 -0
  339. package/es/utils/genCdnUrl.mjs +17 -0
  340. package/es/utils/genCdnUrl.mjs.map +1 -0
  341. package/es/utils/safeReadableColor.mjs +6 -0
  342. package/es/utils/safeReadableColor.mjs.map +1 -0
  343. package/package.json +96 -0
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import { getCssValue, getFlexDirection, isHorizontal, isSpaceDistribution } from "./utils.mjs";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { memo } from "react";
5
+ //#region src/Flex/FlexBasic.tsx
6
+ const BASE_CLASS = "superad-flex";
7
+ const FlexBasic = ({ visible, flex, gap, direction, horizontal, align, justify, distribution, height, width, allowShrink, padding, paddingInline, paddingBlock, prefixCls, as: Container = "div", className, style, children, wrap, ref, ...props }) => {
8
+ const justifyContent = justify || distribution;
9
+ const resolvedWidth = isHorizontal(direction, horizontal) && !width && isSpaceDistribution(justifyContent) ? "100%" : getCssValue(width);
10
+ const cssVarEntries = [
11
+ ["--superad-flex", flex === void 0 ? void 0 : String(flex)],
12
+ ["--superad-flex-direction", direction || horizontal ? getFlexDirection(direction, horizontal) : void 0],
13
+ ["--superad-flex-wrap", wrap],
14
+ ["--superad-flex-justify", justifyContent],
15
+ ["--superad-flex-align", align],
16
+ ["--superad-flex-width", resolvedWidth],
17
+ ["--superad-flex-height", getCssValue(height)],
18
+ ["--superad-flex-padding", getCssValue(padding)],
19
+ ["--superad-flex-padding-inline", getCssValue(paddingInline)],
20
+ ["--superad-flex-padding-block", getCssValue(paddingBlock)],
21
+ ["--superad-flex-gap", getCssValue(gap)]
22
+ ];
23
+ const mergedStyle = {
24
+ ...Object.fromEntries(cssVarEntries.filter(([, value]) => value !== void 0)),
25
+ ...allowShrink ? { minWidth: 0 } : {},
26
+ ...style
27
+ };
28
+ const mergedClassName = [
29
+ BASE_CLASS,
30
+ visible === false ? `${BASE_CLASS}--hidden` : void 0,
31
+ prefixCls ? `${prefixCls}-flex` : void 0,
32
+ className
33
+ ].filter(Boolean).join(" ");
34
+ return /* @__PURE__ */ jsx(Container, {
35
+ ref,
36
+ ...props,
37
+ className: mergedClassName,
38
+ style: mergedStyle,
39
+ children
40
+ });
41
+ };
42
+ var FlexBasic_default = memo(FlexBasic);
43
+ //#endregion
44
+ export { FlexBasic_default as default };
45
+
46
+ //# sourceMappingURL=FlexBasic.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlexBasic.mjs","names":[],"sources":["../../src/Flex/FlexBasic.tsx"],"sourcesContent":["'use client';\n\nimport { type CSSProperties, type ElementType, type FC, memo } from 'react';\n\nimport type { FlexBasicProps } from './type';\nimport { getCssValue, getFlexDirection, isHorizontal, isSpaceDistribution } from './utils';\n\nconst BASE_CLASS = 'superad-flex';\n\nconst FlexBasic: FC<FlexBasicProps> = ({\n visible,\n flex,\n gap,\n direction,\n horizontal,\n align,\n justify,\n distribution,\n height,\n width,\n allowShrink,\n padding,\n paddingInline,\n paddingBlock,\n prefixCls,\n as: Container = 'div' as ElementType,\n className,\n style,\n children,\n wrap,\n ref,\n ...props\n}) => {\n const justifyContent = justify || distribution;\n\n // 横向 + 空间均分时,容器必须撑满整行,均分才生效\n const resolvedWidth =\n isHorizontal(direction, horizontal) && !width && isSpaceDistribution(justifyContent)\n ? '100%'\n : getCssValue(width);\n\n const cssVarEntries: Array<[string, string | number | undefined]> = [\n ['--superad-flex', flex === undefined ? undefined : String(flex)],\n [\n '--superad-flex-direction',\n direction || horizontal ? getFlexDirection(direction, horizontal) : undefined,\n ],\n ['--superad-flex-wrap', wrap],\n ['--superad-flex-justify', justifyContent],\n ['--superad-flex-align', align],\n ['--superad-flex-width', resolvedWidth],\n ['--superad-flex-height', getCssValue(height)],\n ['--superad-flex-padding', getCssValue(padding)],\n ['--superad-flex-padding-inline', getCssValue(paddingInline)],\n ['--superad-flex-padding-block', getCssValue(paddingBlock)],\n ['--superad-flex-gap', getCssValue(gap)],\n ];\n\n const mergedStyle: CSSProperties = {\n ...Object.fromEntries(cssVarEntries.filter(([, value]) => value !== undefined)),\n ...(allowShrink ? { minWidth: 0 } : {}),\n ...style,\n } as CSSProperties;\n\n const mergedClassName = [\n BASE_CLASS,\n visible === false ? `${BASE_CLASS}--hidden` : undefined,\n prefixCls ? `${prefixCls}-flex` : undefined,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Container ref={ref} {...props} className={mergedClassName} style={mergedStyle}>\n {children}\n </Container>\n );\n};\n\nexport default memo(FlexBasic);\n"],"mappings":";;;;;AAOA,MAAM,aAAa;AAEnB,MAAM,aAAiC,EACrC,SACA,MACA,KACA,WACA,YACA,OACA,SACA,cACA,QACA,OACA,aACA,SACA,eACA,cACA,WACA,IAAI,YAAY,OAChB,WACA,OACA,UACA,MACA,KACA,GAAG,YACC;CACJ,MAAM,iBAAiB,WAAW;CAGlC,MAAM,gBACJ,aAAa,WAAW,UAAU,KAAK,CAAC,SAAS,oBAAoB,cAAc,IAC/E,SACA,YAAY,KAAK;CAEvB,MAAM,gBAA8D;EAClE,CAAC,kBAAkB,SAAS,KAAA,IAAY,KAAA,IAAY,OAAO,IAAI,CAAC;EAChE,CACE,4BACA,aAAa,aAAa,iBAAiB,WAAW,UAAU,IAAI,KAAA,CACtE;EACA,CAAC,uBAAuB,IAAI;EAC5B,CAAC,0BAA0B,cAAc;EACzC,CAAC,wBAAwB,KAAK;EAC9B,CAAC,wBAAwB,aAAa;EACtC,CAAC,yBAAyB,YAAY,MAAM,CAAC;EAC7C,CAAC,0BAA0B,YAAY,OAAO,CAAC;EAC/C,CAAC,iCAAiC,YAAY,aAAa,CAAC;EAC5D,CAAC,gCAAgC,YAAY,YAAY,CAAC;EAC1D,CAAC,sBAAsB,YAAY,GAAG,CAAC;CACzC;CAEA,MAAM,cAA6B;EACjC,GAAG,OAAO,YAAY,cAAc,QAAQ,GAAG,WAAW,UAAU,KAAA,CAAS,CAAC;EAC9E,GAAI,cAAc,EAAE,UAAU,EAAE,IAAI,CAAC;EACrC,GAAG;CACL;CAEA,MAAM,kBAAkB;EACtB;EACA,YAAY,QAAQ,GAAG,WAAW,YAAY,KAAA;EAC9C,YAAY,GAAG,UAAU,SAAS,KAAA;EAClC;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEX,OACE,oBAAC,WAAD;EAAgB;EAAK,GAAI;EAAO,WAAW;EAAiB,OAAO;EAChE;CACQ,CAAA;AAEf;AAEA,IAAA,oBAAe,KAAK,SAAS"}
@@ -0,0 +1,2 @@
1
+ import _default from "./FlexBasic.mjs";
2
+ export { _default as default };
@@ -0,0 +1,5 @@
1
+ import { CenterProps, ContentPosition, FlexBasicProps, FlexDirection, FlexboxProps } from "./type.mjs";
2
+ import Center from "./Center.mjs";
3
+ import _default from "./FlexBasic.mjs";
4
+ import "./Flexbox.mjs";
5
+ export { Center, type CenterProps, type ContentPosition, _default as FlexBasic, type FlexBasicProps, type FlexDirection, _default as Flexbox, type FlexboxProps };
@@ -0,0 +1 @@
1
+ export * from './index.d.mts';
@@ -0,0 +1 @@
1
+ export * from './index.mjs';
@@ -0,0 +1,3 @@
1
+ import FlexBasic_default from "./FlexBasic.mjs";
2
+ import Center from "./Center.mjs";
3
+ export { Center, FlexBasic_default as FlexBasic, FlexBasic_default as Flexbox };
@@ -0,0 +1,35 @@
1
+ import { CSSProperties, DOMAttributes, ElementType, HTMLAttributes, ReactNode, Ref } from "react";
2
+ //#region src/Flex/type.d.ts
3
+ type ContentPosition = 'center' | 'end' | 'flex-end' | 'flex-start' | 'start' | 'stretch' | 'baseline';
4
+ type FlexDirection = 'vertical' | 'vertical-reverse' | 'horizontal' | 'horizontal-reverse';
5
+ type DivProps = DOMAttributes<HTMLDivElement> & HTMLAttributes<HTMLDivElement>;
6
+ type CommonSpaceNumber = 2 | 4 | 8 | 12 | 16 | 24;
7
+ interface IFlexbox {
8
+ align?: ContentPosition;
9
+ allowShrink?: boolean;
10
+ as?: ElementType;
11
+ children?: ReactNode;
12
+ className?: string;
13
+ direction?: FlexDirection;
14
+ distribution?: CSSProperties['justifyContent'];
15
+ flex?: number | string;
16
+ gap?: CommonSpaceNumber | number | string;
17
+ height?: number | string;
18
+ horizontal?: boolean;
19
+ justify?: CSSProperties['justifyContent'];
20
+ padding?: string | number | CommonSpaceNumber;
21
+ paddingBlock?: string | number;
22
+ paddingInline?: string | number;
23
+ prefixCls?: string;
24
+ ref?: Ref<HTMLElement>;
25
+ style?: CSSProperties;
26
+ visible?: boolean;
27
+ width?: number | string;
28
+ wrap?: CSSProperties['flexWrap'];
29
+ }
30
+ interface FlexBasicProps extends IFlexbox, DivProps {}
31
+ type FlexboxProps = FlexBasicProps;
32
+ type CenterProps = Omit<FlexBasicProps, 'distribution' | 'direction' | 'align'>;
33
+ //#endregion
34
+ export { CenterProps, CommonSpaceNumber, ContentPosition, DivProps, FlexBasicProps, FlexDirection, FlexboxProps, IFlexbox };
35
+ //# sourceMappingURL=type.d.mts.map
@@ -0,0 +1,24 @@
1
+ //#region src/Flex/utils.ts
2
+ const DIRECTION_TO_CSS = {
3
+ "horizontal": "row",
4
+ "horizontal-reverse": "row-reverse",
5
+ "vertical": "column",
6
+ "vertical-reverse": "column-reverse"
7
+ };
8
+ const getFlexDirection = (direction, isHorizontal) => {
9
+ if (isHorizontal) return "row";
10
+ return DIRECTION_TO_CSS[direction ?? "vertical"];
11
+ };
12
+ const SPACE_DISTRIBUTIONS = /* @__PURE__ */ new Set([
13
+ "space-between",
14
+ "space-around",
15
+ "space-evenly"
16
+ ]);
17
+ const isSpaceDistribution = (distribution) => distribution ? SPACE_DISTRIBUTIONS.has(distribution) : void 0;
18
+ const isHorizontal = (direction, isHorizontalMode) => getFlexDirection(direction, isHorizontalMode) === "row";
19
+ /** 数字一律按 px 处理,字符串原样透传。 */
20
+ const getCssValue = (value) => typeof value === "number" ? `${value}px` : value;
21
+ //#endregion
22
+ export { getCssValue, getFlexDirection, isHorizontal, isSpaceDistribution };
23
+
24
+ //# sourceMappingURL=utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../src/Flex/utils.ts"],"sourcesContent":["import type { FlexDirection } from './type';\n\nconst DEFAULT_PREFIX = 'superad';\n\nexport const getPrefix = (prefixCls?: string) => prefixCls || DEFAULT_PREFIX;\n\nconst DIRECTION_TO_CSS: Record<FlexDirection, string> = {\n 'horizontal': 'row',\n 'horizontal-reverse': 'row-reverse',\n 'vertical': 'column',\n 'vertical-reverse': 'column-reverse',\n};\n\nexport const getFlexDirection = (direction?: FlexDirection, isHorizontal?: boolean) => {\n if (isHorizontal) return 'row';\n return DIRECTION_TO_CSS[direction ?? 'vertical'];\n};\n\nconst SPACE_DISTRIBUTIONS = new Set(['space-between', 'space-around', 'space-evenly']);\n\nexport const isSpaceDistribution = (distribution?: string) =>\n distribution ? SPACE_DISTRIBUTIONS.has(distribution) : undefined;\n\nexport const isHorizontal = (direction?: FlexDirection, isHorizontalMode?: boolean) =>\n getFlexDirection(direction, isHorizontalMode) === 'row';\n\nexport const isVertical = (direction?: FlexDirection, isHorizontalMode?: boolean) =>\n getFlexDirection(direction, isHorizontalMode) === 'column';\n\n/** 数字一律按 px 处理,字符串原样透传。 */\nexport const getCssValue = (value: string | number | undefined) =>\n typeof value === 'number' ? `${value}px` : value;\n"],"mappings":";AAMA,MAAM,mBAAkD;CACtD,cAAc;CACd,sBAAsB;CACtB,YAAY;CACZ,oBAAoB;AACtB;AAEA,MAAa,oBAAoB,WAA2B,iBAA2B;CACrF,IAAI,cAAc,OAAO;CACzB,OAAO,iBAAiB,aAAa;AACvC;AAEA,MAAM,sCAAsB,IAAI,IAAI;CAAC;CAAiB;CAAgB;AAAc,CAAC;AAErF,MAAa,uBAAuB,iBAClC,eAAe,oBAAoB,IAAI,YAAY,IAAI,KAAA;AAEzD,MAAa,gBAAgB,WAA2B,qBACtD,iBAAiB,WAAW,gBAAgB,MAAM;;AAMpD,MAAa,eAAe,UAC1B,OAAO,UAAU,WAAW,GAAG,MAAM,MAAM"}
@@ -0,0 +1,9 @@
1
+ //#region src/FontLoader/index.d.ts
2
+ interface FontLoaderProps {
3
+ url: string;
4
+ }
5
+ /** 以 <link rel="stylesheet"> 方式挂载一份字体资源,随组件卸载移除。 */
6
+ declare const FontLoader: import("react").NamedExoticComponent<FontLoaderProps>;
7
+ //#endregion
8
+ export { FontLoaderProps, FontLoader as default };
9
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ export * from './index.d.mts';
@@ -0,0 +1 @@
1
+ export * from './index.mjs';
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ import { memo, useEffect } from "react";
3
+ //#region src/FontLoader/index.tsx
4
+ /** 以 <link rel="stylesheet"> 方式挂载一份字体资源,随组件卸载移除。 */
5
+ const FontLoader = memo(({ url }) => {
6
+ useEffect(() => {
7
+ const link = document.createElement("link");
8
+ link.rel = "stylesheet";
9
+ link.href = url;
10
+ link.onerror = () => console.error(`Failed to load font from ${url}`);
11
+ document.head.append(link);
12
+ return () => {
13
+ link.onerror = null;
14
+ link.remove();
15
+ };
16
+ }, [url]);
17
+ return null;
18
+ });
19
+ FontLoader.displayName = "FontLoader";
20
+ //#endregion
21
+ export { FontLoader as default };
22
+
23
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/FontLoader/index.tsx"],"sourcesContent":["'use client';\n\nimport { memo, useEffect } from 'react';\n\nexport interface FontLoaderProps {\n url: string;\n}\n\n/** 以 <link rel=\"stylesheet\"> 方式挂载一份字体资源,随组件卸载移除。 */\nconst FontLoader = memo<FontLoaderProps>(({ url }) => {\n useEffect(() => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n link.onerror = () => console.error(`Failed to load font from ${url}`);\n document.head.append(link);\n\n return () => {\n link.onerror = null;\n link.remove();\n };\n }, [url]);\n\n return null;\n});\n\nFontLoader.displayName = 'FontLoader';\n\nexport default FontLoader;\n"],"mappings":";;;;AASA,MAAM,aAAa,MAAuB,EAAE,UAAU;CACpD,gBAAgB;EACd,MAAM,OAAO,SAAS,cAAc,MAAM;EAC1C,KAAK,MAAM;EACX,KAAK,OAAO;EACZ,KAAK,gBAAgB,QAAQ,MAAM,4BAA4B,KAAK;EACpE,SAAS,KAAK,OAAO,IAAI;EAEzB,aAAa;GACX,KAAK,UAAU;GACf,KAAK,OAAO;EACd;CACF,GAAG,CAAC,GAAG,CAAC;CAER,OAAO;AACT,CAAC;AAED,WAAW,cAAc"}
@@ -0,0 +1,6 @@
1
+ //#region src/GlobalFocusRing/index.d.ts
2
+ /** 每个 document 安装一次;返回的释放函数对嵌套 Provider 与 Strict Mode 安全。 */
3
+ declare const installGlobalFocusRing: (doc?: Document) => (() => void);
4
+ //#endregion
5
+ export { installGlobalFocusRing };
6
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ export * from './index.d.mts';
@@ -0,0 +1 @@
1
+ export * from './index.mjs';
@@ -0,0 +1,204 @@
1
+ import { globalFocusRingCSS } from "./style.mjs";
2
+ //#region src/GlobalFocusRing/index.ts
3
+ const RING_ATTRIBUTE = "data-superad-global-focus-ring";
4
+ const MANAGED_ATTRIBUTE = "data-superad-focus-ring";
5
+ const OPT_OUT_SELECTOR = "[data-superad-focus-ring=\"off\"]";
6
+ const ANCHOR_NAME = "--superad-global-focus";
7
+ const FALLBACK_RING_COLOR = "#1677ff";
8
+ /** 这些 input 类型本身是可点按控件,需要焦点环;文本类输入不需要。 */
9
+ const RING_INPUT_TYPES = /* @__PURE__ */ new Set([
10
+ "button",
11
+ "submit",
12
+ "reset",
13
+ "image",
14
+ "checkbox",
15
+ "radio",
16
+ "range",
17
+ "color",
18
+ "file"
19
+ ]);
20
+ /** 当前环境是否支持锚点定位 + popover 这套实现。 */
21
+ const isSupported = (doc) => {
22
+ const win = doc.defaultView;
23
+ return Boolean(win?.CSS?.supports("top", "anchor(top)") && win.CSS.supports("position-visibility", "anchors-visible") && "showPopover" in doc.createElement("div"));
24
+ };
25
+ /** 该元素是否值得挂焦点环。 */
26
+ const isRingTarget = (element, doc) => {
27
+ if (!element || element === doc.body) return false;
28
+ if (element.namespaceURI !== "http://www.w3.org/1999/xhtml") return false;
29
+ if (element.shadowRoot) return false;
30
+ if (element.closest(OPT_OUT_SELECTOR)) return false;
31
+ if (element.matches("textarea")) return false;
32
+ if (element.isContentEditable) return false;
33
+ if (element.matches("input") && !RING_INPUT_TYPES.has(element.type)) return false;
34
+ return element.matches(":focus-visible");
35
+ };
36
+ /** 单个文档内的焦点环控制器:一个 ring 元素跟随当前 :focus-visible 元素。 */
37
+ var FocusRingController = class FocusRingController {
38
+ constructor(doc) {
39
+ this.frame = 0;
40
+ this.disposed = false;
41
+ this.dispose = () => {
42
+ this.disposed = true;
43
+ this.win.cancelAnimationFrame(this.frame);
44
+ this.observer.disconnect();
45
+ this.doc.removeEventListener("focusin", this.handleFocusIn, true);
46
+ this.doc.removeEventListener("focusout", this.schedule, true);
47
+ this.doc.removeEventListener("keydown", this.schedule, true);
48
+ this.doc.removeEventListener("pointerdown", this.schedule, true);
49
+ this.win.removeEventListener("blur", this.handleWindowBlur);
50
+ this.win.removeEventListener("focus", this.schedule);
51
+ this.clear();
52
+ this.ring.remove();
53
+ this.sheet.remove();
54
+ };
55
+ this.handleFocusIn = () => this.win.queueMicrotask(() => this.sync());
56
+ this.handleWindowBlur = () => {
57
+ this.win.cancelAnimationFrame(this.frame);
58
+ this.frame = 0;
59
+ if (this.ring.matches(":popover-open")) this.ring.hidePopover();
60
+ };
61
+ this.schedule = () => {
62
+ if (this.frame) return;
63
+ this.frame = this.win.requestAnimationFrame(() => {
64
+ this.frame = 0;
65
+ this.sync();
66
+ });
67
+ };
68
+ this.syncNow = () => this.sync();
69
+ this.clear = () => {
70
+ if (this.ring.matches(":popover-open")) this.ring.hidePopover();
71
+ this.restoreTarget?.();
72
+ this.restoreTarget = void 0;
73
+ this.target = void 0;
74
+ };
75
+ this.sync = () => {
76
+ if (this.disposed) return;
77
+ const next = this.doc.activeElement;
78
+ if (next === this.target && next?.matches(":focus-visible") && next.isConnected && this.ring.matches(":popover-open")) return;
79
+ this.clear();
80
+ if (!isRingTarget(next, this.doc)) return;
81
+ const element = next;
82
+ const ringParent = this.resolveRingParent(element);
83
+ const moved = this.ring.parentElement !== ringParent;
84
+ if (moved) ringParent.append(this.ring);
85
+ const computed = this.win.getComputedStyle(element);
86
+ const borderRadius = computed.borderRadius;
87
+ const color = computed.getPropertyValue("--superad-focus-ring-color").trim() || computed.getPropertyValue("--ant-color-info").trim() || FALLBACK_RING_COLOR;
88
+ const styleChanged = this.ring.style.borderRadius !== borderRadius || this.ring.style.getPropertyValue("--superad-focus-ring-color") !== color;
89
+ if (styleChanged) {
90
+ this.ring.style.borderRadius = borderRadius;
91
+ this.ring.style.setProperty("--superad-focus-ring-color", color);
92
+ }
93
+ if (moved || styleChanged) {
94
+ this.schedule();
95
+ return;
96
+ }
97
+ const saved = ["anchor-name", "outline"].map((property) => ({
98
+ priority: element.style.getPropertyPriority(property),
99
+ property,
100
+ value: element.style.getPropertyValue(property)
101
+ }));
102
+ const oldMarker = element.getAttribute(MANAGED_ATTRIBUTE);
103
+ const existingAnchor = computed.getPropertyValue("anchor-name").trim();
104
+ const assignedAnchor = existingAnchor && existingAnchor !== "none" ? `${existingAnchor}, ${ANCHOR_NAME}` : ANCHOR_NAME;
105
+ element.style.setProperty("anchor-name", assignedAnchor, "important");
106
+ this.restoreTarget = () => FocusRingController.restoreInlineStyles(element, saved, assignedAnchor, oldMarker);
107
+ const rect = element.getBoundingClientRect();
108
+ if (!(element.getClientRects().length === 1 && Boolean(rect.width) && Boolean(rect.height) && computed.visibility === "visible")) {
109
+ this.clear();
110
+ return;
111
+ }
112
+ try {
113
+ this.ring.showPopover();
114
+ const bounds = this.ring.getBoundingClientRect();
115
+ if (Math.max(...[
116
+ "top",
117
+ "right",
118
+ "bottom",
119
+ "left"
120
+ ].map((edge) => Math.abs(bounds[edge] - rect[edge]))) > 1) {
121
+ this.clear();
122
+ return;
123
+ }
124
+ element.style.setProperty("outline", "none", "important");
125
+ element.setAttribute(MANAGED_ATTRIBUTE, "managed");
126
+ this.target = element;
127
+ } catch {
128
+ this.clear();
129
+ }
130
+ };
131
+ this.doc = doc;
132
+ this.win = doc.defaultView;
133
+ this.sheet = doc.createElement("style");
134
+ this.sheet.textContent = globalFocusRingCSS;
135
+ this.ring = doc.createElement("div");
136
+ this.ring.setAttribute(RING_ATTRIBUTE, "");
137
+ this.ring.setAttribute("aria-hidden", "true");
138
+ this.ring.setAttribute("popover", "manual");
139
+ doc.head.append(this.sheet);
140
+ doc.body.append(this.ring);
141
+ this.observer = new MutationObserver(() => {
142
+ if (this.target && !this.target.isConnected) this.clear();
143
+ });
144
+ this.observer.observe(doc.body, {
145
+ childList: true,
146
+ subtree: true
147
+ });
148
+ doc.addEventListener("focusin", this.handleFocusIn, true);
149
+ doc.addEventListener("focusout", this.schedule, true);
150
+ doc.addEventListener("keydown", this.schedule, true);
151
+ doc.addEventListener("pointerdown", this.schedule, true);
152
+ this.win.addEventListener("blur", this.handleWindowBlur);
153
+ this.win.addEventListener("focus", this.schedule);
154
+ }
155
+ /** 找到 ring 应该挂的父节点:向上跳过 contain: none 的祖先。 */
156
+ resolveRingParent(element) {
157
+ let scope = element.parentElement;
158
+ while (scope && this.win.getComputedStyle(scope).contain === "none") scope = scope.parentElement;
159
+ return scope || this.doc.body;
160
+ }
161
+ /** 把目标元素的内联样式/标记改回去,仅当值仍是我们写入的那个。 */
162
+ static restoreInlineStyles(element, saved, assignedAnchor, oldMarker) {
163
+ for (const { property, value, priority } of saved) {
164
+ const assigned = property === "anchor-name" ? assignedAnchor : "none";
165
+ if (element.style.getPropertyValue(property) !== assigned) continue;
166
+ if (value) element.style.setProperty(property, value, priority);
167
+ else element.style.removeProperty(property);
168
+ }
169
+ if (element.getAttribute(MANAGED_ATTRIBUTE) === "managed") {
170
+ if (oldMarker === null) element.removeAttribute(MANAGED_ATTRIBUTE);
171
+ else element.setAttribute(MANAGED_ATTRIBUTE, oldMarker);
172
+ }
173
+ }
174
+ };
175
+ const installations = /* @__PURE__ */ new WeakMap();
176
+ /** 每个 document 安装一次;返回的释放函数对嵌套 Provider 与 Strict Mode 安全。 */
177
+ const installGlobalFocusRing = (doc = document) => {
178
+ const existing = installations.get(doc);
179
+ if (existing) {
180
+ existing.users += 1;
181
+ let released = false;
182
+ return () => {
183
+ if (released) return;
184
+ released = true;
185
+ existing.users -= 1;
186
+ if (existing.users === 0) {
187
+ existing.controller.dispose();
188
+ installations.delete(doc);
189
+ }
190
+ };
191
+ }
192
+ if (!isSupported(doc) || !doc.body) return () => {};
193
+ const controller = new FocusRingController(doc);
194
+ installations.set(doc, {
195
+ controller,
196
+ users: 0
197
+ });
198
+ controller.syncNow();
199
+ return installGlobalFocusRing(doc);
200
+ };
201
+ //#endregion
202
+ export { installGlobalFocusRing };
203
+
204
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/GlobalFocusRing/index.ts"],"sourcesContent":["import { globalFocusRingCSS } from './style';\n\nconst RING_ATTRIBUTE = 'data-superad-global-focus-ring';\nconst MANAGED_ATTRIBUTE = 'data-superad-focus-ring';\nconst OPT_OUT_SELECTOR = '[data-superad-focus-ring=\"off\"]';\nconst ANCHOR_NAME = '--superad-global-focus';\nconst FALLBACK_RING_COLOR = '#1677ff';\n\n/** 这些 input 类型本身是可点按控件,需要焦点环;文本类输入不需要。 */\nconst RING_INPUT_TYPES = new Set([\n 'button',\n 'submit',\n 'reset',\n 'image',\n 'checkbox',\n 'radio',\n 'range',\n 'color',\n 'file',\n]);\n\n/** 当前环境是否支持锚点定位 + popover 这套实现。 */\nconst isSupported = (doc: Document): boolean => {\n const win = doc.defaultView;\n return Boolean(\n win?.CSS?.supports('top', 'anchor(top)') &&\n win.CSS.supports('position-visibility', 'anchors-visible') &&\n 'showPopover' in doc.createElement('div'),\n );\n};\n\n/** 该元素是否值得挂焦点环。 */\nconst isRingTarget = (element: Element | null, doc: Document): element is HTMLElement => {\n if (!element || element === doc.body) return false;\n if (element.namespaceURI !== 'http://www.w3.org/1999/xhtml') return false;\n if (element.shadowRoot) return false;\n if (element.closest(OPT_OUT_SELECTOR)) return false;\n if (element.matches('textarea')) return false;\n if ((element as HTMLElement).isContentEditable) return false;\n if (element.matches('input') && !RING_INPUT_TYPES.has((element as HTMLInputElement).type))\n return false;\n return element.matches(':focus-visible');\n};\n\ninterface InlineStyleSnapshot {\n priority: string;\n property: string;\n value: string;\n}\n\n/** 单个文档内的焦点环控制器:一个 ring 元素跟随当前 :focus-visible 元素。 */\nclass FocusRingController {\n private readonly doc: Document;\n private readonly win: Window;\n private readonly sheet: HTMLStyleElement;\n private readonly ring: HTMLDivElement;\n\n private target?: HTMLElement;\n private restoreTarget?: () => void;\n private frame = 0;\n private disposed = false;\n private readonly observer: MutationObserver;\n\n constructor(doc: Document) {\n this.doc = doc;\n this.win = doc.defaultView!;\n\n this.sheet = doc.createElement('style');\n this.sheet.textContent = globalFocusRingCSS;\n this.ring = doc.createElement('div');\n this.ring.setAttribute(RING_ATTRIBUTE, '');\n this.ring.setAttribute('aria-hidden', 'true');\n this.ring.setAttribute('popover', 'manual');\n doc.head.append(this.sheet);\n doc.body.append(this.ring);\n\n this.observer = new MutationObserver(() => {\n if (this.target && !this.target.isConnected) this.clear();\n });\n this.observer.observe(doc.body, { childList: true, subtree: true });\n\n doc.addEventListener('focusin', this.handleFocusIn, true);\n doc.addEventListener('focusout', this.schedule, true);\n doc.addEventListener('keydown', this.schedule, true);\n doc.addEventListener('pointerdown', this.schedule, true);\n this.win.addEventListener('blur', this.handleWindowBlur);\n this.win.addEventListener('focus', this.schedule);\n }\n\n dispose = () => {\n this.disposed = true;\n this.win.cancelAnimationFrame(this.frame);\n this.observer.disconnect();\n this.doc.removeEventListener('focusin', this.handleFocusIn, true);\n this.doc.removeEventListener('focusout', this.schedule, true);\n this.doc.removeEventListener('keydown', this.schedule, true);\n this.doc.removeEventListener('pointerdown', this.schedule, true);\n this.win.removeEventListener('blur', this.handleWindowBlur);\n this.win.removeEventListener('focus', this.schedule);\n this.clear();\n this.ring.remove();\n this.sheet.remove();\n };\n\n private handleFocusIn = () => this.win.queueMicrotask(() => this.sync());\n\n private handleWindowBlur = () => {\n this.win.cancelAnimationFrame(this.frame);\n this.frame = 0;\n if (this.ring.matches(':popover-open')) this.ring.hidePopover();\n };\n\n private schedule = () => {\n if (this.frame) return;\n this.frame = this.win.requestAnimationFrame(() => {\n this.frame = 0;\n this.sync();\n });\n };\n\n /** 安装后立即对齐一次当前焦点。 */\n syncNow = () => this.sync();\n\n private clear = () => {\n if (this.ring.matches(':popover-open')) this.ring.hidePopover();\n this.restoreTarget?.();\n this.restoreTarget = undefined;\n this.target = undefined;\n };\n\n /** 找到 ring 应该挂的父节点:向上跳过 contain: none 的祖先。 */\n private resolveRingParent(element: HTMLElement): HTMLElement {\n let scope = element.parentElement;\n while (scope && this.win.getComputedStyle(scope).contain === 'none')\n scope = scope.parentElement;\n return scope || this.doc.body;\n }\n\n /** 把目标元素的内联样式/标记改回去,仅当值仍是我们写入的那个。 */\n private static restoreInlineStyles(\n element: HTMLElement,\n saved: InlineStyleSnapshot[],\n assignedAnchor: string,\n oldMarker: string | null,\n ) {\n for (const { property, value, priority } of saved) {\n const assigned = property === 'anchor-name' ? assignedAnchor : 'none';\n if (element.style.getPropertyValue(property) !== assigned) continue;\n if (value) element.style.setProperty(property, value, priority);\n else element.style.removeProperty(property);\n }\n if (element.getAttribute(MANAGED_ATTRIBUTE) === 'managed') {\n if (oldMarker === null) element.removeAttribute(MANAGED_ATTRIBUTE);\n else element.setAttribute(MANAGED_ATTRIBUTE, oldMarker);\n }\n }\n\n private sync = () => {\n if (this.disposed) return;\n const next = this.doc.activeElement;\n\n const alreadyShowing =\n next === this.target &&\n next?.matches(':focus-visible') &&\n next.isConnected &&\n this.ring.matches(':popover-open');\n if (alreadyShowing) return;\n\n this.clear();\n if (!isRingTarget(next, this.doc)) return;\n\n const element = next;\n const ringParent = this.resolveRingParent(element);\n const moved = this.ring.parentElement !== ringParent;\n if (moved) ringParent.append(this.ring);\n\n const computed = this.win.getComputedStyle(element);\n const borderRadius = computed.borderRadius;\n const color =\n computed.getPropertyValue('--superad-focus-ring-color').trim() ||\n computed.getPropertyValue('--ant-color-info').trim() ||\n FALLBACK_RING_COLOR;\n const styleChanged =\n this.ring.style.borderRadius !== borderRadius ||\n this.ring.style.getPropertyValue('--superad-focus-ring-color') !== color;\n if (styleChanged) {\n this.ring.style.borderRadius = borderRadius;\n this.ring.style.setProperty('--superad-focus-ring-color', color);\n }\n // 刚移动或刚改样式时锚点还没生效,下一帧再同步\n if (moved || styleChanged) {\n this.schedule();\n return;\n }\n\n const saved: InlineStyleSnapshot[] = ['anchor-name', 'outline'].map((property) => ({\n priority: element.style.getPropertyPriority(property),\n property,\n value: element.style.getPropertyValue(property),\n }));\n const oldMarker = element.getAttribute(MANAGED_ATTRIBUTE);\n const existingAnchor = computed.getPropertyValue('anchor-name').trim();\n const assignedAnchor =\n existingAnchor && existingAnchor !== 'none'\n ? `${existingAnchor}, ${ANCHOR_NAME}`\n : ANCHOR_NAME;\n element.style.setProperty('anchor-name', assignedAnchor, 'important');\n\n this.restoreTarget = () =>\n FocusRingController.restoreInlineStyles(element, saved, assignedAnchor, oldMarker);\n\n const rect = element.getBoundingClientRect();\n const hasUsableBox =\n element.getClientRects().length === 1 &&\n Boolean(rect.width) &&\n Boolean(rect.height) &&\n computed.visibility === 'visible';\n if (!hasUsableBox) {\n this.clear();\n return;\n }\n\n try {\n this.ring.showPopover();\n const bounds = this.ring.getBoundingClientRect();\n const maxEdgeDelta = Math.max(\n ...(['top', 'right', 'bottom', 'left'] as const).map((edge) =>\n Math.abs(bounds[edge] - rect[edge]),\n ),\n );\n // 锚点没对齐(比如目标在 transform 容器里)就放弃,不显示错位的环\n if (maxEdgeDelta > 1) {\n this.clear();\n return;\n }\n element.style.setProperty('outline', 'none', 'important');\n element.setAttribute(MANAGED_ATTRIBUTE, 'managed');\n this.target = element;\n } catch {\n this.clear();\n }\n };\n}\n\nconst installations = new WeakMap<Document, { controller: FocusRingController; users: number }>();\n\n/** 每个 document 安装一次;返回的释放函数对嵌套 Provider 与 Strict Mode 安全。 */\nexport const installGlobalFocusRing = (doc: Document = document): (() => void) => {\n const existing = installations.get(doc);\n if (existing) {\n existing.users += 1;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n existing.users -= 1;\n if (existing.users === 0) {\n existing.controller.dispose();\n installations.delete(doc);\n }\n };\n }\n\n if (!isSupported(doc) || !doc.body) return () => {};\n\n const controller = new FocusRingController(doc);\n installations.set(doc, { controller, users: 0 });\n controller.syncNow();\n // 走一遍上面的引用计数分支,拿到释放函数\n return installGlobalFocusRing(doc);\n};\n"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ //#region src/GlobalFocusRing/style.ts
2
+ const focusRingColor = (color) => `color-mix(in srgb, ${color} 90%, transparent)`;
3
+ const globalFocusRingCSS = `
4
+ [data-superad-global-focus-ring] {
5
+ all: initial;
6
+ position: fixed;
7
+ position-anchor: --superad-global-focus;
8
+ top: anchor(top);
9
+ right: anchor(right);
10
+ bottom: anchor(bottom);
11
+ left: anchor(left);
12
+ position-visibility: anchors-visible;
13
+ pointer-events: none;
14
+ border-radius: inherit;
15
+ outline: 2px solid ${focusRingColor("var(--superad-focus-ring-color)")};
16
+ outline-offset: 2px;
17
+ animation: superad-global-focus-in 200ms cubic-bezier(0.22, 1, 0.36, 1);
18
+ }
19
+ [data-superad-global-focus-ring]:not(:popover-open) { display: none; }
20
+ [data-superad-global-focus-ring]::backdrop { background: transparent; pointer-events: none; }
21
+ @keyframes superad-global-focus-in {
22
+ from { opacity: 0.25; outline-offset: 5px; }
23
+ to { opacity: 1; outline-offset: 2px; }
24
+ }
25
+ @media (prefers-reduced-motion: reduce) {
26
+ [data-superad-global-focus-ring] { animation: none; }
27
+ }
28
+ @media (forced-colors: active) {
29
+ [data-superad-global-focus-ring] { outline-color: CanvasText; animation: none; }
30
+ }
31
+ `;
32
+ //#endregion
33
+ export { focusRingColor, globalFocusRingCSS };
34
+
35
+ //# sourceMappingURL=style.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.mjs","names":[],"sources":["../../src/GlobalFocusRing/style.ts"],"sourcesContent":["export const focusRingColor = (color: string) => `color-mix(in srgb, ${color} 90%, transparent)`;\n\nexport const globalFocusRingCSS = `\n[data-superad-global-focus-ring] {\n all: initial;\n position: fixed;\n position-anchor: --superad-global-focus;\n top: anchor(top);\n right: anchor(right);\n bottom: anchor(bottom);\n left: anchor(left);\n position-visibility: anchors-visible;\n pointer-events: none;\n border-radius: inherit;\n outline: 2px solid ${focusRingColor('var(--superad-focus-ring-color)')};\n outline-offset: 2px;\n animation: superad-global-focus-in 200ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n[data-superad-global-focus-ring]:not(:popover-open) { display: none; }\n[data-superad-global-focus-ring]::backdrop { background: transparent; pointer-events: none; }\n@keyframes superad-global-focus-in {\n from { opacity: 0.25; outline-offset: 5px; }\n to { opacity: 1; outline-offset: 2px; }\n}\n@media (prefers-reduced-motion: reduce) {\n [data-superad-global-focus-ring] { animation: none; }\n}\n@media (forced-colors: active) {\n [data-superad-global-focus-ring] { outline-color: CanvasText; animation: none; }\n}\n`;\n"],"mappings":";AAAA,MAAa,kBAAkB,UAAkB,sBAAsB,MAAM;AAE7E,MAAa,qBAAqB;;;;;;;;;;;;uBAYX,eAAe,iCAAiC,EAAE"}
@@ -0,0 +1,5 @@
1
+ import { I18nProviderProps } from "./i18n/types.mjs";
2
+ import { useI18n } from "./ConfigProvider/index.mjs";
3
+ import { I18nProvider } from "./i18n/context.mjs";
4
+ import { useTranslation } from "./i18n/useTranslation.mjs";
5
+ export { I18nProvider, type I18nProviderProps, I18nProvider as SuperadUIProvider, useTranslation };
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { TABLE_CHROME, resolveTableCanvasPalette } from "./theme.mjs";
3
+ //#region src/Table/canvas/canvasPalette.ts
4
+ const getCanvasPalette = (table) => ({
5
+ ...TABLE_CHROME,
6
+ ...table?.__superadPalette ?? table?.options?.customConfig?.__superadPalette ?? resolveTableCanvasPalette()
7
+ });
8
+ //#endregion
9
+ export { getCanvasPalette };
10
+
11
+ //# sourceMappingURL=canvasPalette.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvasPalette.mjs","names":["TABLE_CHROME_BASE"],"sources":["../../../src/Table/canvas/canvasPalette.ts"],"sourcesContent":["'use client';\n\nimport {\n resolveTableCanvasPalette,\n TABLE_CHROME as TABLE_CHROME_BASE,\n type TableCanvasPalette,\n} from './theme';\n\nexport type CanvasPalette = TableCanvasPalette & { paddingX: number };\n\nexport const getCanvasPalette = (table?: any): CanvasPalette => ({\n ...TABLE_CHROME_BASE,\n ...(table?.__superadPalette ??\n table?.options?.customConfig?.__superadPalette ??\n resolveTableCanvasPalette()),\n});\n"],"mappings":";;;AAUA,MAAa,oBAAoB,WAAgC;CAC/D,GAAGA;CACH,GAAI,OAAO,oBACT,OAAO,SAAS,cAAc,oBAC9B,0BAA0B;AAC9B"}