@liveblocks/react-ui 2.25.0-aiprivatebeta8 → 2.25.0-aiprivatebeta9

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 (113) hide show
  1. package/dist/_private/index.cjs +10 -12
  2. package/dist/_private/index.cjs.map +1 -1
  3. package/dist/_private/index.d.cts +141 -112
  4. package/dist/_private/index.d.ts +141 -112
  5. package/dist/_private/index.js +8 -5
  6. package/dist/_private/index.js.map +1 -1
  7. package/dist/components/AiChat.cjs +74 -106
  8. package/dist/components/AiChat.cjs.map +1 -1
  9. package/dist/components/AiChat.js +75 -107
  10. package/dist/components/AiChat.js.map +1 -1
  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 +5 -3
  16. package/dist/components/Comment.cjs.map +1 -1
  17. package/dist/components/Comment.js +6 -4
  18. package/dist/components/Comment.js.map +1 -1
  19. package/dist/components/InboxNotificationList.cjs +11 -3
  20. package/dist/components/InboxNotificationList.cjs.map +1 -1
  21. package/dist/components/InboxNotificationList.js +12 -4
  22. package/dist/components/InboxNotificationList.js.map +1 -1
  23. package/dist/components/internal/AiChatAssistantMessage.cjs +43 -199
  24. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  25. package/dist/components/internal/AiChatAssistantMessage.js +44 -200
  26. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  27. package/dist/components/internal/AiChatComposer.cjs +1 -1
  28. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  29. package/dist/components/internal/AiChatComposer.js +1 -1
  30. package/dist/components/internal/AiChatComposer.js.map +1 -1
  31. package/dist/components/internal/AiChatUserMessage.cjs +17 -10
  32. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  33. package/dist/components/internal/AiChatUserMessage.js +17 -10
  34. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  35. package/dist/components/internal/Button.cjs.map +1 -1
  36. package/dist/components/internal/Button.js.map +1 -1
  37. package/dist/components/internal/CodeBlock.cjs +72 -0
  38. package/dist/components/internal/CodeBlock.cjs.map +1 -0
  39. package/dist/components/internal/CodeBlock.js +70 -0
  40. package/dist/components/internal/CodeBlock.js.map +1 -0
  41. package/dist/components/internal/Emoji.cjs +12 -4
  42. package/dist/components/internal/Emoji.cjs.map +1 -1
  43. package/dist/components/internal/Emoji.js +12 -4
  44. package/dist/components/internal/Emoji.js.map +1 -1
  45. package/dist/components/internal/Prose.cjs +37 -0
  46. package/dist/components/internal/Prose.cjs.map +1 -0
  47. package/dist/components/internal/Prose.js +35 -0
  48. package/dist/components/internal/Prose.js.map +1 -0
  49. package/dist/index.cjs +2 -2
  50. package/dist/index.cjs.map +1 -1
  51. package/dist/index.d.cts +50 -9
  52. package/dist/index.d.ts +50 -9
  53. package/dist/index.js +1 -1
  54. package/dist/index.js.map +1 -1
  55. package/dist/overrides.cjs +2 -4
  56. package/dist/overrides.cjs.map +1 -1
  57. package/dist/overrides.js +2 -4
  58. package/dist/overrides.js.map +1 -1
  59. package/dist/primitives/AiMessage/contexts.cjs +18 -0
  60. package/dist/primitives/AiMessage/contexts.cjs.map +1 -0
  61. package/dist/primitives/AiMessage/contexts.js +15 -0
  62. package/dist/primitives/AiMessage/contexts.js.map +1 -0
  63. package/dist/primitives/AiMessage/index.cjs +133 -0
  64. package/dist/primitives/AiMessage/index.cjs.map +1 -0
  65. package/dist/primitives/AiMessage/index.js +131 -0
  66. package/dist/primitives/AiMessage/index.js.map +1 -0
  67. package/dist/primitives/{internal/Collapsible → Collapsible}/index.cjs +39 -17
  68. package/dist/primitives/Collapsible/index.cjs.map +1 -0
  69. package/dist/primitives/{internal/Collapsible → Collapsible}/index.js +37 -15
  70. package/dist/primitives/Collapsible/index.js.map +1 -0
  71. package/dist/primitives/{internal/Markdown.cjs → Markdown.cjs} +99 -63
  72. package/dist/primitives/Markdown.cjs.map +1 -0
  73. package/dist/primitives/{internal/Markdown.js → Markdown.js} +100 -63
  74. package/dist/primitives/Markdown.js.map +1 -0
  75. package/dist/primitives/index.cjs +4 -6
  76. package/dist/primitives/index.cjs.map +1 -1
  77. package/dist/primitives/index.d.cts +2 -75
  78. package/dist/primitives/index.d.ts +2 -75
  79. package/dist/primitives/index.js +4 -6
  80. package/dist/primitives/index.js.map +1 -1
  81. package/dist/utils/ErrorBoundary.cjs +48 -0
  82. package/dist/utils/ErrorBoundary.cjs.map +1 -0
  83. package/dist/utils/ErrorBoundary.js +45 -0
  84. package/dist/utils/ErrorBoundary.js.map +1 -0
  85. package/dist/utils/use-visible.cjs +63 -45
  86. package/dist/utils/use-visible.cjs.map +1 -1
  87. package/dist/utils/use-visible.js +64 -46
  88. package/dist/utils/use-visible.js.map +1 -1
  89. package/dist/version.cjs +1 -1
  90. package/dist/version.js +1 -1
  91. package/package.json +4 -4
  92. package/src/styles/constants.css +1 -1
  93. package/src/styles/dark/index.css +7 -3
  94. package/src/styles/index.css +555 -253
  95. package/src/styles/utils.css +1 -1
  96. package/styles/dark/attributes.css +1 -1
  97. package/styles/dark/attributes.css.map +1 -1
  98. package/styles/dark/media-query.css +1 -1
  99. package/styles/dark/media-query.css.map +1 -1
  100. package/styles.css +1 -1
  101. package/styles.css.map +1 -1
  102. package/dist/components/AiToolDebugger.cjs +0 -74
  103. package/dist/components/AiToolDebugger.cjs.map +0 -1
  104. package/dist/components/AiToolDebugger.js +0 -72
  105. package/dist/components/AiToolDebugger.js.map +0 -1
  106. package/dist/primitives/internal/Collapsible/index.cjs.map +0 -1
  107. package/dist/primitives/internal/Collapsible/index.js.map +0 -1
  108. package/dist/primitives/internal/Emoji.cjs +0 -32
  109. package/dist/primitives/internal/Emoji.cjs.map +0 -1
  110. package/dist/primitives/internal/Emoji.js +0 -30
  111. package/dist/primitives/internal/Emoji.js.map +0 -1
  112. package/dist/primitives/internal/Markdown.cjs.map +0 -1
  113. package/dist/primitives/internal/Markdown.js.map +0 -1
