@genesislcap/ai-assistant 14.403.0-ai-assistant.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/api-extractor.json +4 -0
  2. package/dist/ai-assistant.api.json +4028 -0
  3. package/dist/ai-assistant.d.ts +396 -0
  4. package/dist/dts/channel/ai-activity-channel.d.ts +32 -0
  5. package/dist/dts/channel/ai-activity-channel.d.ts.map +1 -0
  6. package/dist/dts/components/activity-halo/activity-halo.d.ts +31 -0
  7. package/dist/dts/components/activity-halo/activity-halo.d.ts.map +1 -0
  8. package/dist/dts/components/chat-bubble/chat-bubble.d.ts +52 -0
  9. package/dist/dts/components/chat-bubble/chat-bubble.d.ts.map +1 -0
  10. package/dist/dts/components/chat-bubble/chat-bubble.styles.d.ts +2 -0
  11. package/dist/dts/components/chat-bubble/chat-bubble.styles.d.ts.map +1 -0
  12. package/dist/dts/components/chat-bubble/chat-bubble.template.d.ts +4 -0
  13. package/dist/dts/components/chat-bubble/chat-bubble.template.d.ts.map +1 -0
  14. package/dist/dts/components/chat-bubble/index.d.ts +2 -0
  15. package/dist/dts/components/chat-bubble/index.d.ts.map +1 -0
  16. package/dist/dts/components/chat-driver/chat-driver.d.ts +49 -0
  17. package/dist/dts/components/chat-driver/chat-driver.d.ts.map +1 -0
  18. package/dist/dts/components/chat-driver/index.d.ts +2 -0
  19. package/dist/dts/components/chat-driver/index.d.ts.map +1 -0
  20. package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.d.ts +19 -0
  21. package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.d.ts.map +1 -0
  22. package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.styles.d.ts +2 -0
  23. package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.styles.d.ts.map +1 -0
  24. package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.template.d.ts +3 -0
  25. package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.template.d.ts.map +1 -0
  26. package/dist/dts/components/chat-interaction-wrapper/index.d.ts +4 -0
  27. package/dist/dts/components/chat-interaction-wrapper/index.d.ts.map +1 -0
  28. package/dist/dts/components/chat-markdown/chat-markdown.d.ts +6 -0
  29. package/dist/dts/components/chat-markdown/chat-markdown.d.ts.map +1 -0
  30. package/dist/dts/components/chat-markdown/index.d.ts +2 -0
  31. package/dist/dts/components/chat-markdown/index.d.ts.map +1 -0
  32. package/dist/dts/components/halo-overlay.d.ts +25 -0
  33. package/dist/dts/components/halo-overlay.d.ts.map +1 -0
  34. package/dist/dts/config/config.d.ts +51 -0
  35. package/dist/dts/config/config.d.ts.map +1 -0
  36. package/dist/dts/config/configure.d.ts +1 -0
  37. package/dist/dts/config/configure.d.ts.map +1 -0
  38. package/dist/dts/config/index.d.ts +2 -0
  39. package/dist/dts/config/index.d.ts.map +1 -0
  40. package/dist/dts/index.d.ts +10 -0
  41. package/dist/dts/index.d.ts.map +1 -0
  42. package/dist/dts/main/index.d.ts +5 -0
  43. package/dist/dts/main/index.d.ts.map +1 -0
  44. package/dist/dts/main/main.d.ts +103 -0
  45. package/dist/dts/main/main.d.ts.map +1 -0
  46. package/dist/dts/main/main.styles.d.ts +2 -0
  47. package/dist/dts/main/main.styles.d.ts.map +1 -0
  48. package/dist/dts/main/main.template.d.ts +4 -0
  49. package/dist/dts/main/main.template.d.ts.map +1 -0
  50. package/dist/dts/main/main.types.d.ts +54 -0
  51. package/dist/dts/main/main.types.d.ts.map +1 -0
  52. package/dist/dts/styles/index.d.ts +2 -0
  53. package/dist/dts/styles/index.d.ts.map +1 -0
  54. package/dist/dts/styles/styles.d.ts +5 -0
  55. package/dist/dts/styles/styles.d.ts.map +1 -0
  56. package/dist/dts/tags/index.d.ts +1 -0
  57. package/dist/dts/tags/index.d.ts.map +1 -0
  58. package/dist/dts/types/ai-chat-widget.d.ts +12 -0
  59. package/dist/dts/types/ai-chat-widget.d.ts.map +1 -0
  60. package/dist/dts/utils/index.d.ts +2 -0
  61. package/dist/dts/utils/index.d.ts.map +1 -0
  62. package/dist/dts/utils/logger.d.ts +2 -0
  63. package/dist/dts/utils/logger.d.ts.map +1 -0
  64. package/dist/esm/channel/ai-activity-channel.js +2 -0
  65. package/dist/esm/components/activity-halo/activity-halo.js +119 -0
  66. package/dist/esm/components/chat-bubble/chat-bubble.js +381 -0
  67. package/dist/esm/components/chat-bubble/chat-bubble.styles.js +193 -0
  68. package/dist/esm/components/chat-bubble/chat-bubble.template.js +50 -0
  69. package/dist/esm/components/chat-bubble/index.js +1 -0
  70. package/dist/esm/components/chat-driver/chat-driver.js +209 -0
  71. package/dist/esm/components/chat-driver/index.js +1 -0
  72. package/dist/esm/components/chat-interaction-wrapper/chat-interaction-wrapper.js +90 -0
  73. package/dist/esm/components/chat-interaction-wrapper/chat-interaction-wrapper.styles.js +6 -0
  74. package/dist/esm/components/chat-interaction-wrapper/chat-interaction-wrapper.template.js +4 -0
  75. package/dist/esm/components/chat-interaction-wrapper/index.js +3 -0
  76. package/dist/esm/components/chat-markdown/chat-markdown.js +95 -0
  77. package/dist/esm/components/chat-markdown/index.js +1 -0
  78. package/dist/esm/components/halo-overlay.js +118 -0
  79. package/dist/esm/config/config.js +16 -0
  80. package/dist/esm/config/configure.js +0 -0
  81. package/dist/esm/config/index.js +1 -0
  82. package/dist/esm/index.js +8 -0
  83. package/dist/esm/main/index.js +4 -0
  84. package/dist/esm/main/main.js +491 -0
  85. package/dist/esm/main/main.styles.js +356 -0
  86. package/dist/esm/main/main.template.js +272 -0
  87. package/dist/esm/main/main.types.js +22 -0
  88. package/dist/esm/styles/index.js +1 -0
  89. package/dist/esm/styles/styles.js +237 -0
  90. package/dist/esm/tags/index.js +0 -0
  91. package/dist/esm/types/ai-chat-widget.js +1 -0
  92. package/dist/esm/utils/index.js +1 -0
  93. package/dist/esm/utils/logger.js +2 -0
  94. package/dist/tsconfig.tsbuildinfo +1 -0
  95. package/dist/tsdoc-metadata.json +11 -0
  96. package/docs/.gitattributes +2 -0
  97. package/docs/api/ai-assistant.ai_activity_channel_name.md +11 -0
  98. package/docs/api/ai-assistant.aiactivityevents.md +24 -0
  99. package/docs/api/ai-assistant.aiactivityhalo.channelname.md +16 -0
  100. package/docs/api/ai-assistant.aiactivityhalo.connectedcallback.md +18 -0
  101. package/docs/api/ai-assistant.aiactivityhalo.disconnectedcallback.md +18 -0
  102. package/docs/api/ai-assistant.aiactivityhalo.haloactive.md +14 -0
  103. package/docs/api/ai-assistant.aiactivityhalo.md +176 -0
  104. package/docs/api/ai-assistant.aiactivityhalo.minshowtime.md +16 -0
  105. package/docs/api/ai-assistant.aiactivityhalo.tools.md +16 -0
  106. package/docs/api/ai-assistant.aiassistantanimation.md +18 -0
  107. package/docs/api/ai-assistant.aiassistantanimationdef.label.md +16 -0
  108. package/docs/api/ai-assistant.aiassistantanimationdef.md +80 -0
  109. package/docs/api/ai-assistant.aiassistantanimationdef.tooltip.md +16 -0
  110. package/docs/api/ai-assistant.aiassistantconfig.chatconfig.md +16 -0
  111. package/docs/api/ai-assistant.aiassistantconfig.debugstatefactory.md +16 -0
  112. package/docs/api/ai-assistant.aiassistantconfig.headertitle.md +16 -0
  113. package/docs/api/ai-assistant.aiassistantconfig.md +157 -0
  114. package/docs/api/ai-assistant.aiassistantconfig.systemprompt.md +16 -0
  115. package/docs/api/ai-assistant.aiassistantconfig.tooldefinitions.md +16 -0
  116. package/docs/api/ai-assistant.aiassistantconfig.toolhandlers.md +16 -0
  117. package/docs/api/ai-assistant.aiassistantserializedstate.enabledanimations.md +14 -0
  118. package/docs/api/ai-assistant.aiassistantserializedstate.md +118 -0
  119. package/docs/api/ai-assistant.aiassistantserializedstate.messages.md +14 -0
  120. package/docs/api/ai-assistant.aiassistantserializedstate.showthinkingsteps.md +14 -0
  121. package/docs/api/ai-assistant.aiassistantserializedstate.showtoolcalls.md +14 -0
  122. package/docs/api/ai-assistant.aiassistantstate.md +16 -0
  123. package/docs/api/ai-assistant.aichatbubble.bubbleleft.md +11 -0
  124. package/docs/api/ai-assistant.aichatbubble.bubbletop.md +11 -0
  125. package/docs/api/ai-assistant.aichatbubble.channelname.md +11 -0
  126. package/docs/api/ai-assistant.aichatbubble.connectedcallback.md +15 -0
  127. package/docs/api/ai-assistant.aichatbubble.designsystemprefix.md +11 -0
  128. package/docs/api/ai-assistant.aichatbubble.dialogcontent.md +11 -0
  129. package/docs/api/ai-assistant.aichatbubble.dialogcontentchanged.md +64 -0
  130. package/docs/api/ai-assistant.aichatbubble.dialogheight.md +11 -0
  131. package/docs/api/ai-assistant.aichatbubble.dialogleft.md +11 -0
  132. package/docs/api/ai-assistant.aichatbubble.dialogopen.md +11 -0
  133. package/docs/api/ai-assistant.aichatbubble.dialogopenchanged.md +64 -0
  134. package/docs/api/ai-assistant.aichatbubble.dialogtop.md +11 -0
  135. package/docs/api/ai-assistant.aichatbubble.dialogwidth.md +11 -0
  136. package/docs/api/ai-assistant.aichatbubble.disconnectedcallback.md +15 -0
  137. package/docs/api/ai-assistant.aichatbubble.hovered.md +11 -0
  138. package/docs/api/ai-assistant.aichatbubble.imagesrc.md +11 -0
  139. package/docs/api/ai-assistant.aichatbubble.md +396 -0
  140. package/docs/api/ai-assistant.aichatbubble.onbubblemousedown.md +50 -0
  141. package/docs/api/ai-assistant.aichatbubble.onclosedialog.md +15 -0
  142. package/docs/api/ai-assistant.aichatbubble.ondialogheadermousedown.md +53 -0
  143. package/docs/api/ai-assistant.aichatbubble.onpopout.md +15 -0
  144. package/docs/api/ai-assistant.aichatbubble.title.md +11 -0
  145. package/docs/api/ai-assistant.aichatbubble.tooltipstyle.md +11 -0
  146. package/docs/api/ai-assistant.aichatwidget.data.md +14 -0
  147. package/docs/api/ai-assistant.aichatwidget.md +80 -0
  148. package/docs/api/ai-assistant.aichatwidget.resolved.md +16 -0
  149. package/docs/api/ai-assistant.animation_defs.md +25 -0
  150. package/docs/api/ai-assistant.chatdriver._constructor_.md +99 -0
  151. package/docs/api/ai-assistant.chatdriver.gethistory.md +18 -0
  152. package/docs/api/ai-assistant.chatdriver.isbusy.md +18 -0
  153. package/docs/api/ai-assistant.chatdriver.loadhistory.md +55 -0
  154. package/docs/api/ai-assistant.chatdriver.md +158 -0
  155. package/docs/api/ai-assistant.chatdriver.requestinteraction.md +73 -0
  156. package/docs/api/ai-assistant.chatdriver.resolveinteraction.md +69 -0
  157. package/docs/api/ai-assistant.chatdriver.sendmessage.md +69 -0
  158. package/docs/api/ai-assistant.chathistoryupdatedevent.md +16 -0
  159. package/docs/api/ai-assistant.defaultaiassistantconfig.md +16 -0
  160. package/docs/api/ai-assistant.foundationaiassistant.aiprovider.md +14 -0
  161. package/docs/api/ai-assistant.foundationaiassistant.applystate.md +55 -0
  162. package/docs/api/ai-assistant.foundationaiassistant.attachmenterrors.md +14 -0
  163. package/docs/api/ai-assistant.foundationaiassistant.attachments.md +14 -0
  164. package/docs/api/ai-assistant.foundationaiassistant.channelname.md +14 -0
  165. package/docs/api/ai-assistant.foundationaiassistant.chatconfig.md +14 -0
  166. package/docs/api/ai-assistant.foundationaiassistant.connectedcallback.md +18 -0
  167. package/docs/api/ai-assistant.foundationaiassistant.debugstatefactory.md +14 -0
  168. package/docs/api/ai-assistant.foundationaiassistant.designsystemprefix.md +14 -0
  169. package/docs/api/ai-assistant.foundationaiassistant.disconnectedcallback.md +18 -0
  170. package/docs/api/ai-assistant.foundationaiassistant.downloadhistory.md +18 -0
  171. package/docs/api/ai-assistant.foundationaiassistant.enabledanimations.md +16 -0
  172. package/docs/api/ai-assistant.foundationaiassistant.handlefileselect.md +53 -0
  173. package/docs/api/ai-assistant.foundationaiassistant.handleinteractioncompleted.md +53 -0
  174. package/docs/api/ai-assistant.foundationaiassistant.handlepopout.md +20 -0
  175. package/docs/api/ai-assistant.foundationaiassistant.handlesendclick.md +18 -0
  176. package/docs/api/ai-assistant.foundationaiassistant.hasactivependinginteraction.md +16 -0
  177. package/docs/api/ai-assistant.foundationaiassistant.headertitle.md +14 -0
  178. package/docs/api/ai-assistant.foundationaiassistant.imagesrc.md +14 -0
  179. package/docs/api/ai-assistant.foundationaiassistant.inputvalue.md +14 -0
  180. package/docs/api/ai-assistant.foundationaiassistant.md +826 -0
  181. package/docs/api/ai-assistant.foundationaiassistant.messages.md +14 -0
  182. package/docs/api/ai-assistant.foundationaiassistant.messageschanged.md +18 -0
  183. package/docs/api/ai-assistant.foundationaiassistant.onchatheadermousedown.md +53 -0
  184. package/docs/api/ai-assistant.foundationaiassistant.placeholder.md +14 -0
  185. package/docs/api/ai-assistant.foundationaiassistant.popoutmode.md +16 -0
  186. package/docs/api/ai-assistant.foundationaiassistant.removeattachment.md +53 -0
  187. package/docs/api/ai-assistant.foundationaiassistant.removeattachmenterror.md +53 -0
  188. package/docs/api/ai-assistant.foundationaiassistant.setenabledanimations.md +53 -0
  189. package/docs/api/ai-assistant.foundationaiassistant.settingsopen.md +16 -0
  190. package/docs/api/ai-assistant.foundationaiassistant.showhalo.md +16 -0
  191. package/docs/api/ai-assistant.foundationaiassistant.showhalochanged.md +18 -0
  192. package/docs/api/ai-assistant.foundationaiassistant.showloadingindicator.md +16 -0
  193. package/docs/api/ai-assistant.foundationaiassistant.showloadingindicatorchanged.md +18 -0
  194. package/docs/api/ai-assistant.foundationaiassistant.showthinkingsteps.md +16 -0
  195. package/docs/api/ai-assistant.foundationaiassistant.showtoolcalls.md +16 -0
  196. package/docs/api/ai-assistant.foundationaiassistant.state.md +14 -0
  197. package/docs/api/ai-assistant.foundationaiassistant.statechanged.md +18 -0
  198. package/docs/api/ai-assistant.foundationaiassistant.systemprompt.md +14 -0
  199. package/docs/api/ai-assistant.foundationaiassistant.togglesettings.md +18 -0
  200. package/docs/api/ai-assistant.foundationaiassistant.toggleshowthinkingsteps.md +18 -0
  201. package/docs/api/ai-assistant.foundationaiassistant.toggleshowtoolcalls.md +18 -0
  202. package/docs/api/ai-assistant.foundationaiassistant.tooldefinitions.md +14 -0
  203. package/docs/api/ai-assistant.foundationaiassistant.toolhandlers.md +14 -0
  204. package/docs/api/ai-assistant.foundationaiassistant.triggerfileinput.md +18 -0
  205. package/docs/api/ai-assistant.foundationaiassistant.visiblemessages.md +16 -0
  206. package/docs/api/ai-assistant.foundationaiassistanttemplate.md +50 -0
  207. package/docs/api/ai-assistant.md +262 -0
  208. package/docs/api/ai-assistant.popoutmode.md +16 -0
  209. package/docs/api/index.md +30 -0
  210. package/docs/api-report.md.api.md +280 -0
  211. package/license.txt +46 -0
  212. package/package.json +92 -0
  213. package/src/channel/ai-activity-channel.ts +30 -0
  214. package/src/components/activity-halo/activity-halo.ts +113 -0
  215. package/src/components/chat-bubble/chat-bubble.styles.ts +194 -0
  216. package/src/components/chat-bubble/chat-bubble.template.ts +63 -0
  217. package/src/components/chat-bubble/chat-bubble.ts +389 -0
  218. package/src/components/chat-bubble/index.ts +1 -0
  219. package/src/components/chat-driver/chat-driver.ts +254 -0
  220. package/src/components/chat-driver/index.ts +1 -0
  221. package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.styles.ts +7 -0
  222. package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.template.ts +6 -0
  223. package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.ts +89 -0
  224. package/src/components/chat-interaction-wrapper/index.ts +3 -0
  225. package/src/components/chat-markdown/chat-markdown.ts +87 -0
  226. package/src/components/chat-markdown/index.ts +1 -0
  227. package/src/components/halo-overlay.ts +115 -0
  228. package/src/config/config.ts +59 -0
  229. package/src/config/configure.ts +0 -0
  230. package/src/config/index.ts +1 -0
  231. package/src/index.ts +9 -0
  232. package/src/main/index.ts +4 -0
  233. package/src/main/main.styles.ts +357 -0
  234. package/src/main/main.template.ts +364 -0
  235. package/src/main/main.ts +474 -0
  236. package/src/main/main.types.ts +58 -0
  237. package/src/styles/index.ts +1 -0
  238. package/src/styles/styles.ts +238 -0
  239. package/src/tags/index.ts +0 -0
  240. package/src/types/ai-chat-widget.ts +11 -0
  241. package/src/utils/index.ts +1 -0
  242. package/src/utils/logger.ts +3 -0
  243. package/temp/api-report.md.api.md +280 -0
  244. package/tsconfig.json +11 -0
