@liveblocks/react-ui 2.25.0-aiprivatebeta0 → 2.25.0-aiprivatebeta10

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 (273) hide show
  1. package/dist/_private/index.cjs +18 -10
  2. package/dist/_private/index.cjs.map +1 -1
  3. package/dist/_private/index.d.cts +204 -172
  4. package/dist/_private/index.d.ts +204 -172
  5. package/dist/_private/index.js +12 -5
  6. package/dist/_private/index.js.map +1 -1
  7. package/dist/components/AiChat.cjs +185 -0
  8. package/dist/components/AiChat.cjs.map +1 -0
  9. package/dist/components/AiChat.js +183 -0
  10. package/dist/components/AiChat.js.map +1 -0
  11. package/dist/components/AiTool.cjs +164 -0
  12. package/dist/components/AiTool.cjs.map +1 -0
  13. package/dist/components/AiTool.js +162 -0
  14. package/dist/components/AiTool.js.map +1 -0
  15. package/dist/components/Comment.cjs +7 -5
  16. package/dist/components/Comment.cjs.map +1 -1
  17. package/dist/components/Comment.js +7 -5
  18. package/dist/components/Comment.js.map +1 -1
  19. package/dist/components/Composer.cjs +1 -2
  20. package/dist/components/Composer.cjs.map +1 -1
  21. package/dist/components/Composer.js +1 -2
  22. package/dist/components/Composer.js.map +1 -1
  23. package/dist/components/InboxNotificationList.cjs +11 -3
  24. package/dist/components/InboxNotificationList.cjs.map +1 -1
  25. package/dist/components/InboxNotificationList.js +12 -4
  26. package/dist/components/InboxNotificationList.js.map +1 -1
  27. package/dist/components/Thread.cjs +3 -3
  28. package/dist/components/Thread.cjs.map +1 -1
  29. package/dist/components/Thread.js +3 -3
  30. package/dist/components/Thread.js.map +1 -1
  31. package/dist/components/internal/AiChatAssistantMessage.cjs +74 -291
  32. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  33. package/dist/components/internal/AiChatAssistantMessage.js +76 -293
  34. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  35. package/dist/components/internal/AiChatComposer.cjs +58 -282
  36. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  37. package/dist/components/internal/AiChatComposer.js +63 -283
  38. package/dist/components/internal/AiChatComposer.js.map +1 -1
  39. package/dist/components/internal/AiChatUserMessage.cjs +26 -169
  40. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  41. package/dist/components/internal/AiChatUserMessage.js +28 -171
  42. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  43. package/dist/components/internal/Button.cjs.map +1 -1
  44. package/dist/components/internal/Button.js.map +1 -1
  45. package/dist/components/internal/CodeBlock.cjs +72 -0
  46. package/dist/components/internal/CodeBlock.cjs.map +1 -0
  47. package/dist/components/internal/CodeBlock.js +70 -0
  48. package/dist/components/internal/CodeBlock.js.map +1 -0
  49. package/dist/components/internal/Emoji.cjs +12 -4
  50. package/dist/components/internal/Emoji.cjs.map +1 -1
  51. package/dist/components/internal/Emoji.js +12 -4
  52. package/dist/components/internal/Emoji.js.map +1 -1
  53. package/dist/components/internal/Prose.cjs +37 -0
  54. package/dist/components/internal/Prose.cjs.map +1 -0
  55. package/dist/components/internal/Prose.js +35 -0
  56. package/dist/components/internal/Prose.js.map +1 -0
  57. package/dist/constants.cjs +2 -0
  58. package/dist/constants.cjs.map +1 -1
  59. package/dist/constants.js +2 -1
  60. package/dist/constants.js.map +1 -1
  61. package/dist/icon.cjs +6 -0
  62. package/dist/icon.cjs.map +1 -1
  63. package/dist/icon.js +3 -0
  64. package/dist/icon.js.map +1 -1
  65. package/dist/icons/{Resolve.cjs → CheckCircle.cjs} +3 -3
  66. package/dist/icons/CheckCircle.cjs.map +1 -0
  67. package/dist/icons/{Resolve.js → CheckCircle.js} +3 -3
  68. package/dist/icons/CheckCircle.js.map +1 -0
  69. package/dist/icons/{Resolved.cjs → CheckCircleFill.cjs} +3 -3
  70. package/dist/icons/CheckCircleFill.cjs.map +1 -0
  71. package/dist/icons/{Resolved.js → CheckCircleFill.js} +3 -3
  72. package/dist/icons/CheckCircleFill.js.map +1 -0
  73. package/dist/icons/Copy.cjs +8 -9
  74. package/dist/icons/Copy.cjs.map +1 -1
  75. package/dist/icons/Copy.js +8 -9
  76. package/dist/icons/Copy.js.map +1 -1
  77. package/dist/icons/Retry.cjs +21 -0
  78. package/dist/icons/Retry.cjs.map +1 -0
  79. package/dist/icons/Retry.js +19 -0
  80. package/dist/icons/Retry.js.map +1 -0
  81. package/dist/icons/index.cjs +8 -4
  82. package/dist/icons/index.cjs.map +1 -1
  83. package/dist/icons/index.js +4 -2
  84. package/dist/icons/index.js.map +1 -1
  85. package/dist/index.cjs +3 -1
  86. package/dist/index.cjs.map +1 -1
  87. package/dist/index.d.cts +102 -43
  88. package/dist/index.d.ts +102 -43
  89. package/dist/index.js +2 -1
  90. package/dist/index.js.map +1 -1
  91. package/dist/overrides.cjs +6 -12
  92. package/dist/overrides.cjs.map +1 -1
  93. package/dist/overrides.js +6 -12
  94. package/dist/overrides.js.map +1 -1
  95. package/dist/primitives/AiChatComposer/index.cjs +202 -0
  96. package/dist/primitives/AiChatComposer/index.cjs.map +1 -0
  97. package/dist/primitives/AiChatComposer/index.js +195 -0
  98. package/dist/primitives/AiChatComposer/index.js.map +1 -0
  99. package/dist/primitives/AiMessage/contexts.cjs +18 -0
  100. package/dist/primitives/AiMessage/contexts.cjs.map +1 -0
  101. package/dist/primitives/AiMessage/contexts.js +15 -0
  102. package/dist/primitives/AiMessage/contexts.js.map +1 -0
  103. package/dist/primitives/AiMessage/index.cjs +134 -0
  104. package/dist/primitives/AiMessage/index.cjs.map +1 -0
  105. package/dist/primitives/AiMessage/index.js +132 -0
  106. package/dist/primitives/AiMessage/index.js.map +1 -0
  107. package/dist/primitives/Collapsible/index.cjs +127 -0
  108. package/dist/primitives/Collapsible/index.cjs.map +1 -0
  109. package/dist/primitives/Collapsible/index.js +123 -0
  110. package/dist/primitives/Collapsible/index.js.map +1 -0
  111. package/dist/primitives/Comment/index.cjs +2 -2
  112. package/dist/primitives/Comment/index.cjs.map +1 -1
  113. package/dist/primitives/Comment/index.js +1 -1
  114. package/dist/primitives/Comment/index.js.map +1 -1
  115. package/dist/primitives/Composer/index.cjs +19 -14
  116. package/dist/primitives/Composer/index.cjs.map +1 -1
  117. package/dist/primitives/Composer/index.js +18 -13
  118. package/dist/primitives/Composer/index.js.map +1 -1
  119. package/dist/{slate → primitives/Composer/slate}/plugins/auto-formatting.cjs +3 -3
  120. package/dist/primitives/Composer/slate/plugins/auto-formatting.cjs.map +1 -0
  121. package/dist/{slate → primitives/Composer/slate}/plugins/auto-formatting.js +3 -3
  122. package/dist/primitives/Composer/slate/plugins/auto-formatting.js.map +1 -0
  123. package/dist/{slate → primitives/Composer/slate}/plugins/auto-links.cjs +7 -2
  124. package/dist/primitives/Composer/slate/plugins/auto-links.cjs.map +1 -0
  125. package/dist/{slate → primitives/Composer/slate}/plugins/auto-links.js +8 -3
  126. package/dist/primitives/Composer/slate/plugins/auto-links.js.map +1 -0
  127. package/dist/{slate → primitives/Composer/slate}/plugins/custom-links.cjs +8 -3
  128. package/dist/primitives/Composer/slate/plugins/custom-links.cjs.map +1 -0
  129. package/dist/{slate → primitives/Composer/slate}/plugins/custom-links.js +9 -4
  130. package/dist/primitives/Composer/slate/plugins/custom-links.js.map +1 -0
  131. package/dist/{slate → primitives/Composer/slate}/plugins/mentions.cjs +9 -10
  132. package/dist/primitives/Composer/slate/plugins/mentions.cjs.map +1 -0
  133. package/dist/{slate → primitives/Composer/slate}/plugins/mentions.js +6 -6
  134. package/dist/primitives/Composer/slate/plugins/mentions.js.map +1 -0
  135. package/dist/{slate → primitives/Composer/slate}/plugins/paste.cjs +1 -1
  136. package/dist/primitives/Composer/slate/plugins/paste.cjs.map +1 -0
  137. package/dist/{slate → primitives/Composer/slate}/plugins/paste.js +1 -1
  138. package/dist/primitives/Composer/slate/plugins/paste.js.map +1 -0
  139. package/dist/primitives/Composer/utils.cjs +4 -4
  140. package/dist/primitives/Composer/utils.cjs.map +1 -1
  141. package/dist/primitives/Composer/utils.js +4 -4
  142. package/dist/primitives/Composer/utils.js.map +1 -1
  143. package/dist/primitives/{internal/Markdown.cjs → Markdown.cjs} +150 -83
  144. package/dist/primitives/Markdown.cjs.map +1 -0
  145. package/dist/primitives/{internal/Markdown.js → Markdown.js} +151 -83
  146. package/dist/primitives/Markdown.js.map +1 -0
  147. package/dist/primitives/index.cjs +4 -9
  148. package/dist/primitives/index.cjs.map +1 -1
  149. package/dist/primitives/index.d.cts +4 -110
  150. package/dist/primitives/index.d.ts +4 -110
  151. package/dist/primitives/index.js +0 -1
  152. package/dist/primitives/index.js.map +1 -1
  153. package/dist/primitives/slate/plugins/empty-clear-formatting.cjs.map +1 -0
  154. package/dist/primitives/slate/plugins/empty-clear-formatting.js.map +1 -0
  155. package/dist/{slate → primitives/slate}/plugins/normalize.cjs +0 -5
  156. package/dist/primitives/slate/plugins/normalize.cjs.map +1 -0
  157. package/dist/{slate → primitives/slate}/plugins/normalize.js +0 -5
  158. package/dist/primitives/slate/plugins/normalize.js.map +1 -0
  159. package/dist/primitives/slate/utils/get-character.cjs.map +1 -0
  160. package/dist/primitives/slate/utils/get-character.js.map +1 -0
  161. package/dist/primitives/slate/utils/get-dom-range.cjs.map +1 -0
  162. package/dist/primitives/slate/utils/get-dom-range.js.map +1 -0
  163. package/dist/primitives/slate/utils/get-match-range.cjs.map +1 -0
  164. package/dist/primitives/slate/utils/get-match-range.js.map +1 -0
  165. package/dist/primitives/slate/utils/is-empty-string.cjs.map +1 -0
  166. package/dist/primitives/slate/utils/is-empty-string.js.map +1 -0
  167. package/dist/primitives/slate/utils/is-empty.cjs.map +1 -0
  168. package/dist/primitives/slate/utils/is-empty.js.map +1 -0
  169. package/dist/primitives/slate/utils/is-text.cjs.map +1 -0
  170. package/dist/primitives/slate/utils/is-text.js.map +1 -0
  171. package/dist/primitives/slate/utils/is-whitespace-character.cjs.map +1 -0
  172. package/dist/primitives/slate/utils/is-whitespace-character.js.map +1 -0
  173. package/dist/{slate → primitives/slate}/utils/marks.cjs +9 -9
  174. package/dist/primitives/slate/utils/marks.cjs.map +1 -0
  175. package/dist/{slate → primitives/slate}/utils/marks.js +9 -9
  176. package/dist/primitives/slate/utils/marks.js.map +1 -0
  177. package/dist/primitives/slate/utils/selection-contains-inlines.cjs.map +1 -0
  178. package/dist/primitives/slate/utils/selection-contains-inlines.js.map +1 -0
  179. package/dist/utils/ErrorBoundary.cjs +48 -0
  180. package/dist/utils/ErrorBoundary.cjs.map +1 -0
  181. package/dist/utils/ErrorBoundary.js +45 -0
  182. package/dist/utils/ErrorBoundary.js.map +1 -0
  183. package/dist/utils/use-visible.cjs +63 -45
  184. package/dist/utils/use-visible.cjs.map +1 -1
  185. package/dist/utils/use-visible.js +64 -46
  186. package/dist/utils/use-visible.js.map +1 -1
  187. package/dist/version.cjs +1 -1
  188. package/dist/version.cjs.map +1 -1
  189. package/dist/version.js +1 -1
  190. package/dist/version.js.map +1 -1
  191. package/package.json +18 -6
  192. package/src/styles/constants.css +1 -1
  193. package/src/styles/dark/index.css +7 -3
  194. package/src/styles/index.css +640 -307
  195. package/src/styles/utils.css +8 -3
  196. package/styles/dark/attributes.css +1 -1
  197. package/styles/dark/attributes.css.map +1 -1
  198. package/styles/dark/media-query.css +1 -1
  199. package/styles/dark/media-query.css.map +1 -1
  200. package/styles.css +1 -1
  201. package/styles.css.map +1 -1
  202. package/dist/components/AiChat/AiChat.cjs +0 -200
  203. package/dist/components/AiChat/AiChat.cjs.map +0 -1
  204. package/dist/components/AiChat/AiChat.js +0 -198
  205. package/dist/components/AiChat/AiChat.js.map +0 -1
  206. package/dist/icons/Resolve.cjs.map +0 -1
  207. package/dist/icons/Resolve.js.map +0 -1
  208. package/dist/icons/Resolved.cjs.map +0 -1
  209. package/dist/icons/Resolved.js.map +0 -1
  210. package/dist/primitives/Chat/Composer/index.cjs +0 -323
  211. package/dist/primitives/Chat/Composer/index.cjs.map +0 -1
  212. package/dist/primitives/Chat/Composer/index.js +0 -315
  213. package/dist/primitives/Chat/Composer/index.js.map +0 -1
  214. package/dist/primitives/internal/Collapsible.cjs +0 -99
  215. package/dist/primitives/internal/Collapsible.cjs.map +0 -1
  216. package/dist/primitives/internal/Collapsible.js +0 -95
  217. package/dist/primitives/internal/Collapsible.js.map +0 -1
  218. package/dist/primitives/internal/Emoji.cjs +0 -32
  219. package/dist/primitives/internal/Emoji.cjs.map +0 -1
  220. package/dist/primitives/internal/Emoji.js +0 -30
  221. package/dist/primitives/internal/Emoji.js.map +0 -1
  222. package/dist/primitives/internal/Markdown.cjs.map +0 -1
  223. package/dist/primitives/internal/Markdown.js.map +0 -1
  224. package/dist/slate/plugins/auto-formatting.cjs.map +0 -1
  225. package/dist/slate/plugins/auto-formatting.js.map +0 -1
  226. package/dist/slate/plugins/auto-links.cjs.map +0 -1
  227. package/dist/slate/plugins/auto-links.js.map +0 -1
  228. package/dist/slate/plugins/custom-links.cjs.map +0 -1
  229. package/dist/slate/plugins/custom-links.js.map +0 -1
  230. package/dist/slate/plugins/empty-clear-formatting.cjs.map +0 -1
  231. package/dist/slate/plugins/empty-clear-formatting.js.map +0 -1
  232. package/dist/slate/plugins/mentions.cjs.map +0 -1
  233. package/dist/slate/plugins/mentions.js.map +0 -1
  234. package/dist/slate/plugins/normalize.cjs.map +0 -1
  235. package/dist/slate/plugins/normalize.js.map +0 -1
  236. package/dist/slate/plugins/paste.cjs.map +0 -1
  237. package/dist/slate/plugins/paste.js.map +0 -1
  238. package/dist/slate/utils/get-character.cjs.map +0 -1
  239. package/dist/slate/utils/get-character.js.map +0 -1
  240. package/dist/slate/utils/get-dom-range.cjs.map +0 -1
  241. package/dist/slate/utils/get-dom-range.js.map +0 -1
  242. package/dist/slate/utils/get-match-range.cjs.map +0 -1
  243. package/dist/slate/utils/get-match-range.js.map +0 -1
  244. package/dist/slate/utils/is-empty-string.cjs.map +0 -1
  245. package/dist/slate/utils/is-empty-string.js.map +0 -1
  246. package/dist/slate/utils/is-empty.cjs.map +0 -1
  247. package/dist/slate/utils/is-empty.js.map +0 -1
  248. package/dist/slate/utils/is-text.cjs.map +0 -1
  249. package/dist/slate/utils/is-text.js.map +0 -1
  250. package/dist/slate/utils/is-whitespace-character.cjs.map +0 -1
  251. package/dist/slate/utils/is-whitespace-character.js.map +0 -1
  252. package/dist/slate/utils/marks.cjs.map +0 -1
  253. package/dist/slate/utils/marks.js.map +0 -1
  254. package/dist/slate/utils/selection-contains-inlines.cjs.map +0 -1
  255. package/dist/slate/utils/selection-contains-inlines.js.map +0 -1
  256. /package/dist/{slate → primitives/slate}/plugins/empty-clear-formatting.cjs +0 -0
  257. /package/dist/{slate → primitives/slate}/plugins/empty-clear-formatting.js +0 -0
  258. /package/dist/{slate → primitives/slate}/utils/get-character.cjs +0 -0
  259. /package/dist/{slate → primitives/slate}/utils/get-character.js +0 -0
  260. /package/dist/{slate → primitives/slate}/utils/get-dom-range.cjs +0 -0
  261. /package/dist/{slate → primitives/slate}/utils/get-dom-range.js +0 -0
  262. /package/dist/{slate → primitives/slate}/utils/get-match-range.cjs +0 -0
  263. /package/dist/{slate → primitives/slate}/utils/get-match-range.js +0 -0
  264. /package/dist/{slate → primitives/slate}/utils/is-empty-string.cjs +0 -0
  265. /package/dist/{slate → primitives/slate}/utils/is-empty-string.js +0 -0
  266. /package/dist/{slate → primitives/slate}/utils/is-empty.cjs +0 -0
  267. /package/dist/{slate → primitives/slate}/utils/is-empty.js +0 -0
  268. /package/dist/{slate → primitives/slate}/utils/is-text.cjs +0 -0
  269. /package/dist/{slate → primitives/slate}/utils/is-text.js +0 -0
  270. /package/dist/{slate → primitives/slate}/utils/is-whitespace-character.cjs +0 -0
  271. /package/dist/{slate → primitives/slate}/utils/is-whitespace-character.js +0 -0
  272. /package/dist/{slate → primitives/slate}/utils/selection-contains-inlines.cjs +0 -0
  273. /package/dist/{slate → primitives/slate}/utils/selection-contains-inlines.js +0 -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;
