@ng-nest/ui 21.0.13 → 22.0.0

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 (204) hide show
  1. package/fesm2022/ng-nest-ui-affix.mjs +12 -12
  2. package/fesm2022/ng-nest-ui-affix.mjs.map +1 -1
  3. package/fesm2022/ng-nest-ui-alert.mjs +46 -34
  4. package/fesm2022/ng-nest-ui-alert.mjs.map +1 -1
  5. package/fesm2022/ng-nest-ui-anchor.mjs +43 -31
  6. package/fesm2022/ng-nest-ui-anchor.mjs.map +1 -1
  7. package/fesm2022/ng-nest-ui-api.mjs +7 -7
  8. package/fesm2022/ng-nest-ui-attachments.mjs +74 -48
  9. package/fesm2022/ng-nest-ui-attachments.mjs.map +1 -1
  10. package/fesm2022/ng-nest-ui-auto-complete.mjs +114 -70
  11. package/fesm2022/ng-nest-ui-auto-complete.mjs.map +1 -1
  12. package/fesm2022/ng-nest-ui-avatar.mjs +47 -32
  13. package/fesm2022/ng-nest-ui-avatar.mjs.map +1 -1
  14. package/fesm2022/ng-nest-ui-back-top.mjs +23 -18
  15. package/fesm2022/ng-nest-ui-back-top.mjs.map +1 -1
  16. package/fesm2022/ng-nest-ui-badge.mjs +30 -23
  17. package/fesm2022/ng-nest-ui-badge.mjs.map +1 -1
  18. package/fesm2022/ng-nest-ui-base-form.mjs +75 -44
  19. package/fesm2022/ng-nest-ui-base-form.mjs.map +1 -1
  20. package/fesm2022/ng-nest-ui-bubble.mjs +76 -48
  21. package/fesm2022/ng-nest-ui-bubble.mjs.map +1 -1
  22. package/fesm2022/ng-nest-ui-button.mjs +53 -42
  23. package/fesm2022/ng-nest-ui-button.mjs.map +1 -1
  24. package/fesm2022/ng-nest-ui-calendar.mjs +30 -20
  25. package/fesm2022/ng-nest-ui-calendar.mjs.map +1 -1
  26. package/fesm2022/ng-nest-ui-card.mjs +21 -16
  27. package/fesm2022/ng-nest-ui-card.mjs.map +1 -1
  28. package/fesm2022/ng-nest-ui-carousel.mjs +68 -46
  29. package/fesm2022/ng-nest-ui-carousel.mjs.map +1 -1
  30. package/fesm2022/ng-nest-ui-cascade.mjs +121 -73
  31. package/fesm2022/ng-nest-ui-cascade.mjs.map +1 -1
  32. package/fesm2022/ng-nest-ui-checkbox.mjs +54 -38
  33. package/fesm2022/ng-nest-ui-checkbox.mjs.map +1 -1
  34. package/fesm2022/ng-nest-ui-collapse.mjs +38 -30
  35. package/fesm2022/ng-nest-ui-collapse.mjs.map +1 -1
  36. package/fesm2022/ng-nest-ui-color-picker.mjs +119 -72
  37. package/fesm2022/ng-nest-ui-color-picker.mjs.map +1 -1
  38. package/fesm2022/ng-nest-ui-color.mjs +22 -16
  39. package/fesm2022/ng-nest-ui-color.mjs.map +1 -1
  40. package/fesm2022/ng-nest-ui-comment.mjs +23 -21
  41. package/fesm2022/ng-nest-ui-comment.mjs.map +1 -1
  42. package/fesm2022/ng-nest-ui-container.mjs +40 -37
  43. package/fesm2022/ng-nest-ui-container.mjs.map +1 -1
  44. package/fesm2022/ng-nest-ui-contextmenu.mjs +71 -45
  45. package/fesm2022/ng-nest-ui-contextmenu.mjs.map +1 -1
  46. package/fesm2022/ng-nest-ui-core.mjs +24 -21
  47. package/fesm2022/ng-nest-ui-core.mjs.map +1 -1
  48. package/fesm2022/ng-nest-ui-coversations.mjs +25 -18
  49. package/fesm2022/ng-nest-ui-coversations.mjs.map +1 -1
  50. package/fesm2022/ng-nest-ui-crumb.mjs +15 -13
  51. package/fesm2022/ng-nest-ui-crumb.mjs.map +1 -1
  52. package/fesm2022/ng-nest-ui-date-picker.mjs +425 -256
  53. package/fesm2022/ng-nest-ui-date-picker.mjs.map +1 -1
  54. package/fesm2022/ng-nest-ui-description.mjs +42 -31
  55. package/fesm2022/ng-nest-ui-description.mjs.map +1 -1
  56. package/fesm2022/ng-nest-ui-dialog.mjs +106 -82
  57. package/fesm2022/ng-nest-ui-dialog.mjs.map +1 -1
  58. package/fesm2022/ng-nest-ui-divider.mjs +24 -17
  59. package/fesm2022/ng-nest-ui-divider.mjs.map +1 -1
  60. package/fesm2022/ng-nest-ui-doc.mjs +7 -7
  61. package/fesm2022/ng-nest-ui-drag.mjs +10 -10
  62. package/fesm2022/ng-nest-ui-drawer.mjs +52 -43
  63. package/fesm2022/ng-nest-ui-drawer.mjs.map +1 -1
  64. package/fesm2022/ng-nest-ui-dropdown.mjs +94 -58
  65. package/fesm2022/ng-nest-ui-dropdown.mjs.map +1 -1
  66. package/fesm2022/ng-nest-ui-empty.mjs +14 -12
  67. package/fesm2022/ng-nest-ui-empty.mjs.map +1 -1
  68. package/fesm2022/ng-nest-ui-examples.mjs +7 -7
  69. package/fesm2022/ng-nest-ui-find.mjs +111 -71
  70. package/fesm2022/ng-nest-ui-find.mjs.map +1 -1
  71. package/fesm2022/ng-nest-ui-form.mjs +45 -33
  72. package/fesm2022/ng-nest-ui-form.mjs.map +1 -1
  73. package/fesm2022/ng-nest-ui-highlight.mjs +26 -20
  74. package/fesm2022/ng-nest-ui-highlight.mjs.map +1 -1
  75. package/fesm2022/ng-nest-ui-i18n.mjs +16 -15
  76. package/fesm2022/ng-nest-ui-i18n.mjs.map +1 -1
  77. package/fesm2022/ng-nest-ui-icon.mjs +28 -21
  78. package/fesm2022/ng-nest-ui-icon.mjs.map +1 -1
  79. package/fesm2022/ng-nest-ui-image.mjs +57 -51
  80. package/fesm2022/ng-nest-ui-image.mjs.map +1 -1
  81. package/fesm2022/ng-nest-ui-inner.mjs +11 -11
  82. package/fesm2022/ng-nest-ui-inner.mjs.map +1 -1
  83. package/fesm2022/ng-nest-ui-input-number.mjs +63 -42
  84. package/fesm2022/ng-nest-ui-input-number.mjs.map +1 -1
  85. package/fesm2022/ng-nest-ui-input.mjs +130 -85
  86. package/fesm2022/ng-nest-ui-input.mjs.map +1 -1
  87. package/fesm2022/ng-nest-ui-keyword.mjs +19 -15
  88. package/fesm2022/ng-nest-ui-keyword.mjs.map +1 -1
  89. package/fesm2022/ng-nest-ui-layout.mjs +37 -31
  90. package/fesm2022/ng-nest-ui-layout.mjs.map +1 -1
  91. package/fesm2022/ng-nest-ui-link.mjs +23 -18
  92. package/fesm2022/ng-nest-ui-link.mjs.map +1 -1
  93. package/fesm2022/ng-nest-ui-list.mjs +137 -89
  94. package/fesm2022/ng-nest-ui-list.mjs.map +1 -1
  95. package/fesm2022/ng-nest-ui-loading.mjs +36 -25
  96. package/fesm2022/ng-nest-ui-loading.mjs.map +1 -1
  97. package/fesm2022/ng-nest-ui-menu.mjs +68 -45
  98. package/fesm2022/ng-nest-ui-menu.mjs.map +1 -1
  99. package/fesm2022/ng-nest-ui-message-box.mjs +10 -10
  100. package/fesm2022/ng-nest-ui-message.mjs +10 -10
  101. package/fesm2022/ng-nest-ui-notification.mjs +10 -10
  102. package/fesm2022/ng-nest-ui-outlet.mjs +11 -9
  103. package/fesm2022/ng-nest-ui-outlet.mjs.map +1 -1
  104. package/fesm2022/ng-nest-ui-page-header.mjs +20 -15
  105. package/fesm2022/ng-nest-ui-page-header.mjs.map +1 -1
  106. package/fesm2022/ng-nest-ui-pagination.mjs +69 -48
  107. package/fesm2022/ng-nest-ui-pagination.mjs.map +1 -1
  108. package/fesm2022/ng-nest-ui-pattern.mjs +7 -7
  109. package/fesm2022/ng-nest-ui-popconfirm.mjs +40 -27
  110. package/fesm2022/ng-nest-ui-popconfirm.mjs.map +1 -1
  111. package/fesm2022/ng-nest-ui-popover.mjs +57 -38
  112. package/fesm2022/ng-nest-ui-popover.mjs.map +1 -1
  113. package/fesm2022/ng-nest-ui-portal.mjs +7 -7
  114. package/fesm2022/ng-nest-ui-progress.mjs +60 -41
  115. package/fesm2022/ng-nest-ui-progress.mjs.map +1 -1
  116. package/fesm2022/ng-nest-ui-prompts.mjs +18 -15
  117. package/fesm2022/ng-nest-ui-prompts.mjs.map +1 -1
  118. package/fesm2022/ng-nest-ui-radio.mjs +50 -35
  119. package/fesm2022/ng-nest-ui-radio.mjs.map +1 -1
  120. package/fesm2022/ng-nest-ui-rate.mjs +43 -29
  121. package/fesm2022/ng-nest-ui-rate.mjs.map +1 -1
  122. package/fesm2022/ng-nest-ui-resizable.mjs +18 -16
  123. package/fesm2022/ng-nest-ui-resizable.mjs.map +1 -1
  124. package/fesm2022/ng-nest-ui-result.mjs +22 -16
  125. package/fesm2022/ng-nest-ui-result.mjs.map +1 -1
  126. package/fesm2022/ng-nest-ui-ripple.mjs +14 -13
  127. package/fesm2022/ng-nest-ui-ripple.mjs.map +1 -1
  128. package/fesm2022/ng-nest-ui-scrollable.mjs +41 -24
  129. package/fesm2022/ng-nest-ui-scrollable.mjs.map +1 -1
  130. package/fesm2022/ng-nest-ui-select.mjs +197 -118
  131. package/fesm2022/ng-nest-ui-select.mjs.map +1 -1
  132. package/fesm2022/ng-nest-ui-sender.mjs +43 -31
  133. package/fesm2022/ng-nest-ui-sender.mjs.map +1 -1
  134. package/fesm2022/ng-nest-ui-skeleton.mjs +17 -15
  135. package/fesm2022/ng-nest-ui-skeleton.mjs.map +1 -1
  136. package/fesm2022/ng-nest-ui-slider-select.mjs +85 -53
  137. package/fesm2022/ng-nest-ui-slider-select.mjs.map +1 -1
  138. package/fesm2022/ng-nest-ui-slider.mjs +58 -37
  139. package/fesm2022/ng-nest-ui-slider.mjs.map +1 -1
  140. package/fesm2022/ng-nest-ui-splitter.mjs +32 -24
  141. package/fesm2022/ng-nest-ui-splitter.mjs.map +1 -1
  142. package/fesm2022/ng-nest-ui-statistic.mjs +44 -30
  143. package/fesm2022/ng-nest-ui-statistic.mjs.map +1 -1
  144. package/fesm2022/ng-nest-ui-steps.mjs +30 -22
  145. package/fesm2022/ng-nest-ui-steps.mjs.map +1 -1
  146. package/fesm2022/ng-nest-ui-suggestion.mjs +23 -20
  147. package/fesm2022/ng-nest-ui-suggestion.mjs.map +1 -1
  148. package/fesm2022/ng-nest-ui-switch.mjs +35 -25
  149. package/fesm2022/ng-nest-ui-switch.mjs.map +1 -1
  150. package/fesm2022/ng-nest-ui-table-view.mjs +78 -69
  151. package/fesm2022/ng-nest-ui-table-view.mjs.map +1 -1
  152. package/fesm2022/ng-nest-ui-table.mjs +320 -205
  153. package/fesm2022/ng-nest-ui-table.mjs.map +1 -1
  154. package/fesm2022/ng-nest-ui-tabs.mjs +74 -56
  155. package/fesm2022/ng-nest-ui-tabs.mjs.map +1 -1
  156. package/fesm2022/ng-nest-ui-tag.mjs +30 -23
  157. package/fesm2022/ng-nest-ui-tag.mjs.map +1 -1
  158. package/fesm2022/ng-nest-ui-text-retract.mjs +19 -15
  159. package/fesm2022/ng-nest-ui-text-retract.mjs.map +1 -1
  160. package/fesm2022/ng-nest-ui-textarea.mjs +69 -44
  161. package/fesm2022/ng-nest-ui-textarea.mjs.map +1 -1
  162. package/fesm2022/ng-nest-ui-theme.mjs +34 -23
  163. package/fesm2022/ng-nest-ui-theme.mjs.map +1 -1
  164. package/fesm2022/ng-nest-ui-thought-chain.mjs +26 -19
  165. package/fesm2022/ng-nest-ui-thought-chain.mjs.map +1 -1
  166. package/fesm2022/ng-nest-ui-time-ago.mjs +7 -7
  167. package/fesm2022/ng-nest-ui-time-picker.mjs +164 -96
  168. package/fesm2022/ng-nest-ui-time-picker.mjs.map +1 -1
  169. package/fesm2022/ng-nest-ui-time-range.mjs +7 -7
  170. package/fesm2022/ng-nest-ui-timeline.mjs +26 -19
  171. package/fesm2022/ng-nest-ui-timeline.mjs.map +1 -1
  172. package/fesm2022/ng-nest-ui-tooltip.mjs +53 -35
  173. package/fesm2022/ng-nest-ui-tooltip.mjs.map +1 -1
  174. package/fesm2022/ng-nest-ui-transfer.mjs +66 -40
  175. package/fesm2022/ng-nest-ui-transfer.mjs.map +1 -1
  176. package/fesm2022/ng-nest-ui-tree-file.mjs +39 -28
  177. package/fesm2022/ng-nest-ui-tree-file.mjs.map +1 -1
  178. package/fesm2022/ng-nest-ui-tree-select.mjs +186 -111
  179. package/fesm2022/ng-nest-ui-tree-select.mjs.map +1 -1
  180. package/fesm2022/ng-nest-ui-tree.mjs +166 -105
  181. package/fesm2022/ng-nest-ui-tree.mjs.map +1 -1
  182. package/fesm2022/ng-nest-ui-typography.mjs +16 -13
  183. package/fesm2022/ng-nest-ui-typography.mjs.map +1 -1
  184. package/fesm2022/ng-nest-ui-upload.mjs +81 -53
  185. package/fesm2022/ng-nest-ui-upload.mjs.map +1 -1
  186. package/fesm2022/ng-nest-ui-watermark.mjs +45 -35
  187. package/fesm2022/ng-nest-ui-watermark.mjs.map +1 -1
  188. package/fesm2022/ng-nest-ui-welcome.mjs +22 -16
  189. package/fesm2022/ng-nest-ui-welcome.mjs.map +1 -1
  190. package/package.json +3 -2
  191. package/types/ng-nest-ui-base-form.d.ts +3 -3
  192. package/types/ng-nest-ui-carousel.d.ts +1 -1
  193. package/types/ng-nest-ui-container.d.ts +1 -1
  194. package/types/ng-nest-ui-core.d.ts +1 -1
  195. package/types/ng-nest-ui-dialog.d.ts +1 -1
  196. package/types/ng-nest-ui-drawer.d.ts +1 -1
  197. package/types/ng-nest-ui-form.d.ts +12 -12
  198. package/types/ng-nest-ui-layout.d.ts +1 -1
  199. package/types/ng-nest-ui-list.d.ts +1 -1
  200. package/types/ng-nest-ui-portal.d.ts +3 -3
  201. package/types/ng-nest-ui-table-view.d.ts +1 -1
  202. package/types/ng-nest-ui-table.d.ts +1 -1
  203. package/types/ng-nest-ui-tabs.d.ts +1 -1
  204. package/types/ng-nest-ui-tree.d.ts +1 -1
