@stainless-api/docs 0.1.0-beta.99 → 1.0.0-beta.141

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 (136) hide show
  1. package/CHANGELOG.md +401 -0
  2. package/ambient.d.ts +6 -0
  3. package/eslint-suppressions.json +22 -6
  4. package/{eslint.config.js → eslint.config.ts} +1 -7
  5. package/package.json +62 -40
  6. package/plugin/buildAlgoliaIndex.ts +6 -12
  7. package/plugin/components/SDKSelect.astro +0 -6
  8. package/plugin/components/SnippetCode.tsx +6 -37
  9. package/plugin/components/search/SearchAlgolia.astro +1 -1
  10. package/plugin/components/search/SearchIsland.tsx +19 -13
  11. package/plugin/generateAPIReferenceLink.ts +0 -40
  12. package/plugin/globalJs/ai-dropdown-options.ts +22 -9
  13. package/plugin/globalJs/code-snippets.ts +5 -5
  14. package/plugin/globalJs/copy.ts +20 -91
  15. package/plugin/globalJs/navigation.ts +13 -13
  16. package/plugin/globalJs/summary-selection-tweak.ts +29 -0
  17. package/plugin/index.ts +107 -163
  18. package/plugin/loadPluginConfig.ts +49 -151
  19. package/plugin/markdown/highlighter.ts +100 -0
  20. package/plugin/markdown/index.ts +39 -0
  21. package/plugin/middlewareBuilder/stainlessMiddleware.d.ts +2 -0
  22. package/plugin/react/Routing.tsx +10 -244
  23. package/plugin/referencePlaceholderUtils.ts +1 -1
  24. package/plugin/replaceSidebarPlaceholderMiddleware.ts +1 -1
  25. package/plugin/routes/Docs.astro +3 -1
  26. package/plugin/routes/Overview.astro +14 -7
  27. package/plugin/routes/llms.ts +186 -0
  28. package/plugin/routes/markdown.ts +62 -13
  29. package/plugin/sidebar-utils/sidebar-builder.ts +38 -12
  30. package/plugin/specs/defaultSpecLoader.ts +192 -0
  31. package/plugin/specs/fetchSpecSSR.ts +1 -1
  32. package/plugin/specs/utils.ts +86 -0
  33. package/shared/conditionalIntegration.ts +28 -0
  34. package/shared/getProsePages.ts +6 -7
  35. package/shared/virtualModule.ts +1 -26
  36. package/stl-docs/aiChatExamples.ts +31 -0
  37. package/stl-docs/chat/docs-chat-handler.ts +17 -0
  38. package/stl-docs/chat/hook.ts +225 -0
  39. package/stl-docs/chat/schemas.ts +27 -0
  40. package/stl-docs/chat/ui/AiChat.module.css +591 -0
  41. package/stl-docs/chat/ui/AiChat.tsx +175 -0
  42. package/stl-docs/chat/ui/Trigger.tsx +154 -0
  43. package/stl-docs/chat/ui/components/ChatControls.tsx +51 -0
  44. package/stl-docs/chat/ui/components/ChatEmpty.tsx +42 -0
  45. package/stl-docs/chat/ui/components/ChatLog.tsx +93 -0
  46. package/stl-docs/chat/ui/components/ChatMessage.tsx +47 -0
  47. package/stl-docs/chat/ui/components/CodeBlock.tsx +33 -0
  48. package/stl-docs/chat/ui/components/MessageFeedback.tsx +106 -0
  49. package/stl-docs/chat/ui/components/Table.tsx +15 -0
  50. package/stl-docs/chat/ui/components/ToolCall.tsx +34 -0
  51. package/stl-docs/chat/ui/components/hljs-github.css +81 -0
  52. package/stl-docs/chat/ui/scroll-manager.ts +86 -0
  53. package/stl-docs/chat/ui/types.ts +45 -0
  54. package/stl-docs/components/AiChatIsland.tsx +10 -12
  55. package/stl-docs/components/ContentPanel.astro +9 -0
  56. package/stl-docs/components/Footer.astro +89 -0
  57. package/stl-docs/components/Header.astro +0 -5
  58. package/stl-docs/components/PageFrame.astro +23 -8
  59. package/stl-docs/components/PageSidebar.astro +11 -0
  60. package/stl-docs/components/StainlessLogo.svg +4 -0
  61. package/stl-docs/components/TwoColumnContent.astro +2 -0
  62. package/stl-docs/components/headers/DefaultHeader.astro +6 -8
  63. package/stl-docs/components/headers/StackedHeader.astro +5 -53
  64. package/stl-docs/components/mintlify-compat/Accordion.astro +2 -2
  65. package/stl-docs/components/mintlify-compat/AccordionGroup.astro +0 -4
  66. package/stl-docs/components/mintlify-compat/Columns.astro +2 -2
  67. package/stl-docs/components/mintlify-compat/Frame.astro +2 -2
  68. package/stl-docs/components/mintlify-compat/Tab.astro +2 -2
  69. package/stl-docs/components/mintlify-compat/callouts/Callout.astro +2 -2
  70. package/stl-docs/components/mintlify-compat/callouts/Check.astro +0 -4
  71. package/stl-docs/components/mintlify-compat/callouts/Danger.astro +0 -4
  72. package/stl-docs/components/mintlify-compat/callouts/Info.astro +0 -4
  73. package/stl-docs/components/mintlify-compat/callouts/Note.astro +0 -4
  74. package/stl-docs/components/mintlify-compat/callouts/Tip.astro +0 -4
  75. package/stl-docs/components/mintlify-compat/callouts/Warning.astro +0 -4
  76. package/stl-docs/components/nav-tabs/NavDropdown.astro +12 -7
  77. package/stl-docs/components/nav-tabs/NavTabs.astro +5 -3
  78. package/stl-docs/components/nav-tabs/buildNavLinks.ts +2 -0
  79. package/stl-docs/components/pagination/Pagination.astro +4 -2
  80. package/stl-docs/components/pagination/PaginationLinkEmphasized.astro +2 -2
  81. package/stl-docs/components/pagination/PaginationLinkQuiet.astro +2 -2
  82. package/stl-docs/components/pagination/util.ts +3 -3
  83. package/stl-docs/components/sidebars/BaseSidebar.astro +72 -1
  84. package/stl-docs/disableCalloutSyntax.ts +1 -1
  85. package/stl-docs/fonts.ts +5 -5
  86. package/stl-docs/index.ts +76 -53
  87. package/stl-docs/loadStlDocsConfig.ts +38 -8
  88. package/stl-docs/og-image/components/OpenGraphFunctionSignature.tsx +64 -0
  89. package/stl-docs/og-image/components/OpenGraphImage.tsx +126 -0
  90. package/stl-docs/og-image/config.ts +56 -0
  91. package/stl-docs/og-image/image-gen/generate-api-reference-og-image.tsx +188 -0
  92. package/stl-docs/og-image/image-gen/generate-og-image.tsx +119 -0
  93. package/stl-docs/og-image/image-gen/get-logo-url.ts +47 -0
  94. package/stl-docs/og-image/index.ts +135 -0
  95. package/stl-docs/og-image/routes/add-og-image.ts +45 -0
  96. package/stl-docs/og-image/routes/get-api-reference-og-image.ts +36 -0
  97. package/stl-docs/og-image/routes/get-og-image.ts +28 -0
  98. package/stl-docs/og-image/theme.ts +43 -0
  99. package/stl-docs/og-image/utils.ts +14 -0
  100. package/stl-docs/proseDocSync.test.ts +74 -0
  101. package/stl-docs/proseDocSync.ts +344 -0
  102. package/stl-docs/proseMarkdown/proseMarkdownIntegration.ts +4 -12
  103. package/stl-docs/schema-extension.ts +12 -0
  104. package/stl-docs/tabsMiddleware.ts +1 -1
  105. package/styles/overrides.css +2 -14
  106. package/styles/page.css +210 -71
  107. package/styles/sidebar.css +30 -17
  108. package/styles/sl-variables.css +3 -8
  109. package/styles/stldocs-variables.css +2 -2
  110. package/styles/toc.css +8 -0
  111. package/tsconfig.json +1 -1
  112. package/virtual-module.d.ts +35 -11
  113. package/playground-virtual-modules.d.ts +0 -96
  114. package/plugin/globalJs/create-playground.shim.ts +0 -3
  115. package/plugin/globalJs/playground-data.shim.ts +0 -1
  116. package/plugin/globalJs/playground-data.ts +0 -14
  117. package/plugin/specs/FileCache.ts +0 -99
  118. package/plugin/specs/generateSpec.ts +0 -112
  119. package/plugin/specs/index.ts +0 -132
  120. package/plugin/specs/inputResolver.ts +0 -146
  121. package/plugin/specs/worker.ts +0 -199
  122. package/plugin/vendor/preview.worker.docs.js +0 -26108
  123. package/plugin/vendor/templates/cli.md +0 -1
  124. package/plugin/vendor/templates/go.md +0 -316
  125. package/plugin/vendor/templates/java.md +0 -89
  126. package/plugin/vendor/templates/kotlin.md +0 -89
  127. package/plugin/vendor/templates/node.md +0 -235
  128. package/plugin/vendor/templates/python.md +0 -251
  129. package/plugin/vendor/templates/ruby.md +0 -147
  130. package/plugin/vendor/templates/terraform.md +0 -60
  131. package/plugin/vendor/templates/typescript.md +0 -319
  132. package/scripts/vendor_deps.ts +0 -50
  133. package/stl-docs/components/ClientRouterHead.astro +0 -41
  134. package/stl-docs/components/content-panel/ContentPanel.astro +0 -42
  135. package/stl-docs/components/headers/SplashMobileMenuToggle.astro +0 -65
  136. package/stl-docs/proseSearchIndexing.ts +0 -606
