@baishuyun/ai-design 1.0.10 → 1.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 (313) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/.turbo/turbo-build.log +570 -26
  3. package/CHANGELOG.md +23 -0
  4. package/dist/ai-design.css +4 -3
  5. package/dist/ai-design.js +9605 -9549
  6. package/dist/ai-design.js.map +1 -1
  7. package/dist/ai-design.umd.cjs +82 -94
  8. package/dist/ai-design.umd.cjs.map +1 -1
  9. package/dist/src/components/agent-helper/agent-category-select-menu/index.d.ts +1 -1
  10. package/dist/src/components/agent-helper/agent-category-select-menu/index.d.ts.map +1 -1
  11. package/dist/src/components/agent-helper/agent-entry-card/index.d.ts +1 -1
  12. package/dist/src/components/agent-helper/agent-entry-card/index.d.ts.map +1 -1
  13. package/dist/src/components/agent-helper/agent-helper-card/index.d.ts +1 -1
  14. package/dist/src/components/agent-helper/agent-helper-card/index.d.ts.map +1 -1
  15. package/dist/src/components/agent-helper/agent-helper-card-list/index.d.ts +1 -1
  16. package/dist/src/components/agent-helper/agent-helper-card-list/index.d.ts.map +1 -1
  17. package/dist/src/components/agent-helper/agent-helper-main-layout/index.d.ts +5 -5
  18. package/dist/src/components/agent-helper/agent-sort-select/index.d.ts +8 -0
  19. package/dist/src/components/agent-helper/agent-sort-select/index.d.ts.map +1 -0
  20. package/dist/src/components/agent-helper/agent-tag/index.d.ts +1 -1
  21. package/dist/src/components/agent-helper/agent-tag/index.d.ts.map +1 -1
  22. package/dist/src/components/agent-helper/app-select/index.d.ts +1 -1
  23. package/dist/src/components/agent-helper/app-select/index.d.ts.map +1 -1
  24. package/dist/src/components/agent-helper/condition-group/index.d.ts +1 -1
  25. package/dist/src/components/agent-helper/condition-input/index.d.ts +2 -2
  26. package/dist/src/components/agent-helper/condition-input/index.d.ts.map +1 -1
  27. package/dist/src/components/agent-helper/condition-item/index.d.ts +1 -1
  28. package/dist/src/components/agent-helper/condition-quantifier-select/index.d.ts +1 -1
  29. package/dist/src/components/agent-helper/condition-quantifier-select/index.d.ts.map +1 -1
  30. package/dist/src/components/agent-helper/condition-trigger-description/index.d.ts +1 -1
  31. package/dist/src/components/agent-helper/condition-trigger-description/index.d.ts.map +1 -1
  32. package/dist/src/components/agent-helper/date-picker/calendar-panel.d.ts +1 -1
  33. package/dist/src/components/agent-helper/date-picker/calendar-panel.d.ts.map +1 -1
  34. package/dist/src/components/agent-helper/date-picker/date-input.d.ts +1 -1
  35. package/dist/src/components/agent-helper/date-picker/date-input.d.ts.map +1 -1
  36. package/dist/src/components/agent-helper/date-picker/date-picker.d.ts +1 -1
  37. package/dist/src/components/agent-helper/date-picker/date-picker.d.ts.map +1 -1
  38. package/dist/src/components/agent-helper/date-picker/footer-panel.d.ts +1 -1
  39. package/dist/src/components/agent-helper/date-picker/footer-panel.d.ts.map +1 -1
  40. package/dist/src/components/agent-helper/date-picker/month-panel.d.ts +1 -1
  41. package/dist/src/components/agent-helper/date-picker/month-panel.d.ts.map +1 -1
  42. package/dist/src/components/agent-helper/date-picker/time-panel.d.ts +1 -1
  43. package/dist/src/components/agent-helper/date-picker/time-panel.d.ts.map +1 -1
  44. package/dist/src/components/agent-helper/date-picker/year-panel.d.ts +1 -1
  45. package/dist/src/components/agent-helper/date-picker/year-panel.d.ts.map +1 -1
  46. package/dist/src/components/agent-helper/exec-log-filter/index.d.ts +1 -1
  47. package/dist/src/components/agent-helper/exec-log-filter/index.d.ts.map +1 -1
  48. package/dist/src/components/agent-helper/field-edit-preference-select/index.d.ts +1 -1
  49. package/dist/src/components/agent-helper/field-edit-preference-select/index.d.ts.map +1 -1
  50. package/dist/src/components/agent-helper/field-select/index.d.ts +2 -2
  51. package/dist/src/components/agent-helper/field-select/index.d.ts.map +1 -1
  52. package/dist/src/components/agent-helper/field-value-input/display.d.ts +4 -4
  53. package/dist/src/components/agent-helper/field-value-input/display.d.ts.map +1 -1
  54. package/dist/src/components/agent-helper/field-value-input/icons.d.ts +5 -5
  55. package/dist/src/components/agent-helper/field-value-input/icons.d.ts.map +1 -1
  56. package/dist/src/components/agent-helper/field-value-input/index.d.ts +2 -2
  57. package/dist/src/components/agent-helper/field-value-input/index.d.ts.map +1 -1
  58. package/dist/src/components/agent-helper/field-value-input/inputs.d.ts +8 -8
  59. package/dist/src/components/agent-helper/field-value-input/inputs.d.ts.map +1 -1
  60. package/dist/src/components/agent-helper/field-value-input/picker-inputs.d.ts +8 -8
  61. package/dist/src/components/agent-helper/field-value-input/picker-inputs.d.ts.map +1 -1
  62. package/dist/src/components/agent-helper/flow-node-action-trigger-select/index.d.ts +1 -1
  63. package/dist/src/components/agent-helper/flow-node-action-trigger-select/index.d.ts.map +1 -1
  64. package/dist/src/components/agent-helper/form-action-trigger-select/index.d.ts +1 -1
  65. package/dist/src/components/agent-helper/form-action-trigger-select/index.d.ts.map +1 -1
  66. package/dist/src/components/agent-helper/form-divider/index.d.ts +1 -1
  67. package/dist/src/components/agent-helper/form-divider/index.d.ts.map +1 -1
  68. package/dist/src/components/agent-helper/monthdays-select/index.d.ts +1 -1
  69. package/dist/src/components/agent-helper/monthdays-select/index.d.ts.map +1 -1
  70. package/dist/src/components/agent-helper/offset-preference-select/index.d.ts +1 -1
  71. package/dist/src/components/agent-helper/offset-preference-select/index.d.ts.map +1 -1
  72. package/dist/src/components/agent-helper/offset-type-select/index.d.ts +1 -1
  73. package/dist/src/components/agent-helper/offset-type-select/index.d.ts.map +1 -1
  74. package/dist/src/components/agent-helper/offset-unit-select/index.d.ts +1 -1
  75. package/dist/src/components/agent-helper/offset-unit-select/index.d.ts.map +1 -1
  76. package/dist/src/components/agent-helper/placeholder-card/index.d.ts +1 -1
  77. package/dist/src/components/agent-helper/placeholder-card/index.d.ts.map +1 -1
  78. package/dist/src/components/agent-helper/prompt-input/index.d.ts +1 -1
  79. package/dist/src/components/agent-helper/prompt-input/index.d.ts.map +1 -1
  80. package/dist/src/components/agent-helper/relational-operator-select/index.d.ts +1 -1
  81. package/dist/src/components/agent-helper/relational-operator-select/index.d.ts.map +1 -1
  82. package/dist/src/components/agent-helper/repeat-by-type-select/index.d.ts +1 -1
  83. package/dist/src/components/agent-helper/repeat-by-type-select/index.d.ts.map +1 -1
  84. package/dist/src/components/agent-helper/repeat-preference-select/index.d.ts +1 -1
  85. package/dist/src/components/agent-helper/repeat-preference-select/index.d.ts.map +1 -1
  86. package/dist/src/components/agent-helper/repeat-preference-type-select/index.d.ts +1 -1
  87. package/dist/src/components/agent-helper/repeat-preference-type-select/index.d.ts.map +1 -1
  88. package/dist/src/components/agent-helper/search-input/index.d.ts +1 -1
  89. package/dist/src/components/agent-helper/search-input/index.d.ts.map +1 -1
  90. package/dist/src/components/agent-helper/table/index.d.ts +1 -1
  91. package/dist/src/components/agent-helper/table/index.d.ts.map +1 -1
  92. package/dist/src/components/agent-helper/trigger-select/index.d.ts +2 -2
  93. package/dist/src/components/agent-helper/trigger-select/index.d.ts.map +1 -1
  94. package/dist/src/components/agent-helper/trigger-time-preference-select/index.d.ts +1 -1
  95. package/dist/src/components/agent-helper/trigger-time-preference-select/index.d.ts.map +1 -1
  96. package/dist/src/components/agent-helper/trigger-time-source-type-select/index.d.ts +1 -1
  97. package/dist/src/components/agent-helper/trigger-time-source-type-select/index.d.ts.map +1 -1
  98. package/dist/src/components/agent-helper/weekdays-select/index.d.ts +1 -1
  99. package/dist/src/components/agent-helper/weekdays-select/index.d.ts.map +1 -1
  100. package/dist/src/components/agent-scroll-selector.d.ts +1 -1
  101. package/dist/src/components/agent-scroll-selector.d.ts.map +1 -1
  102. package/dist/src/components/agent-select.d.ts +1 -1
  103. package/dist/src/components/agent-select.d.ts.map +1 -1
  104. package/dist/src/components/attachment-part-group.d.ts +1 -1
  105. package/dist/src/components/attachment-part-group.d.ts.map +1 -1
  106. package/dist/src/components/attachment-part.d.ts +1 -1
  107. package/dist/src/components/attachment-part.d.ts.map +1 -1
  108. package/dist/src/components/attachments-previewer.d.ts +1 -1
  109. package/dist/src/components/attachments-previewer.d.ts.map +1 -1
  110. package/dist/src/components/border-color-animation.d.ts +1 -1
  111. package/dist/src/components/border-color-animation.d.ts.map +1 -1
  112. package/dist/src/components/bot-avatar-name.d.ts +1 -1
  113. package/dist/src/components/bot-avatar-name.d.ts.map +1 -1
  114. package/dist/src/components/bot-icon.d.ts +1 -1
  115. package/dist/src/components/bot-icon.d.ts.map +1 -1
  116. package/dist/src/components/bs-entry-select/app-group-folder.d.ts +1 -1
  117. package/dist/src/components/bs-entry-select/app-group-folder.d.ts.map +1 -1
  118. package/dist/src/components/bs-entry-select/bs-entry-select.d.ts.map +1 -1
  119. package/dist/src/components/bs-entry-select/entry-item.d.ts +1 -1
  120. package/dist/src/components/bs-entry-select/entry-item.d.ts.map +1 -1
  121. package/dist/src/components/bs-entry-select/entry-popover.d.ts +3 -2
  122. package/dist/src/components/bs-entry-select/entry-popover.d.ts.map +1 -1
  123. package/dist/src/components/bs-entry-select/other-app-section.d.ts +1 -1
  124. package/dist/src/components/bs-entry-select/other-app-section.d.ts.map +1 -1
  125. package/dist/src/components/bs-entry-select/scroll-slider.d.ts +3 -2
  126. package/dist/src/components/bs-entry-select/scroll-slider.d.ts.map +1 -1
  127. package/dist/src/components/bs-entry-select/search-input.d.ts +1 -1
  128. package/dist/src/components/bs-entry-select/search-input.d.ts.map +1 -1
  129. package/dist/src/components/bs-entry-select/tree-item-node.d.ts +1 -1
  130. package/dist/src/components/bs-entry-select/tree-item-node.d.ts.map +1 -1
  131. package/dist/src/components/bs-entry-select/types.d.ts +1 -0
  132. package/dist/src/components/bs-entry-select/types.d.ts.map +1 -1
  133. package/dist/src/components/bs-icons.d.ts +72 -72
  134. package/dist/src/components/bs-icons.d.ts.map +1 -1
  135. package/dist/src/components/card-field.d.ts +2 -2
  136. package/dist/src/components/card-field.d.ts.map +1 -1
  137. package/dist/src/components/card.d.ts +1 -1
  138. package/dist/src/components/card.d.ts.map +1 -1
  139. package/dist/src/components/chat-area-header.d.ts +1 -1
  140. package/dist/src/components/chat-area-header.d.ts.map +1 -1
  141. package/dist/src/components/check-card.d.ts +1 -1
  142. package/dist/src/components/check-card.d.ts.map +1 -1
  143. package/dist/src/components/circle-checker.d.ts +1 -1
  144. package/dist/src/components/circle-checker.d.ts.map +1 -1
  145. package/dist/src/components/collapsible-txt-msg.d.ts +1 -1
  146. package/dist/src/components/collapsible-txt-msg.d.ts.map +1 -1
  147. package/dist/src/components/confirm-dialog.d.ts +1 -1
  148. package/dist/src/components/confirm-dialog.d.ts.map +1 -1
  149. package/dist/src/components/date-range-picker.d.ts +1 -1
  150. package/dist/src/components/date-range-picker.d.ts.map +1 -1
  151. package/dist/src/components/fake-bot-msg.d.ts +1 -1
  152. package/dist/src/components/fake-bot-msg.d.ts.map +1 -1
  153. package/dist/src/components/field-checker-list-msg.d.ts +3 -3
  154. package/dist/src/components/field-checker-list-msg.d.ts.map +1 -1
  155. package/dist/src/components/field-checker.d.ts +4 -6
  156. package/dist/src/components/field-checker.d.ts.map +1 -1
  157. package/dist/src/components/field-icon.d.ts +1 -1
  158. package/dist/src/components/field-icon.d.ts.map +1 -1
  159. package/dist/src/components/field-value-checker.d.ts +4 -6
  160. package/dist/src/components/field-value-checker.d.ts.map +1 -1
  161. package/dist/src/components/fields-design-info-table.d.ts +1 -1
  162. package/dist/src/components/fields-design-info-table.d.ts.map +1 -1
  163. package/dist/src/components/fields-generating-indicator.d.ts +2 -2
  164. package/dist/src/components/fields-generating-indicator.d.ts.map +1 -1
  165. package/dist/src/components/font-icon.d.ts +2 -2
  166. package/dist/src/components/font-icon.d.ts.map +1 -1
  167. package/dist/src/components/form-info-editor.d.ts +1 -1
  168. package/dist/src/components/form-info-editor.d.ts.map +1 -1
  169. package/dist/src/components/formula-tag.d.ts +1 -1
  170. package/dist/src/components/formula-tag.d.ts.map +1 -1
  171. package/dist/src/components/generate-animation.d.ts +1 -1
  172. package/dist/src/components/generate-animation.d.ts.map +1 -1
  173. package/dist/src/components/icon-card.d.ts +1 -1
  174. package/dist/src/components/icon-card.d.ts.map +1 -1
  175. package/dist/src/components/icons/calendar-icon.d.ts +1 -1
  176. package/dist/src/components/icons/calendar-icon.d.ts.map +1 -1
  177. package/dist/src/components/icons/clear-all-icon.d.ts +1 -1
  178. package/dist/src/components/icons/clear-all-icon.d.ts.map +1 -1
  179. package/dist/src/components/icons/empty-table-icon.d.ts +1 -1
  180. package/dist/src/components/icons/empty-table-icon.d.ts.map +1 -1
  181. package/dist/src/components/icons/grids-icon.d.ts +1 -1
  182. package/dist/src/components/icons/grids-icon.d.ts.map +1 -1
  183. package/dist/src/components/img-part.d.ts +1 -1
  184. package/dist/src/components/img-part.d.ts.map +1 -1
  185. package/dist/src/components/legacy-slot.d.ts +1 -1
  186. package/dist/src/components/legacy-slot.d.ts.map +1 -1
  187. package/dist/src/components/linear-gradient-color-bg-animation.d.ts +1 -1
  188. package/dist/src/components/linear-gradient-color-bg-animation.d.ts.map +1 -1
  189. package/dist/src/components/memoized-markdown.d.ts +1 -1
  190. package/dist/src/components/memoized-markdown.d.ts.map +1 -1
  191. package/dist/src/components/message-content.d.ts +1 -1
  192. package/dist/src/components/message-content.d.ts.map +1 -1
  193. package/dist/src/components/number-part.d.ts +1 -1
  194. package/dist/src/components/number-part.d.ts.map +1 -1
  195. package/dist/src/components/office-container.d.ts +2 -0
  196. package/dist/src/components/office-container.d.ts.map +1 -1
  197. package/dist/src/components/option-item.d.ts +1 -1
  198. package/dist/src/components/option-item.d.ts.map +1 -1
  199. package/dist/src/components/output-config-editor.d.ts +6 -11
  200. package/dist/src/components/output-config-editor.d.ts.map +1 -1
  201. package/dist/src/components/previewer-header.d.ts +1 -1
  202. package/dist/src/components/previewer-header.d.ts.map +1 -1
  203. package/dist/src/components/primary-confirm-btn.d.ts +1 -1
  204. package/dist/src/components/primary-confirm-btn.d.ts.map +1 -1
  205. package/dist/src/components/primary-entry-btn.d.ts +1 -1
  206. package/dist/src/components/primary-entry-btn.d.ts.map +1 -1
  207. package/dist/src/components/radio-card.d.ts +1 -1
  208. package/dist/src/components/radio-card.d.ts.map +1 -1
  209. package/dist/src/components/scroll-to-bottom-btn.d.ts +1 -1
  210. package/dist/src/components/scroll-to-bottom-btn.d.ts.map +1 -1
  211. package/dist/src/components/split-line.d.ts +1 -1
  212. package/dist/src/components/split-line.d.ts.map +1 -1
  213. package/dist/src/components/subform-fields-value-checker.d.ts +4 -6
  214. package/dist/src/components/subform-fields-value-checker.d.ts.map +1 -1
  215. package/dist/src/components/tooltip.d.ts +1 -1
  216. package/dist/src/components/tooltip.d.ts.map +1 -1
  217. package/dist/src/components/ui/calendar.d.ts +1 -1
  218. package/dist/src/components/ui/calendar.d.ts.map +1 -1
  219. package/dist/src/components/ui/dialog.d.ts +2 -2
  220. package/dist/src/components/ui/drawer.d.ts +11 -11
  221. package/dist/src/components/ui/drawer.d.ts.map +1 -1
  222. package/dist/src/components/ui/form.d.ts +1 -1
  223. package/dist/src/components/ui/form.d.ts.map +1 -1
  224. package/dist/src/components/ui/icons.d.ts +63 -63
  225. package/dist/src/components/ui/icons.d.ts.map +1 -1
  226. package/dist/src/components/ui/spinner.d.ts +1 -1
  227. package/dist/src/components/ui/spinner.d.ts.map +1 -1
  228. package/dist/src/components/ui/switch.d.ts +1 -1
  229. package/dist/src/components/ui/switch.d.ts.map +1 -1
  230. package/dist/src/components/ui/tooltip.d.ts +1 -1
  231. package/dist/src/components/ui/tooltip.d.ts.map +1 -1
  232. package/dist/src/components/user-txt-msg-bubble.d.ts +1 -1
  233. package/dist/src/components/user-txt-msg-bubble.d.ts.map +1 -1
  234. package/dist/src/components/warning-msg.d.ts +1 -1
  235. package/dist/src/components/warning-msg.d.ts.map +1 -1
  236. package/dist/src/index.d.ts +3 -1
  237. package/dist/src/index.d.ts.map +1 -1
  238. package/dist/src/stories/AgentCategorySelectMenu.stories.d.ts +1 -1
  239. package/dist/src/stories/AgentEntryCard.stories.d.ts +1 -1
  240. package/dist/src/stories/AgentHelperCard.stories.d.ts +1 -1
  241. package/dist/src/stories/AgentHelperCardList.stories.d.ts +1 -1
  242. package/dist/src/stories/AgentTag.stories.d.ts +1 -1
  243. package/dist/src/stories/AttachmentPart.stories.d.ts +2 -2
  244. package/dist/src/stories/AttachmentPartGroup.stories.d.ts +2 -2
  245. package/dist/src/stories/BaseButton.stories.d.ts +1 -1
  246. package/dist/src/stories/BorderColorAnimation.stories.d.ts +1 -1
  247. package/dist/src/stories/BotAvatarAndName.stories.d.ts +1 -1
  248. package/dist/src/stories/BotIcon.stories.d.ts +1 -1
  249. package/dist/src/stories/BsEntrySelect.stories.d.ts +1 -0
  250. package/dist/src/stories/BsEntrySelect.stories.d.ts.map +1 -1
  251. package/dist/src/stories/Card.stories.d.ts +1 -1
  252. package/dist/src/stories/ChatAreaHeader.stories.d.ts +1 -1
  253. package/dist/src/stories/CheckCard.stories.d.ts +1 -1
  254. package/dist/src/stories/CircleChecker.stories.d.ts +1 -1
  255. package/dist/src/stories/CollapsibleTextMsg.stories.d.ts +1 -1
  256. package/dist/src/stories/ConditonQuantifierSelect.stories.d.ts +1 -1
  257. package/dist/src/stories/ConditonTriggerDescription.stories.d.ts +1 -1
  258. package/dist/src/stories/FakeBotMsg.stories.d.ts +1 -1
  259. package/dist/src/stories/FlowNodeActionTriggerSelect.stories.d.ts +1 -1
  260. package/dist/src/stories/FormActionTriggerSelect.stories.d.ts +1 -1
  261. package/dist/src/stories/FormDivider.stories.d.ts +1 -1
  262. package/dist/src/stories/FormulaTag.stories.d.ts +1 -1
  263. package/dist/src/stories/GenerateAnimation.stories.d.ts +1 -1
  264. package/dist/src/stories/IconCard.stories.d.ts +1 -1
  265. package/dist/src/stories/IconLib.d.ts +1 -1
  266. package/dist/src/stories/Icons.stories.d.ts +1 -1
  267. package/dist/src/stories/ImgMsgPart.stories.d.ts +1 -1
  268. package/dist/src/stories/LinearGradientColorBgAnimation.stories.d.ts +1 -1
  269. package/dist/src/stories/MemoizedMarkdown.stories.d.ts +1 -1
  270. package/dist/src/stories/MessageContent.stories.d.ts +1 -1
  271. package/dist/src/stories/NumbersMsgPart.stories.d.ts +1 -1
  272. package/dist/src/stories/OfficeContainer.stories.d.ts +1 -0
  273. package/dist/src/stories/OfficeContainer.stories.d.ts.map +1 -1
  274. package/dist/src/stories/OptionItem.stories.d.ts +1 -1
  275. package/dist/src/stories/OutputConfigEditor.stories.d.ts.map +1 -1
  276. package/dist/src/stories/PlaceholderCard.stories.d.ts +14 -1
  277. package/dist/src/stories/PlaceholderCard.stories.d.ts.map +1 -1
  278. package/dist/src/stories/PrimaryConfirmBtn.stories.d.ts +1 -1
  279. package/dist/src/stories/PrimaryEntryBtn.stories.d.ts +1 -1
  280. package/dist/src/stories/PromptInput.stories.d.ts.map +1 -1
  281. package/dist/src/stories/RadioCard.stories.d.ts +1 -1
  282. package/dist/src/stories/RelationalOperatorSelect.stories.d.ts +1 -1
  283. package/dist/src/stories/ScrollToBottom.stories.d.ts +1 -1
  284. package/dist/src/stories/SearchInput.stories.d.ts +1 -1
  285. package/dist/src/stories/TriggerSelect.stories.d.ts +1 -1
  286. package/dist/src/stories/UserTextMsgBubble.stories.d.ts +1 -1
  287. package/dist/src/stories/WarningMessage.stories.d.ts +1 -1
  288. package/dist/src/stories/fields-generating.stories.d.ts +1 -1
  289. package/package.json +24 -22
  290. package/src/components/agent-helper/agent-entry-card/index.tsx +3 -3
  291. package/src/components/agent-helper/agent-sort-select/index.tsx +89 -0
  292. package/src/components/agent-helper/condition-input/index.tsx +13 -2
  293. package/src/components/agent-helper/field-select/index.tsx +35 -12
  294. package/src/components/agent-helper/field-value-input/picker-inputs.tsx +4 -3
  295. package/src/components/agent-helper/placeholder-card/index.tsx +14 -11
  296. package/src/components/agent-helper/prompt-input/index.tsx +44 -33
  297. package/src/components/agent-scroll-selector.tsx +1 -1
  298. package/src/components/bs-entry-select/bs-entry-select.tsx +12 -4
  299. package/src/components/bs-entry-select/entry-popover.tsx +3 -1
  300. package/src/components/bs-entry-select/other-app-section.tsx +1 -1
  301. package/src/components/bs-entry-select/scroll-slider.tsx +12 -2
  302. package/src/components/bs-entry-select/types.ts +1 -0
  303. package/src/components/field-checker.tsx +5 -7
  304. package/src/components/field-value-checker.tsx +3 -5
  305. package/src/components/office-container.tsx +67 -4
  306. package/src/components/output-config-editor.tsx +259 -241
  307. package/src/components/subform-fields-value-checker.tsx +10 -11
  308. package/src/index.ts +3 -1
  309. package/src/stories/BsEntrySelect.stories.tsx +10 -0
  310. package/src/stories/OfficeContainer.stories.tsx +56 -0
  311. package/src/stories/OutputConfigEditor.stories.tsx +43 -23
  312. package/src/stories/PromptInput.stories.tsx +12 -1
  313. package/style.css +4 -3