@@ -26,7 +26,7 @@
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%;
@@ -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;
@@ -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;
@@ -2144,180 +2490,24 @@
2144
2490
  .lb-ai-chat-message {
2145
2491
  display: flex;
2146
2492
  flex-direction: column;
2147
- gap: calc(0.75 * var(--lb-spacing));
2493
+ gap: var(--lb-spacing);
2148
2494
  color: var(--lb-foreground);
2149
2495
  }
2150
2496
 
2151
- .lb-ai-chat-message-content {
2152
- inline-size: 100%;
2153
- white-space: break-spaces;
2154
- }
2155
-
2156
2497
  .lb-ai-chat-user-message {
2157
2498
  :where(.lb-ai-chat-message-content) {
2499
+ min-block-size: calc(1lh + var(--lb-spacing));
2158
2500
  padding: calc(0.5 * var(--lb-spacing)) var(--lb-spacing);
2159
- border-radius: calc(3 * var(--lb-radius));
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);
2160
2507
  background: var(--lb-background-foreground-faint);
2161
2508
  color: var(--lb-foreground);
2162
- }
2163
- }
2164
-
2165
- .lb-ai-chat-message-text {
2166
- display: flex;
2167
- flex-direction: column;
2168
-
2169
- &,
2170
- * {
2171
2509
  line-height: var(--lb-line-height);
2172
2510
  }
2173
-
2174
- :where(p) {
2175
- margin-block: 0.25em;
2176
- }
2177
-
2178
- :where(h1, h2, h3, h4, h5, h6) {
2179
- margin-block: 0.5em;
2180
- font-weight: 600;
2181
- }
2182
-
2183
- :where(h1) {
2184
- font-size: 1.75em;
2185
- }
2186
-
2187
- :where(h2) {
2188
- font-size: 1.5em;
2189
- }
2190
-
2191
- :where(h3) {
2192
- font-size: 1.25em;
2193
- }
2194
-
2195
- :where(h4) {
2196
- font-size: 1.125em;
2197
- }
2198
-
2199
- :where(h5) {
2200
- font-size: 1em;
2201
- }
2202
-
2203
- :where(h6) {
2204
- font-size: 0.875em;
2205
- }
2206
-
2207
- :where(hr) {
2208
- margin-block: calc(0.75 * var(--lb-spacing));
2209
- border-block-start: 1px solid var(--lb-foreground-subtle);
2210
- }
2211
-
2212
- :where(blockquote) {
2213
- position: relative;
2214
- margin-block-start: calc(0.75 * var(--lb-spacing));
2215
- padding: calc(0.375 * var(--lb-spacing)) 0 calc(0.375 * var(--lb-spacing))
2216
- calc(1.5 * var(--lb-spacing));
2217
-
2218
- &::after {
2219
- content: "";
2220
- position: absolute;
2221
- inset-inline-start: 0;
2222
- inset-block-start: 0;
2223
- inline-size: 4px;
2224
- block-size: 100%;
2225
- border-radius: calc(0.5 * var(--lb-radius));
2226
- background: var(--lb-foreground-subtle);
2227
- }
2228
- }
2229
-
2230
- :where(ol, ul) {
2231
- margin-block: calc(0.75 * var(--lb-spacing));
2232
- padding-inline-start: calc(1.5 * var(--lb-spacing));
2233
- list-style-position: outside;
2234
- }
2235
-
2236
- :where(ul) {
2237
- list-style-type: disc;
2238
- }
2239
-
2240
- :where(ol) {
2241
- list-style-type: decimal;
2242
- }
2243
-
2244
- :where(li) {
2245
- margin-block: calc(0.25 * var(--lb-spacing));
2246
- }
2247
-
2248
- /**
2249
- * Merge adjacent inline code elements
2250
- */
2251
- :where(span:has(code) + span code) {
2252
- padding-inline-start: 0;
2253
- border-start-start-radius: 0;
2254
- border-end-start-radius: 0;
2255
- }
2256
-
2257
- :where(span:has(code):has(+ span code) code) {
2258
- padding-inline-end: 0;
2259
- border-start-end-radius: 0;
2260
- border-end-end-radius: 0;
2261
- }
2262
-
2263
- :where(a) {
2264
- color: var(--lb-foreground);
2265
- outline: none;
2266
- font-weight: 500;
2267
- transition-property: color, text-decoration-color;
2268
- text-decoration-line: underline;
2269
- text-decoration-color: var(--lb-foreground-moderate);
2270
- text-underline-offset: 2px;
2271
-
2272
- &:where([href]):where(:hover, :focus-visible) {
2273
- color: var(--lb-accent);
2274
- text-decoration-color: var(--lb-accent-moderate);
2275
- }
2276
- }
2277
-
2278
- :where(.lb-code-block) {
2279
- min-inline-size: 0;
2280
- margin-block: 0.25em;
2281
- border: 1px solid var(--lb-foreground-subtle);
2282
- border-radius: var(--lb-radius);
2283
-
2284
- :where(.lb-code-block-header) {
2285
- display: flex;
2286
- align-items: center;
2287
- padding: calc(0.5 * var(--lb-spacing));
2288
- }
2289
-
2290
- :where(.lb-code-block-title) {
2291
- margin-inline-start: calc(0.5 * var(--lb-spacing));
2292
- color: var(--lb-foreground-tertiary);
2293
- font-weight: 600;
2294
- font-size: 0.675em;
2295
- text-transform: uppercase;
2296
- }
2297
-
2298
- :where(.lb-code-block-header-actions) {
2299
- margin-inline-start: auto;
2300
- }
2301
-
2302
- :where(.lb-code-block-content) {
2303
- min-inline-size: 0;
2304
- padding: 0 var(--lb-spacing) calc(0.875 * var(--lb-spacing));
2305
- font-size: 85%;
2306
- line-height: 1;
2307
-
2308
- /* overflow-inline: auto; doesn't work as expected */
2309
- /* stylelint-disable-next-line plugin/use-logical-properties-and-values */
2310
- overflow-x: auto;
2311
- }
2312
- }
2313
-
2314
- :where(strong) {
2315
- font-weight: 600;
2316
- }
2317
- }
2318
-
2319
- .lb-ai-chat-message-tool {
2320
- margin-block: calc(0.25 * var(--lb-spacing));
2321
2511
  }