@@ -0,0 +1,591 @@
1
+ :global(:root) {
2
+ --stl-chat-outer-padding: 1rem;
3
+ --stl-chat-width: min(40ch + var(--stl-chat-outer-padding) * 2, 100vw);
4
+ }
5
+
6
+ :global(:root):has(.outer-wrapper.presentation-panel) {
7
+ --stl-chat-panel-width: var(--stl-chat-width);
8
+ }
9
+
10
+ /* make some color variables transitionable */
11
+ @property --shadow-color {
12
+ syntax: '<color>';
13
+ inherits: true;
14
+ initial-value: transparent;
15
+ }
16
+ @property --chat-background-color {
17
+ syntax: '<color>';
18
+ inherits: true;
19
+ initial-value: transparent;
20
+ }
21
+
22
+ .outer-wrapper {
23
+ display: grid;
24
+ max-height: calc(80svh - env(safe-area-inset-top, 0px) - env(safe-area-inset-bottom, 0px));
25
+ width: var(--stl-chat-width);
26
+
27
+ /* prettier-ignore */
28
+ grid:
29
+ 'chat-area' minmax(0, 1fr)
30
+ 'trigger' auto
31
+ / auto;
32
+ row-gap: 0.65rem;
33
+
34
+ --trigger-size: 3rem;
35
+ padding: var(--stl-chat-outer-padding);
36
+ padding-bottom: calc(env(safe-area-inset-bottom, 0px) + var(--stl-chat-outer-padding));
37
+ padding-right: calc(env(safe-area-inset-right, 0px) + var(--stl-chat-outer-padding));
38
+
39
+ font-size: var(--stl-typography-scale-sm);
40
+ color: var(--stl-color-foreground-reduced);
41
+ --base-shadow-color: light-dark(rgb(0 0 0 / 0.15), var(--stl-color-background));
42
+ --shadow-color: var(--base-shadow-color);
43
+ --chat-background-color: var(--stl-color-ui-background);
44
+
45
+ &.presentation-floating {
46
+ position: fixed;
47
+ bottom: 0;
48
+ right: 0;
49
+ z-index: 50;
50
+
51
+ pointer-events: none;
52
+ & > * {
53
+ pointer-events: all;
54
+ }
55
+ /* cover interstitial area while expanded but leave padding area clickable */
56
+ &:has(.trigger.expanded)::after {
57
+ content: '';
58
+ grid-area: 1 / 1 / -1 / -1;
59
+ pointer-events: all;
60
+ z-index: -1;
61
+ /* cover padding in the page-edge direction */
62
+ margin-right: calc(-1 * var(--stl-chat-outer-padding));
63
+ margin-bottom: calc(-1 * var(--stl-chat-outer-padding));
64
+ }
65
+ }
66
+
67
+ &.presentation-panel {
68
+ grid-area: chat;
69
+ padding-top: calc(env(safe-area-inset-top, 0px) + var(--stl-chat-outer-padding));
70
+ max-height: none;
71
+ position: sticky;
72
+ top: 0;
73
+ }
74
+ }
75
+
76
+ .trigger-outer {
77
+ position: relative;
78
+ z-index: 3;
79
+ grid-area: trigger;
80
+ justify-self: end;
81
+
82
+ --trigger-border-width: 1px;
83
+ padding: var(--trigger-border-width);
84
+ background-color: var(--stl-color-border);
85
+ display: block;
86
+ transition: background-color 0.1s ease;
87
+ /* reduce scrolling content flashing behind semi-transparent area */
88
+ backdrop-filter: blur(12px);
89
+
90
+ &:hover {
91
+ background-color: var(--stl-color-border-strong);
92
+ }
93
+
94
+ &:has(textarea:focus-visible) {
95
+ background-color: var(--stl-color-accent-border-strong);
96
+ transition: background-color 0.25s ease;
97
+ }
98
+
99
+ &:not(:has(.trigger.expanded)) {
100
+ cursor: pointer;
101
+ }
102
+ }
103
+
104
+ .trigger {
105
+ display: flex;
106
+ align-items: stretch;
107
+ min-height: var(--trigger-size);
108
+ min-width: var(--trigger-size);
109
+ position: relative;
110
+
111
+ background-color: var(--stl-color-background);
112
+ background-image: linear-gradient(to bottom, var(--chat-background-color), var(--chat-background-color));
113
+ color: var(--stl-color-foreground);
114
+ --trigger-padding: 0.5rem;
115
+ padding: var(--trigger-padding);
116
+
117
+ overflow: clip;
118
+
119
+ .bot-icon {
120
+ position: absolute;
121
+ --icon-size: 1.5rem;
122
+ top: calc(var(--trigger-size) / 2 - var(--icon-size) / 2);
123
+ left: calc(var(--trigger-size) / 2 - var(--icon-size) / 2);
124
+ width: var(--icon-size);
125
+ height: var(--icon-size);
126
+ pointer-events: none;
127
+ }
128
+
129
+ .expanded-contents {
130
+ display: flex;
131
+ gap: 0.2rem;
132
+ align-items: center;
133
+ user-select: none;
134
+ width: calc(
135
+ var(--stl-chat-width) - var(--stl-chat-outer-padding) * 2 - var(--trigger-border-width) * 2 -
136
+ var(--trigger-padding) * 2
137
+ );
138
+ }
139
+ &:not(.expanded) .expanded-contents {
140
+ position: absolute;
141
+ pointer-events: none;
142
+ textarea {
143
+ user-select: none;
144
+ }
145
+ }
146
+
147
+ textarea {
148
+ display: block;
149
+ resize: none;
150
+ flex: 1 1 0;
151
+ height: auto;
152
+
153
+ font-size: var(--stl-typography-scale-base);
154
+ line-height: 1.35;
155
+ padding: 0.25em 0.25em 0.25em 0.5em;
156
+
157
+ color: inherit;
158
+ background: none;
159
+
160
+ border: none;
161
+ user-select: initial;
162
+ &:focus-visible {
163
+ outline: none;
164
+ }
165
+ }
166
+
167
+ button[type='submit'] {
168
+ align-self: flex-end;
169
+
170
+ width: calc(var(--trigger-size) - var(--trigger-padding) * 2);
171
+ height: calc(var(--trigger-size) - var(--trigger-padding) * 2);
172
+ display: flex;
173
+ align-items: center;
174
+ justify-content: center;
175
+
176
+ border: none;
177
+ border-radius: calc(var(--border-radius) - var(--trigger-padding) + 2px);
178
+
179
+ background-color: var(--stl-color-accent-inverse-background);
180
+ color: var(--stl-color-accent-inverse-foreground);
181
+
182
+ cursor: pointer;
183
+
184
+ svg {
185
+ width: 1.15rem;
186
+ height: 1.15rem;
187
+ * {
188
+ stroke-width: 2.25px;
189
+ }
190
+ }
191
+
192
+ &:disabled {
193
+ background-color: var(--stl-color-muted-background);
194
+ color: var(--stl-color-foreground);
195
+ opacity: 0.6;
196
+ cursor: default;
197
+ }
198
+ }
199
+ }
200
+
201
+ .chat-area-container {
202
+ position: relative;
203
+ z-index: 2;
204
+ grid-area: chat-area;
205
+ display: flex;
206
+ flex-direction: column;
207
+
208
+ animation: chat-area-container-enter 0.4s cubic-bezier(0.35, 1.5, 0.5, 1);
209
+ animation-delay: 0.2s;
210
+ animation-fill-mode: backwards;
211
+
212
+ padding: 1px; /* for the border */
213
+ background-color: var(--stl-color-border);
214
+ transition:
215
+ --shadow-color 0.35s ease,
216
+ background-color 0.35s ease;
217
+ }
218
+ .presentation-panel .chat-area-container {
219
+ animation-duration: 0s;
220
+ animation-delay: 0s;
221
+ grid-row: 1 / -1;
222
+ margin: calc(-1 * var(--stl-chat-outer-padding));
223
+ padding: 0 0 0 1px; /* only left border */
224
+ background-color: var(--stl-color-border-faint); /* border is lighter */
225
+ }
226
+ @keyframes chat-area-container-enter {
227
+ from {
228
+ opacity: 0;
229
+ scale: 0.8 0.65;
230
+ translate: 5% 8rem;
231
+ }
232
+ to {
233
+ opacity: 1;
234
+ scale: 1;
235
+ translate: 0 0;
236
+ }
237
+ }
238
+
239
+ .chat-area {
240
+ flex: 1;
241
+ display: flex;
242
+ flex-direction: column;
243
+ &:global(.scrolls-up) {
244
+ /* scrolls up from bottom, not down from top */
245
+ flex-direction: column-reverse;
246
+ }
247
+
248
+ overflow-y: auto;
249
+ overflow-x: clip;
250
+ overscroll-behavior: contain;
251
+
252
+ --chat-area-padding: 1em;
253
+ padding: var(--chat-area-padding);
254
+
255
+ background-color: var(--stl-color-background);
256
+ background-image: linear-gradient(to bottom, var(--chat-background-color), var(--chat-background-color));
257
+ transition: --chat-background-color 0.25s ease;
258
+ }
259
+ .presentation-panel .chat-area {
260
+ /* Don’t color chat area when it‘s not floating */
261
+ --chat-background-color: transparent;
262
+ /* Move padding to scrollable, chat-area which now fills the full panel */
263
+ /* TODO: this shift messes up framer-motion layout correction a bit */
264
+ --chat-area-padding: var(--stl-chat-outer-padding);
265
+ padding-bottom: calc(var(--stl-chat-outer-padding) + var(--trigger-size) + 2rem);
266
+ }
267
+ /* Fade out at the bottom of the scroll */
268
+ .presentation-panel .chat-area-container::after {
269
+ content: '';
270
+ position: absolute;
271
+ bottom: 0;
272
+ left: 1px; /* don’t cover border area */
273
+ width: calc(100% - var(--stl-chat-outer-padding)); /* don’t overlap scrollbar */
274
+ height: calc(var(--stl-chat-outer-padding) + var(--trigger-size) + 2rem);
275
+ background: linear-gradient(
276
+ to bottom,
277
+ transparent,
278
+ rgb(from var(--stl-color-background) r g b / 0.65) 2rem,
279
+ rgb(from var(--stl-color-background) r g b / 0.9)
280
+ );
281
+ z-index: 3;
282
+ animation: fade-in 0.15s 0.25s ease;
283
+ animation-fill-mode: backwards;
284
+ }
285
+ @keyframes fade-in {
286
+ from {
287
+ opacity: 0;
288
+ }
289
+ to {
290
+ opacity: 1;
291
+ }
292
+ }
293
+ .chat-scroll-contents {
294
+ flex: 1;
295
+ display: grid;
296
+ grid-template-columns: minmax(0, 1fr);
297
+ grid-template-rows: auto 1fr;
298
+ gap: 1em;
299
+ align-items: start;
300
+ position: relative;
301
+ }
302
+
303
+ .chat-empty-state {
304
+ display: flex;
305
+ flex-direction: column;
306
+ padding: 1em 1em;
307
+ --chat-empty-state-gap: 0.5em;
308
+ gap: var(--chat-empty-state-gap);
309
+
310
+ svg {
311
+ width: 2rem;
312
+ height: 2rem;
313
+ color: var(--stl-color-foreground);
314
+ }
315
+ h2 {
316
+ color: var(--stl-color-foreground);
317
+ font-size: var(--stl-typography-scale-xl);
318
+ font-weight: 500;
319
+ letter-spacing: -0.02em;
320
+ }
321
+ h3 {
322
+ margin-top: 0.5em;
323
+ font-size: var(--stl-typography-scale-sm);
324
+ color: var(--stl-color-foreground-muted);
325
+ font-weight: 400;
326
+ }
327
+ ul {
328
+ list-style-type: none;
329
+ padding-left: 0;
330
+ display: flex;
331
+ flex-direction: column;
332
+ font-weight: 500;
333
+ margin-block: calc(-1 * var(--chat-empty-state-gap) / 2);
334
+
335
+ .chat-example button {
336
+ background-color: transparent;
337
+ border: none;
338
+ padding-inline: 0;
339
+ color: inherit;
340
+ cursor: pointer;
341
+
342
+ padding-block: calc(var(--chat-empty-state-gap) / 2);
343
+ display: flex;
344
+ gap: 0.35rem;
345
+ align-items: center;
346
+ &:hover {
347
+ text-decoration: underline;
348
+ }
349
+ svg {
350
+ width: 1.1em;
351
+ height: 1.1em;
352
+ }
353
+ }
354
+ }
355
+ }
356
+ .controls + .chat-empty-state {
357
+ padding-top: 0;
358
+ margin-top: -1em;
359
+ z-index: 3;
360
+ pointer-events: none;
361
+ & > * {
362
+ pointer-events: all;
363
+ }
364
+ }
365
+
366
+ .message-log {
367
+ padding: 0;
368
+ list-style-type: none;
369
+ position: relative;
370
+ z-index: 1;
371
+
372
+ flex: 0;
373
+
374
+ display: flex;
375
+ flex-direction: column;
376
+ gap: 0.5rem;
377
+
378
+ width: 100%;
379
+
380
+ &:not(:has(.chat-message)) {
381
+ display: none;
382
+ }
383
+ }
384
+
385
+ .chat-message {
386
+ list-style-type: none;
387
+ text-wrap: pretty;
388
+ font-size: 15px;
389
+ line-height: 1.4;
390
+
391
+ &[data-message-role='user'] {
392
+ max-width: 85%;
393
+ align-self: flex-end;
394
+ padding: 0.5em 0.75em;
395
+ background-color: var(--stl-color-accent-inverse-background);
396
+ color: var(--stl-color-accent-inverse-foreground);
397
+ overflow: clip;
398
+
399
+ ::selection {
400
+ background-color: rgb(from var(--stl-color-accent-inverse-foreground) r g b / 0.25);
401
+ }
402
+ }
403
+
404
+ &[data-message-role='assistant'] {
405
+ align-self: stretch;
406
+ padding: 0.25em 0;
407
+ color: var(--stl-color-foreground-reduced);
408
+ }
409
+
410
+ &[data-message-role='error'] {
411
+ align-self: stretch;
412
+ padding: 0.5em 0.75em;
413
+ color: var(--stl-color-red-foreground);
414
+ border: 1px solid var(--stl-color-red-border);
415
+ }
416
+
417
+ pre {
418
+ padding: 0.25em 0.65em;
419
+ font-size: var(--stl-typography-scale-sm);
420
+ line-height: 1.5;
421
+ }
422
+
423
+ &.tool-use {
424
+ color: var(--stl-color-foreground-muted);
425
+ opacity: 0.8;
426
+
427
+ strong,
428
+ em {
429
+ font-weight: 500;
430
+ color: var(--stl-color-foreground-reduced);
431
+ }
432
+
433
+ & + .tool-use {
434
+ margin-top: -0.75em;
435
+ }
436
+ }
437
+ }
438
+
439
+ .chat-message .shimmer-letter {
440
+ animation: letter-shimmer 1s linear infinite alternate;
441
+ animation-fill-mode: both;
442
+ --stagger: 0.05s;
443
+ animation-delay: calc(var(--i) * var(--stagger));
444
+ }
445
+ @keyframes letter-shimmer {
446
+ from {
447
+ opacity: 0.35;
448
+ }
449
+ 80% {
450
+ opacity: 1;
451
+ }
452
+ to {
453
+ opacity: 1;
454
+ }
455
+ }
456
+
457
+ .chat-message .message-loader {
458
+ display: inline-block;
459
+ vertical-align: -0.1em;
460
+ width: 0.9em;
461
+ height: 0.9em;
462
+ color: var(--stl-color-foreground-muted);
463
+ margin-left: 0.75ch;
464
+ /* safari plays the rotation off-axis at some scales when applied to the svg, but can apply it without error to the path */
465
+ path {
466
+ animation: load-spin 0.8s infinite cubic-bezier(0.5, 0.25, 0.5, 0.75);
467
+ transform-origin: center;
468
+ }
469
+ }
470
+ @keyframes load-spin {
471
+ from {
472
+ rotate: 0turn;
473
+ }
474
+ to {
475
+ rotate: 1turn;
476
+ }
477
+ }
478
+
479
+ .feedback-buttons,
480
+ .controls {
481
+ display: flex;
482
+ gap: 0.15rem;
483
+
484
+ button:global(.stl-ui-button.stl-ui-button--ghost) {
485
+ svg {
486
+ opacity: var(--stl-opacity-level-040);
487
+ /* if toggle buttons change icons on click, the clicked icon will be removed from the DOM and
488
+ * cause e.target checks to false-negative.
489
+ * better to ensure e.target is the button, not its icon child */
490
+ pointer-events: none;
491
+ }
492
+ &:hover,
493
+ &.active {
494
+ svg {
495
+ opacity: var(--stl-opacity-level-080);
496
+ }
497
+ }
498
+ }
499
+ }
500
+ .feedback-buttons {
501
+ margin-top: -0.25rem;
502
+ }
503
+ .controls {
504
+ justify-content: flex-end;
505
+ /* stick to top of container */
506
+ margin: calc(-1 * var(--chat-area-padding));
507
+ margin-bottom: 0;
508
+ padding-inline: var(--chat-area-padding);
509
+ padding-block: 0.5em;
510
+ position: sticky;
511
+ top: calc(-1 * var(--chat-area-padding));
512
+ z-index: 4;
513
+ /* mostly-opaque background - pseudo element because color-matching partial transparency is
514
+ * awkward with the variables so element-level `opacity` is preferable */
515
+ backdrop-filter: blur(8px);
516
+ &::before {
517
+ content: '';
518
+ position: absolute;
519
+ inset: 0;
520
+ background-color: var(--stl-color-background);
521
+ background-image: linear-gradient(to bottom, var(--chat-background-color), var(--chat-background-color));
522
+ opacity: 0.85;
523
+ z-index: -1;
524
+ /* Get a bottom border on scroll */
525
+ animation-name: controls-bottom-border;
526
+ animation-duration: 1ms;
527
+ animation-timeline: scroll(block nearest);
528
+ animation-range: 0 1.5em;
529
+ animation-fill-mode: both;
530
+ }
531
+ }
532
+ /* in column-reverse (when the container scrolls up from the bottom), the border needs to disappear
533
+ * at the *end* of the scroll timeline, rather than appearing at the beginning. */
534
+ .chat-area:global(.scrolls-up) .controls::before {
535
+ animation-direction: reverse;
536
+ animation-range: calc(100% - 1.5em) 100%;
537
+ }
538
+ @keyframes controls-bottom-border {
539
+ from {
540
+ box-shadow: inset 0 -1px 0 0 transparent;
541
+ }
542
+ to {
543
+ box-shadow: inset 0 -1px 0 0 var(--stl-color-border-faint);
544
+ }
545
+ }
546
+ .presentation-panel .controls {
547
+ padding-top: 1em;
548
+ }
549
+
550
+ .chat-table {
551
+ overflow: auto;
552
+
553
+ table {
554
+ border-collapse: collapse;
555
+ width: 100%;
556
+
557
+ thead tr {
558
+ border-bottom: 1px solid var(--stl-color-border-strong);
559
+ }
560
+
561
+ tbody td {
562
+ border-bottom: 1px solid var(--stl-color-border);
563
+ }
564
+
565
+ th,
566
+ td {
567
+ padding: 8px;
568
+ text-align: left;
569
+
570
+ &:first-child {
571
+ padding-left: 0;
572
+ }
573
+
574
+ &:last-child {
575
+ padding-right: 0;
576
+ }
577
+ }
578
+
579
+ th {
580
+ white-space: nowrap;
581
+ padding-top: 0;
582
+ font-weight: 500;
583
+ color: var(--stl-color-foreground);
584
+ }
585
+
586
+ td {
587
+ color: var(--stl-color-foreground-reduced);
588
+ line-height: 1.5;
589
+ }
590
+ }
591
+ }