@_tc/template-core 0.0.1-bate.36 → 0.0.1-bate.38

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 (419) hide show
  1. package/cjs/app/controller/base.js +3 -3
  2. package/cjs/app/controller/project.js +1 -1
  3. package/cjs/app/controller/view.js +16 -7
  4. package/cjs/app/middleware/api-params-verify.js +10 -1
  5. package/cjs/app/middleware/error-handle.js +9 -3
  6. package/cjs/app/middleware/project-handler.js +1 -1
  7. package/cjs/app/router/view.js +3 -1
  8. package/cjs/app/router-schema/project.js +1 -1
  9. package/cjs/app/service/project.js +5 -0
  10. package/cjs/bundler/defaultAlias.js +5 -0
  11. package/cjs/bundler/dev.js +4 -3
  12. package/cjs/bundler/index.js +2 -1
  13. package/cjs/bundler/prod.js +4 -3
  14. package/cjs/bundler/utils.js +52 -23
  15. package/cjs/packages/common/LRUCache.js +4 -0
  16. package/cjs/packages/common/array/index.js +43 -0
  17. package/cjs/packages/common/cache/LRUCache.js +45 -0
  18. package/cjs/packages/common/cache/index.js +4 -0
  19. package/cjs/packages/common/guards/index.js +34 -0
  20. package/cjs/packages/common/i18n/default.js +95 -0
  21. package/cjs/packages/common/i18n/en-US.js +95 -0
  22. package/cjs/packages/common/i18n/index.js +178 -0
  23. package/cjs/packages/common/i18n/locales.js +17 -0
  24. package/cjs/packages/common/i18n/types.js +1 -0
  25. package/cjs/packages/common/index.js +65 -0
  26. package/cjs/packages/common/log/index.js +160 -0
  27. package/cjs/packages/common/number/index.js +14 -0
  28. package/cjs/packages/common/object/filterEmpty.js +32 -0
  29. package/cjs/packages/common/object/filtereEmpty.js +5 -0
  30. package/cjs/packages/common/object/index.js +26 -0
  31. package/cjs/packages/common/string/index.js +17 -0
  32. package/cjs/packages/common/types/index.js +1 -0
  33. package/cjs/packages/core/index.js +18 -13
  34. package/cjs/packages/core/loader/config.js +4 -2
  35. package/cjs/packages/core/loader/controller.js +2 -3
  36. package/cjs/packages/core/loader/extend.js +1 -2
  37. package/cjs/packages/core/loader/middleware.js +2 -3
  38. package/cjs/packages/core/loader/model.js +10 -6
  39. package/cjs/packages/core/loader/router-schema.js +4 -2
  40. package/cjs/packages/core/loader/router.js +24 -11
  41. package/cjs/packages/core/loader/service.js +2 -2
  42. package/cjs/packages/utils/runFileFn.js +46 -1
  43. package/esm/app/controller/base.js +3 -3
  44. package/esm/app/controller/project.js +3 -3
  45. package/esm/app/controller/view.js +16 -7
  46. package/esm/app/middleware/api-params-verify.js +10 -1
  47. package/esm/app/middleware/error-handle.js +9 -3
  48. package/esm/app/middleware/project-handler.js +1 -1
  49. package/esm/app/router/view.js +3 -1
  50. package/esm/app/router-schema/project.js +1 -1
  51. package/esm/app/service/project.js +5 -0
  52. package/esm/bundler/defaultAlias.js +4 -0
  53. package/esm/bundler/dev.js +4 -3
  54. package/esm/bundler/index.js +2 -1
  55. package/esm/bundler/prod.js +4 -3
  56. package/esm/bundler/utils.js +52 -23
  57. package/esm/index.js +2 -2
  58. package/esm/packages/common/LRUCache.js +2 -0
  59. package/esm/packages/common/array/index.js +37 -0
  60. package/esm/packages/common/cache/LRUCache.js +43 -0
  61. package/esm/packages/common/cache/index.js +2 -0
  62. package/esm/packages/common/guards/index.js +26 -0
  63. package/esm/packages/common/i18n/default.js +93 -0
  64. package/esm/packages/common/i18n/en-US.js +93 -0
  65. package/esm/packages/common/i18n/index.js +162 -0
  66. package/esm/packages/common/i18n/locales.js +11 -0
  67. package/esm/packages/common/i18n/types.js +0 -0
  68. package/esm/packages/common/index.js +13 -0
  69. package/esm/packages/common/log/index.js +146 -0
  70. package/esm/packages/common/number/index.js +11 -0
  71. package/esm/packages/common/object/filterEmpty.js +29 -0
  72. package/esm/packages/common/object/filtereEmpty.js +2 -0
  73. package/esm/packages/common/object/index.js +20 -0
  74. package/esm/packages/common/string/index.js +13 -0
  75. package/esm/packages/common/types/index.js +0 -0
  76. package/esm/packages/core/index.js +18 -14
  77. package/esm/packages/core/loader/config.js +4 -3
  78. package/esm/packages/core/loader/controller.js +2 -4
  79. package/esm/packages/core/loader/extend.js +1 -3
  80. package/esm/packages/core/loader/middleware.js +2 -4
  81. package/esm/packages/core/loader/model.js +10 -7
  82. package/esm/packages/core/loader/router-schema.js +4 -3
  83. package/esm/packages/core/loader/router.js +24 -12
  84. package/esm/packages/core/loader/service.js +2 -3
  85. package/esm/packages/utils/runFileFn.js +47 -1
  86. package/fe/frontend/dash/Dashboard.d.ts +7 -0
  87. package/fe/frontend/dash/Dashboard.js +73 -0
  88. package/fe/frontend/dash/dash.entry.d.ts +2 -0
  89. package/fe/frontend/dash/dash.entry.js +80 -0
  90. package/fe/frontend/index.d.ts +3 -0
  91. package/fe/frontend/index.js +1 -0
  92. package/fe/frontend/main.css +2 -184
  93. package/fe/frontend/main.d.ts +10 -3
  94. package/fe/frontend/main.js +15 -4
  95. package/fe/frontend/testPage/testPage.entry.js +1 -2
  96. package/fe/frontend/typing/window.d.ts +7 -0
  97. package/fe/frontend/typing/window.js +1 -0
  98. package/fe/frontend/widgets/api/baseInfo.d.ts +31 -0
  99. package/fe/frontend/widgets/api/baseInfo.js +15 -0
  100. package/fe/frontend/widgets/common/CRUD/CRUD.d.ts +70 -0
  101. package/fe/frontend/widgets/common/CRUD/CRUD.js +208 -0
  102. package/fe/frontend/widgets/common/CRUD/index.d.ts +2 -0
  103. package/fe/frontend/widgets/common/CRUD/index.js +1 -0
  104. package/fe/frontend/widgets/common/auth/index.d.ts +7 -0
  105. package/fe/frontend/widgets/common/auth/index.js +20 -0
  106. package/fe/frontend/widgets/common/generateMenuData.d.ts +4 -0
  107. package/fe/frontend/widgets/common/generateMenuData.js +14 -0
  108. package/fe/frontend/widgets/common/importComponent.d.ts +5 -0
  109. package/fe/frontend/widgets/common/importComponent.js +8 -0
  110. package/fe/frontend/widgets/common/language.d.ts +2 -0
  111. package/fe/frontend/widgets/common/language.js +9 -0
  112. package/fe/frontend/widgets/common/logFn/index.d.ts +4 -0
  113. package/fe/frontend/widgets/common/logFn/index.js +8 -0
  114. package/fe/frontend/widgets/common/menu.d.ts +34 -0
  115. package/fe/frontend/widgets/common/menu.js +101 -0
  116. package/fe/frontend/widgets/common/request.d.ts +36 -0
  117. package/fe/frontend/widgets/common/request.js +133 -0
  118. package/fe/frontend/widgets/components/BasePage/HeaderView.d.ts +9 -0
  119. package/fe/frontend/widgets/components/BasePage/HeaderView.js +16 -0
  120. package/fe/frontend/widgets/components/Router/index.d.ts +9 -0
  121. package/fe/frontend/widgets/components/Router/index.js +11 -0
  122. package/fe/frontend/widgets/components/Router/type.d.ts +2 -0
  123. package/fe/frontend/widgets/components/Router/type.js +1 -0
  124. package/fe/frontend/widgets/defaultPages/Iframe/index.d.ts +3 -0
  125. package/fe/frontend/widgets/defaultPages/Iframe/index.js +14 -0
  126. package/fe/frontend/widgets/defaultPages/Schema/components/CallCom/DetailPanel.d.ts +7 -0
  127. package/fe/frontend/widgets/defaultPages/Schema/components/CallCom/DetailPanel.js +94 -0
  128. package/fe/frontend/widgets/defaultPages/Schema/components/CallCom/PopFrom.d.ts +13 -0
  129. package/fe/frontend/widgets/defaultPages/Schema/components/CallCom/PopFrom.js +124 -0
  130. package/fe/frontend/widgets/defaultPages/Schema/components/CallCom/data.d.ts +3 -0
  131. package/fe/frontend/widgets/defaultPages/Schema/components/CallCom/data.js +6 -0
  132. package/fe/frontend/widgets/defaultPages/Schema/components/SchemaSearch/index.d.ts +3 -0
  133. package/fe/frontend/widgets/defaultPages/Schema/components/SchemaSearch/index.js +63 -0
  134. package/fe/frontend/widgets/defaultPages/Schema/components/SchemaTable/index.d.ts +11 -0
  135. package/fe/frontend/widgets/defaultPages/Schema/components/SchemaTable/index.js +188 -0
  136. package/fe/frontend/widgets/defaultPages/Schema/data/eventInfo.d.ts +8 -0
  137. package/fe/frontend/widgets/defaultPages/Schema/data/eventInfo.js +6 -0
  138. package/fe/frontend/widgets/defaultPages/Schema/data/index.d.ts +3 -0
  139. package/fe/frontend/widgets/defaultPages/Schema/data/index.js +1 -0
  140. package/fe/frontend/widgets/defaultPages/Schema/hooks/useComConfig.d.ts +10 -0
  141. package/fe/frontend/widgets/defaultPages/Schema/hooks/useComConfig.js +14 -0
  142. package/fe/frontend/widgets/defaultPages/Schema/index.d.ts +3 -0
  143. package/fe/frontend/widgets/defaultPages/Schema/index.js +74 -0
  144. package/fe/frontend/widgets/defaultPages/Schema/schemaType.d.ts +50 -0
  145. package/fe/frontend/widgets/defaultPages/Schema/schemaType.js +4 -0
  146. package/fe/frontend/widgets/defaultPages/Schema/stores/schemaEventBus.d.ts +42 -0
  147. package/fe/frontend/widgets/defaultPages/Schema/stores/schemaEventBus.js +70 -0
  148. package/fe/frontend/widgets/defaultPages/Schema/stores/schemaStore.d.ts +47 -0
  149. package/fe/frontend/widgets/defaultPages/Schema/stores/schemaStore.js +26 -0
  150. package/fe/frontend/widgets/defaultPages/Schema/utils/fetchErrorShow.d.ts +3 -0
  151. package/fe/frontend/widgets/defaultPages/Schema/utils/fetchErrorShow.js +8 -0
  152. package/fe/frontend/widgets/defaultPages/Schema/utils/permissions.d.ts +3 -0
  153. package/fe/frontend/widgets/defaultPages/Schema/utils/permissions.js +3 -0
  154. package/fe/frontend/widgets/defaultPages/Schema/utils/schemaConversion.d.ts +3 -0
  155. package/fe/frontend/widgets/defaultPages/Schema/utils/schemaConversion.js +115 -0
  156. package/fe/frontend/widgets/defaultPages/Schema/utils/validator.d.ts +7 -0
  157. package/fe/frontend/widgets/defaultPages/Schema/utils/validator.js +36 -0
  158. package/fe/frontend/widgets/defaultPages/SidebarSlotPage/SidebarSlotContainer.d.ts +10 -0
  159. package/fe/frontend/widgets/defaultPages/SidebarSlotPage/SidebarSlotContainer.js +38 -0
  160. package/fe/frontend/widgets/defaultPages/SidebarSlotPage/index.d.ts +3 -0
  161. package/fe/frontend/widgets/defaultPages/SidebarSlotPage/index.js +16 -0
  162. package/fe/frontend/widgets/defaultPages/SidebarSlotPageTmp.d.ts +3 -0
  163. package/fe/frontend/widgets/defaultPages/SidebarSlotPageTmp.js +17 -0
  164. package/fe/frontend/widgets/defaultPages/SlotPage/index.d.ts +3 -0
  165. package/fe/frontend/widgets/defaultPages/SlotPage/index.js +26 -0
  166. package/fe/frontend/widgets/defaultPages/Todo.d.ts +3 -0
  167. package/fe/frontend/widgets/defaultPages/Todo.js +5 -0
  168. package/fe/frontend/widgets/hooks/useCurrentMenuData.d.ts +19 -0
  169. package/fe/frontend/widgets/hooks/useCurrentMenuData.js +28 -0
  170. package/fe/frontend/widgets/hooks/useRouterParams.d.ts +5 -0
  171. package/fe/frontend/widgets/hooks/useRouterParams.js +11 -0
  172. package/fe/frontend/widgets/store/mode.d.ts +19 -0
  173. package/fe/frontend/widgets/store/mode.js +37 -0
  174. package/fe/model/types/data/button.d.ts +32 -0
  175. package/fe/model/types/data/button.js +16 -0
  176. package/fe/model/types/data/component.d.ts +61 -0
  177. package/fe/model/types/data/component.js +11 -0
  178. package/fe/model/types/data/fetchInfo.d.ts +20 -0
  179. package/fe/model/types/data/fetchInfo.js +1 -0
  180. package/fe/model/types/data/schema.d.ts +98 -0
  181. package/fe/model/types/data/schema.js +1 -0
  182. package/fe/model/types/data/search.d.ts +7 -0
  183. package/fe/model/types/data/search.js +1 -0
  184. package/fe/model/types/menuType.d.ts +73 -0
  185. package/fe/model/types/menuType.js +1 -0
  186. package/fe/model/types/model.d.ts +33 -0
  187. package/fe/model/types/model.js +1 -0
  188. package/fe/packages/common/array/index.d.ts +7 -0
  189. package/fe/packages/common/array/index.js +40 -0
  190. package/fe/packages/common/cache/LRUCache.d.ts +13 -0
  191. package/fe/packages/common/cache/LRUCache.js +47 -0
  192. package/fe/packages/common/cache/index.d.ts +2 -0
  193. package/fe/packages/common/cache/index.js +1 -0
  194. package/fe/packages/common/guards/index.d.ts +9 -0
  195. package/fe/packages/common/guards/index.js +24 -0
  196. package/fe/packages/common/i18n/default.d.ts +92 -0
  197. package/fe/packages/common/i18n/default.js +90 -0
  198. package/fe/packages/common/i18n/en-US.d.ts +92 -0
  199. package/fe/packages/common/i18n/en-US.js +90 -0
  200. package/fe/packages/common/i18n/index.d.ts +43 -0
  201. package/fe/packages/common/i18n/index.js +173 -0
  202. package/fe/packages/common/i18n/locales.d.ts +8 -0
  203. package/fe/packages/common/i18n/locales.js +10 -0
  204. package/fe/packages/common/i18n/types.d.ts +71 -0
  205. package/fe/packages/common/i18n/types.js +1 -0
  206. package/fe/packages/common/index.d.ts +10 -0
  207. package/fe/packages/common/index.js +9 -0
  208. package/fe/packages/common/log/index.d.ts +33 -0
  209. package/fe/packages/common/log/index.js +176 -0
  210. package/fe/packages/common/number/index.d.ts +3 -0
  211. package/fe/packages/common/number/index.js +10 -0
  212. package/fe/packages/common/object/filterEmpty.d.ts +3 -0
  213. package/fe/packages/common/object/filterEmpty.js +33 -0
  214. package/fe/packages/common/object/index.d.ts +5 -0
  215. package/fe/packages/common/object/index.js +25 -0
  216. package/fe/packages/common/string/index.d.ts +4 -0
  217. package/fe/packages/common/string/index.js +17 -0
  218. package/fe/packages/common/types/index.d.ts +4 -0
  219. package/fe/packages/common/types/index.js +1 -0
  220. package/fe/packages/ui/react/components/Button/Button.d.ts +29 -10
  221. package/fe/packages/ui/react/components/Button/Button.js +53 -23
  222. package/fe/packages/ui/react/components/Button/SumbitButton.d.ts +2 -2
  223. package/fe/packages/ui/react/components/Button/SumbitButton.js +3 -10
  224. package/fe/packages/ui/react/components/Button/index.d.ts +1 -1
  225. package/fe/packages/ui/react/components/Checkbox/Checkbox.d.ts +1 -1
  226. package/fe/packages/ui/react/components/Checkbox/Checkbox.js +5 -3
  227. package/fe/packages/ui/react/components/ConfirmDialog/ConfirmDialog.js +11 -0
  228. package/fe/packages/ui/react/components/ConfirmDialog/index.d.ts +2 -0
  229. package/fe/packages/ui/react/components/ConfirmDialog/index.js +1 -0
  230. package/fe/packages/ui/react/components/DataTable/ActionBtn.d.ts +3 -1
  231. package/fe/packages/ui/react/components/DataTable/ActionBtn.js +85 -4
  232. package/fe/packages/ui/react/components/DataTable/{data-table.d.ts → index.d.ts} +10 -4
  233. package/fe/packages/ui/react/components/DataTable/{data-table.js → index.js} +58 -44
  234. package/fe/packages/ui/react/components/Date/Calendar.js +4 -3
  235. package/fe/packages/ui/react/components/Date/Date.d.ts +5 -3
  236. package/fe/packages/ui/react/components/Date/Date.js +71 -48
  237. package/fe/packages/ui/react/components/Date/TimePicker.js +3 -1
  238. package/fe/packages/ui/react/components/Date/dropdownPositioning.d.ts +3 -0
  239. package/fe/packages/ui/react/components/Date/dropdownPositioning.js +12 -0
  240. package/fe/packages/ui/react/components/Date/locales.d.ts +1 -0
  241. package/fe/packages/ui/react/components/Date/locales.js +7 -38
  242. package/fe/packages/ui/react/components/Drawer/Drawer.d.ts +29 -0
  243. package/fe/packages/ui/react/components/Drawer/Drawer.js +100 -0
  244. package/fe/packages/ui/react/components/Drawer/index.d.ts +3 -0
  245. package/fe/packages/ui/react/components/Drawer/index.js +1 -0
  246. package/fe/packages/ui/react/components/Dropdown/Dropdown.d.ts +25 -0
  247. package/fe/packages/ui/react/components/Dropdown/Dropdown.js +28 -0
  248. package/fe/packages/ui/react/components/Dropdown/index.d.ts +2 -0
  249. package/fe/packages/ui/react/components/Dropdown/index.js +1 -0
  250. package/fe/packages/ui/react/components/Form/Form.js +1 -1
  251. package/fe/packages/ui/react/components/Form/FormItem.js +1 -1
  252. package/fe/packages/ui/react/components/Form/SchemaForm/data.d.ts +45 -0
  253. package/fe/packages/ui/react/components/Form/{SchemeForm → SchemaForm}/data.js +9 -1
  254. package/fe/packages/ui/react/components/Form/{SchemeForm → SchemaForm}/index.d.ts +15 -14
  255. package/fe/packages/ui/react/components/Form/SchemaForm/index.js +79 -0
  256. package/fe/packages/ui/react/components/Form/index.d.ts +1 -1
  257. package/fe/packages/ui/react/components/Form/index.js +1 -1
  258. package/fe/packages/ui/react/components/ImagePreview/ImagePreview.js +15 -12
  259. package/fe/packages/ui/react/components/ImagePreview/PreviewImage.js +5 -2
  260. package/fe/packages/ui/react/components/Input/Input.d.ts +5 -1
  261. package/fe/packages/ui/react/components/Input/Input.js +5 -4
  262. package/fe/packages/ui/react/components/InputNumber/InputNumber.d.ts +28 -0
  263. package/fe/packages/ui/react/components/InputNumber/InputNumber.js +144 -0
  264. package/fe/packages/ui/react/components/InputNumber/index.d.ts +2 -0
  265. package/fe/packages/ui/react/components/InputNumber/index.js +1 -0
  266. package/fe/packages/ui/react/components/InputNumber/inputNumberUtils.d.ts +30 -0
  267. package/fe/packages/ui/react/components/InputNumber/inputNumberUtils.js +63 -0
  268. package/fe/packages/ui/react/components/InputNumber/inputNumberUtils.test.d.ts +2 -0
  269. package/fe/packages/ui/react/components/InputNumber/inputNumberUtils.test.js +27 -0
  270. package/fe/packages/ui/react/components/Label/Label.js +2 -2
  271. package/fe/packages/ui/react/components/Menu/Menu.d.ts +18 -0
  272. package/fe/packages/ui/react/components/Menu/Menu.js +102 -0
  273. package/fe/packages/ui/react/components/Menu/MenuContext.d.ts +39 -0
  274. package/fe/packages/ui/react/components/Menu/MenuContext.js +97 -0
  275. package/fe/packages/ui/react/components/Menu/MenuItem.d.ts +3 -0
  276. package/fe/packages/ui/react/components/Menu/MenuItem.js +33 -0
  277. package/fe/packages/ui/react/components/Menu/SubMenu.d.ts +10 -0
  278. package/fe/packages/ui/react/components/Menu/SubMenu.js +169 -0
  279. package/fe/packages/ui/react/components/Menu/index.d.ts +9 -0
  280. package/fe/packages/ui/react/components/Menu/index.js +5 -0
  281. package/fe/packages/ui/react/components/Menu/menuTypes.d.ts +59 -0
  282. package/fe/packages/ui/react/components/Menu/menuTypes.js +1 -0
  283. package/fe/packages/ui/react/components/Menu/utils.d.ts +2 -0
  284. package/fe/packages/ui/react/components/Menu/utils.js +7 -0
  285. package/fe/packages/ui/react/components/Message/Message.js +4 -1
  286. package/fe/packages/ui/react/components/Modal/Modal.d.ts +3 -1
  287. package/fe/packages/ui/react/components/Modal/Modal.js +6 -43
  288. package/fe/packages/ui/react/components/Modal/ModalManager.js +4 -3
  289. package/fe/packages/ui/react/components/Overlay/Overlay.d.ts +23 -0
  290. package/fe/packages/ui/react/components/Overlay/Overlay.js +53 -0
  291. package/fe/packages/ui/react/components/Overlay/index.d.ts +3 -0
  292. package/fe/packages/ui/react/components/Overlay/index.js +1 -0
  293. package/fe/packages/ui/react/components/{Pagination.js → Pagination/Pagination.js} +4 -4
  294. package/fe/packages/ui/react/components/Pagination/index.d.ts +2 -0
  295. package/fe/packages/ui/react/components/Pagination/index.js +1 -0
  296. package/fe/packages/ui/react/components/Popup/Popup.d.ts +26 -0
  297. package/fe/packages/ui/react/components/Popup/Popup.js +81 -0
  298. package/fe/packages/ui/react/components/Popup/index.d.ts +2 -0
  299. package/fe/packages/ui/react/components/Popup/index.js +1 -0
  300. package/fe/packages/ui/react/components/Search/Search.d.ts +2 -2
  301. package/fe/packages/ui/react/components/Search/Search.js +3 -3
  302. package/fe/packages/ui/react/components/Select/Select.d.ts +5 -0
  303. package/fe/packages/ui/react/components/Select/Select.js +52 -109
  304. package/fe/packages/ui/react/components/Select/dropdownPositioning.d.ts +3 -0
  305. package/fe/packages/ui/react/components/Select/dropdownPositioning.js +13 -0
  306. package/fe/packages/ui/react/components/Skeleton/Skeleton.js +2 -2
  307. package/fe/packages/ui/react/components/Switch/Switch.js +3 -1
  308. package/fe/packages/ui/react/components/TableSearch/TableSearch.d.ts +5 -4
  309. package/fe/packages/ui/react/components/TableSearch/TableSearch.js +23 -21
  310. package/fe/packages/ui/react/components/TableSearch/lang.js +5 -14
  311. package/fe/packages/ui/react/components/{Textarea.d.ts → Textarea/Textarea.d.ts} +11 -3
  312. package/fe/packages/ui/react/components/Textarea/Textarea.js +37 -0
  313. package/fe/packages/ui/react/components/Textarea/index.d.ts +2 -0
  314. package/fe/packages/ui/react/components/Textarea/index.js +1 -0
  315. package/fe/packages/ui/react/components/{Tooltip.d.ts → Tooltip/Tooltip.d.ts} +2 -2
  316. package/fe/packages/ui/react/components/Tooltip/Tooltip.js +79 -0
  317. package/fe/packages/ui/react/components/Tooltip/index.d.ts +2 -0
  318. package/fe/packages/ui/react/components/Tooltip/index.js +1 -0
  319. package/fe/packages/ui/react/components/{TreeSelect.js → TreeSelect/TreeSelect.js} +9 -11
  320. package/fe/packages/ui/react/components/TreeSelect/index.d.ts +2 -0
  321. package/fe/packages/ui/react/components/TreeSelect/index.js +1 -0
  322. package/fe/packages/ui/react/components/Upload/ImageUpload.js +18 -6
  323. package/fe/packages/ui/react/components/Upload/Upload.js +2 -1
  324. package/fe/packages/ui/react/components/{breadcrumb.js → breadcrumb/breadcrumb.js} +15 -12
  325. package/fe/packages/ui/react/components/breadcrumb/index.d.ts +2 -0
  326. package/fe/packages/ui/react/components/breadcrumb/index.js +1 -0
  327. package/fe/packages/ui/react/components/hooks/useDropdownPositioning.d.ts +49 -0
  328. package/fe/packages/ui/react/components/hooks/useDropdownPositioning.js +137 -0
  329. package/fe/packages/ui/react/components/index.d.ts +7 -1
  330. package/fe/packages/ui/react/components/index.js +7 -1
  331. package/fe/packages/ui/react/components/table/index.d.ts +2 -0
  332. package/fe/packages/ui/react/components/table/index.js +1 -0
  333. package/fe/packages/ui/react/components/table/table.js +20 -0
  334. package/fe/packages/ui/react/components/testPage/MenuTestPage.d.ts +2 -0
  335. package/fe/packages/ui/react/components/testPage/MenuTestPage.js +104 -0
  336. package/fe/packages/ui/react/components/testPage/index.js +277 -81
  337. package/fe/packages/ui/react/hooks/useExecuteOnce.d.ts +30 -0
  338. package/fe/packages/ui/react/hooks/useExecuteOnce.js +57 -0
  339. package/fe/packages/ui/react/hooks/useInit.d.ts +1 -1
  340. package/fe/packages/ui/react/hooks/useInit.js +1 -1
  341. package/fe/packages/ui/react/hooks/useLanguage.d.ts +1 -6
  342. package/fe/packages/ui/react/hooks/useRefState.d.ts +30 -0
  343. package/fe/packages/ui/react/hooks/useRefState.js +29 -0
  344. package/fe/packages/ui/react/hooks/useWatch.d.ts +23 -0
  345. package/fe/packages/ui/react/hooks/useWatch.js +87 -0
  346. package/fe/packages/ui/react/hooks/useWatch.test.d.ts +2 -0
  347. package/fe/packages/ui/react/hooks/useWatch.test.js +22 -0
  348. package/fe/packages/ui/react/i18n/I18nProvider.d.ts +31 -0
  349. package/fe/packages/ui/react/i18n/I18nProvider.js +25 -0
  350. package/fe/packages/ui/react/i18n/index.d.ts +4 -0
  351. package/fe/packages/ui/react/i18n/index.js +3 -0
  352. package/fe/packages/ui/react/i18n/useI18n.d.ts +13 -0
  353. package/fe/packages/ui/react/i18n/useI18n.js +18 -0
  354. package/fe/packages/ui/react/index.css +238 -0
  355. package/fe/packages/ui/react/index.d.ts +2 -0
  356. package/fe/packages/ui/react/index.js +2 -0
  357. package/fe/packages/ui/react/lib/createStoreHook.d.ts +9 -0
  358. package/fe/packages/ui/react/lib/createStoreHook.js +6 -0
  359. package/fe/packages/ui/react/lib/export.d.ts +2 -2
  360. package/fe/packages/ui/react/stores/language.d.ts +3 -12
  361. package/fe/packages/ui/react/stores/language.js +2 -51
  362. package/fe/typings/type.d.ts +5 -0
  363. package/fe/typings/type.js +1 -0
  364. package/model/index.d.ts +2 -0
  365. package/model/types/data/button.d.ts +32 -0
  366. package/model/types/data/component.d.ts +61 -0
  367. package/model/types/data/fetchInfo.d.ts +20 -0
  368. package/model/types/data/schema.d.ts +98 -0
  369. package/model/types/data/search.d.ts +7 -0
  370. package/model/types/index.d.ts +2 -0
  371. package/model/types/menuType.d.ts +73 -0
  372. package/model/types/model.d.ts +33 -0
  373. package/model/types/test.d.ts +2 -0
  374. package/package.json +20 -6
  375. package/types/app/controller/base.d.ts +3 -3
  376. package/types/app/router/view.d.ts +2 -3
  377. package/types/app/service/project.d.ts +29 -4
  378. package/types/app/type.d.ts +1 -0
  379. package/types/app/typings.d.ts +12 -21
  380. package/types/bundler/defaultAlias.d.ts +3 -0
  381. package/types/bundler/utils.d.ts +1 -1
  382. package/types/config/config.default.d.ts +14 -0
  383. package/types/packages/common/LRUCache.d.ts +1 -0
  384. package/types/packages/common/array/index.d.ts +6 -0
  385. package/types/packages/common/cache/LRUCache.d.ts +12 -0
  386. package/types/packages/common/cache/index.d.ts +1 -0
  387. package/types/packages/common/guards/index.d.ts +8 -0
  388. package/types/packages/common/i18n/default.d.ts +86 -0
  389. package/types/packages/common/i18n/en-US.d.ts +86 -0
  390. package/types/packages/common/i18n/index.d.ts +18 -0
  391. package/types/packages/common/i18n/locales.d.ts +7 -0
  392. package/types/packages/common/i18n/types.d.ts +46 -0
  393. package/types/packages/common/index.d.ts +9 -0
  394. package/types/packages/common/log/index.d.ts +32 -0
  395. package/types/packages/common/number/index.d.ts +2 -0
  396. package/types/packages/common/object/filterEmpty.d.ts +2 -0
  397. package/types/packages/common/object/filtereEmpty.d.ts +1 -0
  398. package/types/packages/common/object/index.d.ts +4 -0
  399. package/types/packages/common/string/index.d.ts +3 -0
  400. package/types/packages/common/types/index.d.ts +3 -0
  401. package/types/packages/core/index.d.ts +1 -1
  402. package/types/packages/core/loader/router.d.ts +1 -1
  403. package/types/packages/core/types.d.ts +12 -3
  404. package/types/packages/utils/runFileFn.d.ts +5 -3
  405. package/fe/packages/ui/react/components/ConfirmDialog.js +0 -9
  406. package/fe/packages/ui/react/components/Dropdown.d.ts +0 -16
  407. package/fe/packages/ui/react/components/Dropdown.js +0 -54
  408. package/fe/packages/ui/react/components/Form/SchemeForm/data.d.ts +0 -51
  409. package/fe/packages/ui/react/components/Form/SchemeForm/index.js +0 -69
  410. package/fe/packages/ui/react/components/Textarea.js +0 -35
  411. package/fe/packages/ui/react/components/Tooltip.js +0 -118
  412. package/fe/packages/ui/react/components/table.js +0 -20
  413. package/fe/packages/ui/react/locales/index.d.ts +0 -8
  414. package/fe/packages/ui/react/locales/index.js +0 -6
  415. /package/fe/packages/ui/react/components/{ConfirmDialog.d.ts → ConfirmDialog/ConfirmDialog.d.ts} +0 -0
  416. /package/fe/packages/ui/react/components/{Pagination.d.ts → Pagination/Pagination.d.ts} +0 -0
  417. /package/fe/packages/ui/react/components/{TreeSelect.d.ts → TreeSelect/TreeSelect.d.ts} +0 -0
  418. /package/fe/packages/ui/react/components/{breadcrumb.d.ts → breadcrumb/breadcrumb.d.ts} +0 -0
  419. /package/fe/packages/ui/react/components/{table.d.ts → table/table.d.ts} +0 -0
