@liveblocks/react-ui 2.25.0-aiprivatebeta4 → 2.25.0-aiprivatebeta6

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 +120 -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-aiprivatebeta4" === "string" && "2.25.0-aiprivatebeta4";
4
+ const PKG_VERSION = typeof "2.25.0-aiprivatebeta6" === "string" && "2.25.0-aiprivatebeta6";
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-aiprivatebeta4" === "string" && "2.25.0-aiprivatebeta4";
2
+ const PKG_VERSION = typeof "2.25.0-aiprivatebeta6" === "string" && "2.25.0-aiprivatebeta6";
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-aiprivatebeta4",
3
+ "version": "2.25.0-aiprivatebeta6",
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-aiprivatebeta4",
80
- "@liveblocks/core": "2.25.0-aiprivatebeta4",
81
- "@liveblocks/react": "2.25.0-aiprivatebeta4",
79
+ "@liveblocks/client": "2.25.0-aiprivatebeta6",
80
+ "@liveblocks/core": "2.25.0-aiprivatebeta6",
81
+ "@liveblocks/react": "2.25.0-aiprivatebeta6",
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,75 +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
-
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
2143
 
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));
2148
+ color: var(--lb-foreground);
2199
2149
 
2200
2150
  @media (hover: hover) {
2201
- &:where(.lb-ai-chat-assistant-message\:show-actions-hover) {
2202
- :where(.lb-ai-chat-assistant-message-actions) {
2151
+ &:where(.lb-ai-chat-message\:show-actions-hover) {
2152
+ :where(.lb-ai-chat-message-actions) {
2203
2153
  opacity: 0;
2204
2154
  transition-property: opacity;
2205
2155
  }
2206
2156
 
2207
2157
  &:where(:is(:hover, :focus-within)) {
2208
- :where(.lb-ai-chat-assistant-message-actions) {
2158
+ :where(.lb-ai-chat-message-actions) {
2209
2159
  opacity: 1;
2210
2160
  }
2211
2161
  }
@@ -2213,11 +2163,21 @@
2213
2163
  }
2214
2164
  }
2215
2165
 
2216
- .lb-ai-chat-assistant-message-content {
2166
+ .lb-ai-chat-message-content {
2217
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
+ }
2218
2178
  }
2219
2179
 
2220
- .lb-ai-chat-assistant-message-text-part {
2180
+ .lb-ai-chat-message-text {
2221
2181
  display: flex;
2222
2182
  flex-direction: column;
2223
2183
 
@@ -2356,15 +2316,11 @@
2356
2316
  }
2357
2317
  }
2358
2318
 
2359
- .lb-ai-chat-assistant-message-thinking {
2360
- @include truncate;
2361
-
2362
- user-select: none;
2363
- animation: lb-animation-shimmer-small 8s linear infinite;
2319
+ .lb-ai-chat-message-tool {
2320
+ margin-block: calc(0.25 * var(--lb-spacing));
2364
2321
  }
2365
2322
 
2366
- .lb-ai-chat-user-message-deleted,
2367
- .lb-ai-chat-assistant-message-deleted {
2323
+ .lb-ai-chat-message-deleted {
2368
2324
  position: relative;
2369
2325
  align-items: center;
2370
2326
  inline-size: 100%;
@@ -2373,7 +2329,7 @@
2373
2329
  text-wrap: balance;
2374
2330
  }
2375
2331
 
2376
- .lb-asssitant-chat-message-error {
2332
+ .lb-ai-chat-message-error {
2377
2333
  --lb-dynamic-background: var(--lb-background-destructive-subtle);
2378
2334
 
2379
2335
  position: relative;
@@ -2393,7 +2349,7 @@
2393
2349
  }
2394
2350
  }
2395
2351
 
2396
- .lb-ai-chat-assistant-message-reasoning-part {
2352
+ .lb-ai-chat-assistant-message-collapsible {
2397
2353
  position: relative;
2398
2354
  display: flex;
2399
2355
  flex-direction: column;
@@ -2402,19 +2358,16 @@
2402
2358
  font-size: 0.875em;
2403
2359
  }
2404
2360
 
2405
- .lb-ai-chat-assistant-message-reasoning-part-trigger {
2361
+ .lb-ai-chat-message-collapsible-trigger {
2406
2362
  @include truncate;
2407
2363
 
2408
2364
  display: flex;
2409
2365
  gap: calc(0.25 * var(--lb-spacing));
2410
2366
  align-items: center;
2411
-
2412
- &:where([data-reasoning]) {
2413
- animation: lb-animation-shimmer-small 8s linear infinite;
2414
- }
2367
+ cursor: pointer;
2415
2368
  }
2416
2369
 
2417
- .lb-ai-chat-assistant-message-reasoning-part-content {
2370
+ .lb-ai-chat-message-collapsible-content {
2418
2371
  display: flex;
2419
2372
  gap: calc(0.5 * var(--lb-spacing));
2420
2373
  line-height: var(--lb-line-height);
@@ -2424,26 +2377,12 @@
2424
2377
  }
2425
2378
  }
2426
2379
 
2427
- .lb-ai-chat-assistant-message-actions {
2380
+ .lb-ai-chat-message-actions {
2428
2381
  display: flex;
2429
2382
  gap: calc(0.125 * var(--lb-spacing));
2430
2383
  align-items: center;
2431
2384
  }
2432
2385
 
2433
- .lb-ai-chat {
2434
- --lb-ai-chat-container-width: 100%;
2435
-
2436
- display: flex;
2437
- flex-direction: column;
2438
- inline-size: 100%;
2439
- block-size: 100%;
2440
- background: var(--lb-background);
2441
-
2442
- /* overflow-block: auto; doesn't work as expected */
2443
- /* stylelint-disable-next-line plugin/use-logical-properties-and-values */
2444
- overflow-y: auto;
2445
- }
2446
-
2447
2386
  .lb-ai-chat-messages {
2448
2387
  display: flex;
2449
2388
  flex-direction: column;
@@ -2456,84 +2395,132 @@
2456
2395
  margin-inline: auto;
2457
2396
  padding-block-start: var(--lb-spacing);
2458
2397
  padding-block-end: calc(5 * var(--lb-spacing));
2459
- }
2460
2398
 
2461
- .lb-ai-chat-loading,
2462
- .lb-ai-chat-error {
2463
- position: relative;
2464
- flex: 1 1 auto;
2465
- }
2399
+ :where(.lb-ai-chat-user-message) {
2400
+ max-inline-size: 80%;
2401
+ margin-inline-start: auto;
2466
2402
 
2467
- .lb-ai-chat-messages-user-message {
2468
- max-inline-size: 80%;
2469
- margin-inline-start: auto;
2403
+ :where(.lb-ai-chat-message-actions) {
2404
+ margin-inline-start: auto;
2405
+ }
2406
+ }
2470
2407
  }
2471
2408
 
2472
2409
  .lb-ai-chat-footer {
2473
- position: sticky;
2474
- inset-block-end: 0;
2410
+ position: relative;
2475
2411
  display: flex;
2476
2412
  flex-direction: column;
2477
2413
  gap: calc(0.75 * var(--lb-spacing));
2478
2414
  inline-size: 100%;
2479
- margin-block-start: auto;
2480
- padding: var(--lb-spacing);
2481
- padding-block-start: 0;
2415
+ }
2482
2416
 
2483
- &::before {
2484
- content: "";
2485
- position: absolute;
2486
- inset: 0;
2487
- inset-block-start: calc(-3 * var(--lb-spacing));
2488
- background: linear-gradient(
2489
- to bottom,
2490
- transparent 0%,
2491
- var(--lb-background) calc(3 * var(--lb-spacing))
2492
- );
2493
- 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);
2494
2459
  }
2495
2460
  }
2496
2461
 
2497
2462
  .lb-ai-chat-footer-actions {
2498
2463
  position: absolute;
2499
2464
  inset-inline: 0;
2500
- inset-block-start: calc(-3 * var(--lb-spacing));
2465
+ inset-block-start: calc(-1 * var(--lb-spacing));
2501
2466
  display: flex;
2502
2467
  justify-content: center;
2503
2468
  pointer-events: none;
2469
+ transform: translateY(-100%);
2504
2470
  }
2505
2471
 
2506
2472
  .lb-ai-chat-composer {
2507
2473
  position: relative;
2508
2474
  inline-size: 100%;
2509
- max-inline-size: var(--lb-ai-chat-container-width);
2510
- margin-inline: auto;
2511
- margin-block-start: auto;
2512
- border-radius: calc(2 * var(--lb-radius));
2513
- background: var(--lb-dynamic-background);
2514
- 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
+ }
2515
2504
 
2516
2505
  &::after {
2517
2506
  content: "";
2518
2507
  position: absolute;
2519
2508
  inset: 0;
2520
- z-index: 1;
2521
2509
  border-radius: inherit;
2522
- box-shadow: var(--lb-inset-shadow);
2523
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;
2524
2516
  }
2525
2517
  }
2526
2518
 
2527
- .lb-ai-chat-scroll-button {
2528
- border-radius: $lb-radius-full;
2529
- opacity: 0;
2530
- pointer-events: none;
2531
- transition-property: opacity;
2519
+ .lb-ai-chat-pending {
2520
+ @include truncate;
2532
2521
 
2533
- &:where([data-visible]) {
2534
- opacity: 1;
2535
- pointer-events: all;
2536
- }
2522
+ user-select: none;
2523
+ animation: lb-animation-shimmer-small 8s linear infinite;
2537
2524
  }
2538
2525
 
2539
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: "";