@@ -2,7 +2,7 @@ import { useState, useCallback, useMemo, useRef } from 'react';
2
2
  import { cn } from '../../../lib/utils';
3
3
  import { transCls } from '../../../const/ui';
4
4
  import { Popover, PopoverTrigger, PopoverContent } from '../../ui/popover';
5
- import type { IField, FieldType } from '@baishuyun/types';
5
+ import type { IField, FieldType, ISubformField } from '@baishuyun/types';
6
6
  import { SearchIcon } from '../../bs-icons';
7
7
 
8
8
  const ToggleIcon = ({ expanded }: { expanded: boolean }) => (
@@ -77,6 +77,7 @@ interface FieldTreeNode {
77
77
  depth: number;
78
78
  children: FieldTreeNode[];
79
79
  isExpandable?: boolean;
80
+ widgetName?: string;
80
81
  }
81
82
 
82
83
  // ── Tree Builder ──────────────────────────────────────────────────
@@ -85,8 +86,8 @@ function buildNodeKey(field: IField, index: number): string {
85
86
  return field.widget?.widgetName || String(index);
86
87
  }
87
88
 
88
- function buildItemNodeKey(parentKey: string, item: { widget?: { widgetName?: string } }, index: number): string {
89
- return item.widget?.widgetName || `${parentKey}-${index}`;
89
+ function buildItemNodeKey(parentKey: string, item: { widget?: { widgetName?: string }; value?: unknown; text?: string }, index: number): string {
90
+ return (item as { widget?: { widgetName?: string } }).widget?.widgetName || `${parentKey}-${index}`;
90
91
  }
91
92
 
92
93
  function buildFieldTree(fields: IField[], searchQuery: string): FieldTreeNode[] {
@@ -97,22 +98,31 @@ function buildFieldTree(fields: IField[], searchQuery: string): FieldTreeNode[]
97
98
  for (let i = 0; i < fields.length; i++) {
98
99
  const field = fields[i];
99
100
  const label = field.label;
101
+ const parentWidgetName = field.widget?.widgetName;
102
+
103
+ // Only items with a 'widget' property (ISubformField) are expandable sub-fields
100
104
  const items = field.widget?.items;
101
- const hasItems = items && items.length > 0 && field.widget?.type === 'subform';
102
- const rootKey = buildNodeKey(field, i);
105
+ const subformItems = items?.filter(
106
+ (item): item is ISubformField => 'widget' in item
107
+ );
108
+ const hasItems = subformItems && subformItems.length > 0;
109
+ const rootKey = parentWidgetName || buildNodeKey(field, i);
103
110
 
104
111
  const children: FieldTreeNode[] = [];
105
112
  if (hasItems) {
106
- for (let j = 0; j < items!.length; j++) {
107
- const item = items![j];
113
+ for (let j = 0; j < subformItems!.length; j++) {
114
+ const item = subformItems![j];
115
+ const childWidgetName = item.widget?.widgetName || `${rootKey}-item-${j}`;
116
+ const fullWidgetName = `${parentWidgetName}.${childWidgetName}`;
108
117
  children.push({
109
- key: buildItemNodeKey(rootKey, item, j),
110
- label: item.label,
118
+ key: fullWidgetName,
119
+ label: item.label || `选项 ${j + 1}`,
111
120
  field: field,
112
121
  fieldType: item.widget?.type,
113
122
  depth: 1,
114
123
  children: [],
115
124
  isExpandable: false,
125
+ widgetName: fullWidgetName,
116
126
  });
117
127
  }
118
128
  }
@@ -129,6 +139,7 @@ function buildFieldTree(fields: IField[], searchQuery: string): FieldTreeNode[]
129
139
  depth: 0,
130
140
  children,
131
141
  isExpandable: hasItems,
142
+ widgetName: parentWidgetName,
132
143
  });
133
144
  }
134
145
  }
@@ -184,6 +195,7 @@ export const FieldSelectPopover = ({
184
195
 
185
196
  const handleSelect = useCallback(
186
197
  (node: FieldTreeNode) => {
198
+ if (node.isExpandable) return;
187
199
  if (node.field) {
188
200
  onSelect(node.field, node.key);
189
201
  }
@@ -201,7 +213,11 @@ export const FieldSelectPopover = ({
201
213
  : undefined;
202
214
 
203
215
  const handleRowClick = () => {
204
- handleSelect(node);
216
+ if (node.isExpandable) {
217
+ toggleExpanded(node.key);
218
+ } else {
219
+ handleSelect(node);
220
+ }
205
221
  };
206
222
 
207
223
  const handleToggleClick = (e: React.MouseEvent) => {
@@ -300,8 +316,15 @@ function buildKeyLabelMap(fields: IField[]): Map<string, string> {
300
316
  const items = field.widget?.items;
301
317
  if (items) {
302
318
  for (let j = 0; j < items.length; j++) {
303
- const childKey = buildItemNodeKey(rootKey, items[j], j);
304
- map.set(childKey, items[j].label);
319
+ const item = items[j];
320
+ // For ISubformField items, use dot-joined widgetName as key
321
+ if ('widget' in item) {
322
+ const fullKey = `${field.widget?.widgetName}.${item.widget?.widgetName}`;
323
+ map.set(fullKey, item.label || `选项 ${j + 1}`);
324
+ } else {
325
+ const childKey = buildItemNodeKey(rootKey, item, j);
326
+ map.set(childKey, item.text || `选项 ${j + 1}`);
327
+ }
305
328
  }
306
329
  }
307
330
  }
@@ -285,7 +285,7 @@ export function AsyncPicker({ field, value, onChange, disabled, service, kind, m
285
285
  return;
286
286
  }
287
287
  if (service?.searchUsers && kind === 'user') {
288
- service.searchUsers('').then((users) => {
288
+ service.searchUsers('', { field: fieldName }).then((users) => {
289
289
  const map: Record<string, string> = {};
290
290
  users.forEach((u) => {
291
291
  if (value.includes(u.id)) map[u.id] = u.name;
@@ -299,7 +299,7 @@ export function AsyncPicker({ field, value, onChange, disabled, service, kind, m
299
299
  return;
300
300
  }
301
301
  if (service?.searchUsers && kind === 'user') {
302
- service.searchUsers('').then((users) => {
302
+ service.searchUsers('', { field: fieldName }).then((users) => {
303
303
  const found = users.find((u) => u.id === value);
304
304
  if (found) setSelectedLabel(found.name);
305
305
  });
@@ -307,12 +307,13 @@ export function AsyncPicker({ field, value, onChange, disabled, service, kind, m
307
307
  }
308
308
  }, [value, service, kind, multiple]);
309
309
 
310
+ const fieldName = field.widget?.widgetName || "";
310
311
  const doSearch = useCallback(
311
312
  async (kw: string) => {
312
313
  if (!searchFn) return;
313
314
  setLoading(true);
314
315
  try {
315
- const results = await searchFn(kw);
316
+ const results = await searchFn(kw, { field: fieldName });
316
317
  setOptions(results);
317
318
  } finally {
318
319
  setLoading(false);
@@ -45,17 +45,20 @@ export const PlaceholderCard = ({
45
45
 
46
46
  <div className="mt-[16px] text-center text-[#999] text-[14px] leading-[normal]">
47
47
  <p className="mb-0">{description}</p>
48
- <p>
49
- 您暂时还没有添加智能体助手。
50
- <a
51
- href={detailAddress}
52
- target="_blank"
53
- rel="noopener noreferrer"
54
- className="text-[#0265ff] underline [text-decoration-skip-ink:none] decoration-solid"
55
- >
56
- 了解详情
57
- </a>
58
- </p>
48
+ {
49
+ detailAddress ? (
50
+ <p>
51
+ <a
52
+ href={detailAddress}
53
+ target="_blank"
54
+ rel="noopener noreferrer"
55
+ className="text-[#0265ff] underline [text-decoration-skip-ink:none] decoration-solid"
56
+ >
57
+ 了解详情
58
+ </a>
59
+ </p>
60
+ ) : null
61
+ }
59
62
  </div>
60
63
 
61
64
  <button
@@ -3,7 +3,7 @@ import CodeMirror from 'codemirror';
3
3
  import { cn } from '../../../lib/utils';
4
4
  import { Popover, PopoverTrigger, PopoverContent } from '../../ui/popover';
5
5
  import { FieldSelectPopover } from '../field-select';
6
- import type { IField } from '@baishuyun/types';
6
+ import type { IField, ISubformField } from '@baishuyun/types';
7
7
 
8
8
  // ── Create a DOM node for the field tag (used inside CodeMirror) ────
9
9
 
@@ -26,30 +26,45 @@ function createFieldTagDom(label: string): HTMLSpanElement {
26
26
 
27
27
  // ── CodeMirror Helpers ──────────────────────────────────────────────
28
28
 
29
- function FIELD_KEY(field: IField): string {
30
- return field.widget?.widgetName || field.label;
31
- }
32
-
33
- function getFieldByKey(fields: IField[], key: string): IField | undefined {
34
- return fields.find((f) => FIELD_KEY(f) === key);
29
+ function resolveFieldWidgetInfo(
30
+ fields: IField[],
31
+ key: string,
32
+ ): { widgetName: string; label: string } | undefined {
33
+ const dotIndex = key.indexOf('.');
34
+ if (dotIndex > 0) {
35
+ const parentName = key.substring(0, dotIndex);
36
+ const childName = key.substring(dotIndex + 1);
37
+ const parent = fields.find((f) => f.widget?.widgetName === parentName);
38
+ if (parent?.widget?.items) {
39
+ const child = parent.widget.items.find(
40
+ (item): item is ISubformField =>
41
+ 'widget' in item && item.widget?.widgetName === childName,
42
+ );
43
+ if (child) {
44
+ return { widgetName: key, label: child.label };
45
+ }
46
+ }
47
+ } else {
48
+ const field = fields.find((f) => f.widget?.widgetName === key);
49
+ if (field) {
50
+ return { widgetName: key, label: field.label };
51
+ }
52
+ }
53
+ return undefined;
35
54
  }
36
55
 
37
56
  function addFieldToCM(
38
57
  cm: CodeMirror.Editor,
39
- field: IField,
58
+ widgetName: string,
59
+ displayLabel: string,
40
60
  ): void {
41
- const key = FIELD_KEY(field);
42
- const displayLabel = field.label;
43
61
  const from = cm.getCursor('from');
44
62
 
45
- // Insert the template placeholder as the document text so that
46
- // getTemplateFromCM always outputs ${key} regardless of whether
47
- // markText has applied the replacedWith DOM decoration yet.
48
- cm.replaceSelection('${' + key + '}');
63
+ cm.replaceSelection('${' + widgetName + '}');
49
64
  const to = cm.getCursor();
50
65
 
51
66
  const tagNode = createFieldTagDom(displayLabel);
52
- tagNode.setAttribute('data-field-key', key);
67
+ tagNode.setAttribute('data-field-key', widgetName);
53
68
 
54
69
  cm.markText(from, to, {
55
70
  handleMouseEvents: true,
@@ -108,9 +123,9 @@ function setTemplateToCM(
108
123
  for (const part of parts) {
109
124
  const match = part.match(/^\$\{([^${}]*)\}$/);
110
125
  if (match) {
111
- const field = getFieldByKey(fields, match[1]);
112
- if (field) {
113
- addFieldToCM(cm, field);
126
+ const info = resolveFieldWidgetInfo(fields, match[1]);
127
+ if (info) {
128
+ addFieldToCM(cm, info.widgetName, info.label);
114
129
  } else {
115
130
  cm.replaceSelection(part);
116
131
  }
@@ -216,11 +231,14 @@ export const PromptInput = ({
216
231
  }, []); // eslint-disable-line react-hooks/exhaustive-deps
217
232
 
218
233
  // Handle controlled value updates
234
+ const prevFieldsLenRef = useRef(0);
219
235
  useEffect(() => {
220
236
  const cm = cmRef.current;
221
237
  if (!cm || value === undefined) return;
222
238
  const currentTemplate = getTemplateFromCM(cm);
223
- if (currentTemplate !== value) {
239
+ const fieldsBecameAvailable = prevFieldsLenRef.current === 0 && fields.length > 0;
240
+ prevFieldsLenRef.current = fields.length;
241
+ if (currentTemplate !== value || fieldsBecameAvailable) {
224
242
  isInternalUpdateRef.current = true;
225
243
  setTemplateToCM(cm, value, fields);
226
244
  isInternalUpdateRef.current = false;
@@ -239,12 +257,14 @@ export const PromptInput = ({
239
257
  }, [placeholder]);
240
258
 
241
259
  const handleFieldSelect = useCallback(
242
- (field: IField) => {
260
+ (_field: IField, nodeKey: string) => {
243
261
  const cm = cmRef.current;
244
262
  if (!cm) return;
263
+ const info = resolveFieldWidgetInfo(fieldsRef.current, nodeKey);
264
+ if (!info) return;
245
265
  cm.focus();
246
266
  isInternalUpdateRef.current = true;
247
- addFieldToCM(cm, field);
267
+ addFieldToCM(cm, info.widgetName, info.label);
248
268
  isInternalUpdateRef.current = false;
249
269
  const template = getTemplateFromCM(cm);
250
270
  onChangeRef.current?.(template);
@@ -585,7 +605,7 @@ export const PromptInput = ({
585
605
  background: #EFF0F6;
586
606
  border-radius: 4px;
587
607
  font-size: 14px;
588
- margin: 3px 0;
608
+ margin: 3px 3px;
589
609
  line-height: normal;
590
610
  color: #000000;
591
611
  white-space: nowrap;
@@ -601,18 +621,9 @@ export const PromptInput = ({
601
621
  line-height: 1.4; /* 设置一个符合你字体大小的行高,例如 20px */
602
622
  }
603
623
 
604
- .CodeMirror-line > span {
605
- display: inline-flex; /* 让行内元素使用 inline-flex 布局 */
606
- align-items: center; /* 垂直居中对齐行内元素 */
607
- gap: 6px; /* 行内元素之间的间距 */
608
- flex-wrap: wrap; /* 允许行内元素换行 */
609
- }
610
-
611
- /* 保证光标元素自身不继承异常高度 */
612
624
  .CodeMirror-cursor {
613
- height: auto !important; /* 让光标高度由行高自动决定,而不是被某个固定值撑高 */
614
- border-left: 1px solid black; /* 确保光标可见,颜色可自定义 */
615
- transform: translateY(0);
625
+ height: 1.4em;
626
+ border-left: 1px solid black;
616
627
  }
617
628
 
618
629
  .prompt-field-tag-icon {
@@ -170,7 +170,7 @@ const setTriggerRef = useCallback((node: HTMLButtonElement | null) => {
170
170
  </button>
171
171
  </PopoverTrigger>
172
172
  <PopoverContent
173
- align="end"
173
+ align="start"
174
174
  sideOffset={4}
175
175
  portalContainer={portalContainer}
176
176
  >
@@ -13,7 +13,7 @@ import { ScrollSlider } from './scroll-slider';
13
13
  import { EntryPopover } from './entry-popover';
14
14
  import { buildEntryTreeFromAliasMap } from './build-tree';
15
15
  import type { BsEntrySelectProps, BsEntrySelectChangeResult } from './types';
16
- import { SolidArrowDownIcon as ChevronDownIcon, MenuLinesIcon } from '../bs-icons';
16
+ import { MenuLinesIcon } from '../bs-icons';
17
17
 
18
18
  export type { BsEntrySelectProps, BsEntrySelectChangeResult };
19
19
 
@@ -29,6 +29,7 @@ export const BsEntrySelect = forwardRef<HTMLDivElement, BsEntrySelectProps>(
29
29
  disabled = false,
30
30
  className,
31
31
  showSlider = true,
32
+ showCurrentAppEntriesOnly = false,
32
33
  },
33
34
  ref,
34
35
  ) => {
@@ -171,7 +172,12 @@ export const BsEntrySelect = forwardRef<HTMLDivElement, BsEntrySelectProps>(
171
172
  const currentAppTree = useMemo(() => {
172
173
  if (!currentAppId || !appDetails[currentAppId]) return [];
173
174
  return buildEntryTreeFromAliasMap(appDetails[currentAppId], searchQuery);
174
- }, [appDetails, currentAppId, searchQuery]);
175
+ }, [
176
+ appDetails,
177
+ currentAppId,
178
+ searchQuery,
179
+ currentAppId != null ? (appDetails[currentAppId]?.entryList?.length ?? 0) : 0,
180
+ ]);
175
181
 
176
182
  const hasSearch = searchQuery.trim().length > 0;
177
183
 
@@ -185,6 +191,7 @@ export const BsEntrySelect = forwardRef<HTMLDivElement, BsEntrySelectProps>(
185
191
  selectedEntryId={selectedEntryId}
186
192
  onSelect={handleSelect}
187
193
  onOverflowChange={handleOverflowChange}
194
+ showCurrentAppEntriesOnly={showCurrentAppEntriesOnly}
188
195
  />
189
196
  )}
190
197
 
@@ -230,7 +237,7 @@ export const BsEntrySelect = forwardRef<HTMLDivElement, BsEntrySelectProps>(
230
237
  </span>
231
238
  )} */}
232
239
  </span>
233
- <span
240
+ {/* <span
234
241
  className={cn(
235
242
  'shrink-0 flex items-center justify-center w-[16px] h-[16px] text-[#666666]',
236
243
  transCls,
@@ -238,7 +245,7 @@ export const BsEntrySelect = forwardRef<HTMLDivElement, BsEntrySelectProps>(
238
245
  )}
239
246
  >
240
247
  <ChevronDownIcon size={16} />
241
- </span>
248
+ </span> */}
242
249
  </div>
243
250
  )}
244
251
 
@@ -258,6 +265,7 @@ export const BsEntrySelect = forwardRef<HTMLDivElement, BsEntrySelectProps>(
258
265
  hasOtherApps={hasOtherApps}
259
266
  hasAnyContent={hasAnyContent}
260
267
  hasSearch={hasSearch}
268
+ showCurrentAppEntriesOnly={showCurrentAppEntriesOnly}
261
269
  onSelect={handleSelect}
262
270
  />
263
271
  </div>,
@@ -19,6 +19,7 @@ export function EntryPopover({
19
19
  hasOtherApps,
20
20
  hasAnyContent,
21
21
  hasSearch,
22
+ showCurrentAppEntriesOnly = false,
22
23
  onSelect,
23
24
  }: {
24
25
  searchQuery: string;
@@ -32,6 +33,7 @@ export function EntryPopover({
32
33
  hasOtherApps: boolean;
33
34
  hasAnyContent: boolean;
34
35
  hasSearch: boolean;
36
+ showCurrentAppEntriesOnly?: boolean;
35
37
  onSelect: (result: BsEntrySelectChangeResult) => void;
36
38
  }) {
37
39
  return (
@@ -70,7 +72,7 @@ export function EntryPopover({
70
72
  </AppGroupFolder>
71
73
  )}
72
74
 
73
- {hasOtherApps && (
75
+ {hasOtherApps && !showCurrentAppEntriesOnly && (
74
76
  <AppGroupFolder label="其他应用表单" searchQuery={searchQuery}>
75
77
  {otherAppIds.map((appId) => (
76
78
  <OtherAppSection
@@ -37,7 +37,7 @@ export function OtherAppSection({
37
37
 
38
38
  const tree = useMemo(() => {
39
39
  return buildEntryTreeFromAliasMap(appDetail, searchQuery);
40
- }, [appDetail, searchQuery]);
40
+ }, [appDetail, searchQuery, appDetail?.entryList?.length]);
41
41
 
42
42
  return (
43
43
  <div>
@@ -36,12 +36,14 @@ export function ScrollSlider({
36
36
  selectedEntryId,
37
37
  onSelect,
38
38
  onOverflowChange,
39
+ showCurrentAppEntriesOnly = false,
39
40
  }: {
40
41
  appDetails: Record<string, IAppDetail>;
41
42
  currentAppId?: string;
42
43
  selectedEntryId?: string;
43
44
  onSelect: (result: BsEntrySelectChangeResult) => void;
44
45
  onOverflowChange?: (hasOverflow: boolean) => void;
46
+ showCurrentAppEntriesOnly?: boolean;
45
47
  }) {
46
48
  const scrollRef = useRef<HTMLDivElement>(null);
47
49
  const [canScrollLeft, setCanScrollLeft] = useState(false);
@@ -73,8 +75,16 @@ export function ScrollSlider({
73
75
  }
74
76
  }
75
77
 
76
- return [...currentFirst, ...otherNodes];
77
- }, [appDetails, currentAppId]);
78
+ const merged = [...currentFirst, ...otherNodes];
79
+ return showCurrentAppEntriesOnly ? currentFirst : merged;
80
+ }, [
81
+ appDetails,
82
+ currentAppId,
83
+ showCurrentAppEntriesOnly,
84
+ Object.keys(appDetails)
85
+ .map((id) => (appDetails[id]?.entryList?.length ?? 0))
86
+ .join(','),
87
+ ]);
78
88
 
79
89
  // Filtered tree for the active group popover
80
90
  const filteredGroupTree = useMemo(() => {
@@ -16,6 +16,7 @@ export interface BsEntrySelectProps {
16
16
  disabled?: boolean;
17
17
  className?: string;
18
18
  showSlider?: boolean;
19
+ showCurrentAppEntriesOnly?: boolean;
19
20
  }
20
21
 
21
22
  export interface EntryTreeItem {
@@ -1,16 +1,14 @@
1
1
  import { memo, useEffect, useRef, useState } from 'react';
2
- import { FieldType, ValueOf } from '@baishuyun/types';
2
+ import { type FieldType, IField, type IFieldOption as Option } from '@baishuyun/types';
3
3
  import { FieldTypeNameMap } from '../const/ui';
4
- import { ToolUIPart } from 'ai';
5
- import { FieldsTools, Option } from '@baishuyun/agents';
6
4
  import LineChecker from './line-checker';
7
5
  import { OptionItem } from './option-item';
8
6
  import { FieldIcon } from './field-icon';
9
7
 
10
- type Field = ValueOf<Pick<ToolUIPart<FieldsTools>, 'output'>>;
8
+ type Field = IField;
11
9
 
12
10
  export interface FieldCheckerProps {
13
- field: ValueOf<Pick<ToolUIPart<FieldsTools>, 'output'>>;
11
+ field: IField;
14
12
  isSubField?: boolean;
15
13
  disabled?: boolean;
16
14
  icon?: React.ReactNode;
@@ -95,7 +93,7 @@ export const FieldChecker = memo(
95
93
 
96
94
  return next;
97
95
  });
98
- onChange?.(subChecked, subField, field.widget.widgetName, index);
96
+ onChange?.(subChecked, subField, field.widget?.widgetName, index);
99
97
  };
100
98
  // --- end subform state management ---
101
99
 
@@ -160,7 +158,7 @@ export const FieldChecker = memo(
160
158
  disabled={disabled}
161
159
  checked={subCheckedMap[index]}
162
160
  field={subField}
163
- icon={<FieldIcon type={subField.widget?.type} />}
161
+ icon={<FieldIcon type={subField.widget?.type!} />}
164
162
  onChange={(subChecked) => {
165
163
  handleSubFieldChange(subChecked, subField, index);
166
164
  }}
@@ -1,16 +1,14 @@
1
1
  import { memo, useEffect } from 'react';
2
- import { FieldType, ValueOf } from '@baishuyun/types';
2
+ import { FieldType, IField } from '@baishuyun/types';
3
3
  import { FieldTypeNameMap } from '../const/ui';
4
- import { ToolUIPart } from 'ai';
5
- import { FieldsTools } from '@baishuyun/agents';
6
4
  import { isSubformFieldEqual, toHumanReadable } from '../lib/utils';
7
5
  import { SubformFieldsValueChecker } from './subform-fields-value-checker';
8
6
  import LineChecker from './line-checker';
9
7
 
10
- type Field = ValueOf<Pick<ToolUIPart<FieldsTools>, 'output'>>;
8
+ type Field = IField;
11
9
 
12
10
  export interface FieldValueCheckerProps {
13
- field: ValueOf<Pick<ToolUIPart<FieldsTools>, 'output'>>;
11
+ field: IField;
14
12
  isSubField?: boolean;
15
13
  disabled?: boolean;
16
14
  readonly?: boolean;
@@ -1,4 +1,4 @@
1
- import { FC, useCallback, useRef } from 'react';
1
+ import { FC, useCallback, useEffect, useRef } from 'react';
2
2
  import { useResizableWidth } from '../hooks/use-resizable-width';
3
3
  import { useColumnAppear } from '../hooks/use-column-appear';
4
4
  import classNames from 'classnames';
@@ -25,6 +25,9 @@ export interface IOfficeContainerProps {
25
25
 
26
26
  children?: React.ReactNode;
27
27
 
28
+ onResize?: (leftColWid: number, rightColWid: number) => void;
29
+
30
+ className?: string;
28
31
  }
29
32
 
30
33
 
@@ -41,10 +44,15 @@ export const OfficeContainer: FC<IOfficeContainerProps> = ({
41
44
  rightColHeaderElement,
42
45
  rightColContentElement,
43
46
  fullscreenPart = 'none',
47
+ className,
48
+ onResize,
44
49
  }) => {
45
50
  const isRightResizable = !!rightColWidthRange;
46
51
  const activeRange = rightColWidthRange ?? leftColWidthRange;
47
52
 
53
+ const transitioningRef = useRef(false);
54
+ const mountRef = useRef(true);
55
+
48
56
  const { width, handleMouseDown, isDragging } = useResizableWidth({
49
57
  range: activeRange,
50
58
  initialWidth: activeRange[0],
@@ -93,6 +101,61 @@ export const OfficeContainer: FC<IOfficeContainerProps> = ({
93
101
  return `calc(100% - ${width}px)`;
94
102
  }, [hideLeftCol, isLeftFullscreen, isRightFullscreen, isRightResizable, width]);
95
103
 
104
+ useEffect(() => {
105
+ if (!onResize || transitioningRef.current) return;
106
+ const raf = requestAnimationFrame(() => {
107
+ const leftW = leftColRef.current?.offsetWidth ?? 0;
108
+ const rightW = rightColRef.current?.offsetWidth ?? 0;
109
+ onResize(leftW, rightW);
110
+ });
111
+ return () => cancelAnimationFrame(raf);
112
+ }, [width, fullscreenPart, hideLeftCol, isRightResizable, onResize]);
113
+
114
+ // Set guard when fullscreen/hide triggers CSS transitions. Skip mount.
115
+ useEffect(() => {
116
+ if (mountRef.current) {
117
+ mountRef.current = false;
118
+ return;
119
+ }
120
+ transitioningRef.current = true;
121
+ }, [fullscreenPart, hideLeftCol]);
122
+
123
+ // Fire onResize after CSS width transitions complete
124
+ useEffect(() => {
125
+ if (!onResize) return;
126
+
127
+ let resolved = false;
128
+ const onWidthTransitionEnd = (e: TransitionEvent) => {
129
+ if (e.propertyName !== 'width' || resolved) return;
130
+ resolved = true;
131
+ transitioningRef.current = false;
132
+ const leftW = leftColRef.current?.offsetWidth ?? 0;
133
+ const rightW = rightColRef.current?.offsetWidth ?? 0;
134
+ onResize(leftW, rightW);
135
+ };
136
+
137
+ const leftEl = leftColRef.current;
138
+ const rightEl = rightColRef.current;
139
+
140
+ leftEl?.addEventListener('transitionend', onWidthTransitionEnd);
141
+ rightEl?.addEventListener('transitionend', onWidthTransitionEnd);
142
+
143
+ const fallback = setTimeout(() => {
144
+ if (resolved) return;
145
+ resolved = true;
146
+ transitioningRef.current = false;
147
+ const leftW = leftColRef.current?.offsetWidth ?? 0;
148
+ const rightW = rightColRef.current?.offsetWidth ?? 0;
149
+ onResize(leftW, rightW);
150
+ }, 500);
151
+
152
+ return () => {
153
+ leftEl?.removeEventListener('transitionend', onWidthTransitionEnd);
154
+ rightEl?.removeEventListener('transitionend', onWidthTransitionEnd);
155
+ clearTimeout(fallback);
156
+ };
157
+ }, [fullscreenPart, hideLeftCol, onResize]);
158
+
96
159
  const borderColorCls = 'border-[#0265fc]';
97
160
 
98
161
  // 全屏时补全 shrink-0,确保 width: 100% 或 width: 0 不会被 flex 容器挤压
@@ -112,7 +175,7 @@ export const OfficeContainer: FC<IOfficeContainerProps> = ({
112
175
  const contentStyle: React.CSSProperties = { /*scrollbarGutter: 'stable' */};
113
176
 
114
177
  return (
115
- <div className="relative h-full w-full flex overflow-hidden bg-white">
178
+ <div className={classNames("relative h-full w-full flex overflow-hidden", className)}>
116
179
  {/* fullscreen overlay */}
117
180
  {children && (
118
181
  <div>
@@ -133,7 +196,7 @@ export const OfficeContainer: FC<IOfficeContainerProps> = ({
133
196
  <div
134
197
  ref={leftColInnerRef}
135
198
  className="shrink-0 w-full overflow-hidden"
136
- style={{ height: headerHeight }}
199
+ style={{ height: headerHeight, background: '#fff' }}
137
200
  >
138
201
  {leftColHeaderElement}
139
202
  </div>
@@ -164,7 +227,7 @@ export const OfficeContainer: FC<IOfficeContainerProps> = ({
164
227
  <div
165
228
  ref={rightColInnerRef}
166
229
  className="shrink-0 w-full"
167
- style={{ height: headerHeight }}
230
+ style={{ height: headerHeight, background: "#fff" }}
168
231
  >
169
232
  {rightColHeaderElement}
170
233
  </div>