@@ -0,0 +1,169 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils";
3
+ import { createContext, useCallback, useContext, useRef, useState, } from "react";
4
+ import { ChevronDown, ChevronRight, ChevronUp } from "lucide-react";
5
+ import { Popup } from "../Popup";
6
+ import { CollapsedContext, useMenuStore } from "./MenuContext";
7
+ import { getFirstChar } from "./utils";
8
+ const SUBMENU_POPUP_OFFSET = 12;
9
+ const SubMenuLevelContext = createContext(0);
10
+ /**
11
+ * 计算 top 模式下,二级及更深层 submenu 的弹出位置。
12
+ *
13
+ * @returns 优先放在右侧;右侧空间不够时,改放到左侧。
14
+ */
15
+ const getTopNestedSubMenuPosition = ({ anchorRect, contentRect, viewportWidth, offset, matchAnchorWidth, }) => {
16
+ const width = contentRect?.width ?? 0;
17
+ const rightLeft = anchorRect.right + offset;
18
+ const canPlaceRight = rightLeft + width <= viewportWidth;
19
+ return {
20
+ top: anchorRect.top,
21
+ left: canPlaceRight
22
+ ? rightLeft
23
+ : Math.max(0, anchorRect.left - width - offset),
24
+ width: matchAnchorWidth ? anchorRect.width : undefined,
25
+ };
26
+ };
27
+ /**
28
+ * 判断当前 SubMenu 的子节点里,有没有选中的菜单项。
29
+ *
30
+ * @param children SubMenu 下面渲染出来的菜单节点。
31
+ * @param targetKey 当前选中的 key。
32
+ * @returns 子孙节点里命中选中 key 时返回 true。
33
+ */
34
+ function hasDescendantSelected(children, targetKey) {
35
+ if (!targetKey)
36
+ return false;
37
+ return walkReactChildren(children, targetKey);
38
+ }
39
+ /**
40
+ * 递归遍历 React children,查找指定 eventKey。
41
+ *
42
+ * @param node 当前要检查的 React 节点。
43
+ * @param targetKey 要查找的 eventKey。
44
+ * @returns 当前节点或子孙节点命中时返回 true。
45
+ */
46
+ function walkReactChildren(node, targetKey) {
47
+ if (!node)
48
+ return false;
49
+ if (Array.isArray(node))
50
+ return node.some((n) => walkReactChildren(n, targetKey));
51
+ if (typeof node === "object" && node && "props" in node) {
52
+ const props = node.props;
53
+ if (props.eventKey === targetKey)
54
+ return true;
55
+ if (walkReactChildren(props.children, targetKey))
56
+ return true;
57
+ }
58
+ return false;
59
+ }
60
+ /**
61
+ * 渲染 SubMenu 的触发区域,也就是能点击/hover 的那一行。
62
+ *
63
+ * @returns SubMenu trigger 节点。
64
+ */
65
+ function SubMenuItem({ triggerRef, onClick, icon, label, disabled, collapsed, descendantSelected, ArrowIcon, showArrow, setPopupContentRef, mode, }) {
66
+ const collapsedLabelTooltip = useMenuStore((s) => s.collapsedLabelTooltip);
67
+ return (_jsxs("div", { ref: triggerRef, onClick: onClick, className: cn("subMenuItem group relative flex items-center rounded-lg text-sm transition-all", "select-none", mode === "top" &&
68
+ "h-10 w-auto min-w-fit justify-start gap-3 px-3 py-2 text-left", mode === "left" &&
69
+ collapsed &&
70
+ "h-10 w-full justify-center gap-0 px-0 py-2", mode === "left" &&
71
+ !collapsed &&
72
+ "min-h-10 w-full gap-3 px-3 py-2.5 text-left", descendantSelected && "bg-theme/10 text-theme shadow-sm", !descendantSelected &&
73
+ "text-foreground hover:bg-gray-200 dark:hover:bg-gray-700", disabled && "cursor-not-allowed opacity-50"), children: [icon && (_jsx("span", { className: cn("flex h-7 w-7 flex-shrink-0 items-center justify-center rounded-md transition-colors", descendantSelected
74
+ ? "bg-theme/10 text-theme"
75
+ : "text-muted-foreground group-hover:text-foreground"), children: icon })), !collapsed && _jsx("span", { className: "min-w-0 flex-1 truncate", children: label }), collapsed && !icon && collapsedLabelTooltip && (_jsx("span", { className: "absolute left-0 right-0 top-0 flex h-full items-center justify-center text-[10px]", children: getFirstChar(label) })), !collapsed && showArrow && (_jsx(ArrowIcon, { className: "h-4 w-4 flex-shrink-0 text-muted-foreground transition-transform group-hover:text-foreground" })), _jsx("div", { ref: setPopupContentRef })] }));
76
+ }
77
+ /**
78
+ * 渲染带子菜单的 Menu 项。
79
+ *
80
+ * 根据当前 menu mode、收起状态、是否在弹出层内,决定子菜单是内嵌展开还是 Popup 弹出。
81
+ *
82
+ * @returns SubMenu 完整节点,包含触发区域和子菜单内容。
83
+ */
84
+ export function SubMenu({ eventKey, label, icon, disabled, popup: forcePopup, parentKey, children, }) {
85
+ const mode = useMenuStore((s) => s.mode);
86
+ const expandTrigger = useMenuStore((s) => s.expandTrigger);
87
+ const storeCollapsed = useMenuStore((s) => s.collapsed);
88
+ const collapsed = useContext(CollapsedContext);
89
+ const openKeys = useMenuStore((s) => s.openKeys);
90
+ const toggleOpenKey = useMenuStore((s) => s.toggleOpenKey);
91
+ const selectedKey = useMenuStore((s) => s.selectedKey);
92
+ const level = useContext(SubMenuLevelContext);
93
+ const isOpen = openKeys.includes(eventKey);
94
+ const triggerRef = useRef(null);
95
+ const popupContentRef = useRef(null);
96
+ const [popupContainer, setPopupContainer] = useState(undefined);
97
+ const [popupOpen, setPopupOpen] = useState(false);
98
+ // 处于弹出层内:store 已收起但 context 被覆盖为 false
99
+ const isInsidePopup = storeCollapsed && !collapsed;
100
+ // mode=top always popup; left+collapsed always popup; inside popup -> popup; else check popup flag
101
+ const usePopup = mode === "top" ||
102
+ (mode === "left" && collapsed) ||
103
+ isInsidePopup ||
104
+ forcePopup === true;
105
+ const descendantSelected = hasDescendantSelected(children, selectedKey);
106
+ const setPopupContentRef = useCallback((el) => {
107
+ popupContentRef.current = el;
108
+ if (el)
109
+ setPopupContainer(el);
110
+ }, []);
111
+ const handleMouseEnter = useCallback(() => {
112
+ if (disabled)
113
+ return;
114
+ if (usePopup) {
115
+ setPopupOpen(true);
116
+ }
117
+ else if (expandTrigger === "hover" && !isOpen) {
118
+ toggleOpenKey(eventKey, parentKey);
119
+ }
120
+ }, [
121
+ disabled,
122
+ usePopup,
123
+ expandTrigger,
124
+ isOpen,
125
+ eventKey,
126
+ parentKey,
127
+ toggleOpenKey,
128
+ ]);
129
+ const handleMouseLeave = useCallback(() => {
130
+ if (usePopup) {
131
+ setPopupOpen(false);
132
+ }
133
+ }, [usePopup]);
134
+ const handleTriggerClick = useCallback(() => {
135
+ if (disabled)
136
+ return;
137
+ if (usePopup) {
138
+ setPopupOpen((prev) => !prev);
139
+ }
140
+ else {
141
+ toggleOpenKey(eventKey, parentKey);
142
+ }
143
+ }, [disabled, usePopup, eventKey, parentKey, toggleOpenKey]);
144
+ const showArrow = !(mode === "left" && collapsed);
145
+ const ArrowIcon = usePopup
146
+ ? mode === "top" && level === 0
147
+ ? ChevronDown
148
+ : ChevronRight
149
+ : isOpen
150
+ ? ChevronUp
151
+ : ChevronDown;
152
+ const popupPlacement = mode === "top" && level === 0 ? "bottom-start" : "right-start";
153
+ const popupStrategy = mode === "top" && level > 0 ? getTopNestedSubMenuPosition : undefined;
154
+ const hoverBridgePlacement = mode === "top" && level > 0 ? "horizontal" : "auto";
155
+ const subMenuContent = (_jsx("div", { className: cn(
156
+ // "min-w-[180px]",
157
+ " rounded-xl bg-muted p-2 shadow-[0_18px_44px_rgba(15,23,42,0.14),0_4px_12px_rgba(15,23,42,0.08)]"), children: _jsx(SubMenuLevelContext.Provider, { value: level + 1, children: _jsx("div", { className: "flex flex-col gap-1", children: children }) }) }));
158
+ /**
159
+ *
160
+ * submenu 生成的节点是 1 menuItem
161
+ * submenu「
162
+ * 1-1
163
+ * 1-2
164
+ * 」
165
+ *
166
+ * 所以判断鼠标是否在区域内应该是 监听 submenu 的根节点
167
+ */
168
+ return (_jsxs("div", { className: "submenu", onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, children: [_jsx(SubMenuItem, { triggerRef: triggerRef, onClick: handleTriggerClick, icon: icon, label: label, disabled: disabled, collapsed: collapsed, descendantSelected: descendantSelected, ArrowIcon: ArrowIcon, showArrow: showArrow, setPopupContentRef: setPopupContentRef, mode: mode }), usePopup ? (_jsx(Popup, { open: popupOpen, anchorRef: triggerRef, placement: popupPlacement, offset: SUBMENU_POPUP_OFFSET, hoverBridge: SUBMENU_POPUP_OFFSET, onOpenChange: setPopupOpen, container: popupContainer, strategy: popupStrategy, hoverBridgePlacement: hoverBridgePlacement, className: "border-0 bg-transparent p-0 shadow-none", children: _jsx(CollapsedContext.Provider, { value: false, children: subMenuContent }) })) : (isOpen && (_jsx("div", { className: "ml-4 pl-2 pt-1", children: _jsx(SubMenuLevelContext.Provider, { value: level + 1, children: _jsx("div", { className: "flex flex-col gap-1", children: children }) }) })))] }));
169
+ }
@@ -0,0 +1,9 @@
1
+ export { Menu } from './Menu';
2
+ export { MenuItem } from './MenuItem';
3
+ export { SubMenu } from './SubMenu';
4
+ export { CollapseToggle } from './Menu';
5
+ export type { MenuProps, MenuItemData, MenuItemProps, SubMenuProps } from './menuTypes';
6
+ export type { CollapseToggleHandle, CollapseToggleProps } from './Menu';
7
+ export { useMenuStore } from './MenuContext';
8
+ export type { MenuStore } from './MenuContext';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,5 @@
1
+ export { Menu } from './Menu';
2
+ export { MenuItem } from './MenuItem';
3
+ export { SubMenu } from './SubMenu';
4
+ export { CollapseToggle } from './Menu';
5
+ export { useMenuStore } from './MenuContext';
@@ -0,0 +1,59 @@
1
+ import type { CSSProperties, MouseEventHandler, ReactNode, Ref } from 'react';
2
+ export interface MenuItemData {
3
+ key: string;
4
+ label: ReactNode;
5
+ icon?: ReactNode;
6
+ disabled?: boolean;
7
+ danger?: boolean;
8
+ popup?: boolean;
9
+ children?: MenuItemData[];
10
+ onClick?: () => void;
11
+ className?: string;
12
+ style?: CSSProperties;
13
+ width?: CSSProperties['width'];
14
+ minWidth?: CSSProperties['minWidth'];
15
+ maxWidth?: CSSProperties['maxWidth'];
16
+ }
17
+ export interface MenuProps {
18
+ mode?: 'top' | 'left';
19
+ expandTrigger?: 'hover' | 'click';
20
+ expandMode?: 'accordion' | 'multiple';
21
+ selectedKey?: string;
22
+ defaultSelectedKey?: string;
23
+ onSelect?: (key: string) => void;
24
+ items?: MenuItemData[];
25
+ children?: ReactNode;
26
+ className?: string;
27
+ collapsed?: boolean;
28
+ defaultCollapsed?: boolean;
29
+ onCollapse?: (collapsed: boolean) => void;
30
+ collapsedWidth?: number;
31
+ /** 收起时无 icon 的项是否通过 tooltip 显示完整名称,默认 true */
32
+ collapsedLabelTooltip?: boolean;
33
+ }
34
+ export interface SubMenuProps {
35
+ eventKey: string;
36
+ label: ReactNode;
37
+ icon?: ReactNode;
38
+ disabled?: boolean;
39
+ popup?: boolean;
40
+ parentKey?: string;
41
+ children?: ReactNode;
42
+ }
43
+ export interface MenuItemProps {
44
+ eventKey?: string;
45
+ icon?: ReactNode;
46
+ disabled?: boolean;
47
+ danger?: boolean;
48
+ onClick?: () => void;
49
+ children?: ReactNode;
50
+ className?: string;
51
+ style?: CSSProperties;
52
+ width?: CSSProperties['width'];
53
+ minWidth?: CSSProperties['minWidth'];
54
+ maxWidth?: CSSProperties['maxWidth'];
55
+ onMouseLeave?: MouseEventHandler<HTMLButtonElement>;
56
+ onMouseEnter?: MouseEventHandler<HTMLButtonElement>;
57
+ ref?: Ref<HTMLButtonElement>;
58
+ }
59
+ //# sourceMappingURL=menuTypes.d.ts.map
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export declare function getFirstChar(node: React.ReactNode): string;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1,7 @@
1
+ export function getFirstChar(node) {
2
+ if (typeof node === "string")
3
+ return node[0]?.toUpperCase() ?? "";
4
+ if (typeof node === "number")
5
+ return String(node);
6
+ return "";
7
+ }
@@ -1,7 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useI18n } from '../../i18n';
2
3
  import { cn } from '../../lib/utils';