@@ -0,0 +1,381 @@
1
+ import { __decorate } from "tslib";
2
+ import { createTypedBroadcastChannel } from '@genesislcap/foundation-broadcast-channel';
3
+ import { attr, customElement, GenesisElement, html, observable } from '@genesislcap/web-core';
4
+ import { AI_ACTIVITY_CHANNEL_NAME } from '../../channel/ai-activity-channel';
5
+ import { styles } from './chat-bubble.styles';
6
+ import { AiChatBubbleTemplate } from './chat-bubble.template';
7
+ /** Default dimensions of the dialog panel */
8
+ const DIALOG_DEFAULT_WIDTH = 400;
9
+ const DIALOG_DEFAULT_HEIGHT = 520;
10
+ /** Initial position: bubble starts this far from the right/bottom viewport edges */
11
+ const BUBBLE_INITIAL_RIGHT_OFFSET = 90;
12
+ /** Initial position: dialog starts this far from the right/bottom viewport edges */
13
+ const DIALOG_INITIAL_RIGHT_OFFSET = 440;
14
+ const DIALOG_INITIAL_BOTTOM_OFFSET = 570;
15
+ /** Minimum distance the dialog is allowed from any viewport edge */
16
+ const VIEWPORT_EDGE_MARGIN = 20;
17
+ /** Minimum pointer movement (px) to classify an interaction as a drag rather than a click */
18
+ const DRAG_THRESHOLD = 4;
19
+ /** Keeps the bubble fully inside the viewport when dragged (accounts for bubble size + border) */
20
+ const BUBBLE_DRAG_MARGIN = 64;
21
+ /** Horizontal offset between bubble center and dialog left edge when toggling open/close */
22
+ const DIALOG_BUBBLE_HORIZONTAL_OFFSET = 340;
23
+ /** How far above the bubble the dialog opens */
24
+ const DIALOG_OPEN_TOP_OFFSET = 470;
25
+ /** How far below the dialog top the bubble snaps when closing via the X button */
26
+ const BUBBLE_SNAP_BOTTOM_OFFSET = 458;
27
+ /** Fallback tooltip width used before the element has been measured in the DOM */
28
+ const TOOLTIP_FALLBACK_WIDTH = 155;
29
+ let AiChatBubble = class AiChatBubble extends GenesisElement {
30
+ constructor() {
31
+ super(...arguments);
32
+ this.title = 'AI Assistant';
33
+ this.channelName = AI_ACTIVITY_CHANNEL_NAME;
34
+ this.designSystemPrefix = 'rapid';
35
+ this.dialogContent = [];
36
+ this.tooltipMeasuredWidth = 0;
37
+ this.bubbleLeft = 0;
38
+ this.bubbleTop = 0;
39
+ this.dialogLeft = 0;
40
+ this.dialogTop = 0;
41
+ this.dialogWidth = DIALOG_DEFAULT_WIDTH;
42
+ this.dialogHeight = DIALOG_DEFAULT_HEIGHT;
43
+ this.dialogOpen = false;
44
+ this.hovered = false;
45
+ this.dragging = false;
46
+ this.dragTarget = null;
47
+ this.startMouseX = 0;
48
+ this.startMouseY = 0;
49
+ this.startElemLeft = 0;
50
+ this.startElemTop = 0;
51
+ this.hasDragged = false;
52
+ this.latestMouseX = 0;
53
+ this.latestMouseY = 0;
54
+ this.onBubbleChannelMessage = (event) => {
55
+ var _a, _b;
56
+ if (((_a = event.data) === null || _a === void 0 ? void 0 : _a.type) === 'chat-popout') {
57
+ this.startCloseDialog();
58
+ this.hidden = true;
59
+ }
60
+ else if (((_b = event.data) === null || _b === void 0 ? void 0 : _b.type) === 'chat-popin') {
61
+ this.cancelClose();
62
+ this.hidden = false;
63
+ this.dialogOpen = true;
64
+ }
65
+ };
66
+ this.onCloseBtnClick = () => this.onCloseDialog();
67
+ // Capture the latest pointer coords and schedule one rAF per display frame.
68
+ // Pointer events can fire far faster than the display refreshes (up to 1000Hz on
69
+ // gaming mice), so we only store the coords here and let applyDragFrame do the
70
+ // actual work. If a frame is already scheduled we just overwrite the coords —
71
+ // the pending frame will pick up the freshest values when it runs.
72
+ this.onDocMouseMove = (e) => {
73
+ if (!this.dragging)
74
+ return;
75
+ this.latestMouseX = e.clientX;
76
+ this.latestMouseY = e.clientY;
77
+ if (this.rafHandle === undefined) {
78
+ this.rafHandle = requestAnimationFrame(this.applyDragFrame);
79
+ }
80
+ };
81
+ // Runs once per display frame during a drag. Writes the new position directly to
82
+ // the element's style.translate rather than updating FAST observables, which keeps
83
+ // the compositor thread doing the work instead of triggering FAST's reactivity
84
+ // pipeline on every frame. This means the element's visual position is temporarily
85
+ // ahead of the observables — they are only synced back on mouseup (see onDocMouseUp).
86
+ // Note: style.translate is an independent CSS property and does not conflict with
87
+ // the transform used for the bubble's hover scale or the dialog's open animation.
88
+ this.applyDragFrame = () => {
89
+ var _a, _b;
90
+ this.rafHandle = undefined;
91
+ const dx = this.latestMouseX - this.startMouseX;
92
+ const dy = this.latestMouseY - this.startMouseY;
93
+ if (Math.abs(dx) > DRAG_THRESHOLD || Math.abs(dy) > DRAG_THRESHOLD)
94
+ this.hasDragged = true;
95
+ if (this.dragTarget === 'bubble') {
96
+ const left = Math.max(0, Math.min(window.innerWidth - BUBBLE_DRAG_MARGIN, this.startElemLeft + dx));
97
+ const top = Math.max(0, Math.min(window.innerHeight - BUBBLE_DRAG_MARGIN, this.startElemTop + dy));
98
+ const el = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.bubble');
99
+ if (el)
100
+ el.style.translate = `${left}px ${top}px`;
101
+ }
102
+ else if (this.dragTarget === 'dialog') {
103
+ const left = Math.max(0, Math.min(window.innerWidth - DIALOG_DEFAULT_WIDTH, this.startElemLeft + dx));
104
+ const top = Math.max(0, Math.min(window.innerHeight - 100, this.startElemTop + dy));
105
+ const el = (_b = this.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.dialog');
106
+ if (el)
107
+ el.style.translate = `${left}px ${top}px`;
108
+ }
109
+ };
110
+ // Commits the final drag position back to the FAST observables, bringing them back
111
+ // in sync with what the user sees. This triggers a single FAST re-render which writes
112
+ // the same value already on the element — no visible jump. Any pending rAF is
113
+ // cancelled first; its work is redundant since we recompute from latestMouseX/Y here.
114
+ this.onDocMouseUp = () => {
115
+ if (this.rafHandle !== undefined) {
116
+ cancelAnimationFrame(this.rafHandle);
117
+ this.rafHandle = undefined;
118
+ }
119
+ if (this.dragging) {
120
+ const dx = this.latestMouseX - this.startMouseX;
121
+ const dy = this.latestMouseY - this.startMouseY;
122
+ if (this.dragTarget === 'bubble') {
123
+ this.bubbleLeft = Math.max(0, Math.min(window.innerWidth - BUBBLE_DRAG_MARGIN, this.startElemLeft + dx));
124
+ this.bubbleTop = Math.max(0, Math.min(window.innerHeight - BUBBLE_DRAG_MARGIN, this.startElemTop + dy));
125
+ if (!this.hasDragged) {
126
+ if (this.dialogOpen) {
127
+ this.startCloseDialog();
128
+ }
129
+ else {
130
+ this.dialogLeft = Math.max(VIEWPORT_EDGE_MARGIN, this.bubbleLeft - DIALOG_BUBBLE_HORIZONTAL_OFFSET);
131
+ this.dialogTop = Math.max(VIEWPORT_EDGE_MARGIN, this.bubbleTop - DIALOG_OPEN_TOP_OFFSET);
132
+ this.dialogOpen = true;
133
+ }
134
+ }
135
+ }
136
+ else if (this.dragTarget === 'dialog') {
137
+ this.dialogLeft = Math.max(0, Math.min(window.innerWidth - DIALOG_DEFAULT_WIDTH, this.startElemLeft + dx));
138
+ this.dialogTop = Math.max(0, Math.min(window.innerHeight - 100, this.startElemTop + dy));
139
+ }
140
+ }
141
+ this.dragging = false;
142
+ this.dragTarget = null;
143
+ };
144
+ }
145
+ connectedCallback() {
146
+ super.connectedCallback();
147
+ this.bubbleLeft = window.innerWidth - BUBBLE_INITIAL_RIGHT_OFFSET;
148
+ this.bubbleTop = window.innerHeight - 100;
149
+ this.dialogLeft = Math.max(VIEWPORT_EDGE_MARGIN, window.innerWidth - DIALOG_INITIAL_RIGHT_OFFSET);
150
+ this.dialogTop = Math.max(VIEWPORT_EDGE_MARGIN, window.innerHeight - DIALOG_INITIAL_BOTTOM_OFFSET);
151
+ document.addEventListener('mousemove', this.onDocMouseMove);
152
+ document.addEventListener('mouseup', this.onDocMouseUp);
153
+ this.bubbleChannel = createTypedBroadcastChannel(this.channelName);
154
+ this.bubbleChannel.addEventListener('message', this.onBubbleChannelMessage);
155
+ // Measure tooltip width once after first render. The bubble is visible on connect
156
+ // (dialogOpen starts false), so the element is in the DOM by the time rAF fires.
157
+ // This value persists through open/close cycles — no re-measurement needed unless
158
+ // the title attribute changes.
159
+ requestAnimationFrame(() => {
160
+ var _a;
161
+ const el = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.tooltip');
162
+ if (el)
163
+ this.tooltipMeasuredWidth = el.offsetWidth;
164
+ });
165
+ }
166
+ disconnectedCallback() {
167
+ var _a, _b, _c, _d, _e, _f;
168
+ super.disconnectedCallback();
169
+ document.removeEventListener('mousemove', this.onDocMouseMove);
170
+ document.removeEventListener('mouseup', this.onDocMouseUp);
171
+ (_a = this.bubbleChannel) === null || _a === void 0 ? void 0 : _a.removeEventListener('message', this.onBubbleChannelMessage);
172
+ (_b = this.bubbleChannel) === null || _b === void 0 ? void 0 : _b.close();
173
+ this.bubbleChannel = undefined;
174
+ (_c = this.injectedCloseBtn) === null || _c === void 0 ? void 0 : _c.removeEventListener('click', this.onCloseBtnClick);
175
+ (_d = this.injectedCloseBtn) === null || _d === void 0 ? void 0 : _d.remove();
176
+ this.injectedCloseBtn = undefined;
177
+ (_e = this.resizeObserver) === null || _e === void 0 ? void 0 : _e.disconnect();
178
+ this.resizeObserver = undefined;
179
+ if (this.rafHandle !== undefined) {
180
+ cancelAnimationFrame(this.rafHandle);
181
+ this.rafHandle = undefined;
182
+ }
183
+ (_f = this.closeAbort) === null || _f === void 0 ? void 0 : _f.abort();
184
+ this.closeAbort = undefined;
185
+ }
186
+ dialogOpenChanged(_, next) {
187
+ var _a;
188
+ if (next) {
189
+ requestAnimationFrame(() => {
190
+ var _a;
191
+ const el = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.dialog');
192
+ if (!el)
193
+ return;
194
+ this.resizeObserver = new ResizeObserver((entries) => {
195
+ var _a, _b;
196
+ const size = (_b = (_a = entries[0]) === null || _a === void 0 ? void 0 : _a.borderBoxSize) === null || _b === void 0 ? void 0 : _b[0];
197
+ if (size) {
198
+ this.dialogWidth = Math.round(size.inlineSize);
199
+ this.dialogHeight = Math.round(size.blockSize);
200
+ }
201
+ });
202
+ this.resizeObserver.observe(el);
203
+ });
204
+ }
205
+ else {
206
+ (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
207
+ this.resizeObserver = undefined;
208
+ }
209
+ }
210
+ dialogContentChanged(_, next) {
211
+ var _a;
212
+ if (!(next === null || next === void 0 ? void 0 : next.length) || this.injectedCloseBtn)
213
+ return;
214
+ for (const el of next) {
215
+ const assistant = el.tagName.toLowerCase() === 'foundation-ai-assistant'
216
+ ? el
217
+ : (_a = el.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('foundation-ai-assistant');
218
+ if (assistant) {
219
+ this.injectCloseButton(assistant);
220
+ break;
221
+ }
222
+ }
223
+ }
224
+ injectCloseButton(assistant) {
225
+ const prefix = this.designSystemPrefix;
226
+ const btn = document.createElement(`${prefix}-button`);
227
+ btn.setAttribute('slot', 'header-actions-extra');
228
+ btn.setAttribute('appearance', 'stealth');
229
+ btn.setAttribute('title', 'Close');
230
+ const icon = document.createElement(`${prefix}-icon`);
231
+ icon.setAttribute('name', 'times');
232
+ btn.appendChild(icon);
233
+ btn.addEventListener('click', this.onCloseBtnClick);
234
+ assistant.appendChild(btn);
235
+ this.injectedCloseBtn = btn;
236
+ }
237
+ onBubbleMouseDown(e) {
238
+ e.preventDefault();
239
+ this.dragging = true;
240
+ this.dragTarget = 'bubble';
241
+ this.startMouseX = e.clientX;
242
+ this.startMouseY = e.clientY;
243
+ this.latestMouseX = e.clientX;
244
+ this.latestMouseY = e.clientY;
245
+ this.startElemLeft = this.bubbleLeft;
246
+ this.startElemTop = this.bubbleTop;
247
+ this.hasDragged = false;
248
+ }
249
+ onDialogHeaderMouseDown(e) {
250
+ var _a;
251
+ // Sync actual rendered size before dragging — the browser's CSS resize handle
252
+ // updates the element's size but our observables may not have caught up yet.
253
+ const dialogEl = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.dialog');
254
+ if (dialogEl) {
255
+ this.dialogWidth = dialogEl.offsetWidth;
256
+ this.dialogHeight = dialogEl.offsetHeight;
257
+ }
258
+ this.dragging = true;
259
+ this.dragTarget = 'dialog';
260
+ this.startMouseX = e.detail.clientX;
261
+ this.startMouseY = e.detail.clientY;
262
+ this.latestMouseX = e.detail.clientX;
263
+ this.latestMouseY = e.detail.clientY;
264
+ this.startElemLeft = this.dialogLeft;
265
+ this.startElemTop = this.dialogTop;
266
+ this.hasDragged = false;
267
+ }
268
+ // Cancels an in-flight close animation and restores the dialog to its open state.
269
+ // Needed for the chat-popin case: startCloseDialog() may have been called (adding
270
+ // .closing and an animationend listener) but the host was hidden before the animation
271
+ // finished. When the host reappears via chat-popin, we cancel the pending close so
272
+ // the dialog stays open rather than disappearing once animationend eventually fires.
273
+ cancelClose() {
274
+ var _a, _b;
275
+ (_a = this.closeAbort) === null || _a === void 0 ? void 0 : _a.abort();
276
+ this.closeAbort = undefined;
277
+ const el = (_b = this.shadowRoot) === null || _b === void 0 ? void 0 : _b.querySelector('.dialog');
278
+ el === null || el === void 0 ? void 0 : el.classList.remove('closing');
279
+ }
280
+ // Plays the closing animation before removing the dialog from the DOM.
281
+ // dialogOpen must stay true while the animation runs — setting it to false
282
+ // immediately would cause the repeat directive to remove the element before
283
+ // the animation has a chance to play. We only set dialogOpen = false inside
284
+ // the animationend callback, at which point FAST removes the element cleanly.
285
+ // If the user prefers reduced motion we skip the animation and close immediately.
286
+ startCloseDialog() {
287
+ var _a;
288
+ const el = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('.dialog');
289
+ const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
290
+ if (!el || reducedMotion) {
291
+ this.dialogOpen = false;
292
+ return;
293
+ }
294
+ this.closeAbort = new AbortController();
295
+ el.classList.add('closing');
296
+ el.addEventListener('animationend', () => {
297
+ this.dialogOpen = false;
298
+ }, {
299
+ once: true,
300
+ signal: this.closeAbort.signal,
301
+ });
302
+ }
303
+ onPopout() {
304
+ this.startCloseDialog();
305
+ }
306
+ onCloseDialog() {
307
+ // Snap the bubble orb to the bottom-right of wherever the dialog currently is,
308
+ // so it reappears near where the user last positioned the window.
309
+ this.bubbleLeft = Math.max(0, Math.min(window.innerWidth - BUBBLE_DRAG_MARGIN, this.dialogLeft + DIALOG_BUBBLE_HORIZONTAL_OFFSET));
310
+ this.bubbleTop = Math.max(0, Math.min(window.innerHeight - BUBBLE_DRAG_MARGIN, this.dialogTop + BUBBLE_SNAP_BOTTOM_OFFSET));
311
+ this.startCloseDialog();
312
+ }
313
+ get tooltipStyle() {
314
+ const tooltipWidth = this.tooltipMeasuredWidth || TOOLTIP_FALLBACK_WIDTH;
315
+ const bubbleWidth = 62; // Fixed in CSS
316
+ const margin = 8;
317
+ const naturalLeft = (bubbleWidth - tooltipWidth) / 2;
318
+ const vpLeft = this.bubbleLeft + naturalLeft;
319
+ const vpRight = vpLeft + tooltipWidth;
320
+ let shift = 0;
321
+ if (vpLeft < margin)
322
+ shift = margin - vpLeft;
323
+ else if (vpRight > window.innerWidth - margin)
324
+ shift = window.innerWidth - margin - vpRight;
325
+ const tooltipLeft = naturalLeft + shift;
326
+ const arrowLeft = bubbleWidth / 2 - tooltipLeft;
327
+ return `left: ${tooltipLeft}px; --arrow-left: ${arrowLeft}px`;
328
+ }
329
+ };
330
+ __decorate([
331
+ attr({ attribute: 'title' })
332
+ ], AiChatBubble.prototype, "title", void 0);
333
+ __decorate([
334
+ attr({ attribute: 'image-src' })
335
+ ], AiChatBubble.prototype, "imageSrc", void 0);
336
+ __decorate([
337
+ attr({ attribute: 'channel-name' })
338
+ ], AiChatBubble.prototype, "channelName", void 0);
339
+ __decorate([
340
+ attr({ attribute: 'design-system-prefix' })
341
+ ], AiChatBubble.prototype, "designSystemPrefix", void 0);
342
+ __decorate([
343
+ observable
344
+ ], AiChatBubble.prototype, "dialogContent", void 0);
345
+ __decorate([
346
+ observable
347
+ ], AiChatBubble.prototype, "tooltipMeasuredWidth", void 0);
348
+ __decorate([
349
+ observable
350
+ ], AiChatBubble.prototype, "bubbleLeft", void 0);
351
+ __decorate([
352
+ observable
353
+ ], AiChatBubble.prototype, "bubbleTop", void 0);
354
+ __decorate([
355
+ observable
356
+ ], AiChatBubble.prototype, "dialogLeft", void 0);
357
+ __decorate([
358
+ observable
359
+ ], AiChatBubble.prototype, "dialogTop", void 0);
360
+ __decorate([
361
+ observable
362
+ ], AiChatBubble.prototype, "dialogWidth", void 0);
363
+ __decorate([
364
+ observable
365
+ ], AiChatBubble.prototype, "dialogHeight", void 0);
366
+ __decorate([
367
+ observable
368
+ ], AiChatBubble.prototype, "dialogOpen", void 0);
369
+ __decorate([
370
+ observable
371
+ ], AiChatBubble.prototype, "hovered", void 0);
372
+ AiChatBubble = __decorate([
373
+ customElement({
374
+ name: 'foundation-ai-chat-bubble',
375
+ template: html `
376
+ ${() => AiChatBubbleTemplate()}
377
+ `,
378
+ styles,
379
+ })
380
+ ], AiChatBubble);
381
+ export { AiChatBubble };
@@ -0,0 +1,193 @@
1
+ import { css } from '@genesislcap/web-core';
2
+ export const styles = css `
3
+ :host {
4
+ position: fixed;
5
+ inset: 0;
6
+ pointer-events: none;
7
+ z-index: 9999;
8
+ overflow: visible;
9
+ }
10
+
11
+ :host([hidden]) {
12
+ display: none;
13
+ }
14
+
15
+ .bubble {
16
+ position: absolute;
17
+ width: 62px;
18
+ height: 62px;
19
+ border-radius: 50%;
20
+ cursor: grab;
21
+ pointer-events: all;
22
+ overflow: visible;
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ user-select: none;
27
+ transition:
28
+ transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),
29
+ box-shadow 0.25s ease;
30
+ background: linear-gradient(135deg, #0e1628 0%, #192340 100%);
31
+ box-shadow: 0 4px 20px rgb(0 0 0 / 45%);
32
+ border: 2px solid rgb(255 255 255 / 15%);
33
+ color: white;
34
+ }
35
+
36
+ .bubble img {
37
+ width: 62px;
38
+ height: 62px;
39
+ border-radius: 50%;
40
+ object-fit: cover;
41
+ pointer-events: none;
42
+ box-shadow: 0 4px 20px rgb(0 0 0 / 45%);
43
+ border: 2px solid rgb(255 255 255 / 15%);
44
+ }
45
+
46
+ .bubble svg {
47
+ pointer-events: none;
48
+ }
49
+
50
+ .bubble:hover,
51
+ .bubble.hovered {
52
+ transform: scale(1.18);
53
+ }
54
+
55
+ .bubble:hover img,
56
+ .bubble.hovered img {
57
+ box-shadow:
58
+ 0 6px 32px rgb(0 100 255 / 55%),
59
+ 0 0 0 3px rgb(0 120 255 / 35%);
60
+ }
61
+
62
+ .bubble:active {
63
+ cursor: grabbing;
64
+ }
65
+
66
+ .tooltip {
67
+ position: absolute;
68
+ bottom: calc(100% + 10px);
69
+ background: linear-gradient(135deg, #0078ff 0%, #0050d0 100%);
70
+ color: #fff;
71
+ font-size: 0.78em;
72
+ font-weight: 600;
73
+ letter-spacing: 0.03em;
74
+ white-space: nowrap;
75
+ padding: 5px 10px;
76
+ border-radius: 8px;
77
+ box-shadow: 0 4px 14px rgb(0 120 255 / 45%);
78
+ pointer-events: none;
79
+ opacity: 0%;
80
+ translate: 0 4px;
81
+ transition:
82
+ opacity 0.18s ease,
83
+ translate 0.18s ease;
84
+ }
85
+
86
+ .tooltip::after {
87
+ content: '';
88
+ position: absolute;
89
+ top: 100%;
90
+ left: var(--arrow-left, 50%);
91
+ transform: translateX(-50%);
92
+ border: 5px solid transparent;
93
+ border-top-color: #0050d0;
94
+ }
95
+
96
+ .bubble:hover .tooltip,
97
+ .bubble.hovered .tooltip {
98
+ opacity: 100%;
99
+ translate: 0 0;
100
+ }
101
+
102
+ .pulse-ring {
103
+ position: absolute;
104
+ width: 62px;
105
+ height: 62px;
106
+ border-radius: 50%;
107
+ border: 2px solid rgb(0 120 255 / 50%);
108
+ animation: pulse 2.5s ease-out infinite;
109
+ pointer-events: none;
110
+ }
111
+
112
+ @keyframes pulse {
113
+ 0% {
114
+ transform: scale(1);
115
+ opacity: 70%;
116
+ }
117
+
118
+ 70% {
119
+ transform: scale(1.5);
120
+ opacity: 0%;
121
+ }
122
+
123
+ 100% {
124
+ transform: scale(1.5);
125
+ opacity: 0%;
126
+ }
127
+ }
128
+
129
+ .dialog {
130
+ position: absolute;
131
+ box-sizing: border-box;
132
+ width: 400px;
133
+ height: 520px;
134
+ min-width: 300px;
135
+ min-height: 300px;
136
+ max-width: 50vw;
137
+ max-height: calc(100vh - 40px);
138
+ background: var(--neutral-layer-1);
139
+ border-radius: 14px;
140
+ box-shadow:
141
+ 0 12px 50px rgb(0 0 0 / 55%),
142
+ 0 0 0 1px rgb(255 255 255 / 6%);
143
+ pointer-events: all;
144
+ display: flex;
145
+ flex-direction: column;
146
+ overflow: hidden;
147
+ resize: both;
148
+ border: 1px solid var(--neutral-stroke-rest);
149
+ animation: dialog-in 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
150
+ }
151
+
152
+ @keyframes dialog-in {
153
+ from {
154
+ opacity: 0%;
155
+ transform: scale(0.85) translateY(12px);
156
+ }
157
+
158
+ to {
159
+ opacity: 100%;
160
+ transform: scale(1) translateY(0);
161
+ }
162
+ }
163
+
164
+ @keyframes dialog-out {
165
+ from {
166
+ opacity: 100%;
167
+ transform: scale(1) translateY(0);
168
+ }
169
+
170
+ to {
171
+ opacity: 0%;
172
+ transform: scale(0.85) translateY(12px);
173
+ }
174
+ }
175
+
176
+ .dialog.closing {
177
+ animation: dialog-out 0.2s cubic-bezier(0.4, 0, 0.6, 1) forwards;
178
+ }
179
+
180
+ .dialog-content {
181
+ flex: 1;
182
+ overflow: hidden;
183
+ display: flex;
184
+ min-height: 0;
185
+ }
186
+
187
+ .dialog-content ::slotted(*) {
188
+ display: flex;
189
+ flex: 1;
190
+ width: 100%;
191
+ min-height: 0;
192
+ }
193
+ `;
@@ -0,0 +1,50 @@
1
+ import { html, repeat, slotted, when } from '@genesislcap/web-core';
2
+ const genesisIconTemplate = html `
3
+ <svg
4
+ viewBox="-4 0 30 26"
5
+ fill="none"
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ style="width:60%;height:60%"
8
+ >
9
+ <path
10
+ d="M18.7702 23.0437C18.7702 22.4675 18.8526 21.8089 19.0995 21.3149C19.3465 20.7386 19.6758 20.2447 20.0874 19.833C20.4991 19.4214 20.993 19.0921 21.5693 18.8451C22.1456 18.5982 22.7219 18.5158 23.2981 18.5158H25.9326V11.6828H19.1819V14.3172C19.1819 15.5521 18.6879 16.7047 17.8647 17.5279C17.0414 18.3512 15.8888 18.8451 14.7363 18.9275H6.7507V6.99025H16.4651V0.157227H3.54C2.63442 0.157227 1.72884 0.568855 1.07023 1.22746C0.411628 1.88606 0 2.79165 0 3.77955V22.2205C0 23.1261 0.411628 24.0316 1.07023 24.7726C1.72884 25.4312 2.63442 25.8428 3.54 25.8428H18.7702V23.0437Z"
11
+ fill="currentColor"
12
+ />
13
+ </svg>
14
+ `;
15
+ export const AiChatBubbleTemplate = () => {
16
+ return html `
17
+ ${when((x) => !x.dialogOpen, html `
18
+ <div
19
+ class="bubble ${(x) => (x.hovered ? 'hovered' : '')}"
20
+ style="${(x) => `translate: ${x.bubbleLeft}px ${x.bubbleTop}px`}"
21
+ @mousedown="${(x, c) => x.onBubbleMouseDown(c.event)}"
22
+ @mouseenter="${(x) => (x.hovered = true)}"
23
+ @mouseleave="${(x) => (x.hovered = false)}"
24
+ >
25
+ ${when((x) => !!x.imageSrc, html `
26
+ <img src="${(x) => x.imageSrc}" alt="AI" draggable="false" />
27
+ `)}
28
+ ${when((x) => !x.imageSrc, genesisIconTemplate)}
29
+ <div class="pulse-ring"></div>
30
+ <div class="tooltip" style="${(x) => x.tooltipStyle}">${(x) => x.title}</div>
31
+ </div>
32
+ `)}
33
+ ${repeat(
34
+ // Pass the component instance as the sole array item so inner bindings
35
+ // can use x directly. recycle: false ensures a fresh element on every
36
+ // open, preventing stale .closing class or animationend listeners from
37
+ // a previous close persisting on the reused view.
38
+ (x) => (x.dialogOpen ? [x] : []), html `
39
+ <div
40
+ class="dialog"
41
+ style="${(x) => `translate: ${x.dialogLeft}px ${x.dialogTop}px; width: ${x.dialogWidth}px; height: ${x.dialogHeight}px`}"
42
+ @chat-header-mousedown="${(x, c) => x.onDialogHeaderMouseDown(c.event)}"
43
+ >
44
+ <div class="dialog-content">
45
+ <slot name="dialog-content" ${slotted('dialogContent')}></slot>
46
+ </div>
47
+ </div>
48
+ `, { recycle: false })}
49
+ `;
50
+ };
@@ -0,0 +1 @@
1
+ export * from './chat-bubble';