@neo4j-ndl/react 4.1.9 → 4.2.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 (487) hide show
  1. package/lib/cjs/ai/code-preview/CodePreview.js +91 -0
  2. package/lib/cjs/ai/code-preview/CodePreview.js.map +1 -0
  3. package/lib/cjs/ai/code-preview/index.js +26 -0
  4. package/lib/cjs/ai/code-preview/index.js.map +1 -0
  5. package/lib/cjs/ai/code-preview/stories/code-preview-languages.story.js +37 -0
  6. package/lib/cjs/ai/code-preview/stories/code-preview-languages.story.js.map +1 -0
  7. package/lib/cjs/ai/code-preview/stories/code-preview-loading.story.js +31 -0
  8. package/lib/cjs/ai/code-preview/stories/code-preview-loading.story.js.map +1 -0
  9. package/lib/cjs/ai/code-preview/stories/code-preview-read.story.js +36 -0
  10. package/lib/cjs/ai/code-preview/stories/code-preview-read.story.js.map +1 -0
  11. package/lib/cjs/ai/code-preview/stories/code-preview-write.story.js +36 -0
  12. package/lib/cjs/ai/code-preview/stories/code-preview-write.story.js.map +1 -0
  13. package/lib/cjs/ai/code-preview/stories/code-preview.stories.js +88 -0
  14. package/lib/cjs/ai/code-preview/stories/code-preview.stories.js.map +1 -0
  15. package/lib/cjs/ai/code-preview/stories/index.js +44 -0
  16. package/lib/cjs/ai/code-preview/stories/index.js.map +1 -0
  17. package/lib/cjs/ai/file-tag/FileTag.js +58 -0
  18. package/lib/cjs/ai/file-tag/FileTag.js.map +1 -0
  19. package/lib/cjs/ai/file-tag/index.js +38 -0
  20. package/lib/cjs/ai/file-tag/index.js.map +1 -0
  21. package/lib/cjs/ai/file-tag/stories/file-tag-chat.story.js +31 -0
  22. package/lib/cjs/ai/file-tag/stories/file-tag-chat.story.js.map +1 -0
  23. package/lib/cjs/ai/file-tag/stories/file-tag-loading.story.js +33 -0
  24. package/lib/cjs/ai/file-tag/stories/file-tag-loading.story.js.map +1 -0
  25. package/lib/cjs/ai/file-tag/stories/file-tag-prompt.story.js +33 -0
  26. package/lib/cjs/ai/file-tag/stories/file-tag-prompt.story.js.map +1 -0
  27. package/lib/cjs/ai/file-tag/stories/file-tag.stories.js +76 -0
  28. package/lib/cjs/ai/file-tag/stories/file-tag.stories.js.map +1 -0
  29. package/lib/cjs/ai/file-tag/stories/index.js +40 -0
  30. package/lib/cjs/ai/file-tag/stories/index.js.map +1 -0
  31. package/lib/cjs/ai/image-tag/ImageTag.js +58 -0
  32. package/lib/cjs/ai/image-tag/ImageTag.js.map +1 -0
  33. package/lib/cjs/ai/image-tag/index.js +38 -0
  34. package/lib/cjs/ai/image-tag/index.js.map +1 -0
  35. package/lib/cjs/ai/image-tag/stories/image-tag-chat.story.js +30 -0
  36. package/lib/cjs/ai/image-tag/stories/image-tag-chat.story.js.map +1 -0
  37. package/lib/cjs/ai/image-tag/stories/image-tag-loading.story.js +32 -0
  38. package/lib/cjs/ai/image-tag/stories/image-tag-loading.story.js.map +1 -0
  39. package/lib/cjs/ai/image-tag/stories/image-tag-prompt.story.js +32 -0
  40. package/lib/cjs/ai/image-tag/stories/image-tag-prompt.story.js.map +1 -0
  41. package/lib/cjs/ai/image-tag/stories/image-tag.stories.js +76 -0
  42. package/lib/cjs/ai/image-tag/stories/image-tag.stories.js.map +1 -0
  43. package/lib/cjs/ai/image-tag/stories/index.js +40 -0
  44. package/lib/cjs/ai/image-tag/stories/index.js.map +1 -0
  45. package/lib/cjs/ai/index.js +23 -1
  46. package/lib/cjs/ai/index.js.map +1 -1
  47. package/lib/cjs/ai/more-files/MoreFiles.js +55 -0
  48. package/lib/cjs/ai/more-files/MoreFiles.js.map +1 -0
  49. package/lib/cjs/ai/more-files/index.js +38 -0
  50. package/lib/cjs/ai/more-files/index.js.map +1 -0
  51. package/lib/cjs/ai/more-files/stories/index.js +32 -0
  52. package/lib/cjs/ai/more-files/stories/index.js.map +1 -0
  53. package/lib/cjs/ai/more-files/stories/more-files.stories.js +50 -0
  54. package/lib/cjs/ai/more-files/stories/more-files.stories.js.map +1 -0
  55. package/lib/cjs/ai/more-files/stories/more-files.story.js +35 -0
  56. package/lib/cjs/ai/more-files/stories/more-files.story.js.map +1 -0
  57. package/lib/cjs/ai/presence/Presence.js +5 -1
  58. package/lib/cjs/ai/presence/Presence.js.map +1 -1
  59. package/lib/cjs/ai/prompt/Prompt.js +163 -0
  60. package/lib/cjs/ai/prompt/Prompt.js.map +1 -0
  61. package/lib/cjs/ai/prompt/index.js +38 -0
  62. package/lib/cjs/ai/prompt/index.js.map +1 -0
  63. package/lib/cjs/ai/prompt/stories/index.js +36 -0
  64. package/lib/cjs/ai/prompt/stories/index.js.map +1 -0
  65. package/lib/cjs/ai/prompt/stories/prompt-advanced.story.js +56 -0
  66. package/lib/cjs/ai/prompt/stories/prompt-advanced.story.js.map +1 -0
  67. package/lib/cjs/ai/prompt/stories/prompt-default.story.js +40 -0
  68. package/lib/cjs/ai/prompt/stories/prompt-default.story.js.map +1 -0
  69. package/lib/cjs/ai/prompt/stories/prompt.stories.js +63 -0
  70. package/lib/cjs/ai/prompt/stories/prompt.stories.js.map +1 -0
  71. package/lib/cjs/ai/reasoning/Reasoning.js +77 -0
  72. package/lib/cjs/ai/reasoning/Reasoning.js.map +1 -0
  73. package/lib/cjs/ai/reasoning/index.js +38 -0
  74. package/lib/cjs/ai/reasoning/index.js.map +1 -0
  75. package/lib/cjs/ai/reasoning/stories/index.js +32 -0
  76. package/lib/cjs/ai/reasoning/stories/index.js.map +1 -0
  77. package/lib/cjs/ai/reasoning/stories/reasoning-full.story.js +34 -0
  78. package/lib/cjs/ai/reasoning/stories/reasoning-full.story.js.map +1 -0
  79. package/lib/cjs/ai/reasoning/stories/reasoning.stories.js +50 -0
  80. package/lib/cjs/ai/reasoning/stories/reasoning.stories.js.map +1 -0
  81. package/lib/cjs/ai/response/Response.js +185 -0
  82. package/lib/cjs/ai/response/Response.js.map +1 -0
  83. package/lib/cjs/ai/response/index.js +26 -0
  84. package/lib/cjs/ai/response/index.js.map +1 -0
  85. package/lib/cjs/ai/response/stories/index.js +56 -0
  86. package/lib/cjs/ai/response/stories/index.js.map +1 -0
  87. package/lib/cjs/ai/response/stories/response-all-components.story.js +229 -0
  88. package/lib/cjs/ai/response/stories/response-all-components.story.js.map +1 -0
  89. package/lib/cjs/ai/response/stories/response-code-examples.story.js +248 -0
  90. package/lib/cjs/ai/response/stories/response-code-examples.story.js.map +1 -0
  91. package/lib/cjs/ai/response/stories/response-default.story.js +50 -0
  92. package/lib/cjs/ai/response/stories/response-default.story.js.map +1 -0
  93. package/lib/cjs/ai/response/stories/response-full-example.story.js +162 -0
  94. package/lib/cjs/ai/response/stories/response-full-example.story.js.map +1 -0
  95. package/lib/cjs/ai/response/stories/response-headings.story.js +120 -0
  96. package/lib/cjs/ai/response/stories/response-headings.story.js.map +1 -0
  97. package/lib/cjs/ai/response/stories/response-lists.story.js +170 -0
  98. package/lib/cjs/ai/response/stories/response-lists.story.js.map +1 -0
  99. package/lib/cjs/ai/response/stories/response-streaming.story.js +65 -0
  100. package/lib/cjs/ai/response/stories/response-streaming.story.js.map +1 -0
  101. package/lib/cjs/ai/response/stories/response.stories.js +132 -0
  102. package/lib/cjs/ai/response/stories/response.stories.js.map +1 -0
  103. package/lib/cjs/ai/suggestion/Suggestion.js +58 -0
  104. package/lib/cjs/ai/suggestion/Suggestion.js.map +1 -0
  105. package/lib/cjs/ai/suggestion/index.js +38 -0
  106. package/lib/cjs/ai/suggestion/index.js.map +1 -0
  107. package/lib/cjs/ai/suggestion/stories/index.js +44 -0
  108. package/lib/cjs/ai/suggestion/stories/index.js.map +1 -0
  109. package/lib/cjs/ai/suggestion/stories/suggestion-default.story.js +30 -0
  110. package/lib/cjs/ai/suggestion/stories/suggestion-default.story.js.map +1 -0
  111. package/lib/cjs/ai/suggestion/stories/suggestion-icon.story.js +31 -0
  112. package/lib/cjs/ai/suggestion/stories/suggestion-icon.story.js.map +1 -0
  113. package/lib/cjs/ai/suggestion/stories/suggestion-primary.story.js +30 -0
  114. package/lib/cjs/ai/suggestion/stories/suggestion-primary.story.js.map +1 -0
  115. package/lib/cjs/ai/suggestion/stories/suggestion-sizes.story.js +30 -0
  116. package/lib/cjs/ai/suggestion/stories/suggestion-sizes.story.js.map +1 -0
  117. package/lib/cjs/ai/suggestion/stories/suggestion.stories.js +89 -0
  118. package/lib/cjs/ai/suggestion/stories/suggestion.stories.js.map +1 -0
  119. package/lib/cjs/ai/thinking/Thinking.js +57 -0
  120. package/lib/cjs/ai/thinking/Thinking.js.map +1 -0
  121. package/lib/cjs/ai/thinking/index.js +38 -0
  122. package/lib/cjs/ai/thinking/index.js.map +1 -0
  123. package/lib/cjs/ai/thinking/stories/ai-thinking-default.story.js +30 -0
  124. package/lib/cjs/ai/thinking/stories/ai-thinking-default.story.js.map +1 -0
  125. package/lib/cjs/ai/thinking/stories/ai-thinking-finished.story.js +30 -0
  126. package/lib/cjs/ai/thinking/stories/ai-thinking-finished.story.js.map +1 -0
  127. package/lib/cjs/ai/thinking/stories/ai-thinking.stories.js +63 -0
  128. package/lib/cjs/ai/thinking/stories/ai-thinking.stories.js.map +1 -0
  129. package/lib/cjs/ai/thinking/stories/index.js +36 -0
  130. package/lib/cjs/ai/thinking/stories/index.js.map +1 -0
  131. package/lib/cjs/ai/thinking/thinking-duration-formatter.js +71 -0
  132. package/lib/cjs/ai/thinking/thinking-duration-formatter.js.map +1 -0
  133. package/lib/cjs/ai/tool-call/ToolCall.js +55 -0
  134. package/lib/cjs/ai/tool-call/ToolCall.js.map +1 -0
  135. package/lib/cjs/ai/tool-call/index.js +38 -0
  136. package/lib/cjs/ai/tool-call/index.js.map +1 -0
  137. package/lib/cjs/ai/tool-call/stories/index.js +36 -0
  138. package/lib/cjs/ai/tool-call/stories/index.js.map +1 -0
  139. package/lib/cjs/ai/tool-call/stories/tool-call-default.story.js +30 -0
  140. package/lib/cjs/ai/tool-call/stories/tool-call-default.story.js.map +1 -0
  141. package/lib/cjs/ai/tool-call/stories/tool-call-done.story.js +30 -0
  142. package/lib/cjs/ai/tool-call/stories/tool-call-done.story.js.map +1 -0
  143. package/lib/cjs/ai/tool-call/stories/tool-call.stories.js +63 -0
  144. package/lib/cjs/ai/tool-call/stories/tool-call.stories.js.map +1 -0
  145. package/lib/cjs/ai/user-bubble/UserBubble.js +53 -0
  146. package/lib/cjs/ai/user-bubble/UserBubble.js.map +1 -0
  147. package/lib/cjs/ai/user-bubble/index.js +38 -0
  148. package/lib/cjs/ai/user-bubble/index.js.map +1 -0
  149. package/lib/cjs/ai/user-bubble/stories/index.js +44 -0
  150. package/lib/cjs/ai/user-bubble/stories/index.js.map +1 -0
  151. package/lib/cjs/ai/user-bubble/stories/user-bubble-action.story.js +35 -0
  152. package/lib/cjs/ai/user-bubble/stories/user-bubble-action.story.js.map +1 -0
  153. package/lib/cjs/ai/user-bubble/stories/user-bubble-and-files.story.js +39 -0
  154. package/lib/cjs/ai/user-bubble/stories/user-bubble-and-files.story.js.map +1 -0
  155. package/lib/cjs/ai/user-bubble/stories/user-bubble-long.story.js +33 -0
  156. package/lib/cjs/ai/user-bubble/stories/user-bubble-long.story.js.map +1 -0
  157. package/lib/cjs/ai/user-bubble/stories/user-bubble.stories.js +89 -0
  158. package/lib/cjs/ai/user-bubble/stories/user-bubble.stories.js.map +1 -0
  159. package/lib/cjs/ai/user-bubble/stories/user-bubble.story.js +34 -0
  160. package/lib/cjs/ai/user-bubble/stories/user-bubble.story.js.map +1 -0
  161. package/lib/cjs/code/Code.js.map +1 -1
  162. package/lib/cjs/text-area/TextArea.js.map +1 -1
  163. package/lib/esm/ai/code-preview/CodePreview.js +84 -0
  164. package/lib/esm/ai/code-preview/CodePreview.js.map +1 -0
  165. package/lib/esm/ai/code-preview/index.js +22 -0
  166. package/lib/esm/ai/code-preview/index.js.map +1 -0
  167. package/lib/esm/ai/code-preview/stories/code-preview-languages.story.js +33 -0
  168. package/lib/esm/ai/code-preview/stories/code-preview-languages.story.js.map +1 -0
  169. package/lib/esm/ai/code-preview/stories/code-preview-loading.story.js +27 -0
  170. package/lib/esm/ai/code-preview/stories/code-preview-loading.story.js.map +1 -0
  171. package/lib/esm/ai/code-preview/stories/code-preview-read.story.js +32 -0
  172. package/lib/esm/ai/code-preview/stories/code-preview-read.story.js.map +1 -0
  173. package/lib/esm/ai/code-preview/stories/code-preview-write.story.js +32 -0
  174. package/lib/esm/ai/code-preview/stories/code-preview-write.story.js.map +1 -0
  175. package/lib/esm/ai/code-preview/stories/code-preview.stories.js +85 -0
  176. package/lib/esm/ai/code-preview/stories/code-preview.stories.js.map +1 -0
  177. package/lib/esm/ai/code-preview/stories/index.js +34 -0
  178. package/lib/esm/ai/code-preview/stories/index.js.map +1 -0
  179. package/lib/esm/ai/file-tag/FileTag.js +52 -0
  180. package/lib/esm/ai/file-tag/FileTag.js.map +1 -0
  181. package/lib/esm/ai/file-tag/index.js +22 -0
  182. package/lib/esm/ai/file-tag/index.js.map +1 -0
  183. package/lib/esm/ai/file-tag/stories/file-tag-chat.story.js +29 -0
  184. package/lib/esm/ai/file-tag/stories/file-tag-chat.story.js.map +1 -0
  185. package/lib/esm/ai/file-tag/stories/file-tag-loading.story.js +31 -0
  186. package/lib/esm/ai/file-tag/stories/file-tag-loading.story.js.map +1 -0
  187. package/lib/esm/ai/file-tag/stories/file-tag-prompt.story.js +31 -0
  188. package/lib/esm/ai/file-tag/stories/file-tag-prompt.story.js.map +1 -0
  189. package/lib/esm/ai/file-tag/stories/file-tag.stories.js +73 -0
  190. package/lib/esm/ai/file-tag/stories/file-tag.stories.js.map +1 -0
  191. package/lib/esm/ai/file-tag/stories/index.js +31 -0
  192. package/lib/esm/ai/file-tag/stories/index.js.map +1 -0
  193. package/lib/esm/ai/image-tag/ImageTag.js +52 -0
  194. package/lib/esm/ai/image-tag/ImageTag.js.map +1 -0
  195. package/lib/esm/ai/image-tag/index.js +22 -0
  196. package/lib/esm/ai/image-tag/index.js.map +1 -0
  197. package/lib/esm/ai/image-tag/stories/image-tag-chat.story.js +28 -0
  198. package/lib/esm/ai/image-tag/stories/image-tag-chat.story.js.map +1 -0
  199. package/lib/esm/ai/image-tag/stories/image-tag-loading.story.js +30 -0
  200. package/lib/esm/ai/image-tag/stories/image-tag-loading.story.js.map +1 -0
  201. package/lib/esm/ai/image-tag/stories/image-tag-prompt.story.js +30 -0
  202. package/lib/esm/ai/image-tag/stories/image-tag-prompt.story.js.map +1 -0
  203. package/lib/esm/ai/image-tag/stories/image-tag.stories.js +73 -0
  204. package/lib/esm/ai/image-tag/stories/image-tag.stories.js.map +1 -0
  205. package/lib/esm/ai/image-tag/stories/index.js +31 -0
  206. package/lib/esm/ai/image-tag/stories/index.js.map +1 -0
  207. package/lib/esm/ai/index.js +11 -0
  208. package/lib/esm/ai/index.js.map +1 -1
  209. package/lib/esm/ai/more-files/MoreFiles.js +49 -0
  210. package/lib/esm/ai/more-files/MoreFiles.js.map +1 -0
  211. package/lib/esm/ai/more-files/index.js +22 -0
  212. package/lib/esm/ai/more-files/index.js.map +1 -0
  213. package/lib/esm/ai/more-files/stories/index.js +25 -0
  214. package/lib/esm/ai/more-files/stories/index.js.map +1 -0
  215. package/lib/esm/ai/more-files/stories/more-files.stories.js +47 -0
  216. package/lib/esm/ai/more-files/stories/more-files.stories.js.map +1 -0
  217. package/lib/esm/ai/more-files/stories/more-files.story.js +33 -0
  218. package/lib/esm/ai/more-files/stories/more-files.story.js.map +1 -0
  219. package/lib/esm/ai/presence/Presence.js +5 -1
  220. package/lib/esm/ai/presence/Presence.js.map +1 -1
  221. package/lib/esm/ai/prompt/Prompt.js +157 -0
  222. package/lib/esm/ai/prompt/Prompt.js.map +1 -0
  223. package/lib/esm/ai/prompt/index.js +22 -0
  224. package/lib/esm/ai/prompt/index.js.map +1 -0
  225. package/lib/esm/ai/prompt/stories/index.js +28 -0
  226. package/lib/esm/ai/prompt/stories/index.js.map +1 -0
  227. package/lib/esm/ai/prompt/stories/prompt-advanced.story.js +54 -0
  228. package/lib/esm/ai/prompt/stories/prompt-advanced.story.js.map +1 -0
  229. package/lib/esm/ai/prompt/stories/prompt-default.story.js +38 -0
  230. package/lib/esm/ai/prompt/stories/prompt-default.story.js.map +1 -0
  231. package/lib/esm/ai/prompt/stories/prompt.stories.js +60 -0
  232. package/lib/esm/ai/prompt/stories/prompt.stories.js.map +1 -0
  233. package/lib/esm/ai/reasoning/Reasoning.js +71 -0
  234. package/lib/esm/ai/reasoning/Reasoning.js.map +1 -0
  235. package/lib/esm/ai/reasoning/index.js +22 -0
  236. package/lib/esm/ai/reasoning/index.js.map +1 -0
  237. package/lib/esm/ai/reasoning/stories/index.js +25 -0
  238. package/lib/esm/ai/reasoning/stories/index.js.map +1 -0
  239. package/lib/esm/ai/reasoning/stories/reasoning-full.story.js +32 -0
  240. package/lib/esm/ai/reasoning/stories/reasoning-full.story.js.map +1 -0
  241. package/lib/esm/ai/reasoning/stories/reasoning.stories.js +47 -0
  242. package/lib/esm/ai/reasoning/stories/reasoning.stories.js.map +1 -0
  243. package/lib/esm/ai/response/Response.js +179 -0
  244. package/lib/esm/ai/response/Response.js.map +1 -0
  245. package/lib/esm/ai/response/index.js +22 -0
  246. package/lib/esm/ai/response/index.js.map +1 -0
  247. package/lib/esm/ai/response/stories/index.js +43 -0
  248. package/lib/esm/ai/response/stories/index.js.map +1 -0
  249. package/lib/esm/ai/response/stories/response-all-components.story.js +225 -0
  250. package/lib/esm/ai/response/stories/response-all-components.story.js.map +1 -0
  251. package/lib/esm/ai/response/stories/response-code-examples.story.js +244 -0
  252. package/lib/esm/ai/response/stories/response-code-examples.story.js.map +1 -0
  253. package/lib/esm/ai/response/stories/response-default.story.js +46 -0
  254. package/lib/esm/ai/response/stories/response-default.story.js.map +1 -0
  255. package/lib/esm/ai/response/stories/response-full-example.story.js +158 -0
  256. package/lib/esm/ai/response/stories/response-full-example.story.js.map +1 -0
  257. package/lib/esm/ai/response/stories/response-headings.story.js +116 -0
  258. package/lib/esm/ai/response/stories/response-headings.story.js.map +1 -0
  259. package/lib/esm/ai/response/stories/response-lists.story.js +166 -0
  260. package/lib/esm/ai/response/stories/response-lists.story.js.map +1 -0
  261. package/lib/esm/ai/response/stories/response-streaming.story.js +61 -0
  262. package/lib/esm/ai/response/stories/response-streaming.story.js.map +1 -0
  263. package/lib/esm/ai/response/stories/response.stories.js +129 -0
  264. package/lib/esm/ai/response/stories/response.stories.js.map +1 -0
  265. package/lib/esm/ai/suggestion/Suggestion.js +52 -0
  266. package/lib/esm/ai/suggestion/Suggestion.js.map +1 -0
  267. package/lib/esm/ai/suggestion/index.js +22 -0
  268. package/lib/esm/ai/suggestion/index.js.map +1 -0
  269. package/lib/esm/ai/suggestion/stories/index.js +34 -0
  270. package/lib/esm/ai/suggestion/stories/index.js.map +1 -0
  271. package/lib/esm/ai/suggestion/stories/suggestion-default.story.js +28 -0
  272. package/lib/esm/ai/suggestion/stories/suggestion-default.story.js.map +1 -0
  273. package/lib/esm/ai/suggestion/stories/suggestion-icon.story.js +29 -0
  274. package/lib/esm/ai/suggestion/stories/suggestion-icon.story.js.map +1 -0
  275. package/lib/esm/ai/suggestion/stories/suggestion-primary.story.js +28 -0
  276. package/lib/esm/ai/suggestion/stories/suggestion-primary.story.js.map +1 -0
  277. package/lib/esm/ai/suggestion/stories/suggestion-sizes.story.js +28 -0
  278. package/lib/esm/ai/suggestion/stories/suggestion-sizes.story.js.map +1 -0
  279. package/lib/esm/ai/suggestion/stories/suggestion.stories.js +86 -0
  280. package/lib/esm/ai/suggestion/stories/suggestion.stories.js.map +1 -0
  281. package/lib/esm/ai/thinking/Thinking.js +51 -0
  282. package/lib/esm/ai/thinking/Thinking.js.map +1 -0
  283. package/lib/esm/ai/thinking/index.js +22 -0
  284. package/lib/esm/ai/thinking/index.js.map +1 -0
  285. package/lib/esm/ai/thinking/stories/ai-thinking-default.story.js +28 -0
  286. package/lib/esm/ai/thinking/stories/ai-thinking-default.story.js.map +1 -0
  287. package/lib/esm/ai/thinking/stories/ai-thinking-finished.story.js +28 -0
  288. package/lib/esm/ai/thinking/stories/ai-thinking-finished.story.js.map +1 -0
  289. package/lib/esm/ai/thinking/stories/ai-thinking.stories.js +60 -0
  290. package/lib/esm/ai/thinking/stories/ai-thinking.stories.js.map +1 -0
  291. package/lib/esm/ai/thinking/stories/index.js +28 -0
  292. package/lib/esm/ai/thinking/stories/index.js.map +1 -0
  293. package/lib/esm/ai/thinking/thinking-duration-formatter.js +67 -0
  294. package/lib/esm/ai/thinking/thinking-duration-formatter.js.map +1 -0
  295. package/lib/esm/ai/tool-call/ToolCall.js +49 -0
  296. package/lib/esm/ai/tool-call/ToolCall.js.map +1 -0
  297. package/lib/esm/ai/tool-call/index.js +22 -0
  298. package/lib/esm/ai/tool-call/index.js.map +1 -0
  299. package/lib/esm/ai/tool-call/stories/index.js +28 -0
  300. package/lib/esm/ai/tool-call/stories/index.js.map +1 -0
  301. package/lib/esm/ai/tool-call/stories/tool-call-default.story.js +28 -0
  302. package/lib/esm/ai/tool-call/stories/tool-call-default.story.js.map +1 -0
  303. package/lib/esm/ai/tool-call/stories/tool-call-done.story.js +28 -0
  304. package/lib/esm/ai/tool-call/stories/tool-call-done.story.js.map +1 -0
  305. package/lib/esm/ai/tool-call/stories/tool-call.stories.js +60 -0
  306. package/lib/esm/ai/tool-call/stories/tool-call.stories.js.map +1 -0
  307. package/lib/esm/ai/user-bubble/UserBubble.js +47 -0
  308. package/lib/esm/ai/user-bubble/UserBubble.js.map +1 -0
  309. package/lib/esm/ai/user-bubble/index.js +22 -0
  310. package/lib/esm/ai/user-bubble/index.js.map +1 -0
  311. package/lib/esm/ai/user-bubble/stories/index.js +34 -0
  312. package/lib/esm/ai/user-bubble/stories/index.js.map +1 -0
  313. package/lib/esm/ai/user-bubble/stories/user-bubble-action.story.js +33 -0
  314. package/lib/esm/ai/user-bubble/stories/user-bubble-action.story.js.map +1 -0
  315. package/lib/esm/ai/user-bubble/stories/user-bubble-and-files.story.js +37 -0
  316. package/lib/esm/ai/user-bubble/stories/user-bubble-and-files.story.js.map +1 -0
  317. package/lib/esm/ai/user-bubble/stories/user-bubble-long.story.js +31 -0
  318. package/lib/esm/ai/user-bubble/stories/user-bubble-long.story.js.map +1 -0
  319. package/lib/esm/ai/user-bubble/stories/user-bubble.stories.js +86 -0
  320. package/lib/esm/ai/user-bubble/stories/user-bubble.stories.js.map +1 -0
  321. package/lib/esm/ai/user-bubble/stories/user-bubble.story.js +32 -0
  322. package/lib/esm/ai/user-bubble/stories/user-bubble.story.js.map +1 -0
  323. package/lib/esm/code/Code.js.map +1 -1
  324. package/lib/esm/text-area/TextArea.js.map +1 -1
  325. package/lib/types/ai/code-preview/CodePreview.d.ts +44 -0
  326. package/lib/types/ai/code-preview/CodePreview.d.ts.map +1 -0
  327. package/lib/types/ai/code-preview/index.d.ts +22 -0
  328. package/lib/types/ai/code-preview/index.d.ts.map +1 -0
  329. package/lib/types/ai/code-preview/stories/code-preview-languages.story.d.ts +23 -0
  330. package/lib/types/ai/code-preview/stories/code-preview-languages.story.d.ts.map +1 -0
  331. package/lib/types/ai/code-preview/stories/code-preview-loading.story.d.ts +23 -0
  332. package/lib/types/ai/code-preview/stories/code-preview-loading.story.d.ts.map +1 -0
  333. package/lib/types/ai/code-preview/stories/code-preview-read.story.d.ts +23 -0
  334. package/lib/types/ai/code-preview/stories/code-preview-read.story.d.ts.map +1 -0
  335. package/lib/types/ai/code-preview/stories/code-preview-write.story.d.ts +23 -0
  336. package/lib/types/ai/code-preview/stories/code-preview-write.story.d.ts.map +1 -0
  337. package/lib/types/ai/code-preview/stories/code-preview.stories.d.ts +30 -0
  338. package/lib/types/ai/code-preview/stories/code-preview.stories.d.ts.map +1 -0
  339. package/lib/types/ai/code-preview/stories/index.d.ts +29 -0
  340. package/lib/types/ai/code-preview/stories/index.d.ts.map +1 -0
  341. package/lib/types/ai/file-tag/FileTag.d.ts +44 -0
  342. package/lib/types/ai/file-tag/FileTag.d.ts.map +1 -0
  343. package/lib/types/ai/file-tag/index.d.ts +22 -0
  344. package/lib/types/ai/file-tag/index.d.ts.map +1 -0
  345. package/lib/types/ai/file-tag/stories/file-tag-chat.story.d.ts +24 -0
  346. package/lib/types/ai/file-tag/stories/file-tag-chat.story.d.ts.map +1 -0
  347. package/lib/types/ai/file-tag/stories/file-tag-loading.story.d.ts +24 -0
  348. package/lib/types/ai/file-tag/stories/file-tag-loading.story.d.ts.map +1 -0
  349. package/lib/types/ai/file-tag/stories/file-tag-prompt.story.d.ts +24 -0
  350. package/lib/types/ai/file-tag/stories/file-tag-prompt.story.d.ts.map +1 -0
  351. package/lib/types/ai/file-tag/stories/file-tag.stories.d.ts +29 -0
  352. package/lib/types/ai/file-tag/stories/file-tag.stories.d.ts.map +1 -0
  353. package/lib/types/ai/file-tag/stories/index.d.ts +27 -0
  354. package/lib/types/ai/file-tag/stories/index.d.ts.map +1 -0
  355. package/lib/types/ai/image-tag/ImageTag.d.ts +46 -0
  356. package/lib/types/ai/image-tag/ImageTag.d.ts.map +1 -0
  357. package/lib/types/ai/image-tag/index.d.ts +22 -0
  358. package/lib/types/ai/image-tag/index.d.ts.map +1 -0
  359. package/lib/types/ai/image-tag/stories/image-tag-chat.story.d.ts +24 -0
  360. package/lib/types/ai/image-tag/stories/image-tag-chat.story.d.ts.map +1 -0
  361. package/lib/types/ai/image-tag/stories/image-tag-loading.story.d.ts +24 -0
  362. package/lib/types/ai/image-tag/stories/image-tag-loading.story.d.ts.map +1 -0
  363. package/lib/types/ai/image-tag/stories/image-tag-prompt.story.d.ts +24 -0
  364. package/lib/types/ai/image-tag/stories/image-tag-prompt.story.d.ts.map +1 -0
  365. package/lib/types/ai/image-tag/stories/image-tag.stories.d.ts +29 -0
  366. package/lib/types/ai/image-tag/stories/image-tag.stories.d.ts.map +1 -0
  367. package/lib/types/ai/image-tag/stories/index.d.ts +27 -0
  368. package/lib/types/ai/image-tag/stories/index.d.ts.map +1 -0
  369. package/lib/types/ai/index.d.ts +11 -0
  370. package/lib/types/ai/index.d.ts.map +1 -1
  371. package/lib/types/ai/more-files/MoreFiles.d.ts +38 -0
  372. package/lib/types/ai/more-files/MoreFiles.d.ts.map +1 -0
  373. package/lib/types/ai/more-files/index.d.ts +22 -0
  374. package/lib/types/ai/more-files/index.d.ts.map +1 -0
  375. package/lib/types/ai/more-files/stories/index.d.ts +23 -0
  376. package/lib/types/ai/more-files/stories/index.d.ts.map +1 -0
  377. package/lib/types/ai/more-files/stories/more-files.stories.d.ts +27 -0
  378. package/lib/types/ai/more-files/stories/more-files.stories.d.ts.map +1 -0
  379. package/lib/types/ai/more-files/stories/more-files.story.d.ts +24 -0
  380. package/lib/types/ai/more-files/stories/more-files.story.d.ts.map +1 -0
  381. package/lib/types/ai/presence/Presence.d.ts.map +1 -1
  382. package/lib/types/ai/prompt/Prompt.d.ts +62 -0
  383. package/lib/types/ai/prompt/Prompt.d.ts.map +1 -0
  384. package/lib/types/ai/prompt/index.d.ts +22 -0
  385. package/lib/types/ai/prompt/index.d.ts.map +1 -0
  386. package/lib/types/ai/prompt/stories/index.d.ts +25 -0
  387. package/lib/types/ai/prompt/stories/index.d.ts.map +1 -0
  388. package/lib/types/ai/prompt/stories/prompt-advanced.story.d.ts +24 -0
  389. package/lib/types/ai/prompt/stories/prompt-advanced.story.d.ts.map +1 -0
  390. package/lib/types/ai/prompt/stories/prompt-default.story.d.ts +24 -0
  391. package/lib/types/ai/prompt/stories/prompt-default.story.d.ts.map +1 -0
  392. package/lib/types/ai/prompt/stories/prompt.stories.d.ts +28 -0
  393. package/lib/types/ai/prompt/stories/prompt.stories.d.ts.map +1 -0
  394. package/lib/types/ai/reasoning/Reasoning.d.ts +44 -0
  395. package/lib/types/ai/reasoning/Reasoning.d.ts.map +1 -0
  396. package/lib/types/ai/reasoning/index.d.ts +22 -0
  397. package/lib/types/ai/reasoning/index.d.ts.map +1 -0
  398. package/lib/types/ai/reasoning/stories/index.d.ts +23 -0
  399. package/lib/types/ai/reasoning/stories/index.d.ts.map +1 -0
  400. package/lib/types/ai/reasoning/stories/reasoning-full.story.d.ts +24 -0
  401. package/lib/types/ai/reasoning/stories/reasoning-full.story.d.ts.map +1 -0
  402. package/lib/types/ai/reasoning/stories/reasoning.stories.d.ts +27 -0
  403. package/lib/types/ai/reasoning/stories/reasoning.stories.d.ts.map +1 -0
  404. package/lib/types/ai/response/Response.d.ts +37 -0
  405. package/lib/types/ai/response/Response.d.ts.map +1 -0
  406. package/lib/types/ai/response/index.d.ts +22 -0
  407. package/lib/types/ai/response/index.d.ts.map +1 -0
  408. package/lib/types/ai/response/stories/index.d.ts +35 -0
  409. package/lib/types/ai/response/stories/index.d.ts.map +1 -0
  410. package/lib/types/ai/response/stories/response-all-components.story.d.ts +24 -0
  411. package/lib/types/ai/response/stories/response-all-components.story.d.ts.map +1 -0
  412. package/lib/types/ai/response/stories/response-code-examples.story.d.ts +24 -0
  413. package/lib/types/ai/response/stories/response-code-examples.story.d.ts.map +1 -0
  414. package/lib/types/ai/response/stories/response-default.story.d.ts +23 -0
  415. package/lib/types/ai/response/stories/response-default.story.d.ts.map +1 -0
  416. package/lib/types/ai/response/stories/response-full-example.story.d.ts +24 -0
  417. package/lib/types/ai/response/stories/response-full-example.story.d.ts.map +1 -0
  418. package/lib/types/ai/response/stories/response-headings.story.d.ts +24 -0
  419. package/lib/types/ai/response/stories/response-headings.story.d.ts.map +1 -0
  420. package/lib/types/ai/response/stories/response-lists.story.d.ts +24 -0
  421. package/lib/types/ai/response/stories/response-lists.story.d.ts.map +1 -0
  422. package/lib/types/ai/response/stories/response-streaming.story.d.ts +23 -0
  423. package/lib/types/ai/response/stories/response-streaming.story.d.ts.map +1 -0
  424. package/lib/types/ai/response/stories/response.stories.d.ts +33 -0
  425. package/lib/types/ai/response/stories/response.stories.d.ts.map +1 -0
  426. package/lib/types/ai/suggestion/Suggestion.d.ts +42 -0
  427. package/lib/types/ai/suggestion/Suggestion.d.ts.map +1 -0
  428. package/lib/types/ai/suggestion/index.d.ts +22 -0
  429. package/lib/types/ai/suggestion/index.d.ts.map +1 -0
  430. package/lib/types/ai/suggestion/stories/index.d.ts +29 -0
  431. package/lib/types/ai/suggestion/stories/index.d.ts.map +1 -0
  432. package/lib/types/ai/suggestion/stories/suggestion-default.story.d.ts +24 -0
  433. package/lib/types/ai/suggestion/stories/suggestion-default.story.d.ts.map +1 -0
  434. package/lib/types/ai/suggestion/stories/suggestion-icon.story.d.ts +24 -0
  435. package/lib/types/ai/suggestion/stories/suggestion-icon.story.d.ts.map +1 -0
  436. package/lib/types/ai/suggestion/stories/suggestion-primary.story.d.ts +24 -0
  437. package/lib/types/ai/suggestion/stories/suggestion-primary.story.d.ts.map +1 -0
  438. package/lib/types/ai/suggestion/stories/suggestion-sizes.story.d.ts +24 -0
  439. package/lib/types/ai/suggestion/stories/suggestion-sizes.story.d.ts.map +1 -0
  440. package/lib/types/ai/suggestion/stories/suggestion.stories.d.ts +30 -0
  441. package/lib/types/ai/suggestion/stories/suggestion.stories.d.ts.map +1 -0
  442. package/lib/types/ai/thinking/Thinking.d.ts +40 -0
  443. package/lib/types/ai/thinking/Thinking.d.ts.map +1 -0
  444. package/lib/types/ai/thinking/index.d.ts +22 -0
  445. package/lib/types/ai/thinking/index.d.ts.map +1 -0
  446. package/lib/types/ai/thinking/stories/ai-thinking-default.story.d.ts +24 -0
  447. package/lib/types/ai/thinking/stories/ai-thinking-default.story.d.ts.map +1 -0
  448. package/lib/types/ai/thinking/stories/ai-thinking-finished.story.d.ts +24 -0
  449. package/lib/types/ai/thinking/stories/ai-thinking-finished.story.d.ts.map +1 -0
  450. package/lib/types/ai/thinking/stories/ai-thinking.stories.d.ts +28 -0
  451. package/lib/types/ai/thinking/stories/ai-thinking.stories.d.ts.map +1 -0
  452. package/lib/types/ai/thinking/stories/index.d.ts +25 -0
  453. package/lib/types/ai/thinking/stories/index.d.ts.map +1 -0
  454. package/lib/types/ai/thinking/thinking-duration-formatter.d.ts +45 -0
  455. package/lib/types/ai/thinking/thinking-duration-formatter.d.ts.map +1 -0
  456. package/lib/types/ai/tool-call/ToolCall.d.ts +37 -0
  457. package/lib/types/ai/tool-call/ToolCall.d.ts.map +1 -0
  458. package/lib/types/ai/tool-call/index.d.ts +22 -0
  459. package/lib/types/ai/tool-call/index.d.ts.map +1 -0
  460. package/lib/types/ai/tool-call/stories/index.d.ts +25 -0
  461. package/lib/types/ai/tool-call/stories/index.d.ts.map +1 -0
  462. package/lib/types/ai/tool-call/stories/tool-call-default.story.d.ts +24 -0
  463. package/lib/types/ai/tool-call/stories/tool-call-default.story.d.ts.map +1 -0
  464. package/lib/types/ai/tool-call/stories/tool-call-done.story.d.ts +24 -0
  465. package/lib/types/ai/tool-call/stories/tool-call-done.story.d.ts.map +1 -0
  466. package/lib/types/ai/tool-call/stories/tool-call.stories.d.ts +28 -0
  467. package/lib/types/ai/tool-call/stories/tool-call.stories.d.ts.map +1 -0
  468. package/lib/types/ai/user-bubble/UserBubble.d.ts +39 -0
  469. package/lib/types/ai/user-bubble/UserBubble.d.ts.map +1 -0
  470. package/lib/types/ai/user-bubble/index.d.ts +22 -0
  471. package/lib/types/ai/user-bubble/index.d.ts.map +1 -0
  472. package/lib/types/ai/user-bubble/stories/index.d.ts +29 -0
  473. package/lib/types/ai/user-bubble/stories/index.d.ts.map +1 -0
  474. package/lib/types/ai/user-bubble/stories/user-bubble-action.story.d.ts +24 -0
  475. package/lib/types/ai/user-bubble/stories/user-bubble-action.story.d.ts.map +1 -0
  476. package/lib/types/ai/user-bubble/stories/user-bubble-and-files.story.d.ts +24 -0
  477. package/lib/types/ai/user-bubble/stories/user-bubble-and-files.story.d.ts.map +1 -0
  478. package/lib/types/ai/user-bubble/stories/user-bubble-long.story.d.ts +24 -0
  479. package/lib/types/ai/user-bubble/stories/user-bubble-long.story.d.ts.map +1 -0
  480. package/lib/types/ai/user-bubble/stories/user-bubble.stories.d.ts +30 -0
  481. package/lib/types/ai/user-bubble/stories/user-bubble.stories.d.ts.map +1 -0
  482. package/lib/types/ai/user-bubble/stories/user-bubble.story.d.ts +24 -0
  483. package/lib/types/ai/user-bubble/stories/user-bubble.story.d.ts.map +1 -0
  484. package/lib/types/code/Code.d.ts +4 -1
  485. package/lib/types/code/Code.d.ts.map +1 -1
  486. package/lib/types/text-area/TextArea.d.ts.map +1 -1
  487. package/package.json +3 -2