3
4
  import { AlertCircle, CheckCircle2, Info, X, XCircle } from 'lucide-react';
4
5
  import { useEffect, useRef, useState } from 'react';
6
+ import { Button } from '../Button';
5
7
  import { DEFAULT_DURATION } from './data';
6
8
  const typeConfig = {
7
9
  success: {
@@ -22,6 +24,7 @@ const typeConfig = {
22
24
  },
23
25
  };
24
26
  export function Message({ type = 'info', content, children, duration = DEFAULT_DURATION, onClose, closable = true, className, }) {
27
+ const t = useI18n();
25
28
  const displayContent = children ?? content;
26
29
  const [visible, setVisible] = useState(true);
27
30
  const timerRef = useRef(null);
@@ -51,5 +54,5 @@ export function Message({ type = 'info', content, children, duration = DEFAULT_D
51
54
  }, [duration]);
52
55
  if (!visible)
53
56
  return null;
54
- return (_jsxs("div", { ref: messageRef, className: cn('flex items-start gap-3 px-4 py-3 rounded-lg shadow-lg', 'bg-background border border-border', 'min-w-[320px] max-w-[480px]', 'transition-all duration-200', 'pointer-events-auto', visible ? 'opacity-100 translate-y-0' : 'opacity-0 -translate-y-2', className), children: [_jsx(Icon, { size: 20, className: cn('flex-shrink-0 mt-0.5', iconColor) }), _jsx("div", { className: "flex-1 text-sm text-foreground", children: displayContent }), closable && (_jsx("button", { type: "button", onClick: handleClose, "aria-label": "\u5173\u95ED", className: cn('flex-shrink-0 p-0.5 rounded-md', 'text-muted-foreground hover:text-foreground', 'hover:bg-muted', 'transition-colors', 'focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2'), children: _jsx(X, { size: 16 }) }))] }));
57
+ return (_jsxs("div", { ref: messageRef, className: cn('tc-ui-message flex items-start gap-3 px-4 py-3 rounded-lg shadow-lg', 'bg-background border border-border', 'min-w-[320px] max-w-[480px]', 'transition-all duration-200', 'pointer-events-auto', visible ? 'opacity-100 translate-y-0' : 'opacity-0 -translate-y-2', className), children: [_jsx(Icon, { size: 20, className: cn('flex-shrink-0 mt-0.5', iconColor) }), _jsx("div", { className: "flex-1 text-sm text-foreground", children: displayContent }), closable && (_jsx(Button, { variant: "text", type: "button", onClick: handleClose, "aria-label": t('components.message.close'), className: cn('flex-shrink-0 p-0.5 rounded-md', 'text-muted-foreground hover:text-foreground', 'hover:bg-muted', 'transition-colors', 'focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2'), children: _jsx(X, { size: 16 }) }))] }));
55
58
  }
@@ -7,7 +7,9 @@ export type ModalProps = {
7
7
  footer?: ReactNode;
8
8
  className?: string;
9
9
  contentClassName?: string;
10
+ mask?: boolean;
10
11
  maskClosable?: boolean;
12
+ lockScroll?: boolean;
11
13
  closable?: boolean;
12
14
  width?: number | string;
13
15
  centered?: boolean;
@@ -21,5 +23,5 @@ export type ModalProps = {
21
23
  */
22
24
  keyboard?: boolean;
23
25
  };
24
- export declare function Modal({ open, onClose, title, children, footer, className, contentClassName, maskClosable, closable, width, centered, renderNode, keyboard, zIndex, }: ModalProps): import("react").ReactPortal | null;
26
+ export declare function Modal({ open, onClose, title, children, footer, className, contentClassName, mask, maskClosable, lockScroll, closable, width, centered, renderNode, keyboard, zIndex, }: ModalProps): import("react/jsx-runtime").JSX.Element;
25
27
  //# sourceMappingURL=Modal.d.ts.map
@@ -1,51 +1,14 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useI18n } from '../../i18n';
2
3
  import { cn } from '../../lib/utils';
3
4
  import { X } from 'lucide-react';
4
- import { useEffect, useRef } from 'react';
5
- import { createPortal } from 'react-dom';
6
- export function Modal({ open = false, onClose, title, children, footer, className, contentClassName, maskClosable = true, closable = true, width = 520, centered = true, renderNode = document.body, keyboard = true, zIndex = 1000, }) {
7
- const modalRef = useRef(null);
8
- const contentRef = useRef(null);
9
- // 处理 ESC 键关闭
10
- useEffect(() => {
11
- if (!open || !keyboard)
12
- return;
13
- const handleEscape = (e) => {
14
- if (e.key === 'Escape' && closable) {
15
- onClose?.();
16
- }
17
- };
18
- document.addEventListener('keydown', handleEscape);
19
- return () => {
20
- document.removeEventListener('keydown', handleEscape);
21
- };
22
- }, [open, closable, onClose, keyboard]);
23
- // 阻止 body 滚动
24
- useEffect(() => {
25
- if (open) {
26
- const originalOverflow = document.body.style.overflow;
27
- document.body.style.overflow = 'hidden';
28
- return () => {
29
- document.body.style.overflow = originalOverflow;
30
- };
31
- }
32
- else {
33
- return () => { };
34
- }
35
- }, [open]);
36
- // 点击遮罩层关闭
37
- const handleMaskClick = (e) => {
38
- if (maskClosable && e.target === e.currentTarget) {
39
- onClose?.();
40
- }
41
- };
5
+ import { Button } from '../Button';
6
+ import { Overlay } from '../Overlay';
7
+ export function Modal({ open = false, onClose, title, children, footer, className, contentClassName, mask = true, maskClosable = true, lockScroll = true, closable = true, width = 520, centered = true, renderNode, keyboard = true, zIndex = 1000, }) {
8
+ const t = useI18n();
42
9
  // 点击内容区域阻止冒泡
43
10
  const handleContentClick = (e) => {
44
11
  e.stopPropagation();
45
12
  };
46
- if (!open)
47
- return null;
48
- const modalContent = (_jsx("div", { ref: modalRef, className: cn('fixed inset-0 z-[1000] flex items-center justify-center', 'bg-black/50 backdrop-blur-sm', 'transition-opacity duration-200', open ? 'opacity-100' : 'opacity-0'), style: { zIndex }, onClick: handleMaskClick, children: _jsxs("div", { ref: contentRef, className: cn('relative bg-background rounded-lg shadow-lg', 'flex flex-col max-h-[90vh]', 'transition-all duration-200', open ? 'scale-100 opacity-100' : 'scale-95 opacity-0', centered ? 'my-auto' : 'mt-[10vh]', className), style: { width: typeof width === 'number' ? `${width}px` : width }, onClick: handleContentClick, children: [(title || closable) && (_jsxs("div", { className: "flex items-center justify-between px-6 py-4 border-border", children: [title && _jsx("div", { className: "text-lg font-semibold text-foreground", children: title }), closable && (_jsx("button", { type: "button", onClick: onClose, "aria-label": "\u5173\u95ED", className: cn('ml-auto p-1 rounded-md', 'text-muted-foreground hover:text-foreground', 'hover:bg-muted', 'transition-colors', 'focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2'), children: _jsx(X, { size: 20 }) }))] })), _jsx("div", { className: cn('flex-1 overflow-auto px-6 py-4', contentClassName), children: children }), footer && _jsx("div", { className: "px-6 py-4 border-border", children: footer })] }) }));
49
- const parent = typeof renderNode === 'function' ? renderNode() : renderNode;
50
- return createPortal(modalContent, parent);
13
+ return (_jsx(Overlay, { open: open, onClose: onClose, mask: mask, maskClosable: maskClosable, lockScroll: lockScroll, keyboard: keyboard, closable: closable, renderNode: renderNode, zIndex: zIndex, className: cn('tc-ui-modal flex items-center justify-center'), children: _jsxs("div", { className: cn('relative bg-background rounded-lg shadow-lg', 'flex flex-col max-h-[90vh]', 'transition-all duration-200', open ? 'scale-100 opacity-100' : 'scale-95 opacity-0', centered ? 'my-auto' : 'mt-[10vh]', className), style: { width: typeof width === 'number' ? `${width}px` : width }, onClick: handleContentClick, children: [(title || closable) && (_jsxs("div", { className: "flex items-center justify-between px-6 py-4 border-border", children: [title && _jsx("div", { className: "text-lg font-semibold text-foreground", children: title }), closable && (_jsx(Button, { variant: "text", type: "button", onClick: onClose, "aria-label": t('components.modal.close'), className: cn('ml-auto p-1 rounded-md', 'text-muted-foreground hover:text-foreground', 'hover:bg-muted', 'transition-colors', 'focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2'), children: _jsx(X, { size: 20 }) }))] })), _jsx("div", { className: cn('flex-1 overflow-auto px-6 py-4', contentClassName), children: children }), footer && _jsx("div", { className: "px-6 py-4 border-border", children: footer })] }) }));
51
14
  }
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { t } from '../../i18n';
2
3
  import { createRoot } from 'react-dom/client';
3
4
  import { AsynchronousButton, Button } from '../Button';
4
5
  import { Modal } from './Modal';
@@ -61,13 +62,13 @@ class ModalManagerClass {
61
62
  }
62
63
  }
63
64
  export const openConfirmModal = (pConfig) => {
64
- const { onOk, onCancel, okText = '确认', cancelText = '取消', ...props } = pConfig;
65
+ const { onOk, onCancel, okText = t('components.modal.okText'), cancelText = t('components.modal.cancelText'), ...props } = pConfig;
65
66
  const config = {
66
- title: '提示',
67
+ title: t('components.modal.confirmTitle'),
67
68
  footer: (_jsxs("div", { className: "flex justify-end gap-3", children: [_jsx(Button, { onClick: () => {
68
69
  onCancel?.();
69
70
  modalManager.close(currentModalId);
70
- }, className: "min-w-[100px] bg-white border-[hsl(var(--theme-primary))] text-[hsl(var(--theme-primary))] hover:bg-[hsl(var(--theme-primary))]/5", children: cancelText }), _jsx(AsynchronousButton, { variant: "primary", onClick: async (e) => {
71
+ }, className: "min-w-[100px] bg-background border-[hsl(var(--theme-primary))] text-[hsl(var(--theme-primary))] hover:bg-[hsl(var(--theme-primary))]/5", children: cancelText }), _jsx(AsynchronousButton, { variant: "primary", onClick: async (e) => {
71
72
  const result = await onOk?.(e);
72
73
  if (typeof result === 'boolean' && !result)
73
74
  return;
@@ -0,0 +1,23 @@
1
+ import type { CSSProperties, MouseEvent, ReactNode } from 'react';
2
+ export declare const canUseDocument: () => boolean;
3
+ export type OverlayProps = {
4
+ open?: boolean;
5
+ visible?: boolean;
6
+ children?: ReactNode;
7
+ className?: string;
8
+ style?: CSSProperties;
9
+ zIndex?: number;
10
+ mask?: boolean;
11
+ maskClosable?: boolean;
12
+ lockScroll?: boolean;
13
+ keyboard?: boolean;
14
+ closable?: boolean;
15
+ onClose?: () => void;
16
+ onClick?: (e: MouseEvent<HTMLDivElement>) => void;
17
+ /**
18
+ * @default document.body
19
+ */
20
+ renderNode?: HTMLElement | (() => HTMLElement);
21
+ };
22
+ export declare function Overlay({ open, visible, children, className, style, zIndex, mask, maskClosable, lockScroll, keyboard, closable, onClose, onClick, renderNode, }: OverlayProps): import("react").ReactPortal | null;
23
+ //# sourceMappingURL=Overlay.d.ts.map
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../../lib/utils';
3
+ import { useEffect } from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ let bodyScrollLockCount = 0;
6
+ let originalBodyOverflow = '';
7
+ export const canUseDocument = () => typeof document !== 'undefined';
8
+ const lockBodyScroll = () => {
9
+ if (!canUseDocument())
10
+ return () => { };
11
+ if (bodyScrollLockCount === 0) {
12
+ originalBodyOverflow = document.body.style.overflow;
13
+ document.body.style.overflow = 'hidden';
14
+ }
15
+ bodyScrollLockCount += 1;
16
+ return () => {
17
+ bodyScrollLockCount = Math.max(0, bodyScrollLockCount - 1);
18
+ if (bodyScrollLockCount === 0) {
19
+ document.body.style.overflow = originalBodyOverflow;
20
+ originalBodyOverflow = '';
21
+ }
22
+ };
23
+ };
24
+ export function Overlay({ open = false, visible = open, children, className, style, zIndex = 1000, mask = true, maskClosable = true, lockScroll = true, keyboard = true, closable = true, onClose, onClick, renderNode, }) {
25
+ useEffect(() => {
26
+ if (!open || !keyboard || !canUseDocument())
27
+ return;
28
+ const handleEscape = (e) => {
29
+ if (e.key === 'Escape' && closable) {
30
+ onClose?.();
31
+ }
32
+ };
33
+ document.addEventListener('keydown', handleEscape);
34
+ return () => {
35
+ document.removeEventListener('keydown', handleEscape);
36
+ };
37
+ }, [open, closable, onClose, keyboard]);
38
+ useEffect(() => {
39
+ if (!open || !lockScroll)
40
+ return;
41
+ return lockBodyScroll();
42
+ }, [lockScroll, open]);
43
+ const handleMaskClick = (e) => {
44
+ onClick?.(e);
45
+ if (maskClosable && e.target === e.currentTarget) {
46
+ onClose?.();
47
+ }
48
+ };
49
+ if (!open || !canUseDocument())
50
+ return null;
51
+ const parent = typeof renderNode === 'function' ? renderNode() : (renderNode ?? document.body);
52
+ return createPortal(_jsx("div", { className: cn('tc-ui-overlay fixed inset-0 z-[1000]', mask && 'bg-black/50 backdrop-blur-sm', 'transition-opacity duration-200', visible ? 'opacity-100' : 'opacity-0', className), style: { zIndex, ...style }, onClick: handleMaskClick, children: children }), parent);
53
+ }
@@ -0,0 +1,3 @@
1
+ export { Overlay, canUseDocument } from './Overlay';
2
+ export type { OverlayProps } from './Overlay';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ export { Overlay, canUseDocument } from './Overlay';
@@ -1,8 +1,8 @@
1
1
  import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
- import { cn } from '../lib/utils';
2
+ import { cn } from '../../lib/utils';
3
3
  import { ChevronLeft, ChevronRight } from 'lucide-react';
4
- import { Button } from './Button';
5
- import { Select } from './Select';
4
+ import { Button } from '../Button';
5
+ import { Select } from '../Select';
6
6
  export function Pagination({ current, pageSize, total, onChange, onPageSizeChange, pageSizeOptions = [10, 20, 50, 100], className, }) {
7
7
  const totalPages = Math.ceil(total / pageSize);
8
8
  // 生成页码数组
@@ -72,7 +72,7 @@ export function Pagination({ current, pageSize, total, onChange, onPageSizeChang
72
72
  };
73
73
  if (totalPages === 0)
74
74
  return null;
75
- return (_jsxs("div", { className: cn('flex items-center gap-4', className), children: [_jsxs("div", { className: "text-sm text-muted-foreground", children: ["Total ", total] }), _jsxs("div", { className: "flex-1 flex items-center justify-center gap-2", children: [_jsx(Button, { onClick: handlePrevious, disabled: current === 1, size: "sm", className: cn('inline-flex items-center justify-center', 'h-8 px-3 rounded-md', 'text-sm font-medium', 'border border-border', 'transition-colors', current === 1 ? 'cursor-not-allowed opacity-50 bg-muted' : 'hover:bg-muted bg-background cursor-pointer'), children: _jsx(ChevronLeft, { className: "h-4 w-4" }) }), getPageNumbers().map((page, index) => {
75
+ return (_jsxs("div", { className: cn('tc-ui-pagination flex items-center gap-4', className), children: [_jsxs("div", { className: "text-sm text-muted-foreground", children: ["Total ", total] }), _jsxs("div", { className: "flex-1 flex items-center justify-center gap-2", children: [_jsx(Button, { onClick: handlePrevious, disabled: current === 1, size: "sm", className: cn('inline-flex items-center justify-center', 'h-8 px-3 rounded-md', 'text-sm font-medium', 'border border-border', 'transition-colors', current === 1 ? 'cursor-not-allowed opacity-50 bg-muted' : 'hover:bg-muted bg-background cursor-pointer'), children: _jsx(ChevronLeft, { className: "h-4 w-4" }) }), getPageNumbers().map((page, index) => {
76
76
  if (page === '...') {
77
77
  return (_jsx("span", { className: "px-2 text-muted-foreground", children: "..." }, `ellipsis-${index}`));
78
78
  }
@@ -0,0 +1,2 @@
1
+ export * from './Pagination';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ export * from './Pagination';
@@ -0,0 +1,26 @@
1
+ import type { CSSProperties, ReactNode, RefObject } from "react";
2
+ import { type DropdownPlacement, type DropdownPosition, type DropdownPositioningStrategy, type UseDropdownPositioningResult } from "../hooks/useDropdownPositioning";
3
+ export interface PopupProps {
4
+ open: boolean;
5
+ anchorRef: RefObject<HTMLElement | null>;
6
+ children: ReactNode;
7
+ className?: string;
8
+ style?: CSSProperties;
9
+ placement?: DropdownPlacement;
10
+ offset?: number;
11
+ keepMounted?: boolean;
12
+ closeOnClickOutside?: boolean;
13
+ closeOnEscape?: boolean;
14
+ matchAnchorWidth?: boolean;
15
+ position?: DropdownPosition;
16
+ positioning?: UseDropdownPositioningResult;
17
+ strategy?: DropdownPositioningStrategy;
18
+ contentRef?: RefObject<HTMLDivElement | null>;
19
+ container?: HTMLElement;
20
+ positionMode?: "fixed" | "absolute";
21
+ hoverBridge?: number;
22
+ hoverBridgePlacement?: "auto" | "horizontal";
23
+ onOpenChange?: (open: boolean) => void;
24
+ }
25
+ export declare function Popup({ open, anchorRef, children, className, style, placement, offset, keepMounted, closeOnClickOutside, closeOnEscape, matchAnchorWidth, position, positioning, strategy, contentRef, container, positionMode, hoverBridge, hoverBridgePlacement, onOpenChange, }: PopupProps): import("react").ReactPortal | null;
26
+ //# sourceMappingURL=Popup.d.ts.map
@@ -0,0 +1,81 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils";
3
+ import { useEffect, useMemo, useRef } from "react";
4
+ import { createPortal } from "react-dom";
5
+ import { getDefaultDropdownPosition, useDropdownPositioning, } from "../hooks/useDropdownPositioning";
6
+ const DEFAULT_POPUP_CLASSNAME = cn("fixed z-[9999]", "bg-background rounded-lg shadow-lg border border-gray-200", "animate-in fade-in-0 zoom-in-95");
7
+ const canUseDocument = () => typeof document !== "undefined";
8
+ export function Popup({ open, anchorRef, children, className, style, placement = "bottom-end", offset = 8, keepMounted = false, closeOnClickOutside = true, closeOnEscape = true, matchAnchorWidth = false, position, positioning, strategy = getDefaultDropdownPosition, contentRef, container, positionMode = "fixed", hoverBridge = 0, hoverBridgePlacement = "auto", onOpenChange, }) {
9
+ // 默认自己保存弹窗 DOM;如果外部传了 contentRef,就用外部的。
10
+ const internalContentRef = useRef(null);
11
+ const panelRef = contentRef ?? internalContentRef;
12
+ const containerRef = useMemo(() => ({ current: container ?? null }), [container]);
13
+ // 默认用 useDropdownPositioning 算位置;也允许外部直接传 position 或 positioning 接管。
14
+ const internalPositioning = useDropdownPositioning({
15
+ open,
16
+ anchorRef,
17
+ contentRef: panelRef,
18
+ placement,
19
+ offset,
20
+ matchAnchorWidth,
21
+ strategy,
22
+ containerRef,
23
+ positionMode,
24
+ });
25
+ const resolvedPositioning = position
26
+ ? null
27
+ : (positioning ?? internalPositioning);
28
+ useEffect(() => {
29
+ if (!open || !closeOnClickOutside)
30
+ return;
31
+ // 点到触发元素和弹窗外面,就通知外部关闭。
32
+ const handleClickOutside = (event) => {
33
+ const target = event.target;
34
+ const clickedAnchor = anchorRef.current?.contains(target);
35
+ const clickedPanel = panelRef.current?.contains(target);
36
+ if (!clickedAnchor && !clickedPanel) {
37
+ onOpenChange?.(false);
38
+ }
39
+ };
40
+ document.addEventListener("mousedown", handleClickOutside);
41
+ return () => document.removeEventListener("mousedown", handleClickOutside);
42
+ }, [anchorRef, closeOnClickOutside, onOpenChange, open, panelRef]);
43
+ useEffect(() => {
44
+ if (!open || !closeOnEscape)
45
+ return;
46
+ // 按 Esc 时关闭,常见弹窗交互都需要这个。
47
+ const handleKeyDown = (event) => {
48
+ if (event.key === "Escape") {
49
+ onOpenChange?.(false);
50
+ }
51
+ };
52
+ document.addEventListener("keydown", handleKeyDown);
53
+ return () => document.removeEventListener("keydown", handleKeyDown);
54
+ }, [closeOnEscape, onOpenChange, open]);
55
+ const mergedStyle = useMemo(() => ({
56
+ // 定位样式优先来自 hook,也可以被外部 position/style 覆盖。
57
+ ...resolvedPositioning?.position,
58
+ ...position,
59
+ ...style,
60
+ }), [position, resolvedPositioning?.position, style]);
61
+ // hoverBridge 是透明桥。鼠标从触发元素移动到弹窗时,中间有间距也不会断 hover。
62
+ const showHorizontalHoverBridge = hoverBridge > 0 &&
63
+ (placement.startsWith("right") || placement.startsWith("left"));
64
+ const showBothHorizontalHoverBridges = showHorizontalHoverBridge && hoverBridgePlacement === "horizontal";
65
+ if (!keepMounted && !open) {
66
+ // 不需要常驻 DOM 时,关闭就不渲染。
67
+ return null;
68
+ }
69
+ const portalContainer = container ?? (canUseDocument() ? document.body : undefined);
70
+ if (!portalContainer) {
71
+ return null;
72
+ }
73
+ // 用 portal 把弹窗挂到指定容器;没传 container 就挂到 body。
74
+ return createPortal(_jsxs("div", { ref: panelRef, className: cn("tc-ui-popup", DEFAULT_POPUP_CLASSNAME, positionMode === "absolute" && "absolute", !resolvedPositioning?.ready && "invisible", keepMounted && !open && "hidden", className), style: mergedStyle, children: [hoverBridge > 0 && (
75
+ // 默认只补当前 placement 方向上的透明桥。
76
+ _jsx("div", { "aria-hidden": "true", className: cn("absolute bg-transparent", placement.startsWith("bottom") && "left-0 right-0 top-0 -translate-y-full", placement.startsWith("top") && "bottom-0 left-0 right-0 translate-y-full", placement.startsWith("right") && "bottom-0 left-0 top-0 -translate-x-full", placement.startsWith("left") && "bottom-0 right-0 top-0 translate-x-full"), style: placement.startsWith("right") || placement.startsWith("left")
77
+ ? { width: hoverBridge }
78
+ : { height: hoverBridge } })), showBothHorizontalHoverBridges && (
79
+ // 横向弹窗可能动态从右改到左,这里左右都补桥,避免鼠标移过去时弹窗关闭。
80
+ _jsx("div", { "aria-hidden": "true", className: "absolute bottom-0 right-0 top-0 translate-x-full bg-transparent", style: { width: hoverBridge } })), children] }), portalContainer);
81
+ }
@@ -0,0 +1,2 @@
1
+ export * from './Popup';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ export * from './Popup';
@@ -1,10 +1,10 @@
1
1
  import type { MOmit } from '../../types';
2
2
  import type { FormInstance } from 'rc-field-form';
3
3
  import { type ReactNode } from 'react';
4
- import { type FormFieldScheme } from '../Form';
4
+ import { type FormFieldSchema } from '../Form';
5
5
  export type SearchProps<T> = {
6
6
  defaultValue?: T;
7
- schemes: MOmit<FormFieldScheme<T>, 'rules' | 'required'>[];
7
+ schemas: MOmit<FormFieldSchema<T>, 'rules' | 'required'>[];
8
8
  children?: ReactNode;
9
9
  /**
10
10
  * 获取表单实例的回调