@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,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
- import type { DocsLanguage } from '@stainless-api/docs-ui/routing';
2
- import AiChat, { STAINLESS_PROJECT } from 'virtual:stl-docs/components/AiChat.tsx';
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
- export default function AiChatIsland({
5
- currentLanguage,
6
- siteTitle,
7
- }: {
8
- currentLanguage: DocsLanguage | undefined;
9
- siteTitle: string | undefined;
10
- }) {
11
- if (!AiChat) throw new Error('AiChatIsland was rendered but could not load AiChat component');
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,9 @@
1
+ <div class="stl-ui-prose stl-content-panel">
2
+ <slot />
3
+ </div>
4
+
5
+ <style>
6
+ .stl-content-panel + .stl-content-panel {
7
+ margin-top: 24px;
8
+ }
9
+ </style>
@@ -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>
@@ -23,11 +23,6 @@ const shouldRenderSearch = !!(
23
23
 
24
24
  <style is:global>
25
25
  @layer starlight.core {
26
- header,
27
- header.header {
28
- border-color: var(--stl-color-border-faint);
29
- }
30
-
31
26
  .header {
32
27
  display: flex;
33
28
  gap: var(--sl-nav-gap);
@@ -1,18 +1,33 @@
1
1
  ---
2
- import Default from '@astrojs/starlight/components/PageFrame.astro';
3
- import AiChat from 'virtual:stl-docs/components/AiChat.tsx'; // conditionally resolves to null if ai chat module is not injected
4
- import AiChatIsland from './AiChatIsland.tsx'; // entrypoint for client island can’t be a virtual module
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
- <Default>
12
- <slot name="header" slot="header" />
13
- <slot name="sidebar" slot="sidebar" />
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
- {!!AiChat && <AiChatIsland client:load currentLanguage={Astro.locals.language} siteTitle={siteTitle} />}
18
- </Default>
32
+ {__STLDOCS_ENABLE_AI_CHAT__ && <AiChatIsland client:load siteTitle={siteTitle} />}
33
+ </div>
@@ -0,0 +1,11 @@
1
+ ---
2
+ import TableOfContents from 'virtual:starlight/components/TableOfContents';
3
+ ---
4
+
5
+ {
6
+ Astro.locals.starlightRoute.toc && (
7
+ <div class="right-sidebar-panel">
8
+ <TableOfContents />
9
+ </div>
10
+ )
11
+ }
@@ -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>
@@ -0,0 +1,2 @@
1
+ <slot />
2
+ <slot name="right-sidebar" slot="right-sidebar" />
@@ -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
- interface Props {
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 my-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
- <div class={'sl-flex print:hidden right-group default-tabs-container'}>
28
- {shouldRenderSearch && <Search />}
29
- {!hasSidebar && <SplashMobileMenuToggle />}
25
+ {shouldRenderSearch && <Search />}
26
+
27
+ <div class="right-group">
30
28
  <div class="sl-hidden md:sl-flex">
31
29
  <ThemeSelect />
32
30
  <HeaderLinks />