@@ -0,0 +1,158 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ *
4
+ * Copyright (c) "Neo4j"
5
+ * Neo4j Sweden AB [http://neo4j.com]
6
+ *
7
+ * This file is part of Neo4j.
8
+ *
9
+ * Neo4j is free software: you can redistribute it and/or modify
10
+ * it under the terms of the GNU General Public License as published by
11
+ * the Free Software Foundation, either version 3 of the License, or
12
+ * (at your option) any later version.
13
+ *
14
+ * This program is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ * GNU General Public License for more details.
18
+ *
19
+ * You should have received a copy of the GNU General Public License
20
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
21
+ */
22
+ import { CleanIconButton, TextLink, Typography } from '@neo4j-ndl/react';
23
+ import { Prompt, Response, Suggestion, Thinking, UserBubble, } from '@neo4j-ndl/react/ai';
24
+ import { ArrowPathIconOutline, Cog6ToothIconOutline, HandThumbDownIconOutline, PlusIconOutline, Square2StackIconOutline, XMarkIconOutline, } from '@neo4j-ndl/react/icons';
25
+ import { useEffect, useRef, useState } from 'react';
26
+ const FAKE_RESPONSES = [
27
+ `Here is a simple response with some **bold text** and *italics*.`,
28
+ `Here is a list of items:
29
+ - Item 1
30
+ - Item 2
31
+ - Item 3`,
32
+ `Here is a code block example:
33
+
34
+ \`\`\`typescript
35
+ const greeting = "Hello World";
36
+ console.log(greeting);
37
+ \`\`\`
38
+ `,
39
+ `# Heading 1
40
+ ## Heading 2
41
+ ### Heading 3
42
+
43
+ Some text under headings.`,
44
+ `You can also use tables:
45
+
46
+ | Header 1 | Header 2 |
47
+ |Data 1|Data 2|
48
+ |Data 3|Data 4|
49
+ `,
50
+ ];
51
+ export const Component = () => {
52
+ const [messages, setMessages] = useState([]);
53
+ const [prompt, setPrompt] = useState('');
54
+ const [isThinking, setIsThinking] = useState(false);
55
+ const [isStreaming, setIsStreaming] = useState(false);
56
+ const [responseIndex, setResponseIndex] = useState(0);
57
+ const messagesEndRef = useRef(null);
58
+ const timeoutRef = useRef(null);
59
+ const intervalRef = useRef(null);
60
+ const scrollToBottom = () => {
61
+ var _a;
62
+ (_a = messagesEndRef.current) === null || _a === void 0 ? void 0 : _a.scrollIntoView({ behavior: 'smooth' });
63
+ };
64
+ useEffect(() => {
65
+ scrollToBottom();
66
+ }, [messages, isThinking]);
67
+ const handleSend = (overridePrompt) => {
68
+ // Handle Stop
69
+ if (isThinking || isStreaming) {
70
+ if (timeoutRef.current) {
71
+ clearTimeout(timeoutRef.current);
72
+ }
73
+ if (intervalRef.current) {
74
+ clearInterval(intervalRef.current);
75
+ }
76
+ setIsThinking(false);
77
+ setIsStreaming(false);
78
+ // Mark the last message as done if stopped
79
+ setMessages((prev) => {
80
+ const newMessages = [...prev];
81
+ const lastMessage = newMessages[newMessages.length - 1];
82
+ if ((lastMessage === null || lastMessage === void 0 ? void 0 : lastMessage.role) === 'assistant') {
83
+ lastMessage.done = true;
84
+ }
85
+ return newMessages;
86
+ });
87
+ return;
88
+ }
89
+ const textToSend = overridePrompt || prompt;
90
+ if (!textToSend.trim()) {
91
+ return;
92
+ }
93
+ setMessages((prev) => [...prev, { content: textToSend, role: 'user' }]);
94
+ setPrompt('');
95
+ setIsThinking(true);
96
+ const startTime = Date.now();
97
+ // Simulate network delay (thinking time)
98
+ timeoutRef.current = setTimeout(() => {
99
+ const endTime = Date.now();
100
+ const thinkingTime = endTime - startTime;
101
+ setIsThinking(false);
102
+ setIsStreaming(true);
103
+ const responseText = FAKE_RESPONSES[responseIndex];
104
+ setResponseIndex((prev) => (prev + 1) % FAKE_RESPONSES.length);
105
+ let currentText = '';
106
+ setMessages((prev) => [
107
+ ...prev,
108
+ { content: '', done: false, role: 'assistant', thinkingTime },
109
+ ]);
110
+ // Simulate streaming
111
+ intervalRef.current = setInterval(() => {
112
+ if (currentText.length < responseText.length) {
113
+ // Add a few characters at a time to simulate chunks
114
+ // Ensure we don't split newlines incorrectly if that's an issue,
115
+ // but simple slicing should be fine as long as the source has \n.
116
+ const chunk = responseText.slice(currentText.length, currentText.length + 2);
117
+ currentText += chunk;
118
+ setMessages((prev) => {
119
+ const newMessages = [...prev];
120
+ const lastMessage = newMessages[newMessages.length - 1];
121
+ if (lastMessage.role === 'assistant') {
122
+ lastMessage.content = currentText;
123
+ }
124
+ return newMessages;
125
+ });
126
+ }
127
+ else {
128
+ if (intervalRef.current) {
129
+ clearInterval(intervalRef.current);
130
+ }
131
+ setIsStreaming(false);
132
+ setMessages((prev) => {
133
+ const newMessages = [...prev];
134
+ const lastMessage = newMessages[newMessages.length - 1];
135
+ if (lastMessage.role === 'assistant') {
136
+ lastMessage.done = true;
137
+ }
138
+ return newMessages;
139
+ });
140
+ }
141
+ }, 50);
142
+ }, 2000);
143
+ };
144
+ return (_jsx("section", { className: "n-h-screen", children: _jsxs("div", { className: "n-w-[440px] n-h-full n-flex n-flex-col n-bg-neutral-bg-weak", children: [_jsx("div", { className: "n-flex n-flex-row n-border-b n-border-neutral-border-weak n-p-3", children: _jsxs("div", { className: "n-ml-auto", children: [_jsx(CleanIconButton, { description: "settings", tooltipProps: {}, children: _jsx(Cog6ToothIconOutline, {}) }), _jsx(CleanIconButton, { description: "close", children: _jsx(XMarkIconOutline, {}) })] }) }), _jsx("div", { className: "n-p-4 n-flex n-flex-col n-grow n-overflow-y-auto", children: messages.length === 0 ? (_jsx("div", { className: "n-flex n-flex-col ", children: _jsxs("div", { className: "n-flex n-flex-col n-gap-12", children: [_jsx(Typography, { variant: "display", children: "Hi [User], how can I help you today?" }), _jsxs("div", { className: "n-flex n-flex-col n-gap-4", children: [_jsx(Typography, { variant: "body-medium", children: "Suggestions" }), _jsx(Suggestion, { isPrimary: true, onClick: () => {
145
+ handleSend('I want to import data');
146
+ }, children: "I want to import data" }), _jsx(Suggestion, { onClick: () => {
147
+ handleSend('Create an AI agent');
148
+ }, children: "Create an AI agent" }), _jsx(Suggestion, { onClick: () => {
149
+ handleSend('Invite project members');
150
+ }, children: "Invite project members" }), _jsx(Suggestion, { onClick: () => {
151
+ handleSend('Generate a report');
152
+ }, children: "Generate a report" })] }), _jsxs(Typography, { variant: "body-medium", children: ["You can also drag and drop files here, or", ' ', _jsx(TextLink, { as: "button", type: "internal-underline", children: "browse" }), ". Supports CVG, MOV, PDF"] })] }) })) : (_jsxs("div", { className: "n-flex n-flex-col n-gap-4 n-pb-4", children: [messages.map((msg, idx) => (_jsx("div", { className: `n-flex ${msg.role === 'user' ? 'n-justify-end' : 'n-justify-start'}`, children: msg.role === 'user' ? (_jsx("div", { className: "n-max-w-[85%]", children: _jsx(UserBubble, { avatarProps: {
153
+ name: 'NM',
154
+ type: 'letters',
155
+ }, children: msg.content }) })) : (_jsxs("div", { className: "n-w-full n-flex n-flex-col n-gap-2", children: [msg.thinkingTime !== undefined && (_jsx(Thinking, { isThinking: false, thinkingMs: msg.thinkingTime })), _jsxs("div", { className: "n-flex n-flex-col n-gap-2", children: [_jsx(Response, { children: msg.content }), msg.done === true && (_jsxs("div", { className: "n-flex n-flex-row n-gap-1.5", children: [_jsx(CleanIconButton, { size: "small", description: "Dislike", children: _jsx(HandThumbDownIconOutline, {}) }), _jsx(CleanIconButton, { size: "small", description: "Re-run", children: _jsx(ArrowPathIconOutline, {}) }), _jsx(CleanIconButton, { size: "small", description: "Copy", children: _jsx(Square2StackIconOutline, {}) })] }))] })] })) }, idx))), isThinking && _jsx(Thinking, { isThinking: true }), _jsx("div", { ref: messagesEndRef })] })) }), _jsx("div", { className: "n-p-4 n-mt-auto", children: _jsx(Prompt, { value: prompt, onChange: (e) => setPrompt(e.target.value), onSubmitPrompt: () => handleSend(), isRunningPrompt: isThinking || isStreaming, isSubmitDisabled: prompt.length === 0 && !(isThinking || isStreaming), bottomContent: _jsx(CleanIconButton, { description: "Add files", size: "small", children: _jsx(PlusIconOutline, {}) }) }) })] }) }));
156
+ };
157
+ export default Component;
158
+ //# sourceMappingURL=response-full-example.story.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-full-example.story.js","sourceRoot":"","sources":["../../../../../src/ai/response/stories/response-full-example.story.tsx"],"names":[],"mappings":"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","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport { CleanIconButton, TextLink, Typography } from '@neo4j-ndl/react';\nimport {\n Prompt,\n Response,\n Suggestion,\n Thinking,\n UserBubble,\n} from '@neo4j-ndl/react/ai';\nimport {\n ArrowPathIconOutline,\n Cog6ToothIconOutline,\n HandThumbDownIconOutline,\n PlusIconOutline,\n Square2StackIconOutline,\n XMarkIconOutline,\n} from '@neo4j-ndl/react/icons';\nimport { useEffect, useRef, useState } from 'react';\n\nconst FAKE_RESPONSES = [\n `Here is a simple response with some **bold text** and *italics*.`,\n `Here is a list of items:\n- Item 1\n- Item 2\n- Item 3`,\n `Here is a code block example:\n\n\\`\\`\\`typescript\nconst greeting = \"Hello World\";\nconsole.log(greeting);\n\\`\\`\\`\n`,\n `# Heading 1\n## Heading 2\n### Heading 3\n\nSome text under headings.`,\n `You can also use tables:\n\n| Header 1 | Header 2 |\n|Data 1|Data 2|\n|Data 3|Data 4|\n`,\n];\n\nexport const Component = () => {\n const [messages, setMessages] = useState<\n {\n role: 'user' | 'assistant';\n content: string;\n thinkingTime?: number;\n done?: boolean;\n }[]\n >([]);\n const [prompt, setPrompt] = useState('');\n const [isThinking, setIsThinking] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [responseIndex, setResponseIndex] = useState(0);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const intervalRef = useRef<NodeJS.Timeout | null>(null);\n\n const scrollToBottom = () => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n };\n\n useEffect(() => {\n scrollToBottom();\n }, [messages, isThinking]);\n\n const handleSend = (overridePrompt?: string) => {\n // Handle Stop\n if (isThinking || isStreaming) {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n setIsThinking(false);\n setIsStreaming(false);\n\n // Mark the last message as done if stopped\n setMessages((prev) => {\n const newMessages = [...prev];\n const lastMessage = newMessages[newMessages.length - 1];\n if (lastMessage?.role === 'assistant') {\n lastMessage.done = true;\n }\n return newMessages;\n });\n return;\n }\n\n const textToSend = overridePrompt || prompt;\n\n if (!textToSend.trim()) {\n return;\n }\n\n setMessages((prev) => [...prev, { content: textToSend, role: 'user' }]);\n setPrompt('');\n setIsThinking(true);\n const startTime = Date.now();\n\n // Simulate network delay (thinking time)\n timeoutRef.current = setTimeout(() => {\n const endTime = Date.now();\n const thinkingTime = endTime - startTime;\n setIsThinking(false);\n setIsStreaming(true);\n\n const responseText = FAKE_RESPONSES[responseIndex];\n setResponseIndex((prev) => (prev + 1) % FAKE_RESPONSES.length);\n\n let currentText = '';\n setMessages((prev) => [\n ...prev,\n { content: '', done: false, role: 'assistant', thinkingTime },\n ]);\n\n // Simulate streaming\n intervalRef.current = setInterval(() => {\n if (currentText.length < responseText.length) {\n // Add a few characters at a time to simulate chunks\n // Ensure we don't split newlines incorrectly if that's an issue,\n // but simple slicing should be fine as long as the source has \\n.\n const chunk = responseText.slice(\n currentText.length,\n currentText.length + 2,\n );\n currentText += chunk;\n\n setMessages((prev) => {\n const newMessages = [...prev];\n const lastMessage = newMessages[newMessages.length - 1];\n if (lastMessage.role === 'assistant') {\n lastMessage.content = currentText;\n }\n return newMessages;\n });\n } else {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n setIsStreaming(false);\n setMessages((prev) => {\n const newMessages = [...prev];\n const lastMessage = newMessages[newMessages.length - 1];\n if (lastMessage.role === 'assistant') {\n lastMessage.done = true;\n }\n return newMessages;\n });\n }\n }, 50);\n }, 2000);\n };\n\n return (\n <section className=\"n-h-screen\">\n <div className=\"n-w-[440px] n-h-full n-flex n-flex-col n-bg-neutral-bg-weak\">\n <div className=\"n-flex n-flex-row n-border-b n-border-neutral-border-weak n-p-3\">\n <div className=\"n-ml-auto\">\n <CleanIconButton description=\"settings\" tooltipProps={{}}>\n <Cog6ToothIconOutline />\n </CleanIconButton>\n <CleanIconButton description=\"close\">\n <XMarkIconOutline />\n </CleanIconButton>\n </div>\n </div>\n <div className=\"n-p-4 n-flex n-flex-col n-grow n-overflow-y-auto\">\n {messages.length === 0 ? (\n <div className=\"n-flex n-flex-col \">\n <div className=\"n-flex n-flex-col n-gap-12\">\n <Typography variant=\"display\">\n Hi [User], how can I help you today?\n </Typography>\n <div className=\"n-flex n-flex-col n-gap-4\">\n <Typography variant=\"body-medium\">Suggestions</Typography>\n <Suggestion\n isPrimary\n onClick={() => {\n handleSend('I want to import data');\n }}\n >\n I want to import data\n </Suggestion>\n <Suggestion\n onClick={() => {\n handleSend('Create an AI agent');\n }}\n >\n Create an AI agent\n </Suggestion>\n <Suggestion\n onClick={() => {\n handleSend('Invite project members');\n }}\n >\n Invite project members\n </Suggestion>\n <Suggestion\n onClick={() => {\n handleSend('Generate a report');\n }}\n >\n Generate a report\n </Suggestion>\n </div>\n <Typography variant=\"body-medium\">\n You can also drag and drop files here, or{' '}\n <TextLink as=\"button\" type=\"internal-underline\">\n browse\n </TextLink>\n . Supports CVG, MOV, PDF\n </Typography>\n </div>\n </div>\n ) : (\n <div className=\"n-flex n-flex-col n-gap-4 n-pb-4\">\n {messages.map((msg, idx) => (\n <div\n key={idx}\n className={`n-flex ${\n msg.role === 'user' ? 'n-justify-end' : 'n-justify-start'\n }`}\n >\n {msg.role === 'user' ? (\n <div className=\"n-max-w-[85%]\">\n <UserBubble\n avatarProps={{\n name: 'NM',\n type: 'letters',\n }}\n >\n {msg.content}\n </UserBubble>\n </div>\n ) : (\n <div className=\"n-w-full n-flex n-flex-col n-gap-2\">\n {msg.thinkingTime !== undefined && (\n <Thinking\n isThinking={false}\n thinkingMs={msg.thinkingTime}\n />\n )}\n <div className=\"n-flex n-flex-col n-gap-2\">\n <Response>{msg.content}</Response>\n\n {msg.done === true && (\n <div className=\"n-flex n-flex-row n-gap-1.5\">\n <CleanIconButton size=\"small\" description=\"Dislike\">\n <HandThumbDownIconOutline />\n </CleanIconButton>\n <CleanIconButton size=\"small\" description=\"Re-run\">\n <ArrowPathIconOutline />\n </CleanIconButton>\n <CleanIconButton size=\"small\" description=\"Copy\">\n <Square2StackIconOutline />\n </CleanIconButton>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n ))}\n {isThinking && <Thinking isThinking={true} />}\n <div ref={messagesEndRef} />\n </div>\n )}\n </div>\n <div className=\"n-p-4 n-mt-auto\">\n <Prompt\n value={prompt}\n onChange={(e) => setPrompt(e.target.value)}\n onSubmitPrompt={() => handleSend()}\n isRunningPrompt={isThinking || isStreaming}\n isSubmitDisabled={\n prompt.length === 0 && !(isThinking || isStreaming)\n }\n bottomContent={\n <CleanIconButton description=\"Add files\" size=\"small\">\n <PlusIconOutline />\n </CleanIconButton>\n }\n />\n </div>\n </div>\n </section>\n );\n};\n\nexport default Component;\n"]}
@@ -0,0 +1,116 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ *
4
+ * Copyright (c) "Neo4j"
5
+ * Neo4j Sweden AB [http://neo4j.com]
6
+ *
7
+ * This file is part of Neo4j.
8
+ *
9
+ * Neo4j is free software: you can redistribute it and/or modify
10
+ * it under the terms of the GNU General Public License as published by
11
+ * the Free Software Foundation, either version 3 of the License, or
12
+ * (at your option) any later version.
13
+ *
14
+ * This program is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ * GNU General Public License for more details.
18
+ *
19
+ * You should have received a copy of the GNU General Public License
20
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
21
+ */
22
+ import { Response } from '@neo4j-ndl/react/ai';
23
+ const headingsMarkdown = `
24
+ # Heading Level 1
25
+ This is content under heading 1.
26
+
27
+ ## Heading Level 2
28
+ This is content under heading 2.
29
+
30
+ ### Heading Level 3
31
+ This is content under heading 3.
32
+
33
+ #### Heading Level 4
34
+ This is content under heading 4.
35
+
36
+ ##### Heading Level 5
37
+ This is content under heading 5.
38
+
39
+ ###### Heading Level 6
40
+ This is content under heading 6.
41
+
42
+ ---
43
+
44
+ ## Document Structure Example
45
+
46
+ # Main Document Title
47
+
48
+ Brief introduction to the document.
49
+
50
+ ## Introduction
51
+
52
+ This section provides an overview of what we'll cover.
53
+
54
+ ### Background
55
+
56
+ Some background information about the topic.
57
+
58
+ #### Historical Context
59
+
60
+ Details about the history.
61
+
62
+ ##### Key Events
63
+
64
+ - Event 1
65
+ - Event 2
66
+ - Event 3
67
+
68
+ ###### Notes
69
+
70
+ Additional notes and references.
71
+
72
+ ## Content Section
73
+
74
+ Main content goes here.
75
+
76
+ ### Subsection A
77
+
78
+ Details for subsection A.
79
+
80
+ ### Subsection B
81
+
82
+ Details for subsection B.
83
+
84
+ ## Conclusion
85
+
86
+ Final thoughts and summary.
87
+
88
+ ---
89
+
90
+ ## Headings with Other Elements
91
+
92
+ ### Code Example
93
+
94
+ \`\`\`javascript
95
+ console.log("Hello from heading section");
96
+ \`\`\`
97
+
98
+ ### List Example
99
+
100
+ - Item 1
101
+ - Item 2
102
+ - Item 3
103
+
104
+ ### Quote Example
105
+
106
+ > "This is a quote under a heading."
107
+
108
+ ### Mixed Content
109
+
110
+ Regular paragraph with **bold** and *italic* text.
111
+ `;
112
+ export const Component = () => {
113
+ return (_jsx("div", { className: "max-w-4xl", children: _jsx(Response, { children: headingsMarkdown }) }));
114
+ };
115
+ export default Component;
116
+ //# sourceMappingURL=response-headings.story.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-headings.story.js","sourceRoot":"","sources":["../../../../../src/ai/response/stories/response-headings.story.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwFxB,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE;IAC5B,OAAO,CACL,cAAK,SAAS,EAAC,WAAW,YACxB,KAAC,QAAQ,cAAE,gBAAgB,GAAY,GACnC,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport { Response } from '@neo4j-ndl/react/ai';\n\nconst headingsMarkdown = `\n# Heading Level 1\nThis is content under heading 1.\n\n## Heading Level 2\nThis is content under heading 2.\n\n### Heading Level 3\nThis is content under heading 3.\n\n#### Heading Level 4\nThis is content under heading 4.\n\n##### Heading Level 5\nThis is content under heading 5.\n\n###### Heading Level 6\nThis is content under heading 6.\n\n---\n\n## Document Structure Example\n\n# Main Document Title\n\nBrief introduction to the document.\n\n## Introduction\n\nThis section provides an overview of what we'll cover.\n\n### Background\n\nSome background information about the topic.\n\n#### Historical Context\n\nDetails about the history.\n\n##### Key Events\n\n- Event 1\n- Event 2\n- Event 3\n\n###### Notes\n\nAdditional notes and references.\n\n## Content Section\n\nMain content goes here.\n\n### Subsection A\n\nDetails for subsection A.\n\n### Subsection B\n\nDetails for subsection B.\n\n## Conclusion\n\nFinal thoughts and summary.\n\n---\n\n## Headings with Other Elements\n\n### Code Example\n\n\\`\\`\\`javascript\nconsole.log(\"Hello from heading section\");\n\\`\\`\\`\n\n### List Example\n\n- Item 1\n- Item 2\n- Item 3\n\n### Quote Example\n\n> \"This is a quote under a heading.\"\n\n### Mixed Content\n\nRegular paragraph with **bold** and *italic* text.\n`;\n\nexport const Component = () => {\n return (\n <div className=\"max-w-4xl\">\n <Response>{headingsMarkdown}</Response>\n </div>\n );\n};\n\nexport default Component;\n"]}
@@ -0,0 +1,166 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ *
4
+ * Copyright (c) "Neo4j"
5
+ * Neo4j Sweden AB [http://neo4j.com]
6
+ *
7
+ * This file is part of Neo4j.
8
+ *
9
+ * Neo4j is free software: you can redistribute it and/or modify
10
+ * it under the terms of the GNU General Public License as published by
11
+ * the Free Software Foundation, either version 3 of the License, or
12
+ * (at your option) any later version.
13
+ *
14
+ * This program is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ * GNU General Public License for more details.
18
+ *
19
+ * You should have received a copy of the GNU General Public License
20
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
21
+ */
22
+ import { Response } from '@neo4j-ndl/react/ai';
23
+ const listsMarkdown = `
24
+ # Lists Examples
25
+
26
+ ## Simple Unordered List
27
+
28
+ - Apple
29
+ - Banana
30
+ - Cherry
31
+ - Date
32
+ - Elderberry
33
+
34
+ ## Simple Ordered List
35
+
36
+ 1. First step
37
+ 2. Second step
38
+ 3. Third step
39
+ 4. Fourth step
40
+ 5. Fifth step
41
+
42
+ ## Nested Unordered Lists
43
+
44
+ - Fruits
45
+ - Apples
46
+ - Granny Smith
47
+ - Honeycrisp
48
+ - Fuji
49
+ - Oranges
50
+ - Navel
51
+ - Blood Orange
52
+ - Berries
53
+ - Strawberry
54
+ - Blueberry
55
+ - Raspberry
56
+ - Vegetables
57
+ - Leafy Greens
58
+ - Spinach
59
+ - Kale
60
+ - Root Vegetables
61
+ - Carrot
62
+ - Potato
63
+
64
+ ## Nested Ordered Lists
65
+
66
+ 1. Introduction
67
+ 1. Overview
68
+ 2. Purpose
69
+ 3. Scope
70
+ 2. Main Content
71
+ 1. Chapter 1
72
+ 1. Section 1.1
73
+ 2. Section 1.2
74
+ 3. Section 1.3
75
+ 2. Chapter 2
76
+ 1. Section 2.1
77
+ 2. Section 2.2
78
+ 3. Conclusion
79
+ 1. Summary
80
+ 2. Recommendations
81
+
82
+ ## Mixed Lists
83
+
84
+ 1. Install dependencies
85
+ - Node.js
86
+ - npm or yarn
87
+ - Git
88
+ 2. Clone repository
89
+ - \`git clone <url>\`
90
+ - \`cd project-name\`
91
+ 3. Configure settings
92
+ 1. Copy \`.env.example\` to \`.env\`
93
+ 2. Update configuration values:
94
+ - Database URL
95
+ - API keys
96
+ - Port number
97
+ 4. Start development server
98
+ - Run \`npm install\`
99
+ - Run \`npm start\`
100
+
101
+ ## Lists with Paragraphs
102
+
103
+ - **First Item**
104
+
105
+ This is a detailed explanation of the first item. It can contain multiple sentences and provide context.
106
+
107
+ - **Second Item**
108
+
109
+ The second item also has a detailed explanation. This helps provide more information to the reader.
110
+
111
+ - **Third Item**
112
+
113
+ Each item can have as much detail as needed.
114
+
115
+ ## Lists with Code
116
+
117
+ - JavaScript example:
118
+
119
+ \`\`\`javascript
120
+ const items = ['a', 'b', 'c'];
121
+ items.forEach(item => console.log(item));
122
+ \`\`\`
123
+
124
+ - Python example:
125
+
126
+ \`\`\`python
127
+ items = ['a', 'b', 'c']
128
+ for item in items:
129
+ print(item)
130
+ \`\`\`
131
+
132
+ ## Task Lists Representation
133
+
134
+ - [x] Complete feature A
135
+ - [x] Write tests
136
+ - [ ] Review code
137
+ - [ ] Deploy to production
138
+ - [ ] Monitor metrics
139
+
140
+ ## Lists with Links
141
+
142
+ 1. Official Resources
143
+ - [Neo4j Documentation](https://neo4j.com/docs)
144
+ - [Neo4j Community](https://community.neo4j.com)
145
+ - [Neo4j GitHub](https://github.com/neo4j)
146
+ 2. Tutorials
147
+ - [Getting Started Guide](https://neo4j.com/start)
148
+ - [Cypher Query Language](https://neo4j.com/cypher)
149
+ 3. Tools
150
+ - Neo4j Desktop
151
+ - Neo4j Browser
152
+ - Neo4j Bloom
153
+
154
+ ## Lists with Inline Formatting
155
+
156
+ - **Bold item** with regular text
157
+ - *Italic item* with regular text
158
+ - \`Code item\` with regular text
159
+ - Regular text with **bold**, *italic*, and \`code\`
160
+ - Combination: **bold and *italic* text** together
161
+ `;
162
+ export const Component = () => {
163
+ return (_jsx("div", { className: "max-w-4xl", children: _jsx(Response, { children: listsMarkdown }) }));
164
+ };
165
+ export default Component;
166
+ //# sourceMappingURL=response-lists.story.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-lists.story.js","sourceRoot":"","sources":["../../../../../src/ai/response/stories/response-lists.story.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0IrB,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE;IAC5B,OAAO,CACL,cAAK,SAAS,EAAC,WAAW,YACxB,KAAC,QAAQ,cAAE,aAAa,GAAY,GAChC,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\nimport { Response } from '@neo4j-ndl/react/ai';\n\nconst listsMarkdown = `\n# Lists Examples\n\n## Simple Unordered List\n\n- Apple\n- Banana\n- Cherry\n- Date\n- Elderberry\n\n## Simple Ordered List\n\n1. First step\n2. Second step\n3. Third step\n4. Fourth step\n5. Fifth step\n\n## Nested Unordered Lists\n\n- Fruits\n - Apples\n - Granny Smith\n - Honeycrisp\n - Fuji\n - Oranges\n - Navel\n - Blood Orange\n - Berries\n - Strawberry\n - Blueberry\n - Raspberry\n- Vegetables\n - Leafy Greens\n - Spinach\n - Kale\n - Root Vegetables\n - Carrot\n - Potato\n\n## Nested Ordered Lists\n\n1. Introduction\n 1. Overview\n 2. Purpose\n 3. Scope\n2. Main Content\n 1. Chapter 1\n 1. Section 1.1\n 2. Section 1.2\n 3. Section 1.3\n 2. Chapter 2\n 1. Section 2.1\n 2. Section 2.2\n3. Conclusion\n 1. Summary\n 2. Recommendations\n\n## Mixed Lists\n\n1. Install dependencies\n - Node.js\n - npm or yarn\n - Git\n2. Clone repository\n - \\`git clone <url>\\`\n - \\`cd project-name\\`\n3. Configure settings\n 1. Copy \\`.env.example\\` to \\`.env\\`\n 2. Update configuration values:\n - Database URL\n - API keys\n - Port number\n4. Start development server\n - Run \\`npm install\\`\n - Run \\`npm start\\`\n\n## Lists with Paragraphs\n\n- **First Item**\n \n This is a detailed explanation of the first item. It can contain multiple sentences and provide context.\n\n- **Second Item**\n \n The second item also has a detailed explanation. This helps provide more information to the reader.\n\n- **Third Item**\n \n Each item can have as much detail as needed.\n\n## Lists with Code\n\n- JavaScript example:\n \n \\`\\`\\`javascript\n const items = ['a', 'b', 'c'];\n items.forEach(item => console.log(item));\n \\`\\`\\`\n\n- Python example:\n \n \\`\\`\\`python\n items = ['a', 'b', 'c']\n for item in items:\n print(item)\n \\`\\`\\`\n\n## Task Lists Representation\n\n- [x] Complete feature A\n- [x] Write tests\n- [ ] Review code\n- [ ] Deploy to production\n- [ ] Monitor metrics\n\n## Lists with Links\n\n1. Official Resources\n - [Neo4j Documentation](https://neo4j.com/docs)\n - [Neo4j Community](https://community.neo4j.com)\n - [Neo4j GitHub](https://github.com/neo4j)\n2. Tutorials\n - [Getting Started Guide](https://neo4j.com/start)\n - [Cypher Query Language](https://neo4j.com/cypher)\n3. Tools\n - Neo4j Desktop\n - Neo4j Browser\n - Neo4j Bloom\n\n## Lists with Inline Formatting\n\n- **Bold item** with regular text\n- *Italic item* with regular text\n- \\`Code item\\` with regular text\n- Regular text with **bold**, *italic*, and \\`code\\`\n- Combination: **bold and *italic* text** together\n`;\n\nexport const Component = () => {\n return (\n <div className=\"max-w-4xl\">\n <Response>{listsMarkdown}</Response>\n </div>\n );\n};\n\nexport default Component;\n"]}
@@ -0,0 +1,61 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ *
4
+ * Copyright (c) "Neo4j"
5
+ * Neo4j Sweden AB [http://neo4j.com]
6
+ *
7
+ * This file is part of Neo4j.
8
+ *
9
+ * Neo4j is free software: you can redistribute it and/or modify
10
+ * it under the terms of the GNU General Public License as published by
11
+ * the Free Software Foundation, either version 3 of the License, or
12
+ * (at your option) any later version.
13
+ *
14
+ * This program is distributed in the hope that it will be useful,
15
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ * GNU General Public License for more details.
18
+ *
19
+ * You should have received a copy of the GNU General Public License
20
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
21
+ */
22
+ import { Response } from '@neo4j-ndl/react/ai';
23
+ import { useEffect, useState } from 'react';
24
+ const StreamingComponent = () => {
25
+ const [content, setContent] = useState('');
26
+ useEffect(() => {
27
+ const fullContent = `
28
+ # Streaming Response
29
+
30
+ This content is being **streamed (and here's a long long long long bold text)** to simulate an AI response.
31
+
32
+ It handles:
33
+ 1. Partial updates
34
+ 2. Incomplete markdown
35
+ 3. Code blocks
36
+
37
+ \`\`\`javascript
38
+ function stream() {
39
+ return "streaming...";
40
+ }
41
+ \`\`\`
42
+ And here comes more text after the code block.`;
43
+ let currentIndex = 0;
44
+ const interval = setInterval(() => {
45
+ if (currentIndex < fullContent.length) {
46
+ setContent(fullContent.slice(0, currentIndex + 1));
47
+ currentIndex++;
48
+ }
49
+ else {
50
+ clearInterval(interval);
51
+ }
52
+ }, 30);
53
+ return () => clearInterval(interval);
54
+ }, []);
55
+ return _jsx(Response, { children: content });
56
+ };
57
+ export const Component = () => {
58
+ return _jsx(StreamingComponent, {});
59
+ };
60
+ export default Component;
61
+ //# sourceMappingURL=response-streaming.story.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-streaming.story.js","sourceRoot":"","sources":["../../../../../src/ai/response/stories/response-streaming.story.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,kBAAkB,GAAG,GAAG,EAAE;IAC9B,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAE3C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;+CAeuB,CAAC;QAE5C,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,IAAI,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;gBACtC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;gBACnD,YAAY,EAAE,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,KAAC,QAAQ,cAAE,OAAO,GAAY,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE;IAC5B,OAAO,KAAC,kBAAkB,KAAG,CAAC;AAChC,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC","sourcesContent":["/**\n *\n * Copyright (c) \"Neo4j\"\n * Neo4j Sweden AB [http://neo4j.com]\n *\n * This file is part of Neo4j.\n *\n * Neo4j is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with this program. If not, see <http://www.gnu.org/licenses/>.\n */\n\nimport { Response } from '@neo4j-ndl/react/ai';\nimport { useEffect, useState } from 'react';\n\nconst StreamingComponent = () => {\n const [content, setContent] = useState('');\n\n useEffect(() => {\n const fullContent = `\n# Streaming Response\n\nThis content is being **streamed (and here's a long long long long bold text)** to simulate an AI response.\n\nIt handles:\n1. Partial updates\n2. Incomplete markdown\n3. Code blocks\n\n\\`\\`\\`javascript\nfunction stream() {\n return \"streaming...\";\n}\n\\`\\`\\`\nAnd here comes more text after the code block.`;\n\n let currentIndex = 0;\n const interval = setInterval(() => {\n if (currentIndex < fullContent.length) {\n setContent(fullContent.slice(0, currentIndex + 1));\n currentIndex++;\n } else {\n clearInterval(interval);\n }\n }, 30);\n\n return () => clearInterval(interval);\n }, []);\n\n return <Response>{content}</Response>;\n};\n\nexport const Component = () => {\n return <StreamingComponent />;\n};\n\nexport default Component;\n"]}