2322
2512
 
2323
2513
  .lb-ai-chat-message-deleted {
@@ -2326,110 +2516,63 @@
2326
2516
  inline-size: 100%;
2327
2517
  color: var(--lb-foreground-moderate);
2328
2518
  font-size: 0.875em;
2329
- text-wrap: balance;
2519
+ text-wrap: pretty;
2330
2520
  }
2331
2521
 
2332
2522
  .lb-ai-chat-message-error {
2333
- --lb-dynamic-background: var(--lb-background-destructive-subtle);
2334
-
2335
- position: relative;
2336
2523
  display: flex;
2337
2524
  gap: calc(0.5 * var(--lb-spacing));
2338
- align-items: center;
2525
+ align-items: flex-start;
2339
2526
  inline-size: 100%;
2340
- padding: calc(0.75 * var(--lb-spacing));
2341
- border-radius: var(--lb-radius);
2342
- background: var(--lb-dynamic-background);
2343
2527
  color: var(--lb-destructive);
2344
2528
  font-size: 0.875em;
2345
- text-wrap: balance;
2529
+ line-height: var(--lb-line-height);
2530
+ text-wrap: pretty;
2531
+ word-break: break-word;
2346
2532
 
2347
2533
  :where(.lb-icon-container) {
2534
+ block-size: 1lh;
2348
2535
  color: var(--lb-destructive-secondary);
2349
2536
  }
2350
2537
  }