@@ -26,13 +26,13 @@
26
26
  --lb-transition-easing: cubic-bezier(0.4, 0, 0.2, 1);
27
27
  --lb-highlight-shadow: inset 0 0 0 1px rgb(0 0 0 / 10%);
28
28
  --lb-elevation-shadow: $lb-elevation-shadow;
29
- --lb-elevation-shadow-small: $lb-elevation-shadow-small;
29
+ --lb-elevation-shadow-moderate: $lb-elevation-shadow-moderate;
30
30
  --lb-tooltip-shadow: $lb-tooltip-shadow;
31
31
  --lb-accent-contrast: 8%;
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(
@@ -284,6 +284,23 @@
284
284
  }
285
285
  }
286
286
 
287
+ &:where([data-variant="destructive"]) {
288
+ --lb-button-background: var(--lb-destructive);
289
+
290
+ color: var(--lb-destructive-foreground);
291
+
292
+ &:where(
293
+ :enabled:hover,
294
+ :enabled:focus-visible,
295
+ [aria-expanded="true"],
296
+ [aria-selected="true"]
297
+ ) {
298
+ --lb-button-background: var(--lb-destructive-secondary);
299
+
300
+ color: var(--lb-destructive-foreground);
301
+ }
302
+ }
303
+
287
304
  &:where([data-variant="outline"]) {
288
305
  box-shadow: inset 0 0 0 1px var(--lb-foreground-subtle);
289
306
  transition-property: background, color, opacity, box-shadow;
@@ -451,6 +468,280 @@
451
468
  opacity: 0.75;
452
469
  }