@@ -27,72 +27,82 @@ class XBubbleProperty extends XPropertyFunction(X_BUBBLE_CONFIG_NAME) {
27
27
  * @zh_CN 气泡内容
28
28
  * @en_US Bubble content
29
29
  */
30
- this.content = input(...(ngDevMode ? [undefined, { debugName: "content" }] : []));
30
+ this.content = input(/* @ts-ignore */
31
+ ...(ngDevMode ? [undefined, { debugName: "content" }] : /* istanbul ignore next */ []));
31
32
  /**
32
33
  * @zh_CN 推理内容
33
34
  * @en_US reasoning content
34
35
  */
35
- this.reasoningContent = input(...(ngDevMode ? [undefined, { debugName: "reasoningContent" }] : []));
36
+ this.reasoningContent = input(/* @ts-ignore */
37
+ ...(ngDevMode ? [undefined, { debugName: "reasoningContent" }] : /* istanbul ignore next */ []));
36
38
  /**
37
39
  * @zh_CN 推理标题
38
40
  * @en_US reasoning title
39
41
  */
40
- this.reasoningTitle = input(this.config?.reasoningTitle ?? '深度思考', ...(ngDevMode ? [{ debugName: "reasoningTitle" }] : []));
42
+ this.reasoningTitle = input(this.config?.reasoningTitle ?? '深度思考', /* @ts-ignore */
43
+ ...(ngDevMode ? [{ debugName: "reasoningTitle" }] : /* istanbul ignore next */ []));
41
44
  /**
42
45
  * @zh_CN 头像
43
46
  * @en_US Avatar
44
47
  */
45
- this.avatar = input(...(ngDevMode ? [undefined, { debugName: "avatar" }] : []));
48
+ this.avatar = input(/* @ts-ignore */
49
+ ...(ngDevMode ? [undefined, { debugName: "avatar" }] : /* istanbul ignore next */ []));
46
50
  /**
47
51
  * @zh_CN 尺寸
48
52
  * @en_US Size
49
53
  */
50
- this.size = input(this.config?.size ?? 'medium', ...(ngDevMode ? [{ debugName: "size" }] : []));
54
+ this.size = input(this.config?.size ?? 'medium', /* @ts-ignore */
55
+ ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
51
56
  /**
52
57
  * @zh_CN 形态变体
53
58
  * @en_US Bubble variant
54
59
  */
55
- this.variant = input(this.config?.variant ?? 'outlined', ...(ngDevMode ? [{ debugName: "variant" }] : []));
60
+ this.variant = input(this.config?.variant ?? 'outlined', /* @ts-ignore */
61
+ ...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
56
62
  /**
57
63
  * @zh_CN 位置
58
64
  * @en_US Bubble placement
59
65
  */
60
- this.placement = input('start', ...(ngDevMode ? [{ debugName: "placement" }] : []));
66
+ this.placement = input('start', /* @ts-ignore */
67
+ ...(ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []));
61
68
  /**
62
69
  * @zh_CN 气泡头部内容
63
70
  * @en_US Bubble header content
64
71
  */
65
- this.header = input(...(ngDevMode ? [undefined, { debugName: "header" }] : []));
72
+ this.header = input(/* @ts-ignore */
73
+ ...(ngDevMode ? [undefined, { debugName: "header" }] : /* istanbul ignore next */ []));
66
74
  /**
67
75
  * @zh_CN 气泡底部内容
68
76
  * @en_US Bubble header content
69
77
  */
70
- this.footer = input(...(ngDevMode ? [undefined, { debugName: "footer" }] : []));
78
+ this.footer = input(/* @ts-ignore */
79
+ ...(ngDevMode ? [undefined, { debugName: "footer" }] : /* istanbul ignore next */ []));
71
80
  /**
72
81
  * @zh_CN 加载中
73
82
  * @en_US Loading
74
83
  */
75
- this.loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : {}), transform: XToBoolean });
84
+ this.loading = input(false, { ...(ngDevMode ? { debugName: "loading" } : /* istanbul ignore next */ {}), transform: XToBoolean });
76
85
  /**
77
86
  * @zh_CN 内容输出打字机效果
78
87
  * @en_US Typing effect
79
88
  */
80
- this.typing = input(false, { ...(ngDevMode ? { debugName: "typing" } : {}), transform: XToBoolean });
89
+ this.typing = input(false, { ...(ngDevMode ? { debugName: "typing" } : /* istanbul ignore next */ {}), transform: XToBoolean });
81
90
  /**
82
91
  * @zh_CN 打字机输出速度
83
92
  * @en_US Typing speed
84
93
  */
85
- this.speed = input(30, { ...(ngDevMode ? { debugName: "speed" } : {}), transform: XToNumber });
94
+ this.speed = input(30, { ...(ngDevMode ? { debugName: "speed" } : /* istanbul ignore next */ {}), transform: XToNumber });
86
95
  /**
87
96
  * @zh_CN 内容渲染器,可自定义内容的渲染方式,如 HTML、Markdown
88
97
  * @en_US Content renderer, can customize content rendering, such as HTML, Markdown
89
98
  */
90
- this.renderer = input(...(ngDevMode ? [undefined, { debugName: "renderer" }] : []));
99
+ this.renderer = input(/* @ts-ignore */
100
+ ...(ngDevMode ? [undefined, { debugName: "renderer" }] : /* istanbul ignore next */ []));
91
101
  /**
92
102
  * @zh_CN 是否显示打字机光标
93
103
  * @en_US Whether to show the typing cursor
94
104
  */
95
- this.showCursor = input(false, { ...(ngDevMode ? { debugName: "showCursor" } : {}), transform: XToBoolean });
105
+ this.showCursor = input(false, { ...(ngDevMode ? { debugName: "showCursor" } : /* istanbul ignore next */ {}), transform: XToBoolean });
96
106
  /**
97
107
  * @zh_CN 打字开始
98
108
  * @en_US Typing start
@@ -109,10 +119,10 @@ class XBubbleProperty extends XPropertyFunction(X_BUBBLE_CONFIG_NAME) {
109
119
  */
110
120
  this.typingEnd = output();
111
121
  }
112
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: XBubbleProperty, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
113
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.1", type: XBubbleProperty, isStandalone: true, selector: "x-bubble-property", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, reasoningContent: { classPropertyName: "reasoningContent", publicName: "reasoningContent", isSignal: true, isRequired: false, transformFunction: null }, reasoningTitle: { classPropertyName: "reasoningTitle", publicName: "reasoningTitle", isSignal: true, isRequired: false, transformFunction: null }, avatar: { classPropertyName: "avatar", publicName: "avatar", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, footer: { classPropertyName: "footer", publicName: "footer", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, typing: { classPropertyName: "typing", publicName: "typing", isSignal: true, isRequired: false, transformFunction: null }, speed: { classPropertyName: "speed", publicName: "speed", isSignal: true, isRequired: false, transformFunction: null }, renderer: { classPropertyName: "renderer", publicName: "renderer", isSignal: true, isRequired: false, transformFunction: null }, showCursor: { classPropertyName: "showCursor", publicName: "showCursor", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { typingStart: "typingStart", typingOuput: "typingOuput", typingEnd: "typingEnd" }, usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
122
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: XBubbleProperty, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
123
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.1", type: XBubbleProperty, isStandalone: true, selector: "x-bubble-property", inputs: { content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, reasoningContent: { classPropertyName: "reasoningContent", publicName: "reasoningContent", isSignal: true, isRequired: false, transformFunction: null }, reasoningTitle: { classPropertyName: "reasoningTitle", publicName: "reasoningTitle", isSignal: true, isRequired: false, transformFunction: null }, avatar: { classPropertyName: "avatar", publicName: "avatar", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "header", isSignal: true, isRequired: false, transformFunction: null }, footer: { classPropertyName: "footer", publicName: "footer", isSignal: true, isRequired: false, transformFunction: null }, loading: { classPropertyName: "loading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, typing: { classPropertyName: "typing", publicName: "typing", isSignal: true, isRequired: false, transformFunction: null }, speed: { classPropertyName: "speed", publicName: "speed", isSignal: true, isRequired: false, transformFunction: null }, renderer: { classPropertyName: "renderer", publicName: "renderer", isSignal: true, isRequired: false, transformFunction: null }, showCursor: { classPropertyName: "showCursor", publicName: "showCursor", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { typingStart: "typingStart", typingOuput: "typingOuput", typingEnd: "typingEnd" }, usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
114
124
  }
