@liveblocks/react-ui 2.25.0-aiprivatebeta5 → 2.25.0-aiprivatebeta7

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 (199) hide show
  1. package/dist/_private/index.cjs +4 -0
  2. package/dist/_private/index.cjs.map +1 -1
  3. package/dist/_private/index.d.cts +31 -94
  4. package/dist/_private/index.d.ts +31 -94
  5. package/dist/_private/index.js +2 -0
  6. package/dist/_private/index.js.map +1 -1
  7. package/dist/components/AiChat.cjs +217 -0
  8. package/dist/components/AiChat.cjs.map +1 -0
  9. package/dist/components/AiChat.js +215 -0
  10. package/dist/components/AiChat.js.map +1 -0
  11. package/dist/components/Comment.cjs +2 -2
  12. package/dist/components/Comment.cjs.map +1 -1
  13. package/dist/components/Comment.js +1 -1
  14. package/dist/components/Comment.js.map +1 -1
  15. package/dist/components/Composer.cjs +1 -2
  16. package/dist/components/Composer.cjs.map +1 -1
  17. package/dist/components/Composer.js +1 -2
  18. package/dist/components/Composer.js.map +1 -1
  19. package/dist/components/internal/AiChatAssistantMessage.cjs +83 -124
  20. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  21. package/dist/components/internal/AiChatAssistantMessage.js +81 -122
  22. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  23. package/dist/components/internal/AiChatComposer.cjs +30 -266
  24. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  25. package/dist/components/internal/AiChatComposer.js +35 -267
  26. package/dist/components/internal/AiChatComposer.js.map +1 -1
  27. package/dist/components/internal/AiChatUserMessage.cjs +18 -168
  28. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  29. package/dist/components/internal/AiChatUserMessage.js +20 -170
  30. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  31. package/dist/constants.cjs +2 -0
  32. package/dist/constants.cjs.map +1 -1
  33. package/dist/constants.js +2 -1
  34. package/dist/constants.js.map +1 -1
  35. package/dist/icon.cjs +4 -0
  36. package/dist/icon.cjs.map +1 -1
  37. package/dist/icon.js +2 -0
  38. package/dist/icon.js.map +1 -1
  39. package/dist/icons/Copy.cjs +8 -9
  40. package/dist/icons/Copy.cjs.map +1 -1
  41. package/dist/icons/Copy.js +8 -9
  42. package/dist/icons/Copy.js.map +1 -1
  43. package/dist/icons/Retry.cjs +21 -0
  44. package/dist/icons/Retry.cjs.map +1 -0
  45. package/dist/icons/Retry.js +19 -0
  46. package/dist/icons/Retry.js.map +1 -0
  47. package/dist/icons/index.cjs +4 -0
  48. package/dist/icons/index.cjs.map +1 -1
  49. package/dist/icons/index.js +2 -0
  50. package/dist/icons/index.js.map +1 -1
  51. package/dist/index.cjs +1 -1
  52. package/dist/index.cjs.map +1 -1
  53. package/dist/index.d.cts +32 -43
  54. package/dist/index.d.ts +32 -43
  55. package/dist/index.js +1 -1
  56. package/dist/index.js.map +1 -1
  57. package/dist/overrides.cjs +10 -10
  58. package/dist/overrides.cjs.map +1 -1
  59. package/dist/overrides.js +10 -10
  60. package/dist/overrides.js.map +1 -1
  61. package/dist/primitives/AiChatComposer/index.cjs +203 -0
  62. package/dist/primitives/AiChatComposer/index.cjs.map +1 -0
  63. package/dist/primitives/AiChatComposer/index.js +196 -0
  64. package/dist/primitives/AiChatComposer/index.js.map +1 -0
  65. package/dist/primitives/Comment/index.cjs +2 -2
  66. package/dist/primitives/Comment/index.cjs.map +1 -1
  67. package/dist/primitives/Comment/index.js +1 -1
  68. package/dist/primitives/Comment/index.js.map +1 -1
  69. package/dist/primitives/Composer/index.cjs +19 -14
  70. package/dist/primitives/Composer/index.cjs.map +1 -1
  71. package/dist/primitives/Composer/index.js +18 -13
  72. package/dist/primitives/Composer/index.js.map +1 -1
  73. package/dist/{slate → primitives/Composer/slate}/plugins/auto-formatting.cjs +3 -3
  74. package/dist/primitives/Composer/slate/plugins/auto-formatting.cjs.map +1 -0
  75. package/dist/{slate → primitives/Composer/slate}/plugins/auto-formatting.js +3 -3
  76. package/dist/primitives/Composer/slate/plugins/auto-formatting.js.map +1 -0
  77. package/dist/{slate → primitives/Composer/slate}/plugins/auto-links.cjs +7 -2
  78. package/dist/primitives/Composer/slate/plugins/auto-links.cjs.map +1 -0
  79. package/dist/{slate → primitives/Composer/slate}/plugins/auto-links.js +8 -3
  80. package/dist/primitives/Composer/slate/plugins/auto-links.js.map +1 -0
  81. package/dist/{slate → primitives/Composer/slate}/plugins/custom-links.cjs +8 -3
  82. package/dist/primitives/Composer/slate/plugins/custom-links.cjs.map +1 -0
  83. package/dist/{slate → primitives/Composer/slate}/plugins/custom-links.js +9 -4
  84. package/dist/primitives/Composer/slate/plugins/custom-links.js.map +1 -0
  85. package/dist/{slate → primitives/Composer/slate}/plugins/mentions.cjs +9 -10
  86. package/dist/primitives/Composer/slate/plugins/mentions.cjs.map +1 -0
  87. package/dist/{slate → primitives/Composer/slate}/plugins/mentions.js +6 -6
  88. package/dist/primitives/Composer/slate/plugins/mentions.js.map +1 -0
  89. package/dist/{slate → primitives/Composer/slate}/plugins/paste.cjs +1 -1
  90. package/dist/primitives/Composer/slate/plugins/paste.cjs.map +1 -0
  91. package/dist/{slate → primitives/Composer/slate}/plugins/paste.js +1 -1
  92. package/dist/primitives/Composer/slate/plugins/paste.js.map +1 -0
  93. package/dist/primitives/Composer/utils.cjs +4 -4
  94. package/dist/primitives/Composer/utils.cjs.map +1 -1
  95. package/dist/primitives/Composer/utils.js +4 -4
  96. package/dist/primitives/Composer/utils.js.map +1 -1
  97. package/dist/primitives/index.cjs +2 -5
  98. package/dist/primitives/index.cjs.map +1 -1
  99. package/dist/primitives/index.d.cts +33 -62
  100. package/dist/primitives/index.d.ts +33 -62
  101. package/dist/primitives/index.js +6 -5
  102. package/dist/primitives/index.js.map +1 -1
  103. package/dist/primitives/internal/{Collapsible.cjs → Collapsible/index.cjs} +23 -17
  104. package/dist/primitives/internal/Collapsible/index.cjs.map +1 -0
  105. package/dist/primitives/internal/{Collapsible.js → Collapsible/index.js} +23 -17
  106. package/dist/primitives/internal/Collapsible/index.js.map +1 -0
  107. package/dist/primitives/slate/plugins/empty-clear-formatting.cjs.map +1 -0
  108. package/dist/primitives/slate/plugins/empty-clear-formatting.js.map +1 -0
  109. package/dist/{slate → primitives/slate}/plugins/normalize.cjs +0 -5
  110. package/dist/primitives/slate/plugins/normalize.cjs.map +1 -0
  111. package/dist/{slate → primitives/slate}/plugins/normalize.js +0 -5
  112. package/dist/primitives/slate/plugins/normalize.js.map +1 -0
  113. package/dist/primitives/slate/utils/get-character.cjs.map +1 -0
  114. package/dist/primitives/slate/utils/get-character.js.map +1 -0
  115. package/dist/primitives/slate/utils/get-dom-range.cjs.map +1 -0
  116. package/dist/primitives/slate/utils/get-dom-range.js.map +1 -0
  117. package/dist/primitives/slate/utils/get-match-range.cjs.map +1 -0
  118. package/dist/primitives/slate/utils/get-match-range.js.map +1 -0
  119. package/dist/primitives/slate/utils/is-empty-string.cjs.map +1 -0
  120. package/dist/primitives/slate/utils/is-empty-string.js.map +1 -0
  121. package/dist/primitives/slate/utils/is-empty.cjs.map +1 -0
  122. package/dist/primitives/slate/utils/is-empty.js.map +1 -0
  123. package/dist/primitives/slate/utils/is-text.cjs.map +1 -0
  124. package/dist/primitives/slate/utils/is-text.js.map +1 -0
  125. package/dist/primitives/slate/utils/is-whitespace-character.cjs.map +1 -0
  126. package/dist/primitives/slate/utils/is-whitespace-character.js.map +1 -0
  127. package/dist/{slate → primitives/slate}/utils/marks.cjs +9 -9
  128. package/dist/primitives/slate/utils/marks.cjs.map +1 -0
  129. package/dist/{slate → primitives/slate}/utils/marks.js +9 -9
  130. package/dist/primitives/slate/utils/marks.js.map +1 -0
  131. package/dist/primitives/slate/utils/selection-contains-inlines.cjs.map +1 -0
  132. package/dist/primitives/slate/utils/selection-contains-inlines.js.map +1 -0
  133. package/dist/version.cjs +1 -1
  134. package/dist/version.js +1 -1
  135. package/package.json +4 -4
  136. package/src/styles/index.css +119 -133
  137. package/src/styles/utils.css +7 -2
  138. package/styles.css +1 -1
  139. package/styles.css.map +1 -1
  140. package/dist/components/AiChat/AiChat.cjs +0 -211
  141. package/dist/components/AiChat/AiChat.cjs.map +0 -1
  142. package/dist/components/AiChat/AiChat.js +0 -209
  143. package/dist/components/AiChat/AiChat.js.map +0 -1
  144. package/dist/primitives/Chat/Composer/index.cjs +0 -323
  145. package/dist/primitives/Chat/Composer/index.cjs.map +0 -1
  146. package/dist/primitives/Chat/Composer/index.js +0 -315
  147. package/dist/primitives/Chat/Composer/index.js.map +0 -1
  148. package/dist/primitives/internal/Collapsible.cjs.map +0 -1
  149. package/dist/primitives/internal/Collapsible.js.map +0 -1
  150. package/dist/slate/plugins/auto-formatting.cjs.map +0 -1
  151. package/dist/slate/plugins/auto-formatting.js.map +0 -1
  152. package/dist/slate/plugins/auto-links.cjs.map +0 -1
  153. package/dist/slate/plugins/auto-links.js.map +0 -1
  154. package/dist/slate/plugins/custom-links.cjs.map +0 -1
  155. package/dist/slate/plugins/custom-links.js.map +0 -1
  156. package/dist/slate/plugins/empty-clear-formatting.cjs.map +0 -1
  157. package/dist/slate/plugins/empty-clear-formatting.js.map +0 -1
  158. package/dist/slate/plugins/mentions.cjs.map +0 -1
  159. package/dist/slate/plugins/mentions.js.map +0 -1
  160. package/dist/slate/plugins/normalize.cjs.map +0 -1
  161. package/dist/slate/plugins/normalize.js.map +0 -1
  162. package/dist/slate/plugins/paste.cjs.map +0 -1
  163. package/dist/slate/plugins/paste.js.map +0 -1
  164. package/dist/slate/utils/get-character.cjs.map +0 -1
  165. package/dist/slate/utils/get-character.js.map +0 -1
  166. package/dist/slate/utils/get-dom-range.cjs.map +0 -1
  167. package/dist/slate/utils/get-dom-range.js.map +0 -1
  168. package/dist/slate/utils/get-match-range.cjs.map +0 -1
  169. package/dist/slate/utils/get-match-range.js.map +0 -1
  170. package/dist/slate/utils/is-empty-string.cjs.map +0 -1
  171. package/dist/slate/utils/is-empty-string.js.map +0 -1
  172. package/dist/slate/utils/is-empty.cjs.map +0 -1
  173. package/dist/slate/utils/is-empty.js.map +0 -1
  174. package/dist/slate/utils/is-text.cjs.map +0 -1
  175. package/dist/slate/utils/is-text.js.map +0 -1
  176. package/dist/slate/utils/is-whitespace-character.cjs.map +0 -1
  177. package/dist/slate/utils/is-whitespace-character.js.map +0 -1
  178. package/dist/slate/utils/marks.cjs.map +0 -1
  179. package/dist/slate/utils/marks.js.map +0 -1
  180. package/dist/slate/utils/selection-contains-inlines.cjs.map +0 -1
  181. package/dist/slate/utils/selection-contains-inlines.js.map +0 -1
  182. /package/dist/{slate → primitives/slate}/plugins/empty-clear-formatting.cjs +0 -0
  183. /package/dist/{slate → primitives/slate}/plugins/empty-clear-formatting.js +0 -0
  184. /package/dist/{slate → primitives/slate}/utils/get-character.cjs +0 -0
  185. /package/dist/{slate → primitives/slate}/utils/get-character.js +0 -0
  186. /package/dist/{slate → primitives/slate}/utils/get-dom-range.cjs +0 -0
  187. /package/dist/{slate → primitives/slate}/utils/get-dom-range.js +0 -0
  188. /package/dist/{slate → primitives/slate}/utils/get-match-range.cjs +0 -0
  189. /package/dist/{slate → primitives/slate}/utils/get-match-range.js +0 -0
  190. /package/dist/{slate → primitives/slate}/utils/is-empty-string.cjs +0 -0
  191. /package/dist/{slate → primitives/slate}/utils/is-empty-string.js +0 -0
  192. /package/dist/{slate → primitives/slate}/utils/is-empty.cjs +0 -0
  193. /package/dist/{slate → primitives/slate}/utils/is-empty.js +0 -0
  194. /package/dist/{slate → primitives/slate}/utils/is-text.cjs +0 -0
  195. /package/dist/{slate → primitives/slate}/utils/is-text.js +0 -0
  196. /package/dist/{slate → primitives/slate}/utils/is-whitespace-character.cjs +0 -0
  197. /package/dist/{slate → primitives/slate}/utils/is-whitespace-character.js +0 -0
  198. /package/dist/{slate → primitives/slate}/utils/selection-contains-inlines.cjs +0 -0
  199. /package/dist/{slate → primitives/slate}/utils/selection-contains-inlines.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-text.js","sources":["../../../../src/primitives/slate/utils/is-text.ts"],"sourcesContent":["import type { Node as SlateNode, Text as SlateText } from \"slate\";\n\nexport function isText(element: SlateNode): element is SlateText {\n return (\n !(\"type\" in element) &&\n \"text\" in element &&\n typeof element.text === \"string\"\n );\n}\n\nexport function isPlainText(node: SlateNode): boolean {\n return isText(node) && Object.keys(node).length === 1;\n}\n"],"names":[],"mappings":"AAEO,SAAS,OAAO,OAA0C,EAAA;AAC/D,EAAA,OACE,EAAE,MAAU,IAAA,OAAA,CAAA,IACZ,UAAU,OACV,IAAA,OAAO,QAAQ,IAAS,KAAA,QAAA,CAAA;AAE5B,CAAA;AAEO,SAAS,YAAY,IAA0B,EAAA;AACpD,EAAA,OAAO,OAAO,IAAI,CAAA,IAAK,OAAO,IAAK,CAAA,IAAI,EAAE,MAAW,KAAA,CAAA,CAAA;AACtD;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-whitespace-character.cjs","sources":["../../../../src/primitives/slate/utils/is-whitespace-character.ts"],"sourcesContent":["const WHITESPACE_REGEX = /\\s/;\n\nexport function isWhitespaceCharacter(character?: string): boolean {\n return character ? WHITESPACE_REGEX.test(character) : false;\n}\n"],"names":[],"mappings":";;AAAA,MAAM,gBAAmB,GAAA,IAAA,CAAA;AAElB,SAAS,sBAAsB,SAA6B,EAAA;AACjE,EAAA,OAAO,SAAY,GAAA,gBAAA,CAAiB,IAAK,CAAA,SAAS,CAAI,GAAA,KAAA,CAAA;AACxD;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-whitespace-character.js","sources":["../../../../src/primitives/slate/utils/is-whitespace-character.ts"],"sourcesContent":["const WHITESPACE_REGEX = /\\s/;\n\nexport function isWhitespaceCharacter(character?: string): boolean {\n return character ? WHITESPACE_REGEX.test(character) : false;\n}\n"],"names":[],"mappings":"AAAA,MAAM,gBAAmB,GAAA,IAAA,CAAA;AAElB,SAAS,sBAAsB,SAA6B,EAAA;AACjE,EAAA,OAAO,SAAY,GAAA,gBAAA,CAAiB,IAAK,CAAA,SAAS,CAAI,GAAA,KAAA,CAAA;AACxD;;;;"}