453
470
 
471
+ /*************************************
472
+ * Collapsible *
473
+ *************************************/
474
+
475
+ .lb-collapsible-trigger {
476
+ all: unset;
477
+ position: relative;
478
+ box-sizing: inherit;
479
+ user-select: none;
480
+ transition-timing-function: var(--lb-transition-easing);
481
+ transition-duration: var(--lb-transition-duration);
482
+ transition-property: color, background, opacity;
483
+ -webkit-tap-highlight-color: transparent;
484
+
485
+ &:where(:not([data-disabled])) {
486
+ cursor: pointer;
487
+ }
488
+ }
489
+
490
+ .lb-collapsible-chevron {
491
+ inline-size: calc(0.8 * var(--lb-icon-size));
492
+ block-size: calc(0.8 * var(--lb-icon-size));
493
+ margin-inline-start: -1px;
494
+ margin-block-start: 1px;
495
+ color: var(--lb-foreground-moderate);
496
+ }
497
+
498
+ @media (prefers-reduced-motion: no-preference) {
499
+ @supports (interpolate-size: allow-keywords) {
500
+ .lb-collapsible-content {
501
+ block-size: 0;
502
+ opacity: 0;
503
+ transition-duration: calc(3 * var(--lb-transition-duration));
504
+ transition-property: block-size, opacity, content-visibility;
505
+ content-visibility: hidden;
506
+
507
+ /* overflow-block: clip; doesn't work as expected */
508
+ /* stylelint-disable-next-line plugin/use-logical-properties-and-values */
509
+ overflow-y: clip;
510
+
511
+ /* interpolate-size is a new-ish property */
512
+ /* stylelint-disable-next-line */
513
+ interpolate-size: allow-keywords;
514
+
515
+ /* transition-behavior is a new-ish property */
516
+ /* stylelint-disable-next-line */
517
+ transition-behavior: allow-discrete;
518
+
519
+ &:where([data-state="open"]) {
520
+ block-size: auto;
521
+ opacity: 1;
522
+ content-visibility: auto;
523
+
524
+ /* overflow-block: auto; doesn't work as expected */
525
+ /* stylelint-disable-next-line plugin/use-logical-properties-and-values */
526
+ overflow-y: auto;
527
+ }
528
+ }
529
+ }
530
+
531
+ .lb-collapsible-chevron {
532
+ transition-property: transform;
533
+
534
+ .lb-collapsible:where([data-state="open"]) :where(&) {
535
+ transform: rotate(90deg);
536
+ }
537
+ }
538
+ }
539
+
540
+ /* Fix default browser styles when `hidden="until-found"` isn't supported. */
541
+ .lb-collapsible-content:where([hidden]:not([hidden="until-found"])) {
542
+ display: none !important;
543
+ }
544
+
545
+ /*************************************
546
+ * Prose *
547
+ *************************************/
548
+
549
+ .lb-prose {
550
+ &,
551
+ * {
552
+ line-height: var(--lb-line-height);
553
+ }
554
+
555
+ :where(p) {
556
+ margin-block: 0.75em;
557
+ }
558
+
559
+ :where(p, li) {
560
+ text-wrap: pretty;
561
+ }
562
+
563
+ :where(h1, h2, h3, h4, h5, h6) {
564
+ margin-block-start: 1.5em;
565
+ margin-block-end: 0.375em;
566
+ font-weight: 600;
567
+ text-wrap: balance;
568
+ }
569
+
570
+ :where(h1) {
571
+ font-size: 1.75em;
572
+ line-height: calc(0.8 * var(--lb-line-height));
573
+ }
574
+
575
+ :where(h2) {
576
+ font-size: 1.5em;
577
+ line-height: calc(0.86 * var(--lb-line-height));
578
+ }
579
+
580
+ :where(h3) {
581
+ font-size: 1.25em;
582
+ line-height: calc(0.92 * var(--lb-line-height));
583
+ }
584
+
585
+ :where(h4) {
586
+ font-size: 1.125em;
587
+ line-height: calc(0.98 * var(--lb-line-height));
588
+ }
589
+
590
+ :where(h5) {
591
+ font-size: 1em;
592
+ }
593
+
594
+ :where(h6) {
595
+ font-size: 0.875em;
596
+ }
597
+
598
+ :where(hr) {
599
+ margin-block: 1.5em;
600
+ border: none;
601
+ border-block-start: 1px solid var(--lb-foreground-subtle);
602
+ }
603
+
604
+ :where(ol, ul) {
605
+ display: flex;
606
+ flex-direction: column;
607
+ gap: 0.25em;
608
+ margin-block: 0.75em;
609
+ padding-inline-start: 1.5em;
610
+ list-style-position: outside;
611
+
612
+ :where(ol, ul) {
613
+ margin-block: 0;
614
+ }
615
+ }
616
+
617
+ :where(ul) {
618
+ list-style-type: disc;
619
+ }
620
+
621
+ :where(ol) {
622
+ list-style-type: decimal;
623
+ }
624
+
625
+ :where(li) {
626
+ margin-block: 0;
627
+
628
+ > :where(ol, ul) {
629
+ margin-block-start: 0.25em;
630
+ }
631
+ }
632
+
633
+ :where(a) {
634
+ color: var(--lb-foreground);
635
+ outline: none;
636
+ font-weight: 500;
637
+ transition-property: color, text-decoration-color;
638
+ text-decoration-line: underline;
639
+ text-decoration-color: var(--lb-foreground-moderate);
640
+ text-underline-offset: 2px;
641
+
642
+ &:where([href]):where(:hover, :focus-visible) {
643
+ color: var(--lb-accent);
644
+ text-decoration-color: var(--lb-accent-moderate);
645
+ }
646
+ }
647
+
648
+ :where(strong) {
649
+ font-weight: 600;
650
+ }
651
+
652
+ :where(table) {
653
+ inline-size: 100%;
654
+ min-inline-size: 0;
655
+ margin-block: 1em;
656
+ border-collapse: collapse;
657
+ table-layout: auto;
658
+ word-break: break-word;
659
+ }
660
+
661
+ :where(thead) {
662
+ border-block-end: 2px solid var(--lb-foreground-subtle);
663
+
664
+ :where(th) {
665
+ vertical-align: bottom;
666
+ }
667
+ }
668
+
669
+ :where(tbody) {
670
+ :where(td) {
671
+ vertical-align: baseline;
672
+ }
673
+
674
+ :where(tr:not(:last-child)) {
675
+ border-block-end: 1px solid var(--lb-foreground-subtle);
676
+ }
677
+ }
678
+
679
+ :where(tfoot) {
680
+ border-block-start: 2px solid var(--lb-foreground-subtle);
681
+
682
+ :where(td) {
683
+ vertical-align: top;
684
+ }
685
+ }
686
+
687
+ :where(th, td) {
688
+ padding-inline: 0.75em;
689
+ padding-block: 0.5em;
690
+ text-align: start;
691
+
692
+ &:where(:first-child) {
693
+ padding-inline-start: 0;
694
+ }
695
+
696
+ &:where(:last-child) {
697
+ padding-inline-end: 0;
698
+ }
699
+ }
700
+
701
+ :where(.lb-code-block) {
702
+ margin-block: 1em;
703
+ }
704
+
705
+ :where(blockquote) {
706
+ position: relative;
707
+ margin-inline: 0;
708
+ margin-block: 0.75em;
709
+ padding: 0;
710
+ padding-inline-start: 1.25em;
711
+
712
+ &::after {
713
+ content: "";
714
+ position: absolute;
715
+ inset-inline-start: 0;
716
+ inset-block-start: 0;
717
+ inline-size: 4px;
718
+ block-size: 100%;
719
+ border-radius: calc(0.5 * var(--lb-radius));
720
+ background: var(--lb-foreground-subtle);
721
+ }
722
+
723
+ &:where(& + &) {
724
+ margin-block-start: 1em;
725
+ }
726
+
727
+ > :where(:first-child) {
728
+ margin-block-start: 0;
729
+ }
730
+
731
+ > :where(:last-child) {
732
+ margin-block-end: 0;
733
+ }
734
+ }
735
+
736
+ > :where(:first-child) {
737
+ margin-block-start: 0;
738
+ }
739
+
740
+ > :where(:last-child) {
741
+ margin-block-end: 0;
742
+ }
743
+ }
744
+
454
745
  /*************************************
455
746
  * Composer suggestions *
456
747
  *************************************/