115
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: XBubbleProperty, decorators: [{
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: XBubbleProperty, decorators: [{
116
126
  type: Component,
117
127
  args: [{ selector: `${XBubblePrefix}-property`, template: '' }]
118
128
  }], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], reasoningContent: [{ type: i0.Input, args: [{ isSignal: true, alias: "reasoningContent", required: false }] }], reasoningTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "reasoningTitle", required: false }] }], avatar: [{ type: i0.Input, args: [{ isSignal: true, alias: "avatar", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], header: [{ type: i0.Input, args: [{ isSignal: true, alias: "header", required: false }] }], footer: [{ type: i0.Input, args: [{ isSignal: true, alias: "footer", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], typing: [{ type: i0.Input, args: [{ isSignal: true, alias: "typing", required: false }] }], speed: [{ type: i0.Input, args: [{ isSignal: true, alias: "speed", required: false }] }], renderer: [{ type: i0.Input, args: [{ isSignal: true, alias: "renderer", required: false }] }], showCursor: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCursor", required: false }] }], typingStart: [{ type: i0.Output, args: ["typingStart"] }], typingOuput: [{ type: i0.Output, args: ["typingOuput"] }], typingEnd: [{ type: i0.Output, args: ["typingEnd"] }] } });
@@ -133,22 +143,24 @@ class XBubblesProperty extends XPropertyFunction(X_BUBBLES_CONFIG_NAME) {
133
143
  * @zh_CN 尺寸
134
144
  * @en_US Size
135
145
  */
136
- this.size = input(...(ngDevMode ? [undefined, { debugName: "size" }] : []));
146
+ this.size = input(/* @ts-ignore */
147
+ ...(ngDevMode ? [undefined, { debugName: "size" }] : /* istanbul ignore next */ []));
137
148
  /**
138
149
  * @zh_CN 形态变体
139
150
  * @en_US Bubble variant
140
151
  */
141
- this.variant = input(...(ngDevMode ? [undefined, { debugName: "variant" }] : []));
152
+ this.variant = input(/* @ts-ignore */
153
+ ...(ngDevMode ? [undefined, { debugName: "variant" }] : /* istanbul ignore next */ []));
142
154
  /**
143
155
  * @zh_CN 滚动条滚动事件,自动获取父级可滚动的元素
144
156
  * @en_US Scroll event of the scroll bar, automatically obtaining the scrollable element of the parent
145
157
  */
146
158
  this.scrollChange = output();
147
159
  }
148
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: XBubblesProperty, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
149
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.1", type: XBubblesProperty, isStandalone: true, selector: "x-bubbles-property", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { scrollChange: "scrollChange" }, usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
160
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: XBubblesProperty, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
161
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.1", type: XBubblesProperty, isStandalone: true, selector: "x-bubbles-property", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { scrollChange: "scrollChange" }, usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
150
162
  }
151
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: XBubblesProperty, decorators: [{
163
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: XBubblesProperty, decorators: [{
152
164
  type: Component,
153
165
  args: [{ selector: `${XBubblesPrefix}-property`, template: '' }]
154
166
  }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], scrollChange: [{ type: i0.Output, args: ["scrollChange"] }] } });
@@ -162,43 +174,58 @@ class XBubbleComponent extends XBubbleProperty {
162
174
  this.renderer2 = inject(Renderer2);
163
175
  this.cdr = inject(ChangeDetectorRef);
164
176
  this.bubbles = inject(X_BUBBLES_CONTEXT, { optional: true });
165
- this.wrapperRef = viewChild('wrapperRef', ...(ngDevMode ? [{ debugName: "wrapperRef" }] : []));
177
+ this.wrapperRef = viewChild('wrapperRef', /* @ts-ignore */
178
+ ...(ngDevMode ? [{ debugName: "wrapperRef" }] : /* istanbul ignore next */ []));
166
179
  this.classMap = computed(() => ({
167
180
  [`${XBubblePrefix}-${this.variantSignal()}`]: !XIsEmpty(this.variantSignal()),
168
181
  [`${XBubblePrefix}-${this.placement()}`]: !XIsEmpty(this.placement()),
169
182
  [`${XBubblePrefix}-cursor`]: this.showCursor() && this.typing(),
170
183
  [`${XBubblePrefix}-typing`]: this.typing() && (this.pendingContent().length > 0 || this.reasoningPendingContent().length > 0),
171
184
  [`x-${this.sizeSignal()}`]: !XIsEmpty(this.sizeSignal())
172
- }), ...(ngDevMode ? [{ debugName: "classMap" }] : []));
173
- this.typedContent = signal('', ...(ngDevMode ? [{ debugName: "typedContent" }] : []));
185
+ }), /* @ts-ignore */
186
+ ...(ngDevMode ? [{ debugName: "classMap" }] : /* istanbul ignore next */ []));
187
+ this.typedContent = signal('', /* @ts-ignore */
188
+ ...(ngDevMode ? [{ debugName: "typedContent" }] : /* istanbul ignore next */ []));
174
189
  this.typedContentObserver = toObservable(this.typedContent);
175
- this.pendingContent = signal('', ...(ngDevMode ? [{ debugName: "pendingContent" }] : []));
190
+ this.pendingContent = signal('', /* @ts-ignore */
191
+ ...(ngDevMode ? [{ debugName: "pendingContent" }] : /* istanbul ignore next */ []));
176
192
  this.pendingContentObserver = toObservable(this.pendingContent);
177
- this.reasoningTypedContent = signal('', ...(ngDevMode ? [{ debugName: "reasoningTypedContent" }] : []));
193
+ this.reasoningTypedContent = signal('', /* @ts-ignore */
194
+ ...(ngDevMode ? [{ debugName: "reasoningTypedContent" }] : /* istanbul ignore next */ []));
178
195
  this.reasoningTypedContentObserver = toObservable(this.reasoningTypedContent);
179
- this.reasoningPendingContent = signal('', ...(ngDevMode ? [{ debugName: "reasoningPendingContent" }] : []));
180
- this.reasoningRenderedContent = signal('', ...(ngDevMode ? [{ debugName: "reasoningRenderedContent" }] : []));
181
- this.reasoningToggle = signal(true, ...(ngDevMode ? [{ debugName: "reasoningToggle" }] : []));
196
+ this.reasoningPendingContent = signal('', /* @ts-ignore */
197
+ ...(ngDevMode ? [{ debugName: "reasoningPendingContent" }] : /* istanbul ignore next */ []));
198
+ this.reasoningRenderedContent = signal('', /* @ts-ignore */
199
+ ...(ngDevMode ? [{ debugName: "reasoningRenderedContent" }] : /* istanbul ignore next */ []));
200
+ this.reasoningToggle = signal(true, /* @ts-ignore */
201
+ ...(ngDevMode ? [{ debugName: "reasoningToggle" }] : /* istanbul ignore next */ []));
182
202
  this.typingInterval = null;
183
- this.renderedContent = signal('', ...(ngDevMode ? [{ debugName: "renderedContent" }] : []));
203
+ this.renderedContent = signal('', /* @ts-ignore */
204
+ ...(ngDevMode ? [{ debugName: "renderedContent" }] : /* istanbul ignore next */ []));
184
205
  this.sizeSignal = computed(() => {
185
206
  return (this.bubbles?.size() || this.size());
186
- }, ...(ngDevMode ? [{ debugName: "sizeSignal" }] : []));
207
+ }, /* @ts-ignore */
208
+ ...(ngDevMode ? [{ debugName: "sizeSignal" }] : /* istanbul ignore next */ []));
187
209
  this.variantSignal = computed(() => {
188
210
  return (this.bubbles?.variant() || this.variant());
189
- }, ...(ngDevMode ? [{ debugName: "variantSignal" }] : []));
211
+ }, /* @ts-ignore */
212
+ ...(ngDevMode ? [{ debugName: "variantSignal" }] : /* istanbul ignore next */ []));
190
213
  this.isTemplate = computed(() => {
191
214
  return XIsTemplateRef(this.content());
192
- }, ...(ngDevMode ? [{ debugName: "isTemplate" }] : []));
215
+ }, /* @ts-ignore */
216
+ ...(ngDevMode ? [{ debugName: "isTemplate" }] : /* istanbul ignore next */ []));
193
217
  this.isString = computed(() => {
194
218
  return XIsString(this.content());
195
- }, ...(ngDevMode ? [{ debugName: "isString" }] : []));
219
+ }, /* @ts-ignore */
220
+ ...(ngDevMode ? [{ debugName: "isString" }] : /* istanbul ignore next */ []));
196
221
  this.isReasoningTemplate = computed(() => {
197
222
  return XIsTemplateRef(this.reasoningContent());
198
- }, ...(ngDevMode ? [{ debugName: "isReasoningTemplate" }] : []));
223
+ }, /* @ts-ignore */
224
+ ...(ngDevMode ? [{ debugName: "isReasoningTemplate" }] : /* istanbul ignore next */ []));
199
225
  this.isReasoningString = computed(() => {
200
226
  return XIsString(this.reasoningContent()) && !XIsEmpty(this.reasoningContent());
201
- }, ...(ngDevMode ? [{ debugName: "isReasoningString" }] : []));
227
+ }, /* @ts-ignore */
228
+ ...(ngDevMode ? [{ debugName: "isReasoningString" }] : /* istanbul ignore next */ []));
202
229
  effect(() => {
203
230
  if (this.isString() && !this.typing()) {
204
231
  this.stopTyping();
@@ -337,10 +364,10 @@ class XBubbleComponent extends XBubbleProperty {
337
364
  ngOnDestroy() {
338
365
  this.stopTyping();
339
366
  }
340
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: XBubbleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
341
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: XBubbleComponent, isStandalone: true, selector: "x-bubble", viewQueries: [{ propertyName: "wrapperRef", first: true, predicate: ["wrapperRef"], descendants: true, isSignal: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"x-bubble\" [ngClass]=\"classMap()\">\r\n @if (!!avatar()) {\r\n <div class=\"x-bubble-avatar\" [class.x-bubble-avatar-hidden]=\"avatar()?.hidden\">\r\n <x-avatar\r\n [icon]=\"avatar()?.icon!\"\r\n [label]=\"avatar()?.label!\"\r\n [src]=\"avatar()?.src!\"\r\n [size]=\"avatar()?.size ?? sizeSignal()\"\r\n [gap]=\"avatar()?.gap ?? '0.25rem'\"\r\n [fit]=\"avatar()?.fit ?? 'cover'\"\r\n [backgroundColor]=\"avatar()?.backgroundColor ?? '#999999'\"\r\n [color]=\"avatar()?.color ?? '#FFFFFF'\"\r\n [shape]=\"avatar()?.shape ?? 'circle'\"\r\n ></x-avatar>\r\n </div>\r\n }\r\n <div #wrapperRef class=\"x-bubble-wrapper\">\r\n @if (loading()) {\r\n <div class=\"x-bubble-content\" [x-loading]=\"true\" [size]=\"'small'\" inline></div>\r\n } @else {\r\n @if (header()) {\r\n <div class=\"x-bubble-header\">\r\n <ng-container *xOutlet=\"header()\">{{ header() }}</ng-container>\r\n </div>\r\n }\r\n\r\n @if (isReasoningString()) {\r\n <div class=\"x-bubble-reasoning\">\r\n <ng-container *xOutlet=\"reasoningHeaderTpl\"></ng-container>\r\n @if (reasoningToggle()) {\r\n <div class=\"x-bubble-reasoning-content\" #reasoningContentRef [innerHTML]=\"reasoningRenderedContent()\"></div>\r\n }\r\n </div>\r\n } @else if (isReasoningTemplate()) {\r\n <div class=\"x-bubble-reasoning\">\r\n <ng-container *xOutlet=\"reasoningHeaderTpl\"></ng-container>\r\n @if (reasoningToggle()) {\r\n <div class=\"x-bubble-reasoning-content\" #reasoningContentRef>\r\n <ng-container *xOutlet=\"reasoningContent()\"></ng-container>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <ng-template #reasoningHeaderTpl>\r\n <div class=\"x-bubble-reasoning-header\" (click)=\"onReasoningToggle()\">\r\n <x-icon\r\n class=\"x-bubble-reasoning-toggle\"\r\n [type]=\"reasoningToggle() ? 'fto-chevron-down' : 'fto-chevron-right'\"\r\n ></x-icon>\r\n <span>{{ reasoningTitle() }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n @if (isString()) {\r\n <div class=\"x-bubble-content\" #contentRef [innerHTML]=\"renderedContent()\"></div>\r\n } @else if (isTemplate()) {\r\n <div class=\"x-bubble-content\" #contentRef>\r\n <ng-container *xOutlet=\"content()\"></ng-container>\r\n </div>\r\n }\r\n\r\n @if (footer()) {\r\n <div class=\"x-bubble-footer\">\r\n <ng-container *xOutlet=\"footer()\">{{ footer() }}</ng-container>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n", styles: [".x-bubble{margin:0;padding:0}.x-bubble{display:flex}.x-bubble-wrapper{flex:auto;display:flex;flex-direction:column;align-items:flex-start;min-width:0;max-width:100%}.x-bubble-reasoning{background-color:var(--x-background-a100);color:var(--x-text-400);position:relative;box-sizing:border-box;min-width:0;max-width:100%;font-size:var(--x-font-size-small);border-radius:var(--x-border-radius);word-break:break-word;margin-bottom:1rem}.x-bubble-reasoning-header{padding:.5rem 1rem .5rem .45rem;display:flex;align-items:center;gap:.5rem;cursor:pointer}.x-bubble-reasoning-toggle{font-size:var(--x-font-size-large)}.x-bubble-reasoning-content{position:relative;padding:0rem 1rem 0rem 2rem;margin-bottom:1rem}.x-bubble-reasoning-content:before{position:absolute;top:0;left:1rem;content:\" \";height:100%;border-left:var(--x-border-width) var(--x-border-style) var(--x-border)}.x-bubble-content{position:relative;box-sizing:border-box;min-width:0;max-width:100%;color:var(--x-text);font-size:var(--x-font-size);border-radius:var(--x-border-radius);word-break:break-word}.x-bubble-outlined .x-bubble-content{border:var(--x-border-width) var(--x-border-style) var(--x-border)}.x-bubble-filled .x-bubble-content{background-color:var(--x-background-a200)}.x-bubble-shadow .x-bubble-content{box-shadow:var(--x-box-shadow)}.x-bubble-end{flex-direction:row-reverse}.x-bubble-end .x-bubble-wrapper{align-items:flex-end}.x-bubble-header{margin-bottom:.25rem}.x-bubble-footer{margin-top:.5rem}.x-bubble-cursor.x-bubble-typing .x-bubble-content:after{content:\"\";display:inline-block;width:.0625rem;height:1.1em;margin-left:.0625rem;background-color:currentColor;vertical-align:middle;animation:x-bubble-blink 1s infinite}.x-bubble-cursor:not(.x-bubble-typing) .x-bubble-content:after{display:none}.x-bubble-avatar-hidden{visibility:hidden}@keyframes x-bubble-blink{0%{opacity:1}50%{opacity:0}to{opacity:1}}.x-bubble.x-big{column-gap:var(--x-padding-big)}.x-bubble.x-big .x-bubble-content{padding:calc(var(--x-padding-big) - .25rem) var(--x-padding-big);line-height:calc(var(--x-height-big) - 1rem);min-height:calc(var(--x-padding-big) * 2 + var(--x-height-big) - 1.5rem)}.x-bubble.x-large{column-gap:var(--x-padding-large)}.x-bubble.x-large .x-bubble-content{padding:calc(var(--x-padding-large) - .25rem) var(--x-padding-large);line-height:calc(var(--x-height-large) - 1rem);min-height:calc(var(--x-padding-large) * 2 + var(--x-height-large) - 1.5rem)}.x-bubble.x-medium{column-gap:var(--x-padding-medium)}.x-bubble.x-medium .x-bubble-content{padding:calc(var(--x-padding-medium) - .25rem) var(--x-padding-medium);line-height:calc(var(--x-height-medium) - 1rem);min-height:calc(var(--x-padding-medium) * 2 + var(--x-height-medium) - 1.5rem)}.x-bubble.x-small{column-gap:var(--x-padding-small)}.x-bubble.x-small .x-bubble-content{padding:calc(var(--x-padding-small) - .25rem) var(--x-padding-small);line-height:calc(var(--x-height-small) - 1rem);min-height:calc(var(--x-padding-small) * 2 + var(--x-height-small) - 1.5rem)}.x-bubble.x-mini{column-gap:var(--x-padding-mini)}.x-bubble.x-mini .x-bubble-content{padding:calc(var(--x-padding-mini) - .25rem) var(--x-padding-mini);line-height:calc(var(--x-height-mini) - 1rem);min-height:calc(var(--x-padding-mini) * 2 + var(--x-height-mini) - 1.5rem)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: XOutletDirective, selector: "[xOutlet]", inputs: ["xOutletContext", "xOutlet"] }, { kind: "component", type: XAvatarComponent, selector: "x-avatar" }, { kind: "component", type: XIconComponent, selector: "x-icon" }, { kind: "component", type: XLoadingComponent, selector: "x-loading, [x-loading]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
367
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: XBubbleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
368
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.1", type: XBubbleComponent, isStandalone: true, selector: "x-bubble", viewQueries: [{ propertyName: "wrapperRef", first: true, predicate: ["wrapperRef"], descendants: true, isSignal: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"x-bubble\" [ngClass]=\"classMap()\">\r\n @if (!!avatar()) {\r\n <div class=\"x-bubble-avatar\" [class.x-bubble-avatar-hidden]=\"avatar()?.hidden\">\r\n <x-avatar\r\n [icon]=\"avatar()?.icon!\"\r\n [label]=\"avatar()?.label!\"\r\n [src]=\"avatar()?.src!\"\r\n [size]=\"avatar()?.size ?? sizeSignal()\"\r\n [gap]=\"avatar()?.gap ?? '0.25rem'\"\r\n [fit]=\"avatar()?.fit ?? 'cover'\"\r\n [backgroundColor]=\"avatar()?.backgroundColor ?? '#999999'\"\r\n [color]=\"avatar()?.color ?? '#FFFFFF'\"\r\n [shape]=\"avatar()?.shape ?? 'circle'\"\r\n ></x-avatar>\r\n </div>\r\n }\r\n <div #wrapperRef class=\"x-bubble-wrapper\">\r\n @if (loading()) {\r\n <div class=\"x-bubble-content\" [x-loading]=\"true\" [size]=\"'small'\" inline></div>\r\n } @else {\r\n @if (header()) {\r\n <div class=\"x-bubble-header\">\r\n <ng-container *xOutlet=\"header()\">{{ header() }}</ng-container>\r\n </div>\r\n }\r\n\r\n @if (isReasoningString()) {\r\n <div class=\"x-bubble-reasoning\">\r\n <ng-container *xOutlet=\"reasoningHeaderTpl\"></ng-container>\r\n @if (reasoningToggle()) {\r\n <div class=\"x-bubble-reasoning-content\" #reasoningContentRef [innerHTML]=\"reasoningRenderedContent()\"></div>\r\n }\r\n </div>\r\n } @else if (isReasoningTemplate()) {\r\n <div class=\"x-bubble-reasoning\">\r\n <ng-container *xOutlet=\"reasoningHeaderTpl\"></ng-container>\r\n @if (reasoningToggle()) {\r\n <div class=\"x-bubble-reasoning-content\" #reasoningContentRef>\r\n <ng-container *xOutlet=\"reasoningContent()\"></ng-container>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <ng-template #reasoningHeaderTpl>\r\n <div class=\"x-bubble-reasoning-header\" (click)=\"onReasoningToggle()\">\r\n <x-icon\r\n class=\"x-bubble-reasoning-toggle\"\r\n [type]=\"reasoningToggle() ? 'fto-chevron-down' : 'fto-chevron-right'\"\r\n ></x-icon>\r\n <span>{{ reasoningTitle() }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n @if (isString()) {\r\n <div class=\"x-bubble-content\" #contentRef [innerHTML]=\"renderedContent()\"></div>\r\n } @else if (isTemplate()) {\r\n <div class=\"x-bubble-content\" #contentRef>\r\n <ng-container *xOutlet=\"content()\"></ng-container>\r\n </div>\r\n }\r\n\r\n @if (footer()) {\r\n <div class=\"x-bubble-footer\">\r\n <ng-container *xOutlet=\"footer()\">{{ footer() }}</ng-container>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n", styles: [".x-bubble{margin:0;padding:0}.x-bubble{display:flex}.x-bubble-wrapper{flex:auto;display:flex;flex-direction:column;align-items:flex-start;min-width:0;max-width:100%}.x-bubble-reasoning{background-color:var(--x-background-a100);color:var(--x-text-400);position:relative;box-sizing:border-box;min-width:0;max-width:100%;font-size:var(--x-font-size-small);border-radius:var(--x-border-radius);word-break:break-word;margin-bottom:1rem}.x-bubble-reasoning-header{padding:.5rem 1rem .5rem .45rem;display:flex;align-items:center;gap:.5rem;cursor:pointer}.x-bubble-reasoning-toggle{font-size:var(--x-font-size-large)}.x-bubble-reasoning-content{position:relative;padding:0rem 1rem 0rem 2rem;margin-bottom:1rem}.x-bubble-reasoning-content:before{position:absolute;top:0;left:1rem;content:\" \";height:100%;border-left:var(--x-border-width) var(--x-border-style) var(--x-border)}.x-bubble-content{position:relative;box-sizing:border-box;min-width:0;max-width:100%;color:var(--x-text);font-size:var(--x-font-size);border-radius:var(--x-border-radius);word-break:break-word}.x-bubble-outlined .x-bubble-content{border:var(--x-border-width) var(--x-border-style) var(--x-border)}.x-bubble-filled .x-bubble-content{background-color:var(--x-background-a200)}.x-bubble-shadow .x-bubble-content{box-shadow:var(--x-box-shadow)}.x-bubble-end{flex-direction:row-reverse}.x-bubble-end .x-bubble-wrapper{align-items:flex-end}.x-bubble-header{margin-bottom:.25rem}.x-bubble-footer{margin-top:.5rem}.x-bubble-cursor.x-bubble-typing .x-bubble-content:after{content:\"\";display:inline-block;width:.0625rem;height:1.1em;margin-left:.0625rem;background-color:currentColor;vertical-align:middle;animation:x-bubble-blink 1s infinite}.x-bubble-cursor:not(.x-bubble-typing) .x-bubble-content:after{display:none}.x-bubble-avatar-hidden{visibility:hidden}@keyframes x-bubble-blink{0%{opacity:1}50%{opacity:0}to{opacity:1}}.x-bubble.x-big{column-gap:var(--x-padding-big)}.x-bubble.x-big .x-bubble-content{padding:calc(var(--x-padding-big) - .25rem) var(--x-padding-big);line-height:calc(var(--x-height-big) - 1rem);min-height:calc(var(--x-padding-big) * 2 + var(--x-height-big) - 1.5rem)}.x-bubble.x-large{column-gap:var(--x-padding-large)}.x-bubble.x-large .x-bubble-content{padding:calc(var(--x-padding-large) - .25rem) var(--x-padding-large);line-height:calc(var(--x-height-large) - 1rem);min-height:calc(var(--x-padding-large) * 2 + var(--x-height-large) - 1.5rem)}.x-bubble.x-medium{column-gap:var(--x-padding-medium)}.x-bubble.x-medium .x-bubble-content{padding:calc(var(--x-padding-medium) - .25rem) var(--x-padding-medium);line-height:calc(var(--x-height-medium) - 1rem);min-height:calc(var(--x-padding-medium) * 2 + var(--x-height-medium) - 1.5rem)}.x-bubble.x-small{column-gap:var(--x-padding-small)}.x-bubble.x-small .x-bubble-content{padding:calc(var(--x-padding-small) - .25rem) var(--x-padding-small);line-height:calc(var(--x-height-small) - 1rem);min-height:calc(var(--x-padding-small) * 2 + var(--x-height-small) - 1.5rem)}.x-bubble.x-mini{column-gap:var(--x-padding-mini)}.x-bubble.x-mini .x-bubble-content{padding:calc(var(--x-padding-mini) - .25rem) var(--x-padding-mini);line-height:calc(var(--x-height-mini) - 1rem);min-height:calc(var(--x-padding-mini) * 2 + var(--x-height-mini) - 1.5rem)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: XOutletDirective, selector: "[xOutlet]", inputs: ["xOutletContext", "xOutlet"] }, { kind: "component", type: XAvatarComponent, selector: "x-avatar" }, { kind: "component", type: XIconComponent, selector: "x-icon" }, { kind: "component", type: XLoadingComponent, selector: "x-loading, [x-loading]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
342
369
  }
343
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: XBubbleComponent, decorators: [{
370
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: XBubbleComponent, decorators: [{
344
371
  type: Component,
345
372
  args: [{ selector: 'x-bubble', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgClass, XOutletDirective, XAvatarComponent, XIconComponent, XLoadingComponent], template: "<div class=\"x-bubble\" [ngClass]=\"classMap()\">\r\n @if (!!avatar()) {\r\n <div class=\"x-bubble-avatar\" [class.x-bubble-avatar-hidden]=\"avatar()?.hidden\">\r\n <x-avatar\r\n [icon]=\"avatar()?.icon!\"\r\n [label]=\"avatar()?.label!\"\r\n [src]=\"avatar()?.src!\"\r\n [size]=\"avatar()?.size ?? sizeSignal()\"\r\n [gap]=\"avatar()?.gap ?? '0.25rem'\"\r\n [fit]=\"avatar()?.fit ?? 'cover'\"\r\n [backgroundColor]=\"avatar()?.backgroundColor ?? '#999999'\"\r\n [color]=\"avatar()?.color ?? '#FFFFFF'\"\r\n [shape]=\"avatar()?.shape ?? 'circle'\"\r\n ></x-avatar>\r\n </div>\r\n }\r\n <div #wrapperRef class=\"x-bubble-wrapper\">\r\n @if (loading()) {\r\n <div class=\"x-bubble-content\" [x-loading]=\"true\" [size]=\"'small'\" inline></div>\r\n } @else {\r\n @if (header()) {\r\n <div class=\"x-bubble-header\">\r\n <ng-container *xOutlet=\"header()\">{{ header() }}</ng-container>\r\n </div>\r\n }\r\n\r\n @if (isReasoningString()) {\r\n <div class=\"x-bubble-reasoning\">\r\n <ng-container *xOutlet=\"reasoningHeaderTpl\"></ng-container>\r\n @if (reasoningToggle()) {\r\n <div class=\"x-bubble-reasoning-content\" #reasoningContentRef [innerHTML]=\"reasoningRenderedContent()\"></div>\r\n }\r\n </div>\r\n } @else if (isReasoningTemplate()) {\r\n <div class=\"x-bubble-reasoning\">\r\n <ng-container *xOutlet=\"reasoningHeaderTpl\"></ng-container>\r\n @if (reasoningToggle()) {\r\n <div class=\"x-bubble-reasoning-content\" #reasoningContentRef>\r\n <ng-container *xOutlet=\"reasoningContent()\"></ng-container>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <ng-template #reasoningHeaderTpl>\r\n <div class=\"x-bubble-reasoning-header\" (click)=\"onReasoningToggle()\">\r\n <x-icon\r\n class=\"x-bubble-reasoning-toggle\"\r\n [type]=\"reasoningToggle() ? 'fto-chevron-down' : 'fto-chevron-right'\"\r\n ></x-icon>\r\n <span>{{ reasoningTitle() }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n @if (isString()) {\r\n <div class=\"x-bubble-content\" #contentRef [innerHTML]=\"renderedContent()\"></div>\r\n } @else if (isTemplate()) {\r\n <div class=\"x-bubble-content\" #contentRef>\r\n <ng-container *xOutlet=\"content()\"></ng-container>\r\n </div>\r\n }\r\n\r\n @if (footer()) {\r\n <div class=\"x-bubble-footer\">\r\n <ng-container *xOutlet=\"footer()\">{{ footer() }}</ng-container>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n", styles: [".x-bubble{margin:0;padding:0}.x-bubble{display:flex}.x-bubble-wrapper{flex:auto;display:flex;flex-direction:column;align-items:flex-start;min-width:0;max-width:100%}.x-bubble-reasoning{background-color:var(--x-background-a100);color:var(--x-text-400);position:relative;box-sizing:border-box;min-width:0;max-width:100%;font-size:var(--x-font-size-small);border-radius:var(--x-border-radius);word-break:break-word;margin-bottom:1rem}.x-bubble-reasoning-header{padding:.5rem 1rem .5rem .45rem;display:flex;align-items:center;gap:.5rem;cursor:pointer}.x-bubble-reasoning-toggle{font-size:var(--x-font-size-large)}.x-bubble-reasoning-content{position:relative;padding:0rem 1rem 0rem 2rem;margin-bottom:1rem}.x-bubble-reasoning-content:before{position:absolute;top:0;left:1rem;content:\" \";height:100%;border-left:var(--x-border-width) var(--x-border-style) var(--x-border)}.x-bubble-content{position:relative;box-sizing:border-box;min-width:0;max-width:100%;color:var(--x-text);font-size:var(--x-font-size);border-radius:var(--x-border-radius);word-break:break-word}.x-bubble-outlined .x-bubble-content{border:var(--x-border-width) var(--x-border-style) var(--x-border)}.x-bubble-filled .x-bubble-content{background-color:var(--x-background-a200)}.x-bubble-shadow .x-bubble-content{box-shadow:var(--x-box-shadow)}.x-bubble-end{flex-direction:row-reverse}.x-bubble-end .x-bubble-wrapper{align-items:flex-end}.x-bubble-header{margin-bottom:.25rem}.x-bubble-footer{margin-top:.5rem}.x-bubble-cursor.x-bubble-typing .x-bubble-content:after{content:\"\";display:inline-block;width:.0625rem;height:1.1em;margin-left:.0625rem;background-color:currentColor;vertical-align:middle;animation:x-bubble-blink 1s infinite}.x-bubble-cursor:not(.x-bubble-typing) .x-bubble-content:after{display:none}.x-bubble-avatar-hidden{visibility:hidden}@keyframes x-bubble-blink{0%{opacity:1}50%{opacity:0}to{opacity:1}}.x-bubble.x-big{column-gap:var(--x-padding-big)}.x-bubble.x-big .x-bubble-content{padding:calc(var(--x-padding-big) - .25rem) var(--x-padding-big);line-height:calc(var(--x-height-big) - 1rem);min-height:calc(var(--x-padding-big) * 2 + var(--x-height-big) - 1.5rem)}.x-bubble.x-large{column-gap:var(--x-padding-large)}.x-bubble.x-large .x-bubble-content{padding:calc(var(--x-padding-large) - .25rem) var(--x-padding-large);line-height:calc(var(--x-height-large) - 1rem);min-height:calc(var(--x-padding-large) * 2 + var(--x-height-large) - 1.5rem)}.x-bubble.x-medium{column-gap:var(--x-padding-medium)}.x-bubble.x-medium .x-bubble-content{padding:calc(var(--x-padding-medium) - .25rem) var(--x-padding-medium);line-height:calc(var(--x-height-medium) - 1rem);min-height:calc(var(--x-padding-medium) * 2 + var(--x-height-medium) - 1.5rem)}.x-bubble.x-small{column-gap:var(--x-padding-small)}.x-bubble.x-small .x-bubble-content{padding:calc(var(--x-padding-small) - .25rem) var(--x-padding-small);line-height:calc(var(--x-height-small) - 1rem);min-height:calc(var(--x-padding-small) * 2 + var(--x-height-small) - 1.5rem)}.x-bubble.x-mini{column-gap:var(--x-padding-mini)}.x-bubble.x-mini .x-bubble-content{padding:calc(var(--x-padding-mini) - .25rem) var(--x-padding-mini);line-height:calc(var(--x-height-mini) - 1rem);min-height:calc(var(--x-padding-mini) * 2 + var(--x-height-mini) - 1.5rem)}\n"] }]
346
373
  }], ctorParameters: () => [], propDecorators: { wrapperRef: [{ type: i0.ViewChild, args: ['wrapperRef', { isSignal: true }] }] } });
@@ -356,7 +383,8 @@ class XBubblesComponent extends XBubblesProperty {
356
383
  this.contentMutationObserver = null;
357
384
  this.typingObserver = null;
358
385
  this.$destroy = new Subject();
359
- this.bubbles = contentChildren(XBubbleComponent, ...(ngDevMode ? [{ debugName: "bubbles" }] : []));
386
+ this.bubbles = contentChildren(XBubbleComponent, /* @ts-ignore */
387
+ ...(ngDevMode ? [{ debugName: "bubbles" }] : /* istanbul ignore next */ []));
360
388
  }
361
389
  ngAfterViewInit() {
362
390
  this.stepScroll();
@@ -460,15 +488,15 @@ class XBubblesComponent extends XBubblesProperty {
460
488
  this.parentScrollElement.scrollTop = 0;
461
489
  }
462
490
  }
463
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: XBubblesComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
464
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.1.1", type: XBubblesComponent, isStandalone: true, selector: "x-bubbles", providers: [
491
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: XBubblesComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
492
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.1", type: XBubblesComponent, isStandalone: true, selector: "x-bubbles", providers: [
465
493
  {
466
494
  provide: X_BUBBLES_CONTEXT,
467
495
  useExisting: XBubblesComponent
468
496
  }
469
497
  ], queries: [{ propertyName: "bubbles", predicate: XBubbleComponent, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<ng-content></ng-content>\r\n", styles: ["x-bubbles{margin:0;padding:0}x-bubbles{display:flex;flex-direction:column;gap:1rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
470
498
  }
471
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: XBubblesComponent, decorators: [{
499
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: XBubblesComponent, decorators: [{
472
500
  type: Component,
473
501
  args: [{ selector: 'x-bubbles', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [], providers: [
474
502
  {
@@ -479,11 +507,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
479
507
  }], propDecorators: { bubbles: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => XBubbleComponent), { isSignal: true }] }] } });
480
508
 
481
509
  class XBubbleModule {
482
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: XBubbleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
483
- /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.1", ngImport: i0, type: XBubbleModule, imports: [XBubbleComponent, XBubblesComponent], exports: [XBubbleComponent, XBubblesComponent] }); }
484
- /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: XBubbleModule, imports: [XBubbleComponent] }); }
510
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: XBubbleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
511
+ /** @nocollapse */ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.1", ngImport: i0, type: XBubbleModule, imports: [XBubbleComponent, XBubblesComponent], exports: [XBubbleComponent, XBubblesComponent] }); }
512
+ /** @nocollapse */ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: XBubbleModule, imports: [XBubbleComponent] }); }
485
513
  }
486
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: XBubbleModule, decorators: [{
514
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: XBubbleModule, decorators: [{
487
515
  type: NgModule,
488
516
  args: [{
489
517
  exports: [XBubbleComponent, XBubblesComponent],
@@ -1 +1 @@
1
- {"version":3,"file":"ng-nest-ui-bubble.mjs","sources":["../../../../lib/ng-nest/ui/bubble/bubble.property.ts","../../../../lib/ng-nest/ui/bubble/bubbles.token.ts","../../../../lib/ng-nest/ui/bubble/bubble.component.ts","../../../../lib/ng-nest/ui/bubble/bubble.component.html","../../../../lib/ng-nest/ui/bubble/bubbles.component.ts","../../../../lib/ng-nest/ui/bubble/bubbles.component.html","../../../../lib/ng-nest/ui/bubble/bubble.module.ts","../../../../lib/ng-nest/ui/bubble/ng-nest-ui-bubble.ts"],"sourcesContent":["import { Component, input, output } from '@angular/core';\r\nimport { XBoolean, XNumber, XPropertyFunction, XSize, XTemplate, XToBoolean, XToNumber } from '@ng-nest/ui/core';\r\nimport { XAvatarOption } from '@ng-nest/ui/avatar';\r\nimport { Observable } from 'rxjs';\r\n\r\n/**\r\n * Bubble\r\n * @selector x-bubble\r\n * @decorator component\r\n */\r\nexport const XBubblePrefix = 'x-bubble';\r\nconst X_BUBBLE_CONFIG_NAME = 'bubble';\r\n\r\n/**\r\n * Bubble Property\r\n */\r\n@Component({ selector: `${XBubblePrefix}-property`, template: '' })\r\nexport class XBubbleProperty extends XPropertyFunction(X_BUBBLE_CONFIG_NAME) {\r\n /**\r\n * @zh_CN 气泡内容\r\n * @en_US Bubble content\r\n */\r\n readonly content = input<XTemplate>();\r\n /**\r\n * @zh_CN 推理内容\r\n * @en_US reasoning content\r\n */\r\n readonly reasoningContent = input<XTemplate>();\r\n /**\r\n * @zh_CN 推理标题\r\n * @en_US reasoning title\r\n */\r\n readonly reasoningTitle = input<XTemplate>(this.config?.reasoningTitle ?? '深度思考');\r\n /**\r\n * @zh_CN 头像\r\n * @en_US Avatar\r\n */\r\n readonly avatar = input<XBubbleAvatarOption>();\r\n /**\r\n * @zh_CN 尺寸\r\n * @en_US Size\r\n */\r\n readonly size = input<XSize>(this.config?.size ?? 'medium');\r\n /**\r\n * @zh_CN 形态变体\r\n * @en_US Bubble variant\r\n */\r\n readonly variant = input<XBubbleVariant>(this.config?.variant ?? 'outlined');\r\n /**\r\n * @zh_CN 位置\r\n * @en_US Bubble placement\r\n */\r\n readonly placement = input<XBubblePlacement>('start');\r\n /**\r\n * @zh_CN 气泡头部内容\r\n * @en_US Bubble header content\r\n */\r\n readonly header = input<XTemplate>();\r\n /**\r\n * @zh_CN 气泡底部内容\r\n * @en_US Bubble header content\r\n */\r\n readonly footer = input<XTemplate>();\r\n /**\r\n * @zh_CN 加载中\r\n * @en_US Loading\r\n */\r\n readonly loading = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 内容输出打字机效果\r\n * @en_US Typing effect\r\n */\r\n readonly typing = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 打字机输出速度\r\n * @en_US Typing speed\r\n */\r\n readonly speed = input<number, XNumber>(30, { transform: XToNumber });\r\n /**\r\n * @zh_CN 内容渲染器,可自定义内容的渲染方式,如 HTML、Markdown\r\n * @en_US Content renderer, can customize content rendering, such as HTML, Markdown\r\n */\r\n readonly renderer = input<XBubbleContentRenderer>();\r\n /**\r\n * @zh_CN 是否显示打字机光标\r\n * @en_US Whether to show the typing cursor\r\n */\r\n readonly showCursor = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 打字开始\r\n * @en_US Typing start\r\n */\r\n readonly typingStart = output<void>();\r\n /**\r\n * @zh_CN 打字正在输出的字符\r\n * @en_US Typing output character\r\n */\r\n readonly typingOuput = output<string>();\r\n /**\r\n * @zh_CN 打字结束\r\n * @en_US Typing end\r\n */\r\n readonly typingEnd = output<void>();\r\n}\r\n\r\n/**\r\n * @zh_CN 头像配置,继承了组件 Avatar 相关属性\r\n * @en_US Avatar settings\r\n */\r\nexport interface XBubbleAvatarOption extends XAvatarOption {\r\n /**\r\n * @zh_CN 是否显示头像\r\n * @en_US Whether to show the avatar\r\n */\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * Bubbles\r\n * @selector x-bubbles\r\n * @decorator component\r\n */\r\nexport const XBubblesPrefix = 'x-bubbles';\r\nconst X_BUBBLES_CONFIG_NAME = 'bubbles';\r\n\r\n/**\r\n * Bubbles Property\r\n */\r\n@Component({ selector: `${XBubblesPrefix}-property`, template: '' })\r\nexport class XBubblesProperty extends XPropertyFunction(X_BUBBLES_CONFIG_NAME) {\r\n /**\r\n * @zh_CN 尺寸\r\n * @en_US Size\r\n */\r\n readonly size = input<XSize>();\r\n /**\r\n * @zh_CN 形态变体\r\n * @en_US Bubble variant\r\n */\r\n readonly variant = input<XBubbleVariant>();\r\n /**\r\n * @zh_CN 滚动条滚动事件,自动获取父级可滚动的元素\r\n * @en_US Scroll event of the scroll bar, automatically obtaining the scrollable element of the parent\r\n */\r\n readonly scrollChange = output<Event>();\r\n}\r\n\r\n/**\r\n * @zh_CN 形态变体\r\n * @en_US Bubble variant\r\n */\r\nexport type XBubbleVariant = 'outlined' | 'filled' | 'shadow' | 'borderless';\r\n\r\n/**\r\n * @zh_CN 位置\r\n * @en_US Bubble placement\r\n */\r\nexport type XBubblePlacement = 'start' | 'end';\r\n\r\n/**\r\n * @zh_CN 内容渲染函数\r\n * @en_US Bubble content renderer\r\n */\r\nexport type XBubbleContentRenderer = (content: string) => string | Observable<string> | undefined;\r\n","import { InjectionToken, Signal } from '@angular/core';\r\n\r\nexport interface XBubblesContext {\r\n size: Signal<string | undefined>;\r\n variant: Signal<string | undefined>;\r\n}\r\n\r\nexport const X_BUBBLES_CONTEXT = new InjectionToken<XBubblesContext>('X_BUBBLES_CONTEXT');\r\n","import {\r\n Component,\r\n ViewEncapsulation,\r\n ChangeDetectionStrategy,\r\n computed,\r\n viewChild,\r\n ElementRef,\r\n signal,\r\n effect,\r\n SimpleChanges,\r\n inject,\r\n Renderer2,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { XBubblePrefix, XBubbleProperty } from './bubble.property';\r\nimport { XOutletDirective } from '@ng-nest/ui/outlet';\r\nimport { XIsEmpty, XIsString, XIsTemplateRef, XSize, XVariant } from '@ng-nest/ui/core';\r\nimport { NgClass } from '@angular/common';\r\nimport { XAvatarComponent } from '@ng-nest/ui/avatar';\r\nimport { XLoadingComponent } from '@ng-nest/ui/loading';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport { isObservable } from 'rxjs';\r\nimport { XIconComponent } from '@ng-nest/ui/icon';\r\nimport { X_BUBBLES_CONTEXT } from './bubbles.token';\r\n\r\n@Component({\r\n selector: 'x-bubble',\r\n templateUrl: './bubble.component.html',\r\n styleUrls: ['./bubble.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [NgClass, XOutletDirective, XAvatarComponent, XIconComponent, XLoadingComponent]\r\n})\r\nexport class XBubbleComponent extends XBubbleProperty {\r\n sanitizer = inject(DomSanitizer);\r\n renderer2 = inject(Renderer2);\r\n cdr = inject(ChangeDetectorRef);\r\n private bubbles = inject(X_BUBBLES_CONTEXT, { optional: true });\r\n\r\n wrapperRef = viewChild<ElementRef<HTMLElement>>('wrapperRef');\r\n\r\n classMap = computed(() => ({\r\n [`${XBubblePrefix}-${this.variantSignal()}`]: !XIsEmpty(this.variantSignal()),\r\n [`${XBubblePrefix}-${this.placement()}`]: !XIsEmpty(this.placement()),\r\n [`${XBubblePrefix}-cursor`]: this.showCursor() && this.typing(),\r\n [`${XBubblePrefix}-typing`]:\r\n this.typing() && (this.pendingContent().length > 0 || this.reasoningPendingContent().length > 0),\r\n [`x-${this.sizeSignal()}`]: !XIsEmpty(this.sizeSignal())\r\n }));\r\n\r\n typedContent = signal('');\r\n typedContentObserver = toObservable(this.typedContent);\r\n pendingContent = signal('');\r\n pendingContentObserver = toObservable(this.pendingContent);\r\n\r\n reasoningTypedContent = signal('');\r\n reasoningTypedContentObserver = toObservable(this.reasoningTypedContent);\r\n reasoningPendingContent = signal('');\r\n reasoningRenderedContent = signal<SafeHtml>('');\r\n reasoningToggle = signal(true);\r\n\r\n private typingInterval: any = null;\r\n renderedContent = signal<SafeHtml>('');\r\n\r\n sizeSignal = computed(() => {\r\n return (this.bubbles?.size() || this.size()) as XSize;\r\n });\r\n\r\n variantSignal = computed(() => {\r\n return (this.bubbles?.variant() || this.variant()) as XVariant;\r\n });\r\n\r\n isTemplate = computed(() => {\r\n return XIsTemplateRef(this.content());\r\n });\r\n\r\n isString = computed(() => {\r\n return XIsString(this.content());\r\n });\r\n\r\n isReasoningTemplate = computed(() => {\r\n return XIsTemplateRef(this.reasoningContent());\r\n });\r\n\r\n isReasoningString = computed(() => {\r\n return XIsString(this.reasoningContent()) && !XIsEmpty(this.reasoningContent());\r\n });\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n if (this.isString() && !this.typing()) {\r\n this.stopTyping();\r\n\r\n if (this.reasoningPendingContent().length === 0) {\r\n this.typedContent.set(this.typedContent() + this.pendingContent());\r\n this.pendingContent.set('');\r\n }\r\n }\r\n });\r\n\r\n this.reasoningTypedContentObserver.subscribe(() => {\r\n const finalReasoningContent = this.typing()\r\n ? this.reasoningTypedContent()\r\n : (this.reasoningContent() as string) || '';\r\n const setValue = (value: string) => {\r\n this.reasoningRenderedContent.set(this.sanitizer.bypassSecurityTrustHtml(value));\r\n };\r\n\r\n if (this.renderer() && XIsString(finalReasoningContent)) {\r\n const rendered = this.renderer()!(finalReasoningContent);\r\n if (isObservable(rendered)) {\r\n rendered.subscribe((value) => {\r\n setValue(value);\r\n });\r\n } else {\r\n setValue(rendered as string);\r\n }\r\n } else {\r\n setValue(finalReasoningContent);\r\n }\r\n });\r\n\r\n this.typedContentObserver.subscribe(() => {\r\n const finalContent = this.typing() ? this.typedContent() : (this.content() as string) || '';\r\n const setValue = (value: string) => {\r\n this.renderedContent.set(this.sanitizer.bypassSecurityTrustHtml(value));\r\n };\r\n\r\n if (this.renderer() && XIsString(finalContent)) {\r\n const rendered = this.renderer()!(finalContent);\r\n if (isObservable(rendered)) {\r\n rendered.subscribe((value) => {\r\n setValue(value);\r\n });\r\n } else {\r\n setValue(rendered as string);\r\n }\r\n } else {\r\n setValue(finalContent);\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const { content, reasoningContent } = changes;\r\n\r\n if (reasoningContent && this.isReasoningString()) {\r\n const newReasoningContent = reasoningContent.currentValue || '';\r\n const currentTypedReasoningContent = this.reasoningTypedContent();\r\n\r\n if (!this.typing()) {\r\n this.reasoningTypedContent.set(newReasoningContent);\r\n return;\r\n }\r\n\r\n if (newReasoningContent.startsWith(currentTypedReasoningContent)) {\r\n this.reasoningPendingContent.set(newReasoningContent.substring(currentTypedReasoningContent.length));\r\n if (this.reasoningPendingContent().length > 0 && !this.typingInterval) {\r\n this.startTyping();\r\n }\r\n } else {\r\n this.stopTyping();\r\n this.reasoningTypedContent.set('');\r\n this.reasoningPendingContent.set(newReasoningContent);\r\n this.startTyping();\r\n }\r\n }\r\n\r\n if (content && this.isString()) {\r\n const newFullContent = content.currentValue || '';\r\n const currentTypedContent = this.typedContent();\r\n\r\n if (!this.typing()) {\r\n if (this.reasoningPendingContent().length === 0) {\r\n this.typedContent.set(newFullContent);\r\n }\r\n return;\r\n }\r\n\r\n if (newFullContent.startsWith(currentTypedContent)) {\r\n this.pendingContent.set(newFullContent.substring(currentTypedContent.length));\r\n if (this.reasoningPendingContent().length === 0 && this.pendingContent().length > 0 && !this.typingInterval) {\r\n this.startTyping();\r\n }\r\n } else {\r\n this.stopTyping();\r\n this.typedContent.set('');\r\n this.pendingContent.set(newFullContent);\r\n if (this.reasoningPendingContent().length === 0 && this.pendingContent().length > 0) {\r\n this.startTyping();\r\n }\r\n }\r\n }\r\n }\r\n\r\n private startTyping(): void {\r\n if (this.typingInterval) {\r\n return;\r\n }\r\n\r\n if (this.reasoningPendingContent().length === 0 && this.pendingContent().length === 0) {\r\n return;\r\n }\r\n\r\n this.typingStart.emit();\r\n this.typingInterval = setInterval(() => {\r\n if (this.reasoningPendingContent().length > 0) {\r\n const nextChar = this.reasoningPendingContent().charAt(0);\r\n this.reasoningTypedContent.update((current) => current + nextChar);\r\n this.reasoningPendingContent.update((current) => current.substring(1));\r\n this.typingOuput.emit(nextChar);\r\n } else if (this.pendingContent().length > 0) {\r\n const nextChar = this.pendingContent().charAt(0);\r\n this.typedContent.update((current) => current + nextChar);\r\n this.pendingContent.update((current) => current.substring(1));\r\n this.typingOuput.emit(nextChar);\r\n } else {\r\n this.typingEnd.emit();\r\n this.stopTyping();\r\n }\r\n }, this.speed());\r\n }\r\n\r\n private stopTyping(): void {\r\n if (this.typingInterval) {\r\n clearInterval(this.typingInterval);\r\n this.typingInterval = null;\r\n }\r\n }\r\n\r\n onReasoningToggle() {\r\n this.reasoningToggle.update((x) => !x);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stopTyping();\r\n }\r\n}\r\n","<div class=\"x-bubble\" [ngClass]=\"classMap()\">\r\n @if (!!avatar()) {\r\n <div class=\"x-bubble-avatar\" [class.x-bubble-avatar-hidden]=\"avatar()?.hidden\">\r\n <x-avatar\r\n [icon]=\"avatar()?.icon!\"\r\n [label]=\"avatar()?.label!\"\r\n [src]=\"avatar()?.src!\"\r\n [size]=\"avatar()?.size ?? sizeSignal()\"\r\n [gap]=\"avatar()?.gap ?? '0.25rem'\"\r\n [fit]=\"avatar()?.fit ?? 'cover'\"\r\n [backgroundColor]=\"avatar()?.backgroundColor ?? '#999999'\"\r\n [color]=\"avatar()?.color ?? '#FFFFFF'\"\r\n [shape]=\"avatar()?.shape ?? 'circle'\"\r\n ></x-avatar>\r\n </div>\r\n }\r\n <div #wrapperRef class=\"x-bubble-wrapper\">\r\n @if (loading()) {\r\n <div class=\"x-bubble-content\" [x-loading]=\"true\" [size]=\"'small'\" inline></div>\r\n } @else {\r\n @if (header()) {\r\n <div class=\"x-bubble-header\">\r\n <ng-container *xOutlet=\"header()\">{{ header() }}</ng-container>\r\n </div>\r\n }\r\n\r\n @if (isReasoningString()) {\r\n <div class=\"x-bubble-reasoning\">\r\n <ng-container *xOutlet=\"reasoningHeaderTpl\"></ng-container>\r\n @if (reasoningToggle()) {\r\n <div class=\"x-bubble-reasoning-content\" #reasoningContentRef [innerHTML]=\"reasoningRenderedContent()\"></div>\r\n }\r\n </div>\r\n } @else if (isReasoningTemplate()) {\r\n <div class=\"x-bubble-reasoning\">\r\n <ng-container *xOutlet=\"reasoningHeaderTpl\"></ng-container>\r\n @if (reasoningToggle()) {\r\n <div class=\"x-bubble-reasoning-content\" #reasoningContentRef>\r\n <ng-container *xOutlet=\"reasoningContent()\"></ng-container>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <ng-template #reasoningHeaderTpl>\r\n <div class=\"x-bubble-reasoning-header\" (click)=\"onReasoningToggle()\">\r\n <x-icon\r\n class=\"x-bubble-reasoning-toggle\"\r\n [type]=\"reasoningToggle() ? 'fto-chevron-down' : 'fto-chevron-right'\"\r\n ></x-icon>\r\n <span>{{ reasoningTitle() }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n @if (isString()) {\r\n <div class=\"x-bubble-content\" #contentRef [innerHTML]=\"renderedContent()\"></div>\r\n } @else if (isTemplate()) {\r\n <div class=\"x-bubble-content\" #contentRef>\r\n <ng-container *xOutlet=\"content()\"></ng-container>\r\n </div>\r\n }\r\n\r\n @if (footer()) {\r\n <div class=\"x-bubble-footer\">\r\n <ng-container *xOutlet=\"footer()\">{{ footer() }}</ng-container>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n contentChildren,\r\n ElementRef,\r\n inject,\r\n Renderer2,\r\n ViewEncapsulation\r\n} from '@angular/core';\r\nimport { XBubblesProperty } from './bubble.property';\r\nimport { XBubbleComponent } from './bubble.component';\r\nimport { fromEvent, Subject, Subscription, takeUntil } from 'rxjs';\r\nimport { X_BUBBLES_CONTEXT, XBubblesContext } from './bubbles.token';\r\n\r\n@Component({\r\n selector: 'x-bubbles',\r\n templateUrl: './bubbles.component.html',\r\n styleUrls: ['./bubbles.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [],\r\n providers: [\r\n {\r\n provide: X_BUBBLES_CONTEXT,\r\n useExisting: XBubblesComponent\r\n }\r\n ]\r\n})\r\nexport class XBubblesComponent extends XBubblesProperty implements XBubblesContext {\r\n elementRef = inject(ElementRef);\r\n renderer = inject(Renderer2);\r\n\r\n private parentScrollElement: HTMLElement | null = null;\r\n private isFollowing = true;\r\n private removeScrollListener: Subscription | null = null;\r\n private contentMutationObserver: MutationObserver | null = null;\r\n private typingObserver: MutationObserver | null = null;\r\n private $destroy = new Subject<void>();\r\n\r\n bubbles = contentChildren(XBubbleComponent);\r\n\r\n ngAfterViewInit(): void {\r\n this.stepScroll();\r\n this.observeContentChanges();\r\n }\r\n\r\n ngDoCheck(): void {\r\n const bubbles = this.bubbles();\r\n if (bubbles.length <= 0) return;\r\n const lastBubble = bubbles[bubbles.length - 1];\r\n if (\r\n lastBubble &&\r\n lastBubble.typing() &&\r\n (lastBubble.pendingContent().length > 0 || lastBubble.reasoningPendingContent().length > 0)\r\n ) {\r\n if (!this.typingObserver) {\r\n this.startTypingObserver(lastBubble);\r\n }\r\n } else {\r\n if (this.typingObserver) {\r\n this.stopTypingObserver();\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.removeScrollListener?.unsubscribe();\r\n this.contentMutationObserver?.disconnect();\r\n this.stopTypingObserver();\r\n this.$destroy.next();\r\n this.$destroy.complete();\r\n }\r\n\r\n private stepScroll() {\r\n const newScroll = this.getParentScrollElement(this.elementRef.nativeElement);\r\n if (this.parentScrollElement && newScroll === this.parentScrollElement) return;\r\n this.parentScrollElement = newScroll;\r\n if (this.parentScrollElement) {\r\n this.removeScrollListener?.unsubscribe();\r\n this.removeScrollListener = fromEvent(this.parentScrollElement, 'scroll')\r\n .pipe(takeUntil(this.$destroy))\r\n .subscribe((event: Event) => {\r\n const atBottom =\r\n this.parentScrollElement!.scrollHeight - this.parentScrollElement!.scrollTop ===\r\n this.parentScrollElement!.clientHeight;\r\n if (!atBottom) {\r\n this.isFollowing = false;\r\n } else {\r\n this.isFollowing = true;\r\n }\r\n this.scrollChange.emit(event);\r\n });\r\n }\r\n }\r\n\r\n private getParentScrollElement(element: HTMLElement): HTMLElement | null {\r\n let parent = this.renderer.parentNode(element) as HTMLElement;\r\n while (parent && parent.nodeType === 1) {\r\n const overflowY = getComputedStyle(parent).overflowY;\r\n if (overflowY === 'auto' || overflowY === 'scroll') {\r\n return parent;\r\n }\r\n parent = this.renderer.parentNode(parent);\r\n }\r\n return null;\r\n }\r\n private observeContentChanges(): void {\r\n this.contentMutationObserver = new MutationObserver(() => {\r\n this.isFollowing = true;\r\n this.scrollToBottom();\r\n });\r\n\r\n this.contentMutationObserver.observe(this.elementRef.nativeElement, { childList: true });\r\n }\r\n\r\n private startTypingObserver(bubble: XBubbleComponent): void {\r\n const bubbleContent = bubble.wrapperRef()?.nativeElement;\r\n if (bubbleContent) {\r\n this.typingObserver = new MutationObserver(() => {\r\n if (this.isFollowing) {\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.typingObserver.observe(bubbleContent, {\r\n childList: true,\r\n subtree: true,\r\n characterData: true\r\n });\r\n }\r\n }\r\n\r\n private stopTypingObserver(): void {\r\n if (this.typingObserver) {\r\n this.typingObserver.disconnect();\r\n this.typingObserver = null;\r\n }\r\n }\r\n\r\n scrollToBottom(): void {\r\n this.stepScroll();\r\n if (this.parentScrollElement) {\r\n this.parentScrollElement.scrollTop = this.parentScrollElement.scrollHeight;\r\n }\r\n }\r\n\r\n scrollToTop(): void {\r\n this.stepScroll();\r\n if (this.parentScrollElement) {\r\n this.parentScrollElement.scrollTop = 0;\r\n }\r\n }\r\n}\r\n","<ng-content></ng-content>\r\n","import { NgModule } from '@angular/core';\r\nimport { XBubbleComponent } from './bubble.component';\r\nimport { XBubblesComponent } from './bubbles.component';\r\n\r\n@NgModule({\r\n exports: [XBubbleComponent, XBubblesComponent],\r\n imports: [XBubbleComponent, XBubblesComponent]\r\n})\r\nexport class XBubbleModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-nest-ui-bubble.mjs","sources":["../../../../lib/ng-nest/ui/bubble/bubble.property.ts","../../../../lib/ng-nest/ui/bubble/bubbles.token.ts","../../../../lib/ng-nest/ui/bubble/bubble.component.ts","../../../../lib/ng-nest/ui/bubble/bubble.component.html","../../../../lib/ng-nest/ui/bubble/bubbles.component.ts","../../../../lib/ng-nest/ui/bubble/bubbles.component.html","../../../../lib/ng-nest/ui/bubble/bubble.module.ts","../../../../lib/ng-nest/ui/bubble/ng-nest-ui-bubble.ts"],"sourcesContent":["import { Component, input, output } from '@angular/core';\r\nimport { XBoolean, XNumber, XPropertyFunction, XSize, XTemplate, XToBoolean, XToNumber } from '@ng-nest/ui/core';\r\nimport { XAvatarOption } from '@ng-nest/ui/avatar';\r\nimport { Observable } from 'rxjs';\r\n\r\n/**\r\n * Bubble\r\n * @selector x-bubble\r\n * @decorator component\r\n */\r\nexport const XBubblePrefix = 'x-bubble';\r\nconst X_BUBBLE_CONFIG_NAME = 'bubble';\r\n\r\n/**\r\n * Bubble Property\r\n */\r\n@Component({ selector: `${XBubblePrefix}-property`, template: '' })\r\nexport class XBubbleProperty extends XPropertyFunction(X_BUBBLE_CONFIG_NAME) {\r\n /**\r\n * @zh_CN 气泡内容\r\n * @en_US Bubble content\r\n */\r\n readonly content = input<XTemplate>();\r\n /**\r\n * @zh_CN 推理内容\r\n * @en_US reasoning content\r\n */\r\n readonly reasoningContent = input<XTemplate>();\r\n /**\r\n * @zh_CN 推理标题\r\n * @en_US reasoning title\r\n */\r\n readonly reasoningTitle = input<XTemplate>(this.config?.reasoningTitle ?? '深度思考');\r\n /**\r\n * @zh_CN 头像\r\n * @en_US Avatar\r\n */\r\n readonly avatar = input<XBubbleAvatarOption>();\r\n /**\r\n * @zh_CN 尺寸\r\n * @en_US Size\r\n */\r\n readonly size = input<XSize>(this.config?.size ?? 'medium');\r\n /**\r\n * @zh_CN 形态变体\r\n * @en_US Bubble variant\r\n */\r\n readonly variant = input<XBubbleVariant>(this.config?.variant ?? 'outlined');\r\n /**\r\n * @zh_CN 位置\r\n * @en_US Bubble placement\r\n */\r\n readonly placement = input<XBubblePlacement>('start');\r\n /**\r\n * @zh_CN 气泡头部内容\r\n * @en_US Bubble header content\r\n */\r\n readonly header = input<XTemplate>();\r\n /**\r\n * @zh_CN 气泡底部内容\r\n * @en_US Bubble header content\r\n */\r\n readonly footer = input<XTemplate>();\r\n /**\r\n * @zh_CN 加载中\r\n * @en_US Loading\r\n */\r\n readonly loading = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 内容输出打字机效果\r\n * @en_US Typing effect\r\n */\r\n readonly typing = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 打字机输出速度\r\n * @en_US Typing speed\r\n */\r\n readonly speed = input<number, XNumber>(30, { transform: XToNumber });\r\n /**\r\n * @zh_CN 内容渲染器,可自定义内容的渲染方式,如 HTML、Markdown\r\n * @en_US Content renderer, can customize content rendering, such as HTML, Markdown\r\n */\r\n readonly renderer = input<XBubbleContentRenderer>();\r\n /**\r\n * @zh_CN 是否显示打字机光标\r\n * @en_US Whether to show the typing cursor\r\n */\r\n readonly showCursor = input<boolean, XBoolean>(false, { transform: XToBoolean });\r\n /**\r\n * @zh_CN 打字开始\r\n * @en_US Typing start\r\n */\r\n readonly typingStart = output<void>();\r\n /**\r\n * @zh_CN 打字正在输出的字符\r\n * @en_US Typing output character\r\n */\r\n readonly typingOuput = output<string>();\r\n /**\r\n * @zh_CN 打字结束\r\n * @en_US Typing end\r\n */\r\n readonly typingEnd = output<void>();\r\n}\r\n\r\n/**\r\n * @zh_CN 头像配置,继承了组件 Avatar 相关属性\r\n * @en_US Avatar settings\r\n */\r\nexport interface XBubbleAvatarOption extends XAvatarOption {\r\n /**\r\n * @zh_CN 是否显示头像\r\n * @en_US Whether to show the avatar\r\n */\r\n hidden?: boolean;\r\n}\r\n\r\n/**\r\n * Bubbles\r\n * @selector x-bubbles\r\n * @decorator component\r\n */\r\nexport const XBubblesPrefix = 'x-bubbles';\r\nconst X_BUBBLES_CONFIG_NAME = 'bubbles';\r\n\r\n/**\r\n * Bubbles Property\r\n */\r\n@Component({ selector: `${XBubblesPrefix}-property`, template: '' })\r\nexport class XBubblesProperty extends XPropertyFunction(X_BUBBLES_CONFIG_NAME) {\r\n /**\r\n * @zh_CN 尺寸\r\n * @en_US Size\r\n */\r\n readonly size = input<XSize>();\r\n /**\r\n * @zh_CN 形态变体\r\n * @en_US Bubble variant\r\n */\r\n readonly variant = input<XBubbleVariant>();\r\n /**\r\n * @zh_CN 滚动条滚动事件,自动获取父级可滚动的元素\r\n * @en_US Scroll event of the scroll bar, automatically obtaining the scrollable element of the parent\r\n */\r\n readonly scrollChange = output<Event>();\r\n}\r\n\r\n/**\r\n * @zh_CN 形态变体\r\n * @en_US Bubble variant\r\n */\r\nexport type XBubbleVariant = 'outlined' | 'filled' | 'shadow' | 'borderless';\r\n\r\n/**\r\n * @zh_CN 位置\r\n * @en_US Bubble placement\r\n */\r\nexport type XBubblePlacement = 'start' | 'end';\r\n\r\n/**\r\n * @zh_CN 内容渲染函数\r\n * @en_US Bubble content renderer\r\n */\r\nexport type XBubbleContentRenderer = (content: string) => string | Observable<string> | undefined;\r\n","import { InjectionToken, Signal } from '@angular/core';\r\n\r\nexport interface XBubblesContext {\r\n size: Signal<string | undefined>;\r\n variant: Signal<string | undefined>;\r\n}\r\n\r\nexport const X_BUBBLES_CONTEXT = new InjectionToken<XBubblesContext>('X_BUBBLES_CONTEXT');\r\n","import {\r\n Component,\r\n ViewEncapsulation,\r\n ChangeDetectionStrategy,\r\n computed,\r\n viewChild,\r\n ElementRef,\r\n signal,\r\n effect,\r\n SimpleChanges,\r\n inject,\r\n Renderer2,\r\n ChangeDetectorRef\r\n} from '@angular/core';\r\nimport { XBubblePrefix, XBubbleProperty } from './bubble.property';\r\nimport { XOutletDirective } from '@ng-nest/ui/outlet';\r\nimport { XIsEmpty, XIsString, XIsTemplateRef, XSize, XVariant } from '@ng-nest/ui/core';\r\nimport { NgClass } from '@angular/common';\r\nimport { XAvatarComponent } from '@ng-nest/ui/avatar';\r\nimport { XLoadingComponent } from '@ng-nest/ui/loading';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { toObservable } from '@angular/core/rxjs-interop';\r\nimport { isObservable } from 'rxjs';\r\nimport { XIconComponent } from '@ng-nest/ui/icon';\r\nimport { X_BUBBLES_CONTEXT } from './bubbles.token';\r\n\r\n@Component({\r\n selector: 'x-bubble',\r\n templateUrl: './bubble.component.html',\r\n styleUrls: ['./bubble.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [NgClass, XOutletDirective, XAvatarComponent, XIconComponent, XLoadingComponent]\r\n})\r\nexport class XBubbleComponent extends XBubbleProperty {\r\n sanitizer = inject(DomSanitizer);\r\n renderer2 = inject(Renderer2);\r\n cdr = inject(ChangeDetectorRef);\r\n private bubbles = inject(X_BUBBLES_CONTEXT, { optional: true });\r\n\r\n wrapperRef = viewChild<ElementRef<HTMLElement>>('wrapperRef');\r\n\r\n classMap = computed(() => ({\r\n [`${XBubblePrefix}-${this.variantSignal()}`]: !XIsEmpty(this.variantSignal()),\r\n [`${XBubblePrefix}-${this.placement()}`]: !XIsEmpty(this.placement()),\r\n [`${XBubblePrefix}-cursor`]: this.showCursor() && this.typing(),\r\n [`${XBubblePrefix}-typing`]:\r\n this.typing() && (this.pendingContent().length > 0 || this.reasoningPendingContent().length > 0),\r\n [`x-${this.sizeSignal()}`]: !XIsEmpty(this.sizeSignal())\r\n }));\r\n\r\n typedContent = signal('');\r\n typedContentObserver = toObservable(this.typedContent);\r\n pendingContent = signal('');\r\n pendingContentObserver = toObservable(this.pendingContent);\r\n\r\n reasoningTypedContent = signal('');\r\n reasoningTypedContentObserver = toObservable(this.reasoningTypedContent);\r\n reasoningPendingContent = signal('');\r\n reasoningRenderedContent = signal<SafeHtml>('');\r\n reasoningToggle = signal(true);\r\n\r\n private typingInterval: any = null;\r\n renderedContent = signal<SafeHtml>('');\r\n\r\n sizeSignal = computed(() => {\r\n return (this.bubbles?.size() || this.size()) as XSize;\r\n });\r\n\r\n variantSignal = computed(() => {\r\n return (this.bubbles?.variant() || this.variant()) as XVariant;\r\n });\r\n\r\n isTemplate = computed(() => {\r\n return XIsTemplateRef(this.content());\r\n });\r\n\r\n isString = computed(() => {\r\n return XIsString(this.content());\r\n });\r\n\r\n isReasoningTemplate = computed(() => {\r\n return XIsTemplateRef(this.reasoningContent());\r\n });\r\n\r\n isReasoningString = computed(() => {\r\n return XIsString(this.reasoningContent()) && !XIsEmpty(this.reasoningContent());\r\n });\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n if (this.isString() && !this.typing()) {\r\n this.stopTyping();\r\n\r\n if (this.reasoningPendingContent().length === 0) {\r\n this.typedContent.set(this.typedContent() + this.pendingContent());\r\n this.pendingContent.set('');\r\n }\r\n }\r\n });\r\n\r\n this.reasoningTypedContentObserver.subscribe(() => {\r\n const finalReasoningContent = this.typing()\r\n ? this.reasoningTypedContent()\r\n : (this.reasoningContent() as string) || '';\r\n const setValue = (value: string) => {\r\n this.reasoningRenderedContent.set(this.sanitizer.bypassSecurityTrustHtml(value));\r\n };\r\n\r\n if (this.renderer() && XIsString(finalReasoningContent)) {\r\n const rendered = this.renderer()!(finalReasoningContent);\r\n if (isObservable(rendered)) {\r\n rendered.subscribe((value) => {\r\n setValue(value);\r\n });\r\n } else {\r\n setValue(rendered as string);\r\n }\r\n } else {\r\n setValue(finalReasoningContent);\r\n }\r\n });\r\n\r\n this.typedContentObserver.subscribe(() => {\r\n const finalContent = this.typing() ? this.typedContent() : (this.content() as string) || '';\r\n const setValue = (value: string) => {\r\n this.renderedContent.set(this.sanitizer.bypassSecurityTrustHtml(value));\r\n };\r\n\r\n if (this.renderer() && XIsString(finalContent)) {\r\n const rendered = this.renderer()!(finalContent);\r\n if (isObservable(rendered)) {\r\n rendered.subscribe((value) => {\r\n setValue(value);\r\n });\r\n } else {\r\n setValue(rendered as string);\r\n }\r\n } else {\r\n setValue(finalContent);\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n const { content, reasoningContent } = changes;\r\n\r\n if (reasoningContent && this.isReasoningString()) {\r\n const newReasoningContent = reasoningContent.currentValue || '';\r\n const currentTypedReasoningContent = this.reasoningTypedContent();\r\n\r\n if (!this.typing()) {\r\n this.reasoningTypedContent.set(newReasoningContent);\r\n return;\r\n }\r\n\r\n if (newReasoningContent.startsWith(currentTypedReasoningContent)) {\r\n this.reasoningPendingContent.set(newReasoningContent.substring(currentTypedReasoningContent.length));\r\n if (this.reasoningPendingContent().length > 0 && !this.typingInterval) {\r\n this.startTyping();\r\n }\r\n } else {\r\n this.stopTyping();\r\n this.reasoningTypedContent.set('');\r\n this.reasoningPendingContent.set(newReasoningContent);\r\n this.startTyping();\r\n }\r\n }\r\n\r\n if (content && this.isString()) {\r\n const newFullContent = content.currentValue || '';\r\n const currentTypedContent = this.typedContent();\r\n\r\n if (!this.typing()) {\r\n if (this.reasoningPendingContent().length === 0) {\r\n this.typedContent.set(newFullContent);\r\n }\r\n return;\r\n }\r\n\r\n if (newFullContent.startsWith(currentTypedContent)) {\r\n this.pendingContent.set(newFullContent.substring(currentTypedContent.length));\r\n if (this.reasoningPendingContent().length === 0 && this.pendingContent().length > 0 && !this.typingInterval) {\r\n this.startTyping();\r\n }\r\n } else {\r\n this.stopTyping();\r\n this.typedContent.set('');\r\n this.pendingContent.set(newFullContent);\r\n if (this.reasoningPendingContent().length === 0 && this.pendingContent().length > 0) {\r\n this.startTyping();\r\n }\r\n }\r\n }\r\n }\r\n\r\n private startTyping(): void {\r\n if (this.typingInterval) {\r\n return;\r\n }\r\n\r\n if (this.reasoningPendingContent().length === 0 && this.pendingContent().length === 0) {\r\n return;\r\n }\r\n\r\n this.typingStart.emit();\r\n this.typingInterval = setInterval(() => {\r\n if (this.reasoningPendingContent().length > 0) {\r\n const nextChar = this.reasoningPendingContent().charAt(0);\r\n this.reasoningTypedContent.update((current) => current + nextChar);\r\n this.reasoningPendingContent.update((current) => current.substring(1));\r\n this.typingOuput.emit(nextChar);\r\n } else if (this.pendingContent().length > 0) {\r\n const nextChar = this.pendingContent().charAt(0);\r\n this.typedContent.update((current) => current + nextChar);\r\n this.pendingContent.update((current) => current.substring(1));\r\n this.typingOuput.emit(nextChar);\r\n } else {\r\n this.typingEnd.emit();\r\n this.stopTyping();\r\n }\r\n }, this.speed());\r\n }\r\n\r\n private stopTyping(): void {\r\n if (this.typingInterval) {\r\n clearInterval(this.typingInterval);\r\n this.typingInterval = null;\r\n }\r\n }\r\n\r\n onReasoningToggle() {\r\n this.reasoningToggle.update((x) => !x);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stopTyping();\r\n }\r\n}\r\n","<div class=\"x-bubble\" [ngClass]=\"classMap()\">\r\n @if (!!avatar()) {\r\n <div class=\"x-bubble-avatar\" [class.x-bubble-avatar-hidden]=\"avatar()?.hidden\">\r\n <x-avatar\r\n [icon]=\"avatar()?.icon!\"\r\n [label]=\"avatar()?.label!\"\r\n [src]=\"avatar()?.src!\"\r\n [size]=\"avatar()?.size ?? sizeSignal()\"\r\n [gap]=\"avatar()?.gap ?? '0.25rem'\"\r\n [fit]=\"avatar()?.fit ?? 'cover'\"\r\n [backgroundColor]=\"avatar()?.backgroundColor ?? '#999999'\"\r\n [color]=\"avatar()?.color ?? '#FFFFFF'\"\r\n [shape]=\"avatar()?.shape ?? 'circle'\"\r\n ></x-avatar>\r\n </div>\r\n }\r\n <div #wrapperRef class=\"x-bubble-wrapper\">\r\n @if (loading()) {\r\n <div class=\"x-bubble-content\" [x-loading]=\"true\" [size]=\"'small'\" inline></div>\r\n } @else {\r\n @if (header()) {\r\n <div class=\"x-bubble-header\">\r\n <ng-container *xOutlet=\"header()\">{{ header() }}</ng-container>\r\n </div>\r\n }\r\n\r\n @if (isReasoningString()) {\r\n <div class=\"x-bubble-reasoning\">\r\n <ng-container *xOutlet=\"reasoningHeaderTpl\"></ng-container>\r\n @if (reasoningToggle()) {\r\n <div class=\"x-bubble-reasoning-content\" #reasoningContentRef [innerHTML]=\"reasoningRenderedContent()\"></div>\r\n }\r\n </div>\r\n } @else if (isReasoningTemplate()) {\r\n <div class=\"x-bubble-reasoning\">\r\n <ng-container *xOutlet=\"reasoningHeaderTpl\"></ng-container>\r\n @if (reasoningToggle()) {\r\n <div class=\"x-bubble-reasoning-content\" #reasoningContentRef>\r\n <ng-container *xOutlet=\"reasoningContent()\"></ng-container>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <ng-template #reasoningHeaderTpl>\r\n <div class=\"x-bubble-reasoning-header\" (click)=\"onReasoningToggle()\">\r\n <x-icon\r\n class=\"x-bubble-reasoning-toggle\"\r\n [type]=\"reasoningToggle() ? 'fto-chevron-down' : 'fto-chevron-right'\"\r\n ></x-icon>\r\n <span>{{ reasoningTitle() }}</span>\r\n </div>\r\n </ng-template>\r\n\r\n @if (isString()) {\r\n <div class=\"x-bubble-content\" #contentRef [innerHTML]=\"renderedContent()\"></div>\r\n } @else if (isTemplate()) {\r\n <div class=\"x-bubble-content\" #contentRef>\r\n <ng-container *xOutlet=\"content()\"></ng-container>\r\n </div>\r\n }\r\n\r\n @if (footer()) {\r\n <div class=\"x-bubble-footer\">\r\n <ng-container *xOutlet=\"footer()\">{{ footer() }}</ng-container>\r\n </div>\r\n }\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n contentChildren,\r\n ElementRef,\r\n inject,\r\n Renderer2,\r\n ViewEncapsulation\r\n} from '@angular/core';\r\nimport { XBubblesProperty } from './bubble.property';\r\nimport { XBubbleComponent } from './bubble.component';\r\nimport { fromEvent, Subject, Subscription, takeUntil } from 'rxjs';\r\nimport { X_BUBBLES_CONTEXT, XBubblesContext } from './bubbles.token';\r\n\r\n@Component({\r\n selector: 'x-bubbles',\r\n templateUrl: './bubbles.component.html',\r\n styleUrls: ['./bubbles.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [],\r\n providers: [\r\n {\r\n provide: X_BUBBLES_CONTEXT,\r\n useExisting: XBubblesComponent\r\n }\r\n ]\r\n})\r\nexport class XBubblesComponent extends XBubblesProperty implements XBubblesContext {\r\n elementRef = inject(ElementRef);\r\n renderer = inject(Renderer2);\r\n\r\n private parentScrollElement: HTMLElement | null = null;\r\n private isFollowing = true;\r\n private removeScrollListener: Subscription | null = null;\r\n private contentMutationObserver: MutationObserver | null = null;\r\n private typingObserver: MutationObserver | null = null;\r\n private $destroy = new Subject<void>();\r\n\r\n bubbles = contentChildren(XBubbleComponent);\r\n\r\n ngAfterViewInit(): void {\r\n this.stepScroll();\r\n this.observeContentChanges();\r\n }\r\n\r\n ngDoCheck(): void {\r\n const bubbles = this.bubbles();\r\n if (bubbles.length <= 0) return;\r\n const lastBubble = bubbles[bubbles.length - 1];\r\n if (\r\n lastBubble &&\r\n lastBubble.typing() &&\r\n (lastBubble.pendingContent().length > 0 || lastBubble.reasoningPendingContent().length > 0)\r\n ) {\r\n if (!this.typingObserver) {\r\n this.startTypingObserver(lastBubble);\r\n }\r\n } else {\r\n if (this.typingObserver) {\r\n this.stopTypingObserver();\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.removeScrollListener?.unsubscribe();\r\n this.contentMutationObserver?.disconnect();\r\n this.stopTypingObserver();\r\n this.$destroy.next();\r\n this.$destroy.complete();\r\n }\r\n\r\n private stepScroll() {\r\n const newScroll = this.getParentScrollElement(this.elementRef.nativeElement);\r\n if (this.parentScrollElement && newScroll === this.parentScrollElement) return;\r\n this.parentScrollElement = newScroll;\r\n if (this.parentScrollElement) {\r\n this.removeScrollListener?.unsubscribe();\r\n this.removeScrollListener = fromEvent(this.parentScrollElement, 'scroll')\r\n .pipe(takeUntil(this.$destroy))\r\n .subscribe((event: Event) => {\r\n const atBottom =\r\n this.parentScrollElement!.scrollHeight - this.parentScrollElement!.scrollTop ===\r\n this.parentScrollElement!.clientHeight;\r\n if (!atBottom) {\r\n this.isFollowing = false;\r\n } else {\r\n this.isFollowing = true;\r\n }\r\n this.scrollChange.emit(event);\r\n });\r\n }\r\n }\r\n\r\n private getParentScrollElement(element: HTMLElement): HTMLElement | null {\r\n let parent = this.renderer.parentNode(element) as HTMLElement;\r\n while (parent && parent.nodeType === 1) {\r\n const overflowY = getComputedStyle(parent).overflowY;\r\n if (overflowY === 'auto' || overflowY === 'scroll') {\r\n return parent;\r\n }\r\n parent = this.renderer.parentNode(parent);\r\n }\r\n return null;\r\n }\r\n private observeContentChanges(): void {\r\n this.contentMutationObserver = new MutationObserver(() => {\r\n this.isFollowing = true;\r\n this.scrollToBottom();\r\n });\r\n\r\n this.contentMutationObserver.observe(this.elementRef.nativeElement, { childList: true });\r\n }\r\n\r\n private startTypingObserver(bubble: XBubbleComponent): void {\r\n const bubbleContent = bubble.wrapperRef()?.nativeElement;\r\n if (bubbleContent) {\r\n this.typingObserver = new MutationObserver(() => {\r\n if (this.isFollowing) {\r\n this.scrollToBottom();\r\n }\r\n });\r\n\r\n this.typingObserver.observe(bubbleContent, {\r\n childList: true,\r\n subtree: true,\r\n characterData: true\r\n });\r\n }\r\n }\r\n\r\n private stopTypingObserver(): void {\r\n if (this.typingObserver) {\r\n this.typingObserver.disconnect();\r\n this.typingObserver = null;\r\n }\r\n }\r\n\r\n scrollToBottom(): void {\r\n this.stepScroll();\r\n if (this.parentScrollElement) {\r\n this.parentScrollElement.scrollTop = this.parentScrollElement.scrollHeight;\r\n }\r\n }\r\n\r\n scrollToTop(): void {\r\n this.stepScroll();\r\n if (this.parentScrollElement) {\r\n this.parentScrollElement.scrollTop = 0;\r\n }\r\n }\r\n}\r\n","<ng-content></ng-content>\r\n","import { NgModule } from '@angular/core';\r\nimport { XBubbleComponent } from './bubble.component';\r\nimport { XBubblesComponent } from './bubbles.component';\r\n\r\n@NgModule({\r\n exports: [XBubbleComponent, XBubblesComponent],\r\n imports: [XBubbleComponent, XBubblesComponent]\r\n})\r\nexport class XBubbleModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}