@stainless-api/docs 0.1.0-beta.99 → 1.0.0-beta.140
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.
- package/CHANGELOG.md +390 -0
- package/ambient.d.ts +6 -0
- package/eslint-suppressions.json +22 -6
- package/{eslint.config.js → eslint.config.ts} +1 -7
- package/package.json +57 -40
- package/plugin/buildAlgoliaIndex.ts +6 -12
- package/plugin/components/SDKSelect.astro +0 -6
- package/plugin/components/SnippetCode.tsx +6 -37
- package/plugin/components/search/SearchAlgolia.astro +1 -1
- package/plugin/components/search/SearchIsland.tsx +19 -13
- package/plugin/generateAPIReferenceLink.ts +0 -40
- package/plugin/globalJs/ai-dropdown-options.ts +22 -9
- package/plugin/globalJs/code-snippets.ts +5 -5
- package/plugin/globalJs/copy.ts +20 -91
- package/plugin/globalJs/navigation.ts +13 -13
- package/plugin/globalJs/summary-selection-tweak.ts +29 -0
- package/plugin/index.ts +107 -163
- package/plugin/loadPluginConfig.ts +49 -151
- package/plugin/markdown/highlighter.ts +100 -0
- package/plugin/markdown/index.ts +39 -0
- package/plugin/middlewareBuilder/stainlessMiddleware.d.ts +2 -0
- package/plugin/react/Routing.tsx +10 -244
- package/plugin/referencePlaceholderUtils.ts +1 -1
- package/plugin/replaceSidebarPlaceholderMiddleware.ts +1 -1
- package/plugin/routes/Docs.astro +3 -1
- package/plugin/routes/Overview.astro +14 -7
- package/plugin/routes/llms.ts +186 -0
- package/plugin/routes/markdown.ts +62 -13
- package/plugin/sidebar-utils/sidebar-builder.ts +38 -12
- package/plugin/specs/defaultSpecLoader.ts +192 -0
- package/plugin/specs/fetchSpecSSR.ts +1 -1
- package/plugin/specs/utils.ts +86 -0
- package/shared/conditionalIntegration.ts +28 -0
- package/shared/getProsePages.ts +6 -7
- package/shared/virtualModule.ts +1 -26
- package/stl-docs/aiChatExamples.ts +31 -0
- package/stl-docs/chat/docs-chat-handler.ts +17 -0
- package/stl-docs/chat/hook.ts +225 -0
- package/stl-docs/chat/schemas.ts +27 -0
- package/stl-docs/chat/ui/AiChat.module.css +591 -0
- package/stl-docs/chat/ui/AiChat.tsx +175 -0
- package/stl-docs/chat/ui/Trigger.tsx +154 -0
- package/stl-docs/chat/ui/components/ChatControls.tsx +51 -0
- package/stl-docs/chat/ui/components/ChatEmpty.tsx +42 -0
- package/stl-docs/chat/ui/components/ChatLog.tsx +93 -0
- package/stl-docs/chat/ui/components/ChatMessage.tsx +47 -0
- package/stl-docs/chat/ui/components/CodeBlock.tsx +33 -0
- package/stl-docs/chat/ui/components/MessageFeedback.tsx +106 -0
- package/stl-docs/chat/ui/components/Table.tsx +15 -0
- package/stl-docs/chat/ui/components/ToolCall.tsx +34 -0
- package/stl-docs/chat/ui/components/hljs-github.css +81 -0
- package/stl-docs/chat/ui/scroll-manager.ts +86 -0
- package/stl-docs/chat/ui/types.ts +45 -0
- package/stl-docs/components/AiChatIsland.tsx +10 -12
- package/stl-docs/components/ContentPanel.astro +9 -0
- package/stl-docs/components/Footer.astro +89 -0
- package/stl-docs/components/Header.astro +0 -5
- package/stl-docs/components/PageFrame.astro +23 -8
- package/stl-docs/components/PageSidebar.astro +11 -0
- package/stl-docs/components/StainlessLogo.svg +4 -0
- package/stl-docs/components/TwoColumnContent.astro +2 -0
- package/stl-docs/components/headers/DefaultHeader.astro +6 -8
- package/stl-docs/components/headers/StackedHeader.astro +5 -53
- package/stl-docs/components/mintlify-compat/Accordion.astro +2 -2
- package/stl-docs/components/mintlify-compat/AccordionGroup.astro +0 -4
- package/stl-docs/components/mintlify-compat/Columns.astro +2 -2
- package/stl-docs/components/mintlify-compat/Frame.astro +2 -2
- package/stl-docs/components/mintlify-compat/Tab.astro +2 -2
- package/stl-docs/components/mintlify-compat/callouts/Callout.astro +2 -2
- package/stl-docs/components/mintlify-compat/callouts/Check.astro +0 -4
- package/stl-docs/components/mintlify-compat/callouts/Danger.astro +0 -4
- package/stl-docs/components/mintlify-compat/callouts/Info.astro +0 -4
- package/stl-docs/components/mintlify-compat/callouts/Note.astro +0 -4
- package/stl-docs/components/mintlify-compat/callouts/Tip.astro +0 -4
- package/stl-docs/components/mintlify-compat/callouts/Warning.astro +0 -4
- package/stl-docs/components/nav-tabs/NavDropdown.astro +12 -7
- package/stl-docs/components/nav-tabs/NavTabs.astro +5 -3
- package/stl-docs/components/nav-tabs/buildNavLinks.ts +2 -0
- package/stl-docs/components/pagination/Pagination.astro +4 -2
- package/stl-docs/components/pagination/PaginationLinkEmphasized.astro +2 -2
- package/stl-docs/components/pagination/PaginationLinkQuiet.astro +2 -2
- package/stl-docs/components/pagination/util.ts +3 -3
- package/stl-docs/components/sidebars/BaseSidebar.astro +72 -1
- package/stl-docs/disableCalloutSyntax.ts +1 -1
- package/stl-docs/fonts.ts +5 -5
- package/stl-docs/index.ts +76 -53
- package/stl-docs/loadStlDocsConfig.ts +38 -8
- package/stl-docs/og-image/components/OpenGraphFunctionSignature.tsx +64 -0
- package/stl-docs/og-image/components/OpenGraphImage.tsx +126 -0
- package/stl-docs/og-image/config.ts +56 -0
- package/stl-docs/og-image/image-gen/generate-api-reference-og-image.tsx +188 -0
- package/stl-docs/og-image/image-gen/generate-og-image.tsx +119 -0
- package/stl-docs/og-image/image-gen/get-logo-url.ts +47 -0
- package/stl-docs/og-image/index.ts +135 -0
- package/stl-docs/og-image/routes/add-og-image.ts +45 -0
- package/stl-docs/og-image/routes/get-api-reference-og-image.ts +36 -0
- package/stl-docs/og-image/routes/get-og-image.ts +28 -0
- package/stl-docs/og-image/theme.ts +43 -0
- package/stl-docs/og-image/utils.ts +14 -0
- package/stl-docs/proseDocSync.test.ts +74 -0
- package/stl-docs/proseDocSync.ts +344 -0
- package/stl-docs/proseMarkdown/proseMarkdownIntegration.ts +4 -12
- package/stl-docs/schema-extension.ts +12 -0
- package/stl-docs/tabsMiddleware.ts +1 -1
- package/styles/overrides.css +2 -14
- package/styles/page.css +210 -71
- package/styles/sidebar.css +30 -17
- package/styles/sl-variables.css +3 -8
- package/styles/stldocs-variables.css +2 -2
- package/styles/toc.css +8 -0
- package/tsconfig.json +1 -1
- package/virtual-module.d.ts +35 -11
- package/playground-virtual-modules.d.ts +0 -96
- package/plugin/globalJs/create-playground.shim.ts +0 -3
- package/plugin/globalJs/playground-data.shim.ts +0 -1
- package/plugin/globalJs/playground-data.ts +0 -14
- package/plugin/specs/FileCache.ts +0 -99
- package/plugin/specs/generateSpec.ts +0 -112
- package/plugin/specs/index.ts +0 -132
- package/plugin/specs/inputResolver.ts +0 -146
- package/plugin/specs/worker.ts +0 -199
- package/plugin/vendor/preview.worker.docs.js +0 -26108
- package/plugin/vendor/templates/cli.md +0 -1
- package/plugin/vendor/templates/go.md +0 -316
- package/plugin/vendor/templates/java.md +0 -89
- package/plugin/vendor/templates/kotlin.md +0 -89
- package/plugin/vendor/templates/node.md +0 -235
- package/plugin/vendor/templates/python.md +0 -251
- package/plugin/vendor/templates/ruby.md +0 -147
- package/plugin/vendor/templates/terraform.md +0 -60
- package/plugin/vendor/templates/typescript.md +0 -319
- package/scripts/vendor_deps.ts +0 -50
- package/stl-docs/components/ClientRouterHead.astro +0 -41
- package/stl-docs/components/content-panel/ContentPanel.astro +0 -42
- package/stl-docs/components/headers/SplashMobileMenuToggle.astro +0 -65
- package/stl-docs/proseSearchIndexing.ts +0 -606
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { CheckIcon, CopyIcon, ThumbsDownIcon, ThumbsUpIcon } from 'lucide-react';
|
|
2
|
+
import { motion } from 'motion/react';
|
|
3
|
+
import { startTransition, useCallback, useOptimistic, useState } from 'react';
|
|
4
|
+
|
|
5
|
+
import type { AssistantTextMessage } from '../types';
|
|
6
|
+
|
|
7
|
+
import { Button } from '@stainless-api/ui-primitives';
|
|
8
|
+
import clsx from 'clsx';
|
|
9
|
+
import styles from '../AiChat.module.css';
|
|
10
|
+
|
|
11
|
+
export default function MessageFeedbackButtons({
|
|
12
|
+
spanId,
|
|
13
|
+
messages,
|
|
14
|
+
rateMessage,
|
|
15
|
+
}: {
|
|
16
|
+
spanId: string;
|
|
17
|
+
messages: AssistantTextMessage[];
|
|
18
|
+
rateMessage?: (spanId: string, rating: 'up' | 'down') => Promise<boolean>;
|
|
19
|
+
}) {
|
|
20
|
+
// Copy response as markdown
|
|
21
|
+
const [copied, setCopied] = useState(false);
|
|
22
|
+
const handleCopy = useCallback(() => {
|
|
23
|
+
const combinedText = messages.map((msg) => msg.content).join('\n\n');
|
|
24
|
+
navigator.clipboard
|
|
25
|
+
.writeText(combinedText)
|
|
26
|
+
.then(() => {
|
|
27
|
+
setCopied(true);
|
|
28
|
+
setTimeout(() => setCopied(false), 2000);
|
|
29
|
+
})
|
|
30
|
+
.catch(() => {
|
|
31
|
+
setCopied(false);
|
|
32
|
+
});
|
|
33
|
+
}, [messages]);
|
|
34
|
+
|
|
35
|
+
// Provide message rating
|
|
36
|
+
const [rating, setRating] = useState<'up' | 'down' | null>(null);
|
|
37
|
+
const [optimisticRating, setOptimisticRating] = useOptimistic(
|
|
38
|
+
rating,
|
|
39
|
+
(current, newRating: NonNullable<typeof rating>) => newRating,
|
|
40
|
+
);
|
|
41
|
+
const handleRate = useCallback(
|
|
42
|
+
(newRating: 'up' | 'down') => {
|
|
43
|
+
if (!rateMessage) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
startTransition(async () => {
|
|
48
|
+
setOptimisticRating(newRating);
|
|
49
|
+
const success = await rateMessage(spanId, newRating).catch(() => false);
|
|
50
|
+
if (success) setRating(newRating);
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
[spanId, setOptimisticRating, rateMessage],
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<motion.li
|
|
58
|
+
layout="position"
|
|
59
|
+
data-message-role="assistant"
|
|
60
|
+
className={clsx(styles['chat-message'], styles['feedback-buttons'])}
|
|
61
|
+
>
|
|
62
|
+
{rateMessage != null && (
|
|
63
|
+
<>
|
|
64
|
+
<Button
|
|
65
|
+
type="button"
|
|
66
|
+
variant="ghost"
|
|
67
|
+
size="sm"
|
|
68
|
+
onClick={() => handleRate('up')}
|
|
69
|
+
className={clsx(optimisticRating === 'up' && styles.active)}
|
|
70
|
+
aria-label="Thumbs up"
|
|
71
|
+
>
|
|
72
|
+
<Button.Icon icon={ThumbsUpIcon} size={15} />
|
|
73
|
+
</Button>
|
|
74
|
+
|
|
75
|
+
<Button
|
|
76
|
+
type="button"
|
|
77
|
+
variant="ghost"
|
|
78
|
+
size="sm"
|
|
79
|
+
onClick={() => handleRate('down')}
|
|
80
|
+
className={clsx(optimisticRating === 'down' && styles.active)}
|
|
81
|
+
aria-label="Thumbs down"
|
|
82
|
+
>
|
|
83
|
+
<Button.Icon icon={ThumbsDownIcon} size={15} />
|
|
84
|
+
</Button>
|
|
85
|
+
</>
|
|
86
|
+
)}
|
|
87
|
+
|
|
88
|
+
{messages.length > 0 && messages.some((msg) => msg.content.trim().length) && (
|
|
89
|
+
<Button
|
|
90
|
+
type="button"
|
|
91
|
+
variant="ghost"
|
|
92
|
+
size="sm"
|
|
93
|
+
onClick={handleCopy}
|
|
94
|
+
className={clsx(copied && styles.active)}
|
|
95
|
+
aria-label={copied ? 'Copied' : 'Copy response'}
|
|
96
|
+
>
|
|
97
|
+
<Button.Icon
|
|
98
|
+
// TODO: nicer cross-fade transition
|
|
99
|
+
icon={copied ? CheckIcon : CopyIcon}
|
|
100
|
+
size={15}
|
|
101
|
+
/>
|
|
102
|
+
</Button>
|
|
103
|
+
)}
|
|
104
|
+
</motion.li>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import clsx from 'clsx';
|
|
2
|
+
import type { Components } from 'react-markdown';
|
|
3
|
+
import styles from '../AiChat.module.css';
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
table(props) {
|
|
7
|
+
const { children, ...rest } = props;
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div className={clsx(styles['chat-table'])}>
|
|
11
|
+
<table {...rest}>{children}</table>
|
|
12
|
+
</div>
|
|
13
|
+
);
|
|
14
|
+
},
|
|
15
|
+
} satisfies Components;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { motion } from 'motion/react';
|
|
2
|
+
|
|
3
|
+
import type { AssistantToolCallMessage } from '../types';
|
|
4
|
+
|
|
5
|
+
import clsx from 'clsx';
|
|
6
|
+
import styles from '../AiChat.module.css';
|
|
7
|
+
|
|
8
|
+
export default function ToolCall({
|
|
9
|
+
message,
|
|
10
|
+
}: {
|
|
11
|
+
message: Pick<AssistantToolCallMessage, 'id' | 'toolName' | 'input'>;
|
|
12
|
+
}) {
|
|
13
|
+
const firstStringArg = message.input
|
|
14
|
+
? Object.values(message.input).find((v): v is string => typeof v === 'string')
|
|
15
|
+
: undefined;
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<motion.li
|
|
19
|
+
layout="position"
|
|
20
|
+
data-message-role="assistant"
|
|
21
|
+
className={clsx(styles['chat-message'], styles['tool-use'])}
|
|
22
|
+
>
|
|
23
|
+
<p>
|
|
24
|
+
Calling <code>{message.toolName}</code>
|
|
25
|
+
{firstStringArg && (
|
|
26
|
+
<>
|
|
27
|
+
{' '}
|
|
28
|
+
with <em>{firstStringArg}</em>
|
|
29
|
+
</>
|
|
30
|
+
)}
|
|
31
|
+
</p>
|
|
32
|
+
</motion.li>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
.hljs-github {
|
|
2
|
+
/* color: light-dark(#24292e, #c9d1d9); */
|
|
3
|
+
/* background: light-dark(#ffffff, #0d1117); */
|
|
4
|
+
|
|
5
|
+
.hljs-doctag,
|
|
6
|
+
.hljs-keyword,
|
|
7
|
+
.hljs-meta .hljs-keyword,
|
|
8
|
+
.hljs-template-tag,
|
|
9
|
+
.hljs-template-variable,
|
|
10
|
+
.hljs-type,
|
|
11
|
+
.hljs-variable.language_ {
|
|
12
|
+
color: light-dark(#d73a49, #ff7b72);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.hljs-title,
|
|
16
|
+
.hljs-title.class_,
|
|
17
|
+
.hljs-title.class_.inherited__,
|
|
18
|
+
.hljs-title.function_ {
|
|
19
|
+
color: light-dark(#6f42c1, #d2a8ff);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.hljs-attr,
|
|
23
|
+
.hljs-attribute,
|
|
24
|
+
.hljs-literal,
|
|
25
|
+
.hljs-meta,
|
|
26
|
+
.hljs-number,
|
|
27
|
+
.hljs-operator,
|
|
28
|
+
.hljs-variable,
|
|
29
|
+
.hljs-selector-attr,
|
|
30
|
+
.hljs-selector-class,
|
|
31
|
+
.hljs-selector-id {
|
|
32
|
+
color: light-dark(#005cc5, #79c0ff);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.hljs-regexp,
|
|
36
|
+
.hljs-string,
|
|
37
|
+
.hljs-meta .hljs-string {
|
|
38
|
+
color: light-dark(#032f62, #a5d6ff);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.hljs-built_in,
|
|
42
|
+
.hljs-symbol {
|
|
43
|
+
color: light-dark(#e36209, #ffa657);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.hljs-comment,
|
|
47
|
+
.hljs-code,
|
|
48
|
+
.hljs-formula {
|
|
49
|
+
color: light-dark(#6a737d, #8b949e);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.hljs-name,
|
|
53
|
+
.hljs-quote,
|
|
54
|
+
.hljs-selector-tag,
|
|
55
|
+
.hljs-selector-pseudo {
|
|
56
|
+
color: light-dark(#22863a, #7ee787);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.hljs-subst {
|
|
60
|
+
color: light-dark(#24292e, #c9d1d9);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.hljs-section {
|
|
64
|
+
color: light-dark(#005cc5, #1f6feb);
|
|
65
|
+
font-weight: bold;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.hljs-bullet {
|
|
69
|
+
color: light-dark(#735c0f, #f2cc60);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.hljs-emphasis {
|
|
73
|
+
color: light-dark(#24292e, #c9d1d9);
|
|
74
|
+
font-style: italic;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.hljs-strong {
|
|
78
|
+
color: light-dark(#24292e, #c9d1d9);
|
|
79
|
+
font-weight: bold;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
const THRESHOLD_FROM_BOTTOM = 32; // px
|
|
4
|
+
|
|
5
|
+
/** Keep chat area scrolled to bottom */
|
|
6
|
+
export function useScrollToBottom(
|
|
7
|
+
scrollAreaRef: React.RefObject<HTMLDivElement | null>,
|
|
8
|
+
scrollContentsRef: React.RefObject<HTMLDivElement | null>,
|
|
9
|
+
watchValue: unknown,
|
|
10
|
+
) {
|
|
11
|
+
/**
|
|
12
|
+
* Set `overflow` based on whether content is actually overflowing.
|
|
13
|
+
* - The reason this behavior is different than `overflow: auto` is that `overflow: auto` would
|
|
14
|
+
* show scrollbars while `motion` transitions are in flight applying scale correction to the
|
|
15
|
+
* children (i.e. while the chat area is animating to accommodate increased child height).
|
|
16
|
+
* - If we measure with `offsetHeight`/`clientHeight`, we only see the eventual “resting”
|
|
17
|
+
* dimensions (unaffected by transforms) so we know better whether a scrollbar should actually
|
|
18
|
+
* show, and avoid distracting flicker of scrollbars appearing & disappearing
|
|
19
|
+
*/
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (!scrollAreaRef.current || !scrollContentsRef.current) return;
|
|
22
|
+
const containerStyle = getComputedStyle(scrollAreaRef.current);
|
|
23
|
+
const scrollAreaHeight = scrollAreaRef.current.clientHeight;
|
|
24
|
+
const scrollContentsHeight = // scrollHeight is sometimes off; maybe because of scale correction?
|
|
25
|
+
scrollContentsRef.current.offsetHeight +
|
|
26
|
+
parseFloat(containerStyle.paddingTop) +
|
|
27
|
+
parseFloat(containerStyle.paddingBottom);
|
|
28
|
+
const canScroll = scrollContentsHeight > scrollAreaHeight + 1;
|
|
29
|
+
scrollAreaRef.current.style.overflowY = canScroll ? 'auto' : 'hidden';
|
|
30
|
+
}, [watchValue, scrollAreaRef, scrollContentsRef]);
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Flip scroll direction based on user’s scroll position
|
|
34
|
+
* - By default, we need to keep the container scrolled all the way to the end during streaming,
|
|
35
|
+
* so that the user sees the new content that is appearing.
|
|
36
|
+
* - However, if the user scrolls upwards to read previous content, we shouldn’t scroll them
|
|
37
|
+
* back to the bottom while they’re trying to read content further up, even if more content is
|
|
38
|
+
* streaming.
|
|
39
|
+
*
|
|
40
|
+
* The smoothest way to accomplish this interaction is to flip the container’s scroll direction
|
|
41
|
+
* using flex-direction:
|
|
42
|
+
* - When the scroll position is near the bottom, scrolling should run in reverse direction—so
|
|
43
|
+
* that at a constant `0` scrollTop, the scroll stays at the end (no js-driven scrolling with
|
|
44
|
+
* distracting scrollbar flashing).
|
|
45
|
+
* - When the user scrolls upwards by a certain threshold, we flip scroll direction to normal,
|
|
46
|
+
* so that as scroll position holds constant, the still-streaming content below doesn’t push
|
|
47
|
+
* up the content the user is trying to read.
|
|
48
|
+
*
|
|
49
|
+
* When changing the flex direction, the meaning of `scrollTop` changes dramatically, so we need
|
|
50
|
+
* to manually adjust `scrollTop` to keep the scroll position visually seamless.
|
|
51
|
+
*/
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
if (!scrollAreaRef.current) return;
|
|
54
|
+
const ac = new AbortController();
|
|
55
|
+
scrollAreaRef.current.addEventListener(
|
|
56
|
+
'scroll',
|
|
57
|
+
(e) => {
|
|
58
|
+
const scroller = e.currentTarget;
|
|
59
|
+
if (!(scroller instanceof HTMLElement)) return;
|
|
60
|
+
const appliedScrollDirection = scroller.classList.contains('scrolls-up') ? 'up' : 'down';
|
|
61
|
+
if (!appliedScrollDirection) return;
|
|
62
|
+
const { scrollHeight, clientHeight, scrollTop } = scroller;
|
|
63
|
+
// scrollTop is measured from the opposite edge depending on the appliedScrollDirection
|
|
64
|
+
// prettier-ignore
|
|
65
|
+
const distanceFromBottom = appliedScrollDirection === 'up'
|
|
66
|
+
? -scrollTop
|
|
67
|
+
: scrollHeight - clientHeight - scrollTop;
|
|
68
|
+
|
|
69
|
+
// apply reverse scroll when the container is scrolled near the bottom, so that new content
|
|
70
|
+
// pushes old content up and the bottom edge stays constant.
|
|
71
|
+
if (appliedScrollDirection === 'down' && distanceFromBottom < THRESHOLD_FROM_BOTTOM) {
|
|
72
|
+
scroller.classList.add('scrolls-up');
|
|
73
|
+
scroller.scrollTop = -distanceFromBottom;
|
|
74
|
+
}
|
|
75
|
+
// flip to forward scroll when the user scrolls up from the bottom, so that new content
|
|
76
|
+
// doesn’t push up the content the user is trying to read.
|
|
77
|
+
if (appliedScrollDirection === 'up' && distanceFromBottom > THRESHOLD_FROM_BOTTOM) {
|
|
78
|
+
scroller.classList.remove('scrolls-up');
|
|
79
|
+
scroller.scrollTop = scrollHeight - clientHeight + scrollTop;
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
{ capture: false, signal: ac.signal },
|
|
83
|
+
);
|
|
84
|
+
return () => ac.abort();
|
|
85
|
+
}, [scrollAreaRef]);
|
|
86
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Base
|
|
2
|
+
type BaseMessage = { id: string };
|
|
3
|
+
type BaseTextMessage = BaseMessage & { content: string };
|
|
4
|
+
// User
|
|
5
|
+
export type UserMessage = BaseTextMessage & { role: 'user' };
|
|
6
|
+
// Assistant
|
|
7
|
+
export type AssistantTextMessage = BaseMessage & {
|
|
8
|
+
role: 'assistant';
|
|
9
|
+
respondingTo: string;
|
|
10
|
+
messageType: 'text';
|
|
11
|
+
content: string;
|
|
12
|
+
isComplete: boolean;
|
|
13
|
+
};
|
|
14
|
+
export type AssistantToolCallMessage = BaseMessage & {
|
|
15
|
+
role: 'assistant';
|
|
16
|
+
respondingTo: string;
|
|
17
|
+
messageType: 'tool_use';
|
|
18
|
+
toolName: string;
|
|
19
|
+
input: Record<string, unknown> | undefined;
|
|
20
|
+
};
|
|
21
|
+
type AssistantDoneMessage = BaseMessage & {
|
|
22
|
+
role: 'assistant';
|
|
23
|
+
respondingTo: string;
|
|
24
|
+
messageType: 'done';
|
|
25
|
+
spanId: string;
|
|
26
|
+
};
|
|
27
|
+
type AssistantErrorMessage = BaseMessage & {
|
|
28
|
+
role: 'assistant';
|
|
29
|
+
respondingTo: string;
|
|
30
|
+
messageType: 'error';
|
|
31
|
+
errorMessage: string;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export type ChatMessage =
|
|
35
|
+
| UserMessage
|
|
36
|
+
| AssistantTextMessage
|
|
37
|
+
| AssistantToolCallMessage
|
|
38
|
+
| AssistantDoneMessage
|
|
39
|
+
| AssistantErrorMessage;
|
|
40
|
+
|
|
41
|
+
export type ExamplePrompt = {
|
|
42
|
+
longPrompt: string;
|
|
43
|
+
shortPrompt: string;
|
|
44
|
+
icon: React.ComponentType;
|
|
45
|
+
};
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// Conditionally load DocsChat only if it is enabled
|
|
2
|
+
// this way the virtual module imports aren’t evaluated and don’t cause errors when the feature is disabled
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
if (!STAINLESS_PROJECT) return null;
|
|
13
|
-
return <AiChat projectId={STAINLESS_PROJECT} language={currentLanguage} siteTitle={siteTitle} />;
|
|
4
|
+
// This conditional can’t be inlined into PageFrame because it breaks Astro’s static analysis of imports of client islands
|
|
5
|
+
const AiChat = __STLDOCS_ENABLE_AI_CHAT__ ? (await import('../chat/ui/AiChat')).default : null;
|
|
6
|
+
|
|
7
|
+
export default function DocsChatLazy(
|
|
8
|
+
props: Omit<React.ComponentProps<NonNullable<typeof AiChat>>, 'stainlessProject'>,
|
|
9
|
+
) {
|
|
10
|
+
if (!AiChat) return null;
|
|
11
|
+
return <AiChat {...props} />;
|
|
14
12
|
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
---
|
|
2
|
+
import EditLink from 'virtual:starlight/components/EditLink';
|
|
3
|
+
import LastUpdated from 'virtual:starlight/components/LastUpdated';
|
|
4
|
+
import Pagination from 'virtual:starlight/components/Pagination';
|
|
5
|
+
import { RENDER_CREDITS } from 'virtual:stl-docs-virtual-module';
|
|
6
|
+
import StainlessLogo from './StainlessLogo.svg';
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<footer class="stl-footer">
|
|
10
|
+
<div class="stl-footer-row meta">
|
|
11
|
+
<EditLink />
|
|
12
|
+
<LastUpdated />
|
|
13
|
+
</div>
|
|
14
|
+
|
|
15
|
+
<Pagination />
|
|
16
|
+
|
|
17
|
+
{
|
|
18
|
+
RENDER_CREDITS && (
|
|
19
|
+
<div class="stl-footer-row">
|
|
20
|
+
<a
|
|
21
|
+
class="stl-footer-credits"
|
|
22
|
+
href="https://www.stainless.com/products/docs"
|
|
23
|
+
target="_blank"
|
|
24
|
+
rel="noopener noreferrer"
|
|
25
|
+
>
|
|
26
|
+
Powered by <StainlessLogo />
|
|
27
|
+
</a>
|
|
28
|
+
</div>
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
</footer>
|
|
32
|
+
|
|
33
|
+
<style is:global>
|
|
34
|
+
.stl-footer {
|
|
35
|
+
display: flex;
|
|
36
|
+
flex-direction: column;
|
|
37
|
+
gap: 1.5rem;
|
|
38
|
+
margin-block-start: 4rem;
|
|
39
|
+
padding-block-start: 1rem;
|
|
40
|
+
padding-block-end: 4rem;
|
|
41
|
+
|
|
42
|
+
.stl-footer-row {
|
|
43
|
+
display: flex;
|
|
44
|
+
gap: 1rem;
|
|
45
|
+
justify-content: space-between;
|
|
46
|
+
|
|
47
|
+
&:empty,
|
|
48
|
+
&:not(:has(> *)) {
|
|
49
|
+
display: none;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.pagination-links {
|
|
54
|
+
margin-inline: calc(-0.25 * var(--stl-ui-pagination-border-radius-outer));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.stl-footer-credits {
|
|
59
|
+
display: flex;
|
|
60
|
+
flex-direction: row;
|
|
61
|
+
align-items: center;
|
|
62
|
+
text-decoration: none;
|
|
63
|
+
margin-inline-start: auto;
|
|
64
|
+
margin-block-start: 1rem;
|
|
65
|
+
font-size: var(--stl-typography-scale-sm);
|
|
66
|
+
|
|
67
|
+
/* duck text opacity by more than image opacity */
|
|
68
|
+
opacity: 0.75;
|
|
69
|
+
color: rgb(from var(--stl-color-foreground-reduced) r g b / calc(alpha * 0.9));
|
|
70
|
+
transition:
|
|
71
|
+
opacity 0.15s ease,
|
|
72
|
+
color 0.15s ease;
|
|
73
|
+
/* both text & image to full opacity */
|
|
74
|
+
&:hover {
|
|
75
|
+
opacity: 1;
|
|
76
|
+
color: var(--stl-color-foreground-reduced);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
svg {
|
|
80
|
+
height: 1.4em;
|
|
81
|
+
width: auto;
|
|
82
|
+
display: inline-block;
|
|
83
|
+
margin-inline-start: 0.5ch;
|
|
84
|
+
image {
|
|
85
|
+
transform: translateX(0.15ch);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
</style>
|
|
@@ -1,18 +1,33 @@
|
|
|
1
1
|
---
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
|
|
2
|
+
import Sidebar from 'virtual:starlight/components/Sidebar';
|
|
3
|
+
import MobileMenuToggle from 'virtual:starlight/components/MobileMenuToggle';
|
|
4
|
+
|
|
5
|
+
import AiChatIsland from './AiChatIsland.tsx'; // entrypoint for client island can’t be conditionally import()ed
|
|
6
|
+
import clsx from 'clsx';
|
|
5
7
|
|
|
6
8
|
import starlightConfig from 'virtual:starlight/user-config';
|
|
7
9
|
const locale = Astro.currentLocale ?? starlightConfig.defaultLocale.lang;
|
|
8
10
|
const siteTitle = locale && starlightConfig.title[locale];
|
|
11
|
+
|
|
12
|
+
const { hasSidebar } = Astro.locals.starlightRoute;
|
|
9
13
|
---
|
|
10
14
|
|
|
11
|
-
<
|
|
12
|
-
<
|
|
13
|
-
|
|
15
|
+
<div class="page">
|
|
16
|
+
<header>
|
|
17
|
+
<slot name="header" slot="header" />
|
|
18
|
+
</header>
|
|
19
|
+
|
|
20
|
+
<nav
|
|
21
|
+
class={clsx('sidebar', !hasSidebar && 'hidden')}
|
|
22
|
+
aria-label={Astro.locals.t('sidebarNav.accessibleLabel')}
|
|
23
|
+
>
|
|
24
|
+
<MobileMenuToggle />
|
|
25
|
+
<div id="starlight__sidebar" class="sidebar-pane">
|
|
26
|
+
<Sidebar />
|
|
27
|
+
</div>
|
|
28
|
+
</nav>
|
|
14
29
|
|
|
15
30
|
<slot />
|
|
16
31
|
|
|
17
|
-
{
|
|
18
|
-
</
|
|
32
|
+
{__STLDOCS_ENABLE_AI_CHAT__ && <AiChatIsland client:load siteTitle={siteTitle} />}
|
|
33
|
+
</div>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 136 32">
|
|
2
|
+
<path fill="currentColor" d="M34.29 6.344c1.476 0 2.726.27 3.75.807 1.025.521 1.832 1.242 2.422 2.162.59.92.955 1.98 1.094 3.177l-3.411.157c-.087-.678-.295-1.268-.625-1.772a3.159 3.159 0 0 0-1.303-1.172c-.538-.295-1.198-.442-1.98-.442-.971 0-1.744.225-2.317.677-.555.434-.834 1.016-.834 1.745 0 .503.114.92.34 1.25.242.33.668.616 1.276.86.607.225 1.458.468 2.551.729 1.65.347 2.96.79 3.933 1.328.972.538 1.667 1.163 2.084 1.875.417.712.625 1.528.625 2.448 0 1.129-.286 2.11-.86 2.943-.572.816-1.38 1.45-2.421 1.9-1.042.435-2.267.652-3.673.652-1.528 0-2.847-.27-3.958-.808-1.111-.538-1.989-1.284-2.63-2.239-.626-.972-.99-2.1-1.095-3.386l3.438-.207c.104.798.33 1.475.677 2.03.365.556.843.982 1.433 1.277.608.278 1.337.416 2.188.416.729 0 1.345-.086 1.848-.26.521-.19.912-.46 1.172-.807.278-.365.417-.808.417-1.328 0-.47-.113-.886-.339-1.25-.225-.382-.66-.72-1.301-1.016-.643-.313-1.598-.617-2.866-.912-1.527-.347-2.751-.738-3.672-1.172-.92-.451-1.588-1.007-2.005-1.667-.416-.677-.625-1.52-.625-2.526 0-1.077.27-2.022.807-2.838.538-.834 1.303-1.477 2.292-1.928.99-.469 2.18-.703 3.569-.703Zm25.874 4.687c1.979 0 3.472.504 4.48 1.511 1.023.99 1.535 2.414 1.535 4.272v8.437h-2.864l-.112-2.296c-.159.36-.372.692-.644.994-.434.504-.998.903-1.692 1.199-.695.277-1.477.417-2.345.417-1.44 0-2.604-.331-3.49-.99-.885-.678-1.327-1.615-1.327-2.813 0-1.198.373-2.136 1.12-2.813.746-.677 1.883-1.164 3.41-1.459l4.61-.91c0-.99-.225-1.728-.676-2.215-.452-.503-1.12-.755-2.005-.755-.799 0-1.433.19-1.902.573-.451.364-.764.894-.937 1.589l-3.386-.157c.278-1.475.955-2.604 2.031-3.385 1.077-.799 2.475-1.199 4.194-1.199Zm39.004 0c1.32 0 2.475.296 3.464.886 1.007.59 1.78 1.442 2.318 2.553s.807 2.448.807 4.01v.755h-9.87c.07 1.216.4 2.136.99 2.761.607.608 1.406.911 2.395.911.746 0 1.363-.164 1.85-.494a2.655 2.655 0 0 0 1.042-1.432l3.411.208c-.382 1.354-1.137 2.421-2.266 3.203-1.111.781-2.465 1.172-4.062 1.173-1.39 0-2.596-.296-3.62-.886a6.124 6.124 0 0 1-2.37-2.553c-.556-1.094-.834-2.37-.834-3.828 0-1.458.278-2.726.833-3.803.556-1.093 1.337-1.944 2.344-2.551 1.025-.608 2.214-.913 3.569-.913Zm14.091 0c1.25 0 2.301.209 3.152.625.85.4 1.51.955 1.979 1.667.486.695.79 1.494.911 2.397l-3.359.156a3.336 3.336 0 0 0-.469-1.224 2.104 2.104 0 0 0-.912-.782c-.382-.19-.833-.286-1.353-.286-.782 0-1.373.156-1.772.469-.399.312-.599.73-.599 1.25 0 .364.087.668.26.911.191.243.496.443.912.6.417.139.973.269 1.667.39 1.459.226 2.604.521 3.438.886.85.347 1.449.798 1.797 1.354.364.538.547 1.19.547 1.954-.001.885-.252 1.64-.755 2.265-.487.625-1.182 1.102-2.084 1.432-.886.312-1.927.47-3.125.47-1.372 0-2.527-.2-3.464-.6-.92-.4-1.632-.955-2.136-1.667a4.743 4.743 0 0 1-.859-2.422l3.412-.156c.121.73.425 1.294.911 1.693.486.4 1.207.599 2.162.599.781 0 1.388-.122 1.822-.364.452-.26.678-.66.678-1.199 0-.312-.078-.573-.234-.78-.157-.21-.452-.392-.886-.548-.434-.156-1.076-.312-1.927-.468-1.424-.244-2.544-.539-3.36-.886-.816-.365-1.397-.817-1.744-1.355-.33-.538-.495-1.206-.495-2.005 0-1.302.494-2.352 1.484-3.151 1.007-.816 2.474-1.225 4.401-1.225Zm13.697 0c1.25 0 2.3.209 3.151.625.851.4 1.511.955 1.979 1.667.487.695.79 1.494.912 2.397l-3.36.156a3.336 3.336 0 0 0-.469-1.224 2.098 2.098 0 0 0-.912-.782c-.381-.19-.833-.286-1.353-.286-.782 0-1.372.156-1.772.469-.399.312-.598.73-.598 1.25 0 .364.086.668.259.911.191.243.496.443.913.6.416.139.972.269 1.667.39 1.458.226 2.604.521 3.437.886.851.347 1.45.798 1.797 1.354.365.538.547 1.19.547 1.954 0 .885-.252 1.64-.755 2.265-.486.625-1.181 1.102-2.084 1.432-.886.312-1.927.47-3.125.47-1.372 0-2.526-.2-3.464-.6-.92-.4-1.632-.955-2.136-1.667a4.743 4.743 0 0 1-.859-2.422l3.412-.156c.122.73.425 1.294.911 1.693.486.4 1.207.599 2.162.599.781 0 1.389-.122 1.823-.364.451-.26.677-.66.677-1.199 0-.312-.078-.573-.234-.78-.156-.21-.452-.392-.886-.548-.434-.156-1.076-.312-1.927-.468-1.423-.244-2.544-.539-3.36-.886-.816-.365-1.397-.817-1.744-1.355-.33-.538-.495-1.206-.495-2.005 0-1.302.495-2.352 1.484-3.151 1.007-.816 2.474-1.225 4.402-1.225Zm-78.355.313h3.672v2.579H48.6v7.031c0 .643.14 1.094.417 1.355.278.243.712.364 1.302.364h1.953v2.578h-2.969c-1.389 0-2.413-.32-3.073-.963-.642-.642-.963-1.65-.963-3.021v-7.344H43.08v-2.58h2.188V8.09h3.333v3.255ZM71.393 25.25H68.06V11.344h3.334V25.25Zm9.308-14.22c1.024 0 1.883.227 2.578.678a4.26 4.26 0 0 1 1.614 1.875c.365.781.547 1.693.547 2.735v8.932h-3.333v-7.864c0-.781-.078-1.442-.234-1.98-.157-.538-.417-.947-.782-1.224-.347-.295-.817-.443-1.407-.443-.885 0-1.597.313-2.135.938-.52.625-.78 1.528-.78 2.709v7.864h-3.335V11.344h3.022l.079 2.384a4.08 4.08 0 0 1 .52-.977 3.946 3.946 0 0 1 1.588-1.303 5.01 5.01 0 0 1 2.058-.417Zm9.917 14.22h-3.334V6.761h3.334v18.49Zm-31.366-5.677c-.747.157-1.285.391-1.615.703-.312.296-.468.686-.468 1.172 0 .538.173.955.52 1.25.365.295.877.443 1.537.443.746 0 1.389-.148 1.927-.443a3.14 3.14 0 0 0 1.25-1.223c.295-.521.442-1.138.442-1.85v-.781l-3.593.73Zm39.916-5.912c-.885 0-1.623.287-2.213.86-.573.573-.929 1.398-1.068 2.474h6.433c-.07-1.128-.391-1.962-.964-2.5-.573-.556-1.302-.834-2.188-.834ZM69.752 6.344c.504 0 .912.156 1.224.469.33.295.495.694.495 1.198 0 .52-.165.937-.495 1.25-.312.295-.72.442-1.224.442-.52 0-.946-.147-1.276-.442-.312-.313-.469-.73-.469-1.25 0-.504.157-.903.47-1.198.329-.313.755-.47 1.275-.47Z"/>
|
|
3
|
+
<image width="20.5" height="20.5" y="6" xlink:href="data:image/png;base64,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"/>
|
|
4
|
+
</svg>
|
|
@@ -6,17 +6,15 @@ import HeaderLinks from './HeaderLinks.astro';
|
|
|
6
6
|
import NavLinks from '../nav-tabs/NavTabs.astro';
|
|
7
7
|
import { TABS } from 'virtual:stl-docs-virtual-module';
|
|
8
8
|
import ThemeSelect from 'virtual:starlight/components/ThemeSelect';
|
|
9
|
-
import SplashMobileMenuToggle from './SplashMobileMenuToggle.astro';
|
|
10
9
|
|
|
11
|
-
|
|
10
|
+
type Props = {
|
|
12
11
|
shouldRenderSearch?: boolean;
|
|
13
|
-
}
|
|
12
|
+
};
|
|
14
13
|
|
|
15
14
|
const { shouldRenderSearch } = Astro.props;
|
|
16
|
-
const { hasSidebar } = Astro.locals.starlightRoute;
|
|
17
15
|
---
|
|
18
16
|
|
|
19
|
-
<div class="header
|
|
17
|
+
<div class="header">
|
|
20
18
|
<div class="left-group">
|
|
21
19
|
<div class="title-wrapper sl-flex">
|
|
22
20
|
<SiteTitle />
|
|
@@ -24,9 +22,9 @@ const { hasSidebar } = Astro.locals.starlightRoute;
|
|
|
24
22
|
</div>
|
|
25
23
|
{TABS.length > 0 && <NavLinks />}
|
|
26
24
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
{shouldRenderSearch && <Search />}
|
|
26
|
+
|
|
27
|
+
<div class="right-group">
|
|
30
28
|
<div class="sl-hidden md:sl-flex">
|
|
31
29
|
<ThemeSelect />
|
|
32
30
|
<HeaderLinks />
|