@@ -510,6 +801,14 @@
510
801
  * Emoji *
511
802
  *************************************/
512
803
 
804
+ .lb-emoji {
805
+ display: inline-flex;
806
+ justify-content: center;
807
+ align-items: center;
808
+ inline-size: 1em;
809
+ white-space: nowrap;
810
+ }
811
+
513
812
  @include safari-only {
514
813
  .lb-emoji {
515
814
  transform: scale(0.825);
@@ -670,6 +969,7 @@
670
969
  --lb-background: #222;
671
970
  --lb-foreground: #fff;
672
971
  --lb-foreground-contrast: 10%;
972
+ --lb-dynamic-background: var(--lb-background);
673
973
 
674
974
  position: relative;
675
975
  display: flex;
@@ -1889,7 +2189,7 @@
1889
2189
  *************************************/
1890
2190
 
1891
2191
  :is(.lb-root) {
1892
- :where(code) {
2192
+ :where(code:not(pre > code)) {
1893
2193
  padding: 0.2em 0.4em;
1894
2194
  border-radius: calc(0.75 * var(--lb-radius));
1895
2195
  background: var(--lb-foreground-subtle);
@@ -1925,6 +2225,8 @@
1925
2225
  *************************************/
1926
2226
 
1927
2227
  .lb-elevation {
2228
+ --lb-dynamic-background: var(--lb-background);
2229
+
1928
2230
  position: relative;
1929
2231
  overflow: hidden;
1930
2232
  border-radius: var(--lb-radius);
@@ -1940,6 +2242,10 @@
1940
2242
  box-shadow: var(--lb-inset-shadow);
1941
2243
  pointer-events: none;
1942
2244
  }
2245
+
2246
+ &:where(.lb-elevation-moderate) {
2247
+ box-shadow: var(--lb-elevation-shadow-moderate);
2248
+ }
1943
2249
  }
1944
2250
 
1945
2251
  /*************************************
@@ -2049,9 +2355,56 @@
2049
2355
  }
2050
2356
  }
2051
2357
 
2358
+ /*************************************
2359
+ * Code block *
2360
+ *************************************/
2361
+
2362
+ .lb-code-block {
2363
+ min-inline-size: 0;
2364
+ border: 1px solid var(--lb-foreground-subtle);
2365
+ border-radius: var(--lb-radius);
2366
+
2367
+ :where(.lb-code-block-header) {
2368
+ display: flex;
2369
+ align-items: center;
2370
+ padding: calc(0.5 * var(--lb-spacing));
2371
+ }
2372
+
2373
+ :where(.lb-code-block-title) {
2374
+ margin-inline-start: calc(0.5 * var(--lb-spacing));
2375
+ color: var(--lb-foreground-tertiary);
2376
+ font-weight: 600;
2377
+ font-size: 0.675em;
2378
+ text-transform: uppercase;
2379
+ }
2380
+
2381
+ :where(.lb-code-block-header-actions) {
2382
+ margin-inline-start: auto;
2383
+ }
2384
+
2385
+ :where(.lb-code-block-content) {
2386
+ min-inline-size: 0;
2387
+ margin: 0;
2388
+ padding: 0 var(--lb-spacing) calc(0.875 * var(--lb-spacing));
2389
+ font-size: 85%;
2390
+ line-height: 1;
2391
+
2392
+ /* overflow-inline: auto; doesn't work as expected */
2393
+ /* stylelint-disable-next-line plugin/use-logical-properties-and-values */
2394
+ overflow-x: auto;
2395
+ }
2396
+ }
2397
+
2052
2398
  /*************************************
2053
2399
  * Chat Composer *
2054
2400
  *************************************/
2401
+
2402
+ .lb-ai-chat-composer {
2403
+ position: relative;
2404
+ inline-size: 100%;
2405
+ color: var(--lb-foreground);
2406
+ }
2407
+
2055
2408
  .lb-ai-chat-composer-form:where(
2056
2409
  :has(.lb-ai-chat-composer-editor:not(:focus-visible))
2057
2410
  ) {
@@ -2068,13 +2421,6 @@
2068
2421
  }
2069
2422
  }
2070
2423
 
2071
- .lb-ai-chat-composer-form {
2072
- position: relative;
2073
- background: var(--lb-dynamic-background);
2074
- color: var(--lb-foreground);
2075
- transition-property: background;
2076
- }
2077
-
2078
2424
  .lb-ai-chat-composer-editor {
2079
2425
  max-block-size: 15rem;
2080
2426
  padding: var(--lb-spacing) var(--lb-spacing) 0;
@@ -2138,402 +2484,389 @@
2138
2484
  }
2139
2485
 
2140
2486
  /*************************************
2141
- * Chat composer attachments *
2487
+ * Chat message *
2142
2488
  *************************************/
2143
- .lb-ai-chat-composer-attachments {
2489
+
2490
+ .lb-ai-chat-message {
2144
2491
  display: flex;
2145
2492
  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;
2493
+ gap: var(--lb-spacing);
2494
+ color: var(--lb-foreground);
2153
2495
  }
2154
2496
 
2155
- /*************************************
2156
- * Chat message *
2157
- *************************************/
2158
2497
  .lb-ai-chat-user-message {
2159
- display: flex;
2160
- flex-direction: column;
2161
- gap: calc(0.75 * var(--lb-spacing));
2162
-
2163
- &,
2164
- * {
2498
+ :where(.lb-ai-chat-message-content) {
2499
+ min-block-size: calc(1lh + var(--lb-spacing));
2500
+ padding: calc(0.5 * var(--lb-spacing)) var(--lb-spacing);
2501
+
2502
+ /**
2503
+ * Exactly half the height (line-height + padding) of a one line bubble,
2504
+ * so that it doesn't change when the text wraps and the bubble becomes taller.
2505
+ */
2506
+ border-radius: calc((1lh + var(--lb-spacing)) / 2);
2507
+ background: var(--lb-background-foreground-faint);
2508
+ color: var(--lb-foreground);
2165
2509
  line-height: var(--lb-line-height);
2166
2510
  }
2167
2511
  }
2168
2512
 
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));
2513
+ .lb-ai-chat-message-deleted {
2514
+ position: relative;
2515
+ align-items: center;
2516
+ inline-size: 100%;
2517
+ color: var(--lb-foreground-moderate);
2518
+ font-size: 0.875em;
2519
+ text-wrap: pretty;
2181
2520
  }
2182
2521
 
2183
- .lb-ai-chat-user-message-media-attachments {
2522
+ .lb-ai-chat-message-error {
2184
2523
  display: flex;
2185
- flex-wrap: wrap;
2186
- gap: calc(0.75 * var(--lb-spacing));
2187
- justify-content: flex-end;
2188
- }
2524
+ gap: calc(0.5 * var(--lb-spacing));
2525
+ align-items: flex-start;
2526
+ inline-size: 100%;
2527
+ color: var(--lb-destructive);
2528
+ font-size: 0.875em;
2529
+ line-height: var(--lb-line-height);
2530
+ text-wrap: pretty;
2531
+ word-break: break-word;
2189
2532
 
2190
- .lb-ai-chat-user-message-attachment {
2191
- flex-shrink: 1;
2192
- flex-basis: 300px;
2533
+ :where(.lb-icon-container) {
2534
+ block-size: 1lh;
2535
+ color: var(--lb-destructive-secondary);
2536
+ }
2193
2537
  }
2194
2538
 
2195
- .lb-ai-chat-assistant-message {
2196
- display: flex;
2197
- flex-direction: column;
2198
- gap: calc(0.75 * var(--lb-spacing));
2539
+ .lb-ai-chat-message-content {
2540
+ inline-size: 100%;
2541
+ white-space: break-spaces;
2199
2542
 
2200
- @media (hover: hover) {
2201
- &:where(.lb-ai-chat-assistant-message\:show-actions-hover) {
2202
- :where(.lb-ai-chat-assistant-message-actions) {
2203
- opacity: 0;
2204
- transition-property: opacity;
2205
- }
2543
+ &:where(:empty) {
2544
+ display: contents;
2545
+ }
2206
2546
 
2207
- &:where(:is(:hover, :focus-within)) {
2208
- :where(.lb-ai-chat-assistant-message-actions) {
2209
- opacity: 1;
2210
- }
2211
- }
2212
- }
2547
+ > :where(.lb-ai-chat-message-text) {
2548
+ margin-block: var(--lb-spacing);
2213
2549
  }
2214
- }
2215
2550
 
2216
- .lb-ai-chat-assistant-message-content {
2217
- inline-size: 100%;
2551
+ > :where(.lb-ai-chat-message-tool-invocation) {
2552
+ margin-block: var(--lb-spacing);
2553
+ }
2554
+
2555
+ > :where(:first-child) {
2556
+ margin-block-start: 0;
2557
+ }
2558
+
2559
+ > :where(:last-child) {
2560
+ margin-block-end: 0;
2561
+ }
2218
2562
  }
2219
2563
 
2220
- .lb-ai-chat-assistant-message-text-part {
2564
+ .lb-ai-chat-messages {
2221
2565
  display: flex;
2222
2566
  flex-direction: column;
2567
+ gap: var(--lb-spacing);
2568
+ inline-size: 100%;
2569
+ max-inline-size: min(
2570
+ calc(var(--lb-ai-chat-container-width) - var(--lb-spacing)),
2571
+ calc(100% - 3 * var(--lb-spacing))
2572
+ );
2573
+ margin-inline: auto;
2574
+ padding-block-start: calc(1.5 * var(--lb-spacing));
2575
+ padding-block-end: calc(3 * var(--lb-spacing));
2223
2576
 
2224
- &,
2225
- * {
2226
- line-height: var(--lb-line-height);
2577
+ :where(.lb-ai-chat-user-message) {
2578
+ max-inline-size: 80%;
2579
+ margin-inline-start: auto;
2227
2580
  }
2581
+ }
2228
2582
 
2229
- :where(p) {
2230
- margin-block: 0.25em;
2231
- }
2583
+ .lb-ai-chat-footer {
2584
+ position: relative;
2585
+ display: flex;
2586
+ flex-direction: column;
2587
+ gap: calc(0.75 * var(--lb-spacing));
2588
+ inline-size: 100%;
2589
+ }
2232
2590
 
2233
- :where(h1, h2, h3, h4, h5, h6) {
2234
- margin-block: 0.5em;
2235
- font-weight: 600;
2236
- }
2591
+ .lb-ai-chat {
2592
+ --lb-ai-chat-container-width: 100%;
2237
2593
 
2238
- :where(h1) {
2239
- font-size: 1.75em;
2240
- }
2594
+ display: flex;
2595
+ flex-direction: column;
2596
+ inline-size: 100%;
2597
+ block-size: 100%;
2598
+ background: var(--lb-background);
2599
+ isolation: isolate;
2241
2600
 
2242
- :where(h2) {
2243
- font-size: 1.5em;
2244
- }
2601
+ /* overflow-block: auto; doesn't work as expected */
2602
+ /* stylelint-disable-next-line plugin/use-logical-properties-and-values */
2603
+ overflow-y: auto;
2245
2604
 
2246
- :where(h3) {
2247
- font-size: 1.25em;
2605
+ :where(.lb-ai-chat-footer) {
2606
+ position: sticky;
2607
+ inset-block-end: 0;
2608
+ z-index: 1;
2609
+ margin-block-start: auto;
2248
2610
  }
2249
2611
 
2250
- :where(h4) {
2251
- font-size: 1.125em;
2612
+ :where(.lb-ai-chat-composer) {
2613
+ margin-inline: auto;
2252
2614
  }
2615
+ }
2253
2616
 
2254
- :where(h5) {
2255
- font-size: 1em;
2256
- }
2617
+ .lb-ai-chat:where(.lb-ai-chat\:layout-compact) {
2618
+ :where(.lb-ai-chat-footer) {
2619
+ background: var(--lb-dynamic-background);
2257
2620
 
2258
- :where(h6) {
2259
- font-size: 0.875em;
2621
+ &::after {
2622
+ content: "";
2623
+ position: absolute;
2624
+ inset: 0;
2625
+ border-block-start: 1px solid var(--lb-foreground-subtle);
2626
+ pointer-events: none;
2627
+ }
2260
2628
  }
2261
2629
 
2262
- :where(hr) {
2263
- margin-block: calc(0.75 * var(--lb-spacing));
2264
- border-block-start: 1px solid var(--lb-foreground-subtle);
2630
+ :where(.lb-ai-chat-composer) {
2631
+ max-inline-size: min(
2632
+ 100%,
2633
+ calc(var(--lb-ai-chat-container-width) + var(--lb-spacing))
2634
+ );
2265
2635
  }
2636
+ }
2266
2637
 
2267
- :where(blockquote) {
2268
- position: relative;
2269
- margin-block-start: calc(0.75 * var(--lb-spacing));
2270
- padding: calc(0.375 * var(--lb-spacing)) calc(1.5 * var(--lb-spacing));
2638
+ .lb-ai-chat:where(.lb-ai-chat\:layout-inset) {
2639
+ :where(.lb-ai-chat-footer) {
2640
+ padding: var(--lb-spacing);
2641
+ padding-block-start: 0;
2271
2642
 
2272
- &::after {
2643
+ &::before {
2273
2644
  content: "";
2274
2645
  position: absolute;
2275
- inset-inline-start: 0;
2276
- inset-block-start: 0;
2277
- inline-size: 4px;
2278
- block-size: 100%;
2279
- border-radius: calc(0.5 * var(--lb-radius));
2280
- background: var(--lb-foreground-subtle);
2646
+ inset: 0;
2647
+ inset-block-start: calc(-3 * var(--lb-spacing));
2648
+ background: linear-gradient(
2649
+ to bottom,
2650
+ transparent 0%,
2651
+ var(--lb-background) calc(3.5 * var(--lb-spacing))
2652
+ );
2653
+ pointer-events: none;
2281
2654
  }
2282
2655
  }
2283
2656
 
2284
- :where(ol, ul) {
2285
- margin-block: calc(0.75 * var(--lb-spacing));
2286
- padding-inline-start: calc(1.5 * var(--lb-spacing));
2287
- list-style-position: outside;
2657
+ :where(.lb-ai-chat-composer) {
2658
+ max-inline-size: var(--lb-ai-chat-container-width);
2659
+ border-radius: calc(2 * var(--lb-radius));
2288
2660
  }
2661
+ }
2289
2662
 
2290
- :where(ul) {
2291
- list-style-type: disc;
2292
- }
2663
+ .lb-ai-chat-content {
2664
+ position: relative;
2665
+ flex: 1 0 auto;
2666
+ }
2293
2667
 
2294
- :where(ol) {
2295
- list-style-type: decimal;
2668
+ .lb-ai-chat-footer-actions {
2669
+ position: absolute;
2670
+ inset-inline: 0;
2671
+ inset-block-start: calc(-1 * var(--lb-spacing));
2672
+ display: flex;
2673
+ justify-content: center;
2674
+ pointer-events: none;
2675
+ transform: translateY(-100%);
2676
+ }
2677
+
2678
+ .lb-ai-chat-scroll-indicator {
2679
+ border-radius: $lb-radius-full;
2680
+ color: var(--lb-foreground-moderate);
2681
+ opacity: 0;
2682
+ pointer-events: none;
2683
+ transition-property: transform, opacity, background;
2684
+ transform: scale(0.8);
2685
+ transform-origin: bottom;
2686
+
2687
+ &:where([data-visible]) {
2688
+ opacity: 1;
2689
+ pointer-events: all;
2690
+ transform: scale(1);
2296
2691
  }
2692
+ }
2297
2693
 
2298
- :where(li) {
2299
- margin-block: calc(0.25 * var(--lb-spacing));
2694
+ .lb-ai-chat-scroll-indicator-button {
2695
+ @include button-base;
2696
+
2697
+ padding: calc(0.375 * var(--lb-spacing));
2698
+ border-radius: $lb-radius-full;
2699
+ color: var(--lb-foreground-moderate);
2700
+ transition-property: opacity, color;
2701
+
2702
+ &:where(:hover, :focus-visible) {
2703
+ color: var(--lb-foreground-secondary);
2300
2704
  }
2301
2705
 
2302
- /**
2303
- * Merge adjacent inline code elements
2304
- */
2305
- :where(span:has(code) + span code) {
2306
- padding-inline-start: 0;
2307
- border-start-start-radius: 0;
2308
- border-end-start-radius: 0;
2706
+ &::after {
2707
+ content: "";
2708
+ position: absolute;
2709
+ inset: 0;
2710
+ border-radius: inherit;
2711
+ pointer-events: none;
2712
+ transition-property: box-shadow;
2309
2713
  }
2310
2714
 
2311
- :where(span:has(code):has(+ span code) code) {
2312
- padding-inline-end: 0;
2313
- border-start-end-radius: 0;
2314
- border-end-end-radius: 0;
2715
+ &:where(:focus-visible)::after {
2716
+ box-shadow: inset var(--lb-accent) 0 0 0 2px;
2315
2717
  }
2718
+ }
2316
2719
 
2317
- :where(a) {
2720
+ .lb-ai-chat-pending {
2721
+ user-select: none;
2722
+ animation: lb-animation-shimmer-small 5s linear infinite;
2723
+ }
2724
+
2725
+ .lb-ai-chat-message-thinking,
2726
+ .lb-ai-chat-message-reasoning {
2727
+ inline-size: fit-content;
2728
+ max-inline-size: 100%;
2729
+ color: var(--lb-foreground-tertiary);
2730
+
2731
+ &:where(.lb-ai-chat-pending),
2732
+ :where(.lb-ai-chat-pending) {
2318
2733
  color: var(--lb-foreground);
2319
- outline: none;
2320
- font-weight: 500;
2321
- transition-property: color, text-decoration-color;
2322
- text-decoration-line: underline;
2323
- text-decoration-color: var(--lb-foreground-moderate);
2324
- text-underline-offset: 2px;
2734
+ }
2735
+ }
2325
2736
 
2326
- &:where([href]):where(:hover, :focus-visible) {
2737
+ .lb-ai-chat-message-reasoning {
2738
+ margin-block-end: calc(0.75 * var(--lb-spacing));
2739
+
2740
+ :where(.lb-collapsible-trigger) {
2741
+ display: flex;
2742
+ gap: calc(0.25 * var(--lb-spacing));
2743
+ align-items: center;
2744
+
2745
+ &:where(:focus-visible) {
2327
2746
  color: var(--lb-accent);
2328
- text-decoration-color: var(--lb-accent-moderate);
2329
- }
2330
- }
2331
2747
 
2332
- :where(code) {
2333
- padding: 0.2em 0.4em;
2334
- border-radius: calc(0.75 * var(--lb-radius));
2335
- background: var(--lb-foreground-subtle);
2336
- box-decoration-break: clone;
2337
- font-size: 85%;
2338
- line-height: 1;
2748
+ :where(.lb-collapsible-chevron) {
2749
+ color: var(--lb-accent-moderate);
2750
+ }
2751
+ }
2339
2752
  }
2340
2753
 
2341
- :where(pre) {
2342
- margin-block: 0.25em;
2343
- padding: var(--lb-spacing);
2344
- border-radius: var(--lb-radius);
2345
- box-decoration-break: clone;
2346
- box-shadow: var(--lb-foreground-subtle) 0 0 0 1px inset;
2754
+ :where(.lb-collapsible-content) {
2755
+ display: flex;
2756
+ flex-direction: column;
2757
+ gap: calc(0.5 * var(--lb-spacing));
2758
+ line-height: var(--lb-line-height);
2347
2759
 
2348
- :where(code) {
2349
- padding: 0;
2350
- background: transparent;
2760
+ :where(& > *:first-child) {
2761
+ margin-block-start: calc(0.5 * var(--lb-spacing));
2351
2762
  }
2352
2763
  }
2353
2764
 
2354
- :where(strong) {
2355
- font-weight: 600;
2765
+ :where(.lb-prose) {
2766
+ color: var(--lb-foreground);
2767
+ font-size: 0.875em;
2768
+ opacity: 0.75;
2356
2769
  }
2357
2770
  }
2358
2771
 
2359
- .lb-ai-chat-assistant-message-thinking {
2360
- @include truncate;
2361
-
2362
- user-select: none;
2363
- animation: lb-animation-shimmer-small 8s linear infinite;
2364
- }
2365
-
2366
- .lb-ai-chat-user-message-deleted,
2367
- .lb-ai-chat-assistant-message-deleted {
2772
+ .lb-ai-tool {
2368
2773
  position: relative;
2369
- align-items: center;
2370
- inline-size: 100%;
2371
- color: var(--lb-foreground-moderate);
2372
- font-size: 0.875em;
2373
- text-wrap: balance;
2374
- }
2774
+ border-radius: var(--lb-radius);
2775
+ box-shadow: inset 0 0 0 1px var(--lb-foreground-subtle);
2375
2776
 
2376
- .lb-asssitant-chat-message-error {
2377
- --lb-dynamic-background: var(--lb-background-destructive-subtle);
2777
+ &::after {
2778
+ content: "";
2779
+ position: absolute;
2780
+ inset: 0;
2781
+ border-radius: inherit;
2782
+ pointer-events: none;
2783
+ transition-property: box-shadow;
2784
+ }
2378
2785
 
2379
- position: relative;
2380
- display: flex;
2381
- gap: calc(0.5 * var(--lb-spacing));
2382
- align-items: center;
2383
- inline-size: 100%;
2384
- padding: calc(0.75 * var(--lb-spacing));
2385
- border-radius: var(--lb-radius);
2386
- background: var(--lb-dynamic-background);
2387
- color: var(--lb-destructive);
2388
- font-size: 0.875em;
2389
- text-wrap: balance;
2786
+ &:where(:has(.lb-ai-tool-header:focus-visible)) {
2787
+ z-index: 1;
2390
2788
 
2391
- :where(.lb-icon-container) {
2392
- color: var(--lb-destructive-secondary);
2789
+ &::after {
2790
+ box-shadow:
2791
+ var(--lb-dynamic-background) 0 0 0 2px,
2792
+ var(--lb-accent) 0 0 0 4px;
2793
+ }
2393
2794
  }
2394
2795
  }
2395
2796
 
2396
- .lb-ai-chat-assistant-message-reasoning-part {
2397
- position: relative;
2797
+ .lb-ai-tool-header {
2398
2798
  display: flex;
2399
- flex-direction: column;
2799
+ gap: calc(0.25 * var(--lb-spacing));
2800
+ align-items: center;
2400
2801
  inline-size: 100%;
2401
- color: var(--lb-foreground-secondary);
2402
- font-size: 0.875em;
2802
+ block-size: calc($lb-button-size + var(--lb-spacing));
2803
+ padding-inline: calc(0.5 * var(--lb-spacing));
2403
2804
  }
2404
2805
 
2405
- .lb-ai-chat-assistant-message-reasoning-part-trigger {
2406
- @include truncate;
2407
-
2806
+ .lb-ai-tool-header-icon-container,
2807
+ .lb-ai-tool-icon {
2408
2808
  display: flex;
2409
- gap: calc(0.25 * var(--lb-spacing));
2809
+ flex: none;
2810
+ justify-content: center;
2410
2811
  align-items: center;
2411
-
2412
- &:where([data-reasoning]) {
2413
- animation: lb-animation-shimmer-small 8s linear infinite;
2414
- }
2812
+ inline-size: $lb-button-size;
2813
+ block-size: $lb-button-size;
2415
2814
  }
2416
2815
 
2417
- .lb-ai-chat-assistant-message-reasoning-part-content {
2418
- display: flex;
2419
- gap: calc(0.5 * var(--lb-spacing));
2420
- line-height: var(--lb-line-height);
2816
+ .lb-ai-tool-header-icon-container {
2817
+ color: var(--lb-foreground-moderate);
2421
2818
 
2422
- &:where([data-state="open"]) {
2423
- margin-block-start: 0.25em;
2819
+ &:where(:has(.lb-ai-tool-icon)) {
2820
+ margin-inline-end: calc(0.25 * var(--lb-spacing));
2424
2821
  }
2425
2822
  }
2426
2823
 
2427
- .lb-ai-chat-assistant-message-actions {
2428
- display: flex;
2429
- gap: calc(0.125 * var(--lb-spacing));
2430
- align-items: center;
2824
+ .lb-ai-tool-icon {
2825
+ border-radius: calc(0.75 * var(--lb-radius));
2826
+ background: var(--lb-foreground-subtle);
2827
+ font-size: 0.875em;
2431
2828
  }
2432
2829
 
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);
2830
+ .lb-ai-tool-header-title {
2831
+ @include truncate;
2441
2832
 
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
- }
2833
+ color: var(--lb-foreground-secondary);
2834
+ font-size: 0.9375em;
2446
2835
 
2447
- .lb-ai-chat-messages {
2448
- display: flex;
2449
- flex-direction: column;
2450
- gap: calc(0.75 * var(--lb-spacing));
2451
- inline-size: 100%;
2452
- max-inline-size: min(
2453
- calc(var(--lb-ai-chat-container-width) - var(--lb-spacing)),
2454
- calc(100% - 3 * var(--lb-spacing))
2455
- );
2456
- margin-inline: auto;
2457
- padding-block-start: var(--lb-spacing);
2458
- padding-block-end: calc(3 * var(--lb-spacing));
2836
+ &:where(:first-child) {
2837
+ margin-inline-start: calc(0.25 * var(--lb-spacing));
2838
+ }
2459
2839
  }
2460
2840
 
2461
- .lb-ai-chat-loading,
2462
- .lb-ai-chat-error {
2463
- position: relative;
2464
- flex: 1 1 auto;
2841
+ .lb-ai-tool-header-status {
2842
+ flex: none;
2843
+ margin-inline-start: auto;
2844
+ margin-inline-end: calc(0.25 * var(--lb-spacing));
2845
+ color: var(--lb-foreground-moderate);
2465
2846
  }
2466
2847
 
2467
- .lb-ai-chat-messages-user-message {
2468
- max-inline-size: 80%;
2469
- margin-inline-start: auto;
2848
+ .lb-ai-tool-content {
2849
+ padding: 0 calc(0.75 * var(--lb-spacing)) calc(0.75 * var(--lb-spacing));
2470
2850
  }
2471
2851
 
2472
- .lb-ai-chat-footer {
2473
- position: sticky;
2474
- inset-block-end: 0;
2852
+ .lb-ai-tool-inspector {
2475
2853
  display: flex;
2476
2854
  flex-direction: column;
2477
2855
  gap: calc(0.75 * var(--lb-spacing));
2478
- inline-size: 100%;
2479
- margin-block-start: auto;
2480
- padding: var(--lb-spacing);
2481
- padding-block-start: 0;
2482
-
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;
2494
- }
2495
2856
  }
2496
2857
 
2497
- .lb-ai-chat-footer-actions {
2498
- position: absolute;
2499
- inset-inline: 0;
2500
- inset-block-start: calc(-3 * var(--lb-spacing));
2858
+ .lb-ai-tool-confirmation-footer {
2501
2859
  display: flex;
2502
- justify-content: center;
2503
- pointer-events: none;
2504
- }
2505
-
2506
- .lb-ai-chat-composer {
2507
- position: relative;
2508
- 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);
2515
-
2516
- &::after {
2517
- content: "";
2518
- position: absolute;
2519
- inset: 0;
2520
- z-index: 1;
2521
- border-radius: inherit;
2522
- box-shadow: var(--lb-inset-shadow);
2523
- pointer-events: none;
2524
- }
2860
+ align-items: center;
2861
+ margin-block-start: calc(0.75 * var(--lb-spacing));
2525
2862
  }
2526
2863
 
2527
- .lb-ai-chat-scroll-button {
2528
- border-radius: $lb-radius-full;
2529
- opacity: 0;
2530
- pointer-events: none;
2531
- transition-property: opacity;
2532
-
2533
- &:where([data-visible]) {
2534
- opacity: 1;
2535
- pointer-events: all;
2536
- }
2864
+ .lb-ai-tool-confirmation-actions {
2865
+ display: flex;
2866
+ gap: calc(0.75 * var(--lb-spacing));
2867
+ justify-content: flex-end;
2868
+ align-items: center;
2869
+ margin-inline-start: auto;
2537
2870
  }
2538
2871
 
2539
2872
  /*************************************
@@ -2611,12 +2944,12 @@
2611
2944
  to {
2612
2945
  mask-image: linear-gradient(
2613
2946
  90deg,
2614
- #000 8%,
2615
- rgb(0 0 0 / 50%) 20%,
2616
- rgb(0 0 0 / 50%) 80%,
2617
- #000 92%
2947
+ #000 0%,
2948
+ rgb(0 0 0 / 50%) 18%,
2949
+ rgb(0 0 0 / 50%) 82%,
2950
+ #000 100%
2618
2951
  );
2619
- mask-size: 400% 100%;
2952
+ mask-size: 300% 100%;
2620
2953
  }
2621
2954
 
2622
2955
  from {
@@ -2624,7 +2957,7 @@
2624
2957
  }
2625
2958
 
2626
2959
  to {
2627
- mask-position: -200% 0;
2960
+ mask-position: -100% 0;
2628
2961
  }
2629
2962
  }
2630
2963