2351
2538
 
2352
- .lb-ai-chat-message-collapsible-trigger {
2353
- @include truncate;
2354
-
2355
- display: flex;
2356
- gap: calc(0.25 * var(--lb-spacing));
2357
- align-items: center;
2358
- cursor: pointer;
2359
- }
2360
-
2361
- .lb-ai-chat-message-collapsible-content {
2362
- display: flex;
2363
- flex-direction: column;
2364
- gap: calc(0.5 * var(--lb-spacing));
2365
- line-height: var(--lb-line-height);
2539
+ .lb-ai-chat-message-content {
2540
+ inline-size: 100%;
2541
+ white-space: break-spaces;
2366
2542
 
2367
- :where(& > *:first-child) {
2368
- margin-block-start: calc(0.5 * var(--lb-spacing));
2543
+ &:where(:empty) {
2544
+ display: contents;
2369
2545
  }
2370
- }
2371
-
2372
- .lb-ai-chat-message-collapsible-chevron {
2373
- inline-size: calc(0.8 * var(--lb-icon-size));
2374
- block-size: calc(0.8 * var(--lb-icon-size));
2375
- margin-inline-start: -1px;
2376
- margin-block-start: 1px;
2377
- }
2378
-
2379
- @media (prefers-reduced-motion: no-preference) {
2380
- @supports (interpolate-size: allow-keywords) {
2381
- .lb-ai-chat-message-collapsible-content {
2382
- block-size: 0;
2383
- opacity: 0;
2384
- transition-duration: calc(3 * var(--lb-transition-duration));
2385
- transition-property: block-size, opacity, content-visibility;
2386
- content-visibility: hidden;
2387
2546
 
2388
- /* overflow-block: clip; doesn't work as expected */
2389
- /* stylelint-disable-next-line plugin/use-logical-properties-and-values */
2390
- overflow-y: clip;
2391
-
2392
- /* interpolate-size is a new-ish property */
2393
- /* stylelint-disable-next-line */
2394
- interpolate-size: allow-keywords;
2395
-
2396
- /* transition-behavior is a new-ish property */
2397
- /* stylelint-disable-next-line */
2398
- transition-behavior: allow-discrete;
2399
-
2400
- &:where([data-state="open"]) {
2401
- block-size: auto;
2402
- opacity: 1;
2403
- content-visibility: auto;
2547
+ > :where(.lb-ai-chat-message-text) {
2548
+ margin-block: var(--lb-spacing);
2549
+ }
2404
2550
 
2405
- /* overflow-block: auto; doesn't work as expected */
2406
- /* stylelint-disable-next-line plugin/use-logical-properties-and-values */
2407
- overflow-y: auto;
2408
- }
2409
- }
2551
+ > :where(.lb-ai-chat-message-tool-invocation) {
2552
+ margin-block: var(--lb-spacing);
2410
2553
  }
2411
2554
 
2412
- .lb-ai-chat-message-collapsible-chevron {
2413
- transition-property: transform;
2555
+ > :where(:first-child) {
2556
+ margin-block-start: 0;
2557
+ }
2414
2558
 
2415
- .lb-ai-chat-message-collapsible:where([data-state="open"]) :where(&) {
2416
- transform: rotate(90deg);
2417
- }
2559
+ > :where(:last-child) {
2560
+ margin-block-end: 0;
2418
2561
  }
2419
2562
  }
2420
2563
 
2421
2564
  .lb-ai-chat-messages {
2422
2565
  display: flex;
2423
2566
  flex-direction: column;
2424
- gap: calc(0.75 * var(--lb-spacing));
2567
+ gap: var(--lb-spacing);
2425
2568
  inline-size: 100%;
2426
2569
  max-inline-size: min(
2427
2570
  calc(var(--lb-ai-chat-container-width) - var(--lb-spacing)),
2428
2571
  calc(100% - 3 * var(--lb-spacing))
2429
2572
  );
2430
2573
  margin-inline: auto;
2431
- padding-block-start: var(--lb-spacing);
2432
- padding-block-end: calc(5 * var(--lb-spacing));
2574
+ padding-block-start: calc(1.5 * var(--lb-spacing));
2575
+ padding-block-end: calc(3 * var(--lb-spacing));
2433
2576
 
2434
2577
  :where(.lb-ai-chat-user-message) {
2435
2578
  max-inline-size: 80%;
@@ -2464,6 +2607,36 @@
2464
2607
  inset-block-end: 0;
2465
2608
  z-index: 1;
2466
2609
  margin-block-start: auto;
2610
+ }
2611
+
2612
+ :where(.lb-ai-chat-composer) {
2613
+ margin-inline: auto;
2614
+ }
2615
+ }
2616
+
2617
+ .lb-ai-chat:where(.lb-ai-chat\:layout-compact) {
2618
+ :where(.lb-ai-chat-footer) {
2619
+ background: var(--lb-dynamic-background);
2620
+
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
+ }
2628
+ }
2629
+
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
+ );
2635
+ }
2636
+ }
2637
+
2638
+ .lb-ai-chat:where(.lb-ai-chat\:layout-inset) {
2639
+ :where(.lb-ai-chat-footer) {
2467
2640
  padding: var(--lb-spacing);
2468
2641
  padding-block-start: 0;
2469
2642
 
@@ -2483,13 +2656,15 @@
2483
2656
 
2484
2657
  :where(.lb-ai-chat-composer) {
2485
2658
  max-inline-size: var(--lb-ai-chat-container-width);
2486
- margin-inline: auto;
2487
2659
  border-radius: calc(2 * var(--lb-radius));
2488
- background: var(--lb-dynamic-background);
2489
- box-shadow: var(--lb-elevation-shadow-small);
2490
2660
  }
2491
2661
  }
2492
2662
 
2663
+ .lb-ai-chat-content {
2664
+ position: relative;
2665
+ flex: 1 0 auto;
2666
+ }
2667
+
2493
2668
  .lb-ai-chat-footer-actions {
2494
2669
  position: absolute;
2495
2670
  inset-inline: 0;
@@ -2500,11 +2675,6 @@
2500
2675
  transform: translateY(-100%);
2501
2676
  }
2502
2677
 
2503
- .lb-ai-chat-composer {
2504
- position: relative;
2505
- inline-size: 100%;
2506
- }
2507
-
2508
2678
  .lb-ai-chat-scroll-indicator {
2509
2679
  border-radius: $lb-radius-full;
2510
2680
  color: var(--lb-foreground-moderate);
@@ -2556,17 +2726,149 @@
2556
2726
  .lb-ai-chat-message-reasoning {
2557
2727
  inline-size: fit-content;
2558
2728
  max-inline-size: 100%;
2729
+ color: var(--lb-foreground-tertiary);
2730
+
2731
+ &:where(.lb-ai-chat-pending),
2732
+ :where(.lb-ai-chat-pending) {
2733
+ color: var(--lb-foreground);
2734
+ }
2559
2735
  }
2560
2736
 
2561
2737
  .lb-ai-chat-message-reasoning {
2562
- margin-block-end: calc(0.5 * var(--lb-spacing));
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) {
2746
+ color: var(--lb-accent);
2563
2747
 
2564
- :where(.lb-ai-chat-message-text) {
2748
+ :where(.lb-collapsible-chevron) {
2749
+ color: var(--lb-accent-moderate);
2750
+ }
2751
+ }
2752
+ }
2753
+
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);
2759
+
2760
+ :where(& > *:first-child) {
2761
+ margin-block-start: calc(0.5 * var(--lb-spacing));
2762
+ }
2763
+ }
2764
+
2765
+ :where(.lb-prose) {
2766
+ color: var(--lb-foreground);
2565
2767
  font-size: 0.875em;
2566
2768
  opacity: 0.75;
2567
2769
  }
2568
2770
  }