@@ -3,22 +3,22 @@
3
3
  var slate = require('slate');
4
4
  var getCharacter = require('./get-character.cjs');
5
5
 
6
- const defaultMarks = {
6
+ const defaultComposerBodyMarks = {
7
7
  bold: false,
8
8
  italic: false,
9
9
  strikethrough: false,
10
10
  code: false
11
11
  };
12
- function isMarkActive(editor, mark) {
13
- const marks = slate.Editor.marks(editor);
14
- return marks ? marks[mark] === true : false;
15
- }
16
- function getMarks(editor) {
12
+ function getComposerBodyMarks(editor) {
17
13
  if (!editor) {
18
- return { ...defaultMarks };
14
+ return { ...defaultComposerBodyMarks };
19
15
  }
20
16
  const marks = slate.Editor.marks(editor);
21
- return { ...defaultMarks, ...marks };
17
+ return { ...defaultComposerBodyMarks, ...marks };
18
+ }
19
+ function isMarkActive(editor, mark) {
20
+ const marks = slate.Editor.marks(editor);
21
+ return marks ? marks[mark] === true : false;
22
22
  }
23
23
  function filterActiveMarks(value) {
24
24
  return Object.keys(value ?? {}).filter(
@@ -54,7 +54,7 @@ function leaveMarkEdge(editor, edge) {
54
54
  }
55
55
 
56
56
  exports.filterActiveMarks = filterActiveMarks;
57
- exports.getMarks = getMarks;
57
+ exports.getComposerBodyMarks = getComposerBodyMarks;
58
58
  exports.isMarkActive = isMarkActive;
59
59
  exports.leaveMarkEdge = leaveMarkEdge;
60
60
  exports.removeMarks = removeMarks;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marks.cjs","sources":["../../../../src/primitives/slate/utils/marks.ts"],"sourcesContent":["import type { Text } from \"slate\";\nimport { Editor as SlateEditor, Range as SlateRange } from \"slate\";\n\nimport type { ComposerBodyMarks } from \"../../../types\";\nimport { getCharacterAfter, getCharacterBefore } from \"./get-character\";\n\nconst defaultComposerBodyMarks: Required<ComposerBodyMarks> = {\n bold: false,\n italic: false,\n strikethrough: false,\n code: false,\n};\n\nexport function getComposerBodyMarks(editor?: SlateEditor) {\n if (!editor) {\n return { ...defaultComposerBodyMarks };\n }\n\n const marks = SlateEditor.marks(editor);\n\n return { ...defaultComposerBodyMarks, ...marks };\n}\n\nexport function isMarkActive<M = ComposerBodyMarks>(\n editor: SlateEditor,\n mark: keyof M\n) {\n const marks = SlateEditor.marks(editor) as M | null;\n\n return marks ? marks[mark] === true : false;\n}\n\nexport function filterActiveMarks(\n value: Text | ComposerBodyMarks | null | undefined\n) {\n return Object.keys(value ?? {}).filter(\n (key) => key !== \"text\"\n ) as (keyof ComposerBodyMarks)[];\n}\n\nexport function toggleMark(editor: SlateEditor, mark: keyof ComposerBodyMarks) {\n const isActive = isMarkActive(editor, mark);\n\n if (isActive) {\n SlateEditor.removeMark(editor, mark);\n } else {\n SlateEditor.addMark(editor, mark, true);\n }\n}\n\nexport function removeMarks(editor: SlateEditor) {\n const marks = SlateEditor.marks(editor);\n\n if (marks) {\n for (const mark in marks) {\n SlateEditor.removeMark(editor, mark);\n }\n }\n}\n\nexport function leaveMarkEdge(editor: SlateEditor, edge: \"start\" | \"end\") {\n if (editor.selection && SlateRange.isCollapsed(editor.selection)) {\n const marks = Object.keys(SlateEditor.marks(editor) ?? {});\n\n if (marks.length > 0) {\n const sibling =\n edge === \"start\"\n ? getCharacterBefore(editor, editor.selection)\n : getCharacterAfter(editor, editor.selection);\n\n if (!sibling) {\n removeMarks(editor);\n }\n }\n }\n}\n"],"names":["SlateEditor","SlateRange","getCharacterBefore","getCharacterAfter"],"mappings":";;;;;AAMA,MAAM,wBAAwD,GAAA;AAAA,EAC5D,IAAM,EAAA,KAAA;AAAA,EACN,MAAQ,EAAA,KAAA;AAAA,EACR,aAAe,EAAA,KAAA;AAAA,EACf,IAAM,EAAA,KAAA;AACR,CAAA,CAAA;AAEO,SAAS,qBAAqB,MAAsB,EAAA;AACzD,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,EAAE,GAAG,wBAAyB,EAAA,CAAA;AAAA,GACvC;AAEA,EAAM,MAAA,KAAA,GAAQA,YAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,OAAO,EAAE,GAAG,wBAA0B,EAAA,GAAG,KAAM,EAAA,CAAA;AACjD,CAAA;AAEgB,SAAA,YAAA,CACd,QACA,IACA,EAAA;AACA,EAAM,MAAA,KAAA,GAAQA,YAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAO,OAAA,KAAA,GAAQ,KAAM,CAAA,IAAA,CAAA,KAAU,IAAO,GAAA,KAAA,CAAA;AACxC,CAAA;AAEO,SAAS,kBACd,KACA,EAAA;AACA,EAAA,OAAO,MAAO,CAAA,IAAA,CAAK,KAAS,IAAA,EAAE,CAAE,CAAA,MAAA;AAAA,IAC9B,CAAC,QAAQ,GAAQ,KAAA,MAAA;AAAA,GACnB,CAAA;AACF,CAAA;AAEgB,SAAA,UAAA,CAAW,QAAqB,IAA+B,EAAA;AAC7E,EAAM,MAAA,QAAA,GAAW,YAAa,CAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AAE1C,EAAA,IAAI,QAAU,EAAA;AACZ,IAAYA,YAAA,CAAA,UAAA,CAAW,QAAQ,IAAI,CAAA,CAAA;AAAA,GAC9B,MAAA;AACL,IAAYA,YAAA,CAAA,OAAA,CAAQ,MAAQ,EAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AAAA,GACxC;AACF,CAAA;AAEO,SAAS,YAAY,MAAqB,EAAA;AAC/C,EAAM,MAAA,KAAA,GAAQA,YAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,MAAYA,YAAA,CAAA,UAAA,CAAW,QAAQ,IAAI,CAAA,CAAA;AAAA,KACrC;AAAA,GACF;AACF,CAAA;AAEgB,SAAA,aAAA,CAAc,QAAqB,IAAuB,EAAA;AACxE,EAAA,IAAI,OAAO,SAAa,IAAAC,WAAA,CAAW,WAAY,CAAA,MAAA,CAAO,SAAS,CAAG,EAAA;AAChE,IAAM,MAAA,KAAA,GAAQ,OAAO,IAAK,CAAAD,YAAA,CAAY,MAAM,MAAM,CAAA,IAAK,EAAE,CAAA,CAAA;AAEzD,IAAI,IAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACpB,MAAM,MAAA,OAAA,GACJ,IAAS,KAAA,OAAA,GACLE,+BAAmB,CAAA,MAAA,EAAQ,MAAO,CAAA,SAAS,CAC3C,GAAAC,8BAAA,CAAkB,MAAQ,EAAA,MAAA,CAAO,SAAS,CAAA,CAAA;AAEhD,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAA,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,OACpB;AAAA,KACF;AAAA,GACF;AACF;;;;;;;;;"}
@@ -1,22 +1,22 @@
1
1
  import { Editor, Range } from 'slate';
2
2
  import { getCharacterBefore, getCharacterAfter } from './get-character.js';
3
3
 
4
- const defaultMarks = {
4
+ const defaultComposerBodyMarks = {
5
5
  bold: false,
6
6
  italic: false,
7
7
  strikethrough: false,
8
8
  code: false
9
9
  };
10
- function isMarkActive(editor, mark) {
11
- const marks = Editor.marks(editor);
12
- return marks ? marks[mark] === true : false;
13
- }
14
- function getMarks(editor) {
10
+ function getComposerBodyMarks(editor) {
15
11
  if (!editor) {
16
- return { ...defaultMarks };
12
+ return { ...defaultComposerBodyMarks };
17
13
  }
18
14
  const marks = Editor.marks(editor);
19
- return { ...defaultMarks, ...marks };
15
+ return { ...defaultComposerBodyMarks, ...marks };
16
+ }
17
+ function isMarkActive(editor, mark) {
18
+ const marks = Editor.marks(editor);
19
+ return marks ? marks[mark] === true : false;
20
20
  }
21
21
  function filterActiveMarks(value) {
22
22
  return Object.keys(value ?? {}).filter(
@@ -51,5 +51,5 @@ function leaveMarkEdge(editor, edge) {
51
51
  }
52
52
  }
53
53
 
54
- export { filterActiveMarks, getMarks, isMarkActive, leaveMarkEdge, removeMarks, toggleMark };
54
+ export { filterActiveMarks, getComposerBodyMarks, isMarkActive, leaveMarkEdge, removeMarks, toggleMark };
55
55
  //# sourceMappingURL=marks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marks.js","sources":["../../../../src/primitives/slate/utils/marks.ts"],"sourcesContent":["import type { Text } from \"slate\";\nimport { Editor as SlateEditor, Range as SlateRange } from \"slate\";\n\nimport type { ComposerBodyMarks } from \"../../../types\";\nimport { getCharacterAfter, getCharacterBefore } from \"./get-character\";\n\nconst defaultComposerBodyMarks: Required<ComposerBodyMarks> = {\n bold: false,\n italic: false,\n strikethrough: false,\n code: false,\n};\n\nexport function getComposerBodyMarks(editor?: SlateEditor) {\n if (!editor) {\n return { ...defaultComposerBodyMarks };\n }\n\n const marks = SlateEditor.marks(editor);\n\n return { ...defaultComposerBodyMarks, ...marks };\n}\n\nexport function isMarkActive<M = ComposerBodyMarks>(\n editor: SlateEditor,\n mark: keyof M\n) {\n const marks = SlateEditor.marks(editor) as M | null;\n\n return marks ? marks[mark] === true : false;\n}\n\nexport function filterActiveMarks(\n value: Text | ComposerBodyMarks | null | undefined\n) {\n return Object.keys(value ?? {}).filter(\n (key) => key !== \"text\"\n ) as (keyof ComposerBodyMarks)[];\n}\n\nexport function toggleMark(editor: SlateEditor, mark: keyof ComposerBodyMarks) {\n const isActive = isMarkActive(editor, mark);\n\n if (isActive) {\n SlateEditor.removeMark(editor, mark);\n } else {\n SlateEditor.addMark(editor, mark, true);\n }\n}\n\nexport function removeMarks(editor: SlateEditor) {\n const marks = SlateEditor.marks(editor);\n\n if (marks) {\n for (const mark in marks) {\n SlateEditor.removeMark(editor, mark);\n }\n }\n}\n\nexport function leaveMarkEdge(editor: SlateEditor, edge: \"start\" | \"end\") {\n if (editor.selection && SlateRange.isCollapsed(editor.selection)) {\n const marks = Object.keys(SlateEditor.marks(editor) ?? {});\n\n if (marks.length > 0) {\n const sibling =\n edge === \"start\"\n ? getCharacterBefore(editor, editor.selection)\n : getCharacterAfter(editor, editor.selection);\n\n if (!sibling) {\n removeMarks(editor);\n }\n }\n }\n}\n"],"names":["SlateEditor","SlateRange"],"mappings":";;;AAMA,MAAM,wBAAwD,GAAA;AAAA,EAC5D,IAAM,EAAA,KAAA;AAAA,EACN,MAAQ,EAAA,KAAA;AAAA,EACR,aAAe,EAAA,KAAA;AAAA,EACf,IAAM,EAAA,KAAA;AACR,CAAA,CAAA;AAEO,SAAS,qBAAqB,MAAsB,EAAA;AACzD,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,EAAE,GAAG,wBAAyB,EAAA,CAAA;AAAA,GACvC;AAEA,EAAM,MAAA,KAAA,GAAQA,MAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,OAAO,EAAE,GAAG,wBAA0B,EAAA,GAAG,KAAM,EAAA,CAAA;AACjD,CAAA;AAEgB,SAAA,YAAA,CACd,QACA,IACA,EAAA;AACA,EAAM,MAAA,KAAA,GAAQA,MAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAO,OAAA,KAAA,GAAQ,KAAM,CAAA,IAAA,CAAA,KAAU,IAAO,GAAA,KAAA,CAAA;AACxC,CAAA;AAEO,SAAS,kBACd,KACA,EAAA;AACA,EAAA,OAAO,MAAO,CAAA,IAAA,CAAK,KAAS,IAAA,EAAE,CAAE,CAAA,MAAA;AAAA,IAC9B,CAAC,QAAQ,GAAQ,KAAA,MAAA;AAAA,GACnB,CAAA;AACF,CAAA;AAEgB,SAAA,UAAA,CAAW,QAAqB,IAA+B,EAAA;AAC7E,EAAM,MAAA,QAAA,GAAW,YAAa,CAAA,MAAA,EAAQ,IAAI,CAAA,CAAA;AAE1C,EAAA,IAAI,QAAU,EAAA;AACZ,IAAYA,MAAA,CAAA,UAAA,CAAW,QAAQ,IAAI,CAAA,CAAA;AAAA,GAC9B,MAAA;AACL,IAAYA,MAAA,CAAA,OAAA,CAAQ,MAAQ,EAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AAAA,GACxC;AACF,CAAA;AAEO,SAAS,YAAY,MAAqB,EAAA;AAC/C,EAAM,MAAA,KAAA,GAAQA,MAAY,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAEtC,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,KAAA,MAAW,QAAQ,KAAO,EAAA;AACxB,MAAYA,MAAA,CAAA,UAAA,CAAW,QAAQ,IAAI,CAAA,CAAA;AAAA,KACrC;AAAA,GACF;AACF,CAAA;AAEgB,SAAA,aAAA,CAAc,QAAqB,IAAuB,EAAA;AACxE,EAAA,IAAI,OAAO,SAAa,IAAAC,KAAA,CAAW,WAAY,CAAA,MAAA,CAAO,SAAS,CAAG,EAAA;AAChE,IAAM,MAAA,KAAA,GAAQ,OAAO,IAAK,CAAAD,MAAA,CAAY,MAAM,MAAM,CAAA,IAAK,EAAE,CAAA,CAAA;AAEzD,IAAI,IAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACpB,MAAM,MAAA,OAAA,GACJ,IAAS,KAAA,OAAA,GACL,kBAAmB,CAAA,MAAA,EAAQ,MAAO,CAAA,SAAS,CAC3C,GAAA,iBAAA,CAAkB,MAAQ,EAAA,MAAA,CAAO,SAAS,CAAA,CAAA;AAEhD,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAA,WAAA,CAAY,MAAM,CAAA,CAAA;AAAA,OACpB;AAAA,KACF;AAAA,GACF;AACF;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-contains-inlines.cjs","sources":["../../../../src/primitives/slate/utils/selection-contains-inlines.ts"],"sourcesContent":["import type { Node as SlateNode } from \"slate\";\nimport {\n Editor as SlateEditor,\n Element as SlateElement,\n Range as SlateRange,\n} from \"slate\";\n\nexport function selectionContainsInlines(\n editor: SlateEditor,\n match: (node: SlateNode) => boolean\n) {\n const { selection } = editor;\n if (!selection) {\n return false;\n }\n\n const roots = Array.from(\n SlateEditor.nodes(editor, {\n at: selection,\n match: (node) =>\n SlateElement.isElement(node) && SlateEditor.isBlock(editor, node),\n mode: \"lowest\",\n })\n );\n\n for (const [, rootPath] of roots) {\n const intersectingSelection = SlateRange.isRange(selection)\n ? SlateRange.intersection(selection, SlateEditor.range(editor, rootPath))\n : selection;\n\n if (!intersectingSelection) {\n continue;\n }\n\n const matches = Array.from(\n SlateEditor.nodes(editor, {\n at: intersectingSelection,\n match: (node) =>\n SlateEditor.isInline(editor, node as SlateElement) && match(node),\n })\n );\n\n if (matches.length > 0) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":["SlateEditor","SlateElement","SlateRange"],"mappings":";;;;AAOgB,SAAA,wBAAA,CACd,QACA,KACA,EAAA;AACA,EAAM,MAAA,EAAE,WAAc,GAAA,MAAA,CAAA;AACtB,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,QAAQ,KAAM,CAAA,IAAA;AAAA,IAClBA,YAAA,CAAY,MAAM,MAAQ,EAAA;AAAA,MACxB,EAAI,EAAA,SAAA;AAAA,MACJ,KAAA,EAAO,CAAC,IAAA,KACNC,aAAa,CAAA,SAAA,CAAU,IAAI,CAAK,IAAAD,YAAA,CAAY,OAAQ,CAAA,MAAA,EAAQ,IAAI,CAAA;AAAA,MAClE,IAAM,EAAA,QAAA;AAAA,KACP,CAAA;AAAA,GACH,CAAA;AAEA,EAAA,KAAA,MAAW,GAAG,QAAQ,CAAA,IAAK,KAAO,EAAA;AAChC,IAAA,MAAM,qBAAwB,GAAAE,WAAA,CAAW,OAAQ,CAAA,SAAS,CACtD,GAAAA,WAAA,CAAW,YAAa,CAAA,SAAA,EAAWF,YAAY,CAAA,KAAA,CAAM,MAAQ,EAAA,QAAQ,CAAC,CACtE,GAAA,SAAA,CAAA;AAEJ,IAAA,IAAI,CAAC,qBAAuB,EAAA;AAC1B,MAAA,SAAA;AAAA,KACF;AAEA,IAAA,MAAM,UAAU,KAAM,CAAA,IAAA;AAAA,MACpBA,YAAA,CAAY,MAAM,MAAQ,EAAA;AAAA,QACxB,EAAI,EAAA,qBAAA;AAAA,QACJ,KAAA,EAAO,CAAC,IACN,KAAAA,YAAA,CAAY,SAAS,MAAQ,EAAA,IAAoB,CAAK,IAAA,KAAA,CAAM,IAAI,CAAA;AAAA,OACnE,CAAA;AAAA,KACH,CAAA;AAEA,IAAI,IAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AACtB,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,GACF;AAEA,EAAO,OAAA,KAAA,CAAA;AACT;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-contains-inlines.js","sources":["../../../../src/primitives/slate/utils/selection-contains-inlines.ts"],"sourcesContent":["import type { Node as SlateNode } from \"slate\";\nimport {\n Editor as SlateEditor,\n Element as SlateElement,\n Range as SlateRange,\n} from \"slate\";\n\nexport function selectionContainsInlines(\n editor: SlateEditor,\n match: (node: SlateNode) => boolean\n) {\n const { selection } = editor;\n if (!selection) {\n return false;\n }\n\n const roots = Array.from(\n SlateEditor.nodes(editor, {\n at: selection,\n match: (node) =>\n SlateElement.isElement(node) && SlateEditor.isBlock(editor, node),\n mode: \"lowest\",\n })\n );\n\n for (const [, rootPath] of roots) {\n const intersectingSelection = SlateRange.isRange(selection)\n ? SlateRange.intersection(selection, SlateEditor.range(editor, rootPath))\n : selection;\n\n if (!intersectingSelection) {\n continue;\n }\n\n const matches = Array.from(\n SlateEditor.nodes(editor, {\n at: intersectingSelection,\n match: (node) =>\n SlateEditor.isInline(editor, node as SlateElement) && match(node),\n })\n );\n\n if (matches.length > 0) {\n return true;\n }\n }\n\n return false;\n}\n"],"names":["SlateEditor","SlateElement","SlateRange"],"mappings":";;AAOgB,SAAA,wBAAA,CACd,QACA,KACA,EAAA;AACA,EAAM,MAAA,EAAE,WAAc,GAAA,MAAA,CAAA;AACtB,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,QAAQ,KAAM,CAAA,IAAA;AAAA,IAClBA,MAAA,CAAY,MAAM,MAAQ,EAAA;AAAA,MACxB,EAAI,EAAA,SAAA;AAAA,MACJ,KAAA,EAAO,CAAC,IAAA,KACNC,OAAa,CAAA,SAAA,CAAU,IAAI,CAAK,IAAAD,MAAA,CAAY,OAAQ,CAAA,MAAA,EAAQ,IAAI,CAAA;AAAA,MAClE,IAAM,EAAA,QAAA;AAAA,KACP,CAAA;AAAA,GACH,CAAA;AAEA,EAAA,KAAA,MAAW,GAAG,QAAQ,CAAA,IAAK,KAAO,EAAA;AAChC,IAAA,MAAM,qBAAwB,GAAAE,KAAA,CAAW,OAAQ,CAAA,SAAS,CACtD,GAAAA,KAAA,CAAW,YAAa,CAAA,SAAA,EAAWF,MAAY,CAAA,KAAA,CAAM,MAAQ,EAAA,QAAQ,CAAC,CACtE,GAAA,SAAA,CAAA;AAEJ,IAAA,IAAI,CAAC,qBAAuB,EAAA;AAC1B,MAAA,SAAA;AAAA,KACF;AAEA,IAAA,MAAM,UAAU,KAAM,CAAA,IAAA;AAAA,MACpBA,MAAA,CAAY,MAAM,MAAQ,EAAA;AAAA,QACxB,EAAI,EAAA,qBAAA;AAAA,QACJ,KAAA,EAAO,CAAC,IACN,KAAAA,MAAA,CAAY,SAAS,MAAQ,EAAA,IAAoB,CAAK,IAAA,KAAA,CAAM,IAAI,CAAA;AAAA,OACnE,CAAA;AAAA,KACH,CAAA;AAEA,IAAI,IAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AACtB,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAAA,GACF;AAEA,EAAO,OAAA,KAAA,CAAA;AACT;;;;"}
package/dist/version.cjs CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const PKG_NAME = "@liveblocks/react-ui";
4
- const PKG_VERSION = typeof "2.25.0-aiprivatebeta5" === "string" && "2.25.0-aiprivatebeta5";
4
+ const PKG_VERSION = typeof "2.25.0-aiprivatebeta7" === "string" && "2.25.0-aiprivatebeta7";
5
5
  const PKG_FORMAT = typeof "cjs" === "string" && "cjs";
6
6
 
7
7
  exports.PKG_FORMAT = PKG_FORMAT;
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  const PKG_NAME = "@liveblocks/react-ui";
2
- const PKG_VERSION = typeof "2.25.0-aiprivatebeta5" === "string" && "2.25.0-aiprivatebeta5";
2
+ const PKG_VERSION = typeof "2.25.0-aiprivatebeta7" === "string" && "2.25.0-aiprivatebeta7";
3
3
  const PKG_FORMAT = typeof "esm" === "string" && "esm";
4
4
 
5
5
  export { PKG_FORMAT, PKG_NAME, PKG_VERSION };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liveblocks/react-ui",
3
- "version": "2.25.0-aiprivatebeta5",
3
+ "version": "2.25.0-aiprivatebeta7",
4
4
  "description": "A set of React pre-built components for the Liveblocks products. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -76,9 +76,9 @@
76
76
  },
77
77
  "dependencies": {
78
78
  "@floating-ui/react-dom": "^2.1.2",
79
- "@liveblocks/client": "2.25.0-aiprivatebeta5",
80
- "@liveblocks/core": "2.25.0-aiprivatebeta5",
81
- "@liveblocks/react": "2.25.0-aiprivatebeta5",
79
+ "@liveblocks/client": "2.25.0-aiprivatebeta7",
80
+ "@liveblocks/core": "2.25.0-aiprivatebeta7",
81
+ "@liveblocks/react": "2.25.0-aiprivatebeta7",
82
82
  "@radix-ui/react-dropdown-menu": "^2.1.2",
83
83
  "@radix-ui/react-popover": "^1.1.2",
84
84
  "@radix-ui/react-slot": "^1.1.0",
@@ -2,7 +2,7 @@
2
2
  @import "./constants";
3
3
 
4
4
  .lb-root {
5
- /**
5
+ /**
6
6
  * Basic
7
7
  */
8
8
  --lb-radius: 0.5em;
@@ -14,7 +14,7 @@
14
14
  --lb-background: #fff;
15
15
  --lb-foreground: #111;
16
16
 
17
- /**
17
+ /**
18
18
  * Advanced
19
19
  */
20
20
  --lb-line-height: 1.5;
@@ -32,7 +32,7 @@
32
32
  --lb-destructive-contrast: 8%;
33
33
  --lb-foreground-contrast: 8%;
34
34
 
35
- /**
35
+ /**
36
36
  * Colors
37
37
  */
38
38
  --lb-background-foreground-faint: color-mix-scale(
@@ -2137,76 +2137,25 @@
2137
2137
  margin-inline-end: auto;
2138
2138
  }
2139
2139
 
2140
- /*************************************
2141
- * Chat composer attachments *
2142
- *************************************/
2143
- .lb-ai-chat-composer-attachments {
2144
- display: flex;
2145
- flex-direction: column;
2146
- gap: calc(0.75 * var(--lb-spacing));
2147
- padding-inline: var(--lb-spacing);
2148
- padding-block-start: calc(0.75 * var(--lb-spacing));
2149
- }
2150
-
2151
- .lb-ai-chat-composer-editor-container:where([data-drop]) * {
2152
- pointer-events: none;
2153
- }
2154
-
2155
2140
  /*************************************
2156
2141
  * Chat message *
2157
2142
  *************************************/
2158
- .lb-ai-chat-user-message {
2159
- display: flex;
2160
- flex-direction: column;
2161
- gap: calc(0.75 * var(--lb-spacing));
2162
2143
 
2163
- &,
2164
- * {
2165
- line-height: var(--lb-line-height);
2166
- }
2167
- }
2168
-
2169
- .lb-ai-chat-user-message-content {
2170
- padding: calc(0.75 * var(--lb-spacing)) calc(1.375 * var(--lb-spacing));
2171
- border-radius: calc(3 * var(--lb-radius));
2172
- background: var(--lb-background-foreground-faint);
2173
- color: var(--lb-foreground);
2174
- white-space: break-spaces;
2175
- }
2176
-
2177
- .lb-ai-chat-user-message-attachments {
2178
- display: flex;
2179
- flex-direction: column;
2180
- gap: calc(0.75 * var(--lb-spacing));
2181
- }
2182
-
2183
- .lb-ai-chat-user-message-media-attachments {
2184
- display: flex;
2185
- flex-wrap: wrap;
2186
- gap: calc(0.75 * var(--lb-spacing));
2187
- justify-content: flex-end;
2188
- }
2189
-
2190
- .lb-ai-chat-user-message-attachment {
2191
- flex-shrink: 1;
2192
- flex-basis: 300px;
2193
- }
2194
-
2195
- .lb-ai-chat-assistant-message {
2144
+ .lb-ai-chat-message {
2196
2145
  display: flex;
2197
2146
  flex-direction: column;
2198
2147
  gap: calc(0.75 * var(--lb-spacing));
2199
2148
  color: var(--lb-foreground);
2200
2149
 
2201
2150
  @media (hover: hover) {
2202
- &:where(.lb-ai-chat-assistant-message\:show-actions-hover) {
2203
- :where(.lb-ai-chat-assistant-message-actions) {
2151
+ &:where(.lb-ai-chat-message\:show-actions-hover) {
2152
+ :where(.lb-ai-chat-message-actions) {
2204
2153
  opacity: 0;
2205
2154
  transition-property: opacity;
2206
2155
  }
2207
2156
 
2208
2157
  &:where(:is(:hover, :focus-within)) {
2209
- :where(.lb-ai-chat-assistant-message-actions) {
2158
+ :where(.lb-ai-chat-message-actions) {
2210
2159
  opacity: 1;
2211
2160
  }
2212
2161
  }
@@ -2214,11 +2163,21 @@
2214
2163
  }
2215
2164
  }
2216
2165
 
2217
- .lb-ai-chat-assistant-message-content {
2166
+ .lb-ai-chat-message-content {
2218
2167
  inline-size: 100%;
2168
+ white-space: break-spaces;
2169
+ }
2170
+
2171
+ .lb-ai-chat-user-message {
2172
+ :where(.lb-ai-chat-message-content) {
2173
+ padding: calc(0.5 * var(--lb-spacing)) var(--lb-spacing);
2174
+ border-radius: calc(3 * var(--lb-radius));
2175
+ background: var(--lb-background-foreground-faint);
2176
+ color: var(--lb-foreground);
2177
+ }
2219
2178
  }
2220
2179
 
2221
- .lb-ai-chat-assistant-message-text-part {
2180
+ .lb-ai-chat-message-text {
2222
2181
  display: flex;
2223
2182
  flex-direction: column;
2224
2183
 
@@ -2357,15 +2316,11 @@
2357
2316
  }
2358
2317
  }
2359
2318
 
2360
- .lb-ai-chat-assistant-message-thinking {
2361
- @include truncate;
2362
-
2363
- user-select: none;
2364
- animation: lb-animation-shimmer-small 8s linear infinite;
2319
+ .lb-ai-chat-message-tool {
2320
+ margin-block: calc(0.25 * var(--lb-spacing));
2365
2321
  }
2366
2322
 
2367
- .lb-ai-chat-user-message-deleted,
2368
- .lb-ai-chat-assistant-message-deleted {
2323
+ .lb-ai-chat-message-deleted {
2369
2324
  position: relative;
2370
2325
  align-items: center;
2371
2326
  inline-size: 100%;
@@ -2374,7 +2329,7 @@
2374
2329
  text-wrap: balance;
2375
2330
  }
2376
2331
 
2377
- .lb-ai-chat-assitant-message-error {
2332
+ .lb-ai-chat-message-error {
2378
2333
  --lb-dynamic-background: var(--lb-background-destructive-subtle);
2379
2334
 
2380
2335
  position: relative;
@@ -2394,7 +2349,7 @@
2394
2349
  }
2395
2350
  }
2396
2351
 
2397
- .lb-ai-chat-assistant-message-reasoning-part {
2352
+ .lb-ai-chat-assistant-message-collapsible {
2398
2353
  position: relative;
2399
2354
  display: flex;
2400
2355
  flex-direction: column;
@@ -2403,19 +2358,16 @@
2403
2358
  font-size: 0.875em;
2404
2359
  }
2405
2360
 
2406
- .lb-ai-chat-assistant-message-reasoning-part-trigger {
2361
+ .lb-ai-chat-message-collapsible-trigger {
2407
2362
  @include truncate;
2408
2363
 
2409
2364
  display: flex;
2410
2365
  gap: calc(0.25 * var(--lb-spacing));
2411
2366
  align-items: center;
2412
-
2413
- &:where([data-reasoning]) {
2414
- animation: lb-animation-shimmer-small 8s linear infinite;
2415
- }
2367
+ cursor: pointer;
2416
2368
  }
2417
2369
 
2418
- .lb-ai-chat-assistant-message-reasoning-part-content {
2370
+ .lb-ai-chat-message-collapsible-content {
2419
2371
  display: flex;
2420
2372
  gap: calc(0.5 * var(--lb-spacing));
2421
2373
  line-height: var(--lb-line-height);
@@ -2425,26 +2377,12 @@
2425
2377
  }
2426
2378
  }
2427
2379
 
2428
- .lb-ai-chat-assistant-message-actions {
2380
+ .lb-ai-chat-message-actions {
2429
2381
  display: flex;
2430
2382
  gap: calc(0.125 * var(--lb-spacing));
2431
2383
  align-items: center;
2432
2384
  }
2433
2385
 
2434
- .lb-ai-chat {
2435
- --lb-ai-chat-container-width: 100%;
2436
-
2437
- display: flex;
2438
- flex-direction: column;
2439
- inline-size: 100%;
2440
- block-size: 100%;
2441
- background: var(--lb-background);
2442
-
2443
- /* overflow-block: auto; doesn't work as expected */
2444
- /* stylelint-disable-next-line plugin/use-logical-properties-and-values */
2445
- overflow-y: auto;
2446
- }
2447
-
2448
2386
  .lb-ai-chat-messages {
2449
2387
  display: flex;
2450
2388
  flex-direction: column;
@@ -2457,84 +2395,132 @@
2457
2395
  margin-inline: auto;
2458
2396
  padding-block-start: var(--lb-spacing);
2459
2397
  padding-block-end: calc(5 * var(--lb-spacing));
2460
- }
2461
2398
 
2462
- .lb-ai-chat-loading,
2463
- .lb-ai-chat-error {
2464
- position: relative;
2465
- flex: 1 1 auto;
2466
- }
2399
+ :where(.lb-ai-chat-user-message) {
2400
+ max-inline-size: 80%;
2401
+ margin-inline-start: auto;
2467
2402
 
2468
- .lb-ai-chat-messages-user-message {
2469
- max-inline-size: 80%;
2470
- margin-inline-start: auto;
2403
+ :where(.lb-ai-chat-message-actions) {
2404
+ margin-inline-start: auto;
2405
+ }
2406
+ }
2471
2407
  }
2472
2408
 
2473
2409
  .lb-ai-chat-footer {
2474
- position: sticky;
2475
- inset-block-end: 0;
2410
+ position: relative;
2476
2411
  display: flex;
2477
2412
  flex-direction: column;
2478
2413
  gap: calc(0.75 * var(--lb-spacing));
2479
2414
  inline-size: 100%;
2480
- margin-block-start: auto;
2481
- padding: var(--lb-spacing);
2482
- padding-block-start: 0;
2415
+ }
2483
2416
 
2484
- &::before {
2485
- content: "";
2486
- position: absolute;
2487
- inset: 0;
2488
- inset-block-start: calc(-3 * var(--lb-spacing));
2489
- background: linear-gradient(
2490
- to bottom,
2491
- transparent 0%,
2492
- var(--lb-background) calc(3 * var(--lb-spacing))
2493
- );
2494
- pointer-events: none;
2417
+ .lb-ai-chat {
2418
+ --lb-ai-chat-container-width: 100%;
2419
+
2420
+ display: flex;
2421
+ flex-direction: column;
2422
+ inline-size: 100%;
2423
+ block-size: 100%;
2424
+ background: var(--lb-background);
2425
+ isolation: isolate;
2426
+
2427
+ /* overflow-block: auto; doesn't work as expected */
2428
+ /* stylelint-disable-next-line plugin/use-logical-properties-and-values */
2429
+ overflow-y: auto;
2430
+
2431
+ :where(.lb-ai-chat-footer) {
2432
+ position: sticky;
2433
+ inset-block-end: 0;
2434
+ z-index: 1;
2435
+ margin-block-start: auto;
2436
+ padding: var(--lb-spacing);
2437
+ padding-block-start: 0;
2438
+
2439
+ &::before {
2440
+ content: "";
2441
+ position: absolute;
2442
+ inset: 0;
2443
+ inset-block-start: calc(-3 * var(--lb-spacing));
2444
+ background: linear-gradient(
2445
+ to bottom,
2446
+ transparent 0%,
2447
+ var(--lb-background) calc(3.5 * var(--lb-spacing))
2448
+ );
2449
+ pointer-events: none;
2450
+ }
2451
+ }
2452
+
2453
+ :where(.lb-ai-chat-composer) {
2454
+ max-inline-size: var(--lb-ai-chat-container-width);
2455
+ margin-inline: auto;
2456
+ border-radius: calc(2 * var(--lb-radius));
2457
+ background: var(--lb-dynamic-background);
2458
+ box-shadow: var(--lb-elevation-shadow-small);
2495
2459
  }
2496
2460
  }
2497
2461
 
2498
2462
  .lb-ai-chat-footer-actions {
2499
2463
  position: absolute;
2500
2464
  inset-inline: 0;
2501
- inset-block-start: calc(-3 * var(--lb-spacing));
2465
+ inset-block-start: calc(-1 * var(--lb-spacing));
2502
2466
  display: flex;
2503
2467
  justify-content: center;
2504
2468
  pointer-events: none;
2469
+ transform: translateY(-100%);
2505
2470
  }
2506
2471
 
2507
2472
  .lb-ai-chat-composer {
2508
2473
  position: relative;
2509
2474
  inline-size: 100%;
2510
- max-inline-size: var(--lb-ai-chat-container-width);
2511
- margin-inline: auto;
2512
- margin-block-start: auto;
2513
- border-radius: calc(2 * var(--lb-radius));
2514
- background: var(--lb-dynamic-background);
2515
- box-shadow: var(--lb-elevation-shadow-small);
2475
+ }
2476
+
2477
+ .lb-ai-chat-scroll-indicator {
2478
+ border-radius: $lb-radius-full;
2479
+ color: var(--lb-foreground-moderate);
2480
+ opacity: 0;
2481
+ pointer-events: none;
2482
+ transition-property: transform, opacity, background;
2483
+ transform: scale(0.8);
2484
+ transform-origin: bottom;
2485
+
2486
+ &:where([data-visible]) {
2487
+ opacity: 1;
2488
+ pointer-events: all;
2489
+ transform: scale(1);
2490
+ }
2491
+ }
2492
+
2493
+ .lb-ai-chat-scroll-indicator-button {
2494
+ @include button-base;
2495
+
2496
+ padding: calc(0.375 * var(--lb-spacing));
2497
+ border-radius: $lb-radius-full;
2498
+ color: var(--lb-foreground-moderate);
2499
+ transition-property: opacity, color;
2500
+
2501
+ &:where(:hover, :focus-visible) {
2502
+ color: var(--lb-foreground-secondary);
2503
+ }
2516
2504
 
2517
2505
  &::after {
2518
2506
  content: "";
2519
2507
  position: absolute;
2520
2508
  inset: 0;
2521
- z-index: 1;
2522
2509
  border-radius: inherit;
2523
- box-shadow: var(--lb-inset-shadow);
2524
2510
  pointer-events: none;
2511
+ transition-property: box-shadow;
2512
+ }
2513
+
2514
+ &:where(:focus-visible)::after {
2515
+ box-shadow: inset var(--lb-accent) 0 0 0 2px;
2525
2516
  }
2526
2517
  }
2527
2518
 
2528
- .lb-ai-chat-scroll-button {
2529
- border-radius: $lb-radius-full;
2530
- opacity: 0;
2531
- pointer-events: none;
2532
- transition-property: opacity;
2519
+ .lb-ai-chat-pending {
2520
+ @include truncate;
2533
2521
 
2534
- &:where([data-visible]) {
2535
- opacity: 1;
2536
- pointer-events: all;
2537
- }
2522
+ user-select: none;
2523
+ animation: lb-animation-shimmer-small 8s linear infinite;
2538
2524
  }
2539
2525
 
2540
2526
  /*************************************
@@ -1,5 +1,5 @@
1
1
  /* Because of `all: unset`, we have to re-define some these values. */
2
- @mixin button {
2
+ @mixin button-base {
3
3
  all: unset;
4
4
  position: relative;
5
5
  box-sizing: inherit;
@@ -8,8 +8,13 @@
8
8
  user-select: none;
9
9
  transition-timing-function: var(--lb-transition-easing);
10
10
  transition-duration: var(--lb-transition-duration);
11
- transition-property: background, color, opacity;
12
11
  -webkit-tap-highlight-color: transparent;
12
+ }
13
+
14
+ @mixin button {
15
+ @include button-base;
16
+
17
+ transition-property: background, color, opacity;
13
18
 
14
19
  &::after {
15
20
  content: "";