2569
2771
 
2772
+ .lb-ai-tool {
2773
+ position: relative;
2774
+ border-radius: var(--lb-radius);
2775
+ box-shadow: inset 0 0 0 1px var(--lb-foreground-subtle);
2776
+
2777
+ &::after {
2778
+ content: "";
2779
+ position: absolute;
2780
+ inset: 0;
2781
+ border-radius: inherit;
2782
+ pointer-events: none;
2783
+ transition-property: box-shadow;
2784
+ }
2785
+
2786
+ &:where(:has(.lb-ai-tool-header:focus-visible)) {
2787
+ z-index: 1;
2788
+
2789
+ &::after {
2790
+ box-shadow:
2791
+ var(--lb-dynamic-background) 0 0 0 2px,
2792
+ var(--lb-accent) 0 0 0 4px;
2793
+ }
2794
+ }
2795
+ }
2796
+
2797
+ .lb-ai-tool-header {
2798
+ display: flex;
2799
+ gap: calc(0.25 * var(--lb-spacing));
2800
+ align-items: center;
2801
+ inline-size: 100%;
2802
+ block-size: calc($lb-button-size + var(--lb-spacing));
2803
+ padding-inline: calc(0.5 * var(--lb-spacing));
2804
+ }
2805
+
2806
+ .lb-ai-tool-header-icon-container,
2807
+ .lb-ai-tool-icon {
2808
+ display: flex;
2809
+ flex: none;
2810
+ justify-content: center;
2811
+ align-items: center;
2812
+ inline-size: $lb-button-size;
2813
+ block-size: $lb-button-size;
2814
+ }
2815
+
2816
+ .lb-ai-tool-header-icon-container {
2817
+ color: var(--lb-foreground-moderate);
2818
+
2819
+ &:where(:has(.lb-ai-tool-icon)) {
2820
+ margin-inline-end: calc(0.25 * var(--lb-spacing));
2821
+ }
2822
+ }
2823
+
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;
2828
+ }
2829
+
2830
+ .lb-ai-tool-header-title {
2831
+ @include truncate;
2832
+
2833
+ color: var(--lb-foreground-secondary);
2834
+ font-size: 0.9375em;
2835
+
2836
+ &:where(:first-child) {
2837
+ margin-inline-start: calc(0.25 * var(--lb-spacing));
2838
+ }
2839
+ }
2840
+
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);
2846
+ }
2847
+
2848
+ .lb-ai-tool-content {
2849
+ margin: 0 calc(0.75 * var(--lb-spacing)) calc(0.75 * var(--lb-spacing));
2850
+ }
2851
+
2852
+ .lb-ai-tool-inspector {
2853
+ display: flex;
2854
+ flex-direction: column;
2855
+ gap: calc(0.75 * var(--lb-spacing));
2856
+ }
2857
+
2858
+ .lb-ai-tool-confirmation-footer {
2859
+ display: flex;
2860
+ align-items: center;
2861
+ margin-block-start: calc(0.75 * var(--lb-spacing));
2862
+ }
2863
+
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;
2870
+ }
2871
+
2570
2872
  /*************************************
2571
2873
  * Animations *
2572
2874
  *************************************/