radiant-docs 0.1.40 → 0.1.41

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "radiant-docs",
3
- "version": "0.1.40",
3
+ "version": "0.1.41",
4
4
  "description": "CLI tool for previewing Radiant documentation locally",
5
5
  "type": "module",
6
6
  "bin": {
@@ -6,10 +6,10 @@
6
6
  "dev": "astro dev",
7
7
  "start": "tsx runner.ts",
8
8
  "prebuild": "rm -rf public/pagefind",
9
- "build": "astro build && node scripts/generate-og-metadata.mjs && node scripts/generate-og-images.mjs && node scripts/stamp-og-image-versions.mjs && node scripts/stamp-image-versions.mjs && pagefind --site dist && node scripts/stamp-pagefind-runtime-version.mjs && node scripts/generate-proxy-allowed-origins.mjs && node scripts/generate-robots-txt.mjs",
9
+ "build": "astro build && node scripts/remove-assistant-for-non-pro.mjs && node scripts/generate-og-metadata.mjs && node scripts/generate-og-images.mjs && node scripts/stamp-og-image-versions.mjs && node scripts/stamp-image-versions.mjs && pagefind --site dist && node scripts/stamp-pagefind-runtime-version.mjs && node scripts/generate-proxy-allowed-origins.mjs && node scripts/generate-robots-txt.mjs",
10
10
  "preview": "astro preview",
11
11
  "astro": "astro",
12
- "search:index": "astro build && node scripts/generate-og-metadata.mjs && node scripts/generate-og-images.mjs && node scripts/stamp-og-image-versions.mjs && node scripts/stamp-image-versions.mjs && pagefind --site dist && node scripts/stamp-pagefind-runtime-version.mjs && node scripts/generate-proxy-allowed-origins.mjs && node scripts/generate-robots-txt.mjs && cp -r dist/pagefind public/"
12
+ "search:index": "astro build && node scripts/remove-assistant-for-non-pro.mjs && node scripts/generate-og-metadata.mjs && node scripts/generate-og-images.mjs && node scripts/stamp-og-image-versions.mjs && node scripts/stamp-image-versions.mjs && pagefind --site dist && node scripts/stamp-pagefind-runtime-version.mjs && node scripts/generate-proxy-allowed-origins.mjs && node scripts/generate-robots-txt.mjs && cp -r dist/pagefind public/"
13
13
  },
14
14
  "dependencies": {
15
15
  "@alpinejs/collapse": "^3.15.2",
@@ -1,9 +1,17 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128">
2
- <path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" />
3
- <style>
4
- path { fill: #000; }
5
- @media (prefers-color-scheme: dark) {
6
- path { fill: #FFF; }
7
- }
8
- </style>
1
+ <svg
2
+ fill="none"
3
+ height="48"
4
+ viewBox="0 0 32 48"
5
+ width="48"
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ >
8
+ <path
9
+ d="m18.6667 30.6667c7.3638 0 13.3333-5.9696 13.3333-13.3334 0-7.36376-5.9695-13.3333-13.3333-13.3333h-18.6667v26.6667z"
10
+ fill="#ff692e"
11
+ />
12
+ <path d="m0 4 32 40h-21.3333l-10.6667-13.3333z" fill="#2e90fa" />
13
+ <path
14
+ d="m21.1488 30.436c-.8042.1515-1.6339.2307-2.4821.2307h-18.6667v-26.6667z"
15
+ fill="#53b1fd"
16
+ />
9
17
  </svg>
@@ -0,0 +1,28 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ const FRAMEWORK_DIR = path.resolve(__dirname, "..");
8
+ const ASSISTANT_DIST_DIR = path.join(FRAMEWORK_DIR, "dist", "-", "assistant");
9
+
10
+ function getOrgTier() {
11
+ const parsedTier = Number.parseInt((process.env.ORG_TIER ?? "1").trim(), 10);
12
+ return Number.isFinite(parsedTier) && parsedTier > 0 ? parsedTier : 1;
13
+ }
14
+
15
+ const orgTier = getOrgTier();
16
+
17
+ if (orgTier >= 3) {
18
+ console.log("Assistant embed retained for Pro tier build.");
19
+ process.exit(0);
20
+ }
21
+
22
+ if (!fs.existsSync(ASSISTANT_DIST_DIR)) {
23
+ console.log("Assistant embed cleanup skipped: assistant output not found.");
24
+ process.exit(0);
25
+ }
26
+
27
+ fs.rmSync(ASSISTANT_DIST_DIR, { recursive: true, force: true });
28
+ console.log("Assistant embed removed for non-Pro tier build.");
@@ -18,7 +18,7 @@ const config = await getConfig();
18
18
  class:list={[
19
19
  "fixed z-30 top-1 inset-x-1 shadow-[0px_-20px_0px_20px_var(--background-dark)] h-16 border-x border-t border-border rounded-t-2xl overflow-hidden border-b bg-background border-b-border-light",
20
20
  config.navbar?.blur &&
21
- "sm:bg-background/80 sm:backdrop-blur-[18px] sm:backdrop-saturate-50 sm:border-b-neutral-100/85 sm:dark:border-neutral-800/85 sm:bg-clip-padding",
21
+ "sm:bg-background/85 sm:backdrop-blur-[18px] sm:backdrop-saturate-50 sm:border-b-neutral-100/85 sm:dark:border-neutral-800/85 sm:bg-clip-padding",
22
22
  ]}
23
23
  data-pagefind-ignore
24
24
  data-vaul-scale-chrome
@@ -60,7 +60,7 @@ const config = await getConfig();
60
60
  <button
61
61
  type="button"
62
62
  class="hidden md:inline-flex items-center gap-2 h-8 rounded-lg [corner-shape:superellipse(1.2)] bg-linear-to-b from-[var(--color-theme-top)] to-[var(--color-theme-bottom)] px-3 text-[13px] font-[350] text-[var(--color-theme-foreground)] shadow-sm hover:opacity-95 cursor-pointer"
63
- onclick="window.dispatchEvent(new CustomEvent('ask-ai:open'));"
63
+ onclick="window.__assistantOpenRequested = true; window.dispatchEvent(new CustomEvent('ask-ai:open'));"
64
64
  >
65
65
  <img
66
66
  src={sparkleIcon}
@@ -0,0 +1,16 @@
1
+ ---
2
+ import AssistantDocsWidget from "./AssistantDocsWidget";
3
+ import { getAssistantPanelRuntimeConfig } from "../../lib/assistant-panel-config";
4
+ import { getConfig } from "../../lib/validation";
5
+
6
+ const config = await getConfig();
7
+ const assistantConfig = getAssistantPanelRuntimeConfig(config);
8
+ ---
9
+
10
+ <div data-pagefind-ignore>
11
+ <AssistantDocsWidget
12
+ client:only="preact"
13
+ transition:persist="assistant-docs-widget"
14
+ {...assistantConfig}
15
+ />
16
+ </div>
@@ -0,0 +1,402 @@
1
+ import type { JSX } from "preact";
2
+ import { useEffect, useState } from "preact/hooks";
3
+ import AssistantEmbedPanel, { AssistantPanelIcon } from "./AssistantEmbedPanel";
4
+ import {
5
+ DEFAULT_ASSISTANT_CHROME_CONFIG,
6
+ type AssistantChromeConfig,
7
+ } from "../../lib/assistant-chrome-defaults";
8
+
9
+ type AssistantDocsWidgetProps = {
10
+ apiPath: string;
11
+ docsTitle: string;
12
+ isChatAvailable: boolean;
13
+ canSendChatRequest: boolean;
14
+ launcherThemeColor?: string;
15
+ launcherThemeColors?: {
16
+ light: string;
17
+ dark: string;
18
+ };
19
+ launcherIconColor?: string;
20
+ launcherIconColors?: {
21
+ light: string;
22
+ dark: string;
23
+ };
24
+ launcherIconImageSrc?: string;
25
+ emptyStateHeading?: string;
26
+ emptyStateQuestions?: string[];
27
+ devProxyToken?: string;
28
+ chrome?: AssistantChromeConfig;
29
+ };
30
+
31
+ type AssistantOpenRequestWindow = Window & {
32
+ __assistantOpenRequested?: boolean;
33
+ };
34
+
35
+ export default function AssistantDocsWidget({
36
+ apiPath,
37
+ docsTitle,
38
+ isChatAvailable,
39
+ canSendChatRequest,
40
+ launcherThemeColor,
41
+ launcherThemeColors,
42
+ launcherIconColor,
43
+ launcherIconColors,
44
+ launcherIconImageSrc,
45
+ emptyStateHeading,
46
+ emptyStateQuestions,
47
+ devProxyToken,
48
+ chrome,
49
+ }: AssistantDocsWidgetProps) {
50
+ const [isOpen, setIsOpen] = useState(false);
51
+ const [openSignal, setOpenSignal] = useState(0);
52
+ const chromeConfig = chrome ?? DEFAULT_ASSISTANT_CHROME_CONFIG;
53
+ const numericZIndex =
54
+ Number.parseInt(chromeConfig.zIndex, 10) ||
55
+ Number.parseInt(DEFAULT_ASSISTANT_CHROME_CONFIG.zIndex, 10);
56
+ const launcherThemeColorLight =
57
+ launcherThemeColors?.light ?? launcherThemeColor ?? "#171717";
58
+ const launcherThemeColorDark =
59
+ launcherThemeColors?.dark ?? launcherThemeColor ?? "#171717";
60
+ const launcherIconColorLight =
61
+ launcherIconColors?.light ?? launcherIconColor ?? "#ffffff";
62
+ const launcherIconColorDark =
63
+ launcherIconColors?.dark ?? launcherIconColor ?? "#ffffff";
64
+ const rootStyle = {
65
+ "--assistant-docs-theme-light": launcherThemeColorLight,
66
+ "--assistant-docs-theme-dark": launcherThemeColorDark,
67
+ "--assistant-docs-icon-color-light": launcherIconColorLight,
68
+ "--assistant-docs-icon-color-dark": launcherIconColorDark,
69
+ "--assistant-docs-z-index": String(numericZIndex),
70
+ "--assistant-docs-launcher-z-index": String(numericZIndex + 1),
71
+ "--assistant-docs-mobile-panel-z-index": String(numericZIndex + 2),
72
+ "--assistant-docs-offset-x": chromeConfig.offsetX,
73
+ "--assistant-docs-offset-y": chromeConfig.offsetY,
74
+ "--assistant-docs-mobile-offset-x": chromeConfig.mobileOffsetX,
75
+ "--assistant-docs-mobile-offset-y": chromeConfig.mobileOffsetY,
76
+ "--assistant-docs-launcher-size": chromeConfig.launcherSize,
77
+ "--assistant-docs-launcher-icon-size": chromeConfig.launcherIconSize,
78
+ "--assistant-docs-launcher-shadow": chromeConfig.launcherShadow,
79
+ "--assistant-docs-panel-width": chromeConfig.panelWidth,
80
+ "--assistant-docs-panel-height": chromeConfig.panelHeight,
81
+ "--assistant-docs-panel-gap": chromeConfig.panelGap,
82
+ "--assistant-docs-panel-radius": chromeConfig.panelRadius,
83
+ "--assistant-docs-panel-border": chromeConfig.panelBorder,
84
+ "--assistant-docs-panel-background": chromeConfig.panelBackground,
85
+ "--assistant-docs-panel-dark-border": chromeConfig.panelDarkBorder,
86
+ "--assistant-docs-panel-dark-background": chromeConfig.panelDarkBackground,
87
+ "--assistant-docs-panel-backdrop-blur": chromeConfig.panelBackdropBlur,
88
+ "--assistant-docs-panel-shadow": chromeConfig.panelShadow,
89
+ "--assistant-docs-panel-dark-shadow": chromeConfig.panelDarkShadow,
90
+ "--assistant-docs-panel-open-scale": chromeConfig.panelOpenScale,
91
+ "--assistant-docs-panel-open-duration": chromeConfig.panelOpenDuration,
92
+ "--assistant-docs-panel-open-timing": chromeConfig.panelOpenTiming,
93
+ "--assistant-docs-panel-close-duration": chromeConfig.panelCloseDuration,
94
+ "--assistant-docs-panel-close-timing": chromeConfig.panelCloseTiming,
95
+ } as JSX.CSSProperties;
96
+
97
+ const openPanel = () => {
98
+ setIsOpen((wasOpen) => {
99
+ if (!wasOpen) {
100
+ setOpenSignal((previous) => previous + 1);
101
+ }
102
+ return true;
103
+ });
104
+ };
105
+
106
+ const closePanel = () => {
107
+ setIsOpen(false);
108
+ };
109
+
110
+ useEffect(() => {
111
+ const handleOpen = () => {
112
+ (window as AssistantOpenRequestWindow).__assistantOpenRequested = false;
113
+ openPanel();
114
+ };
115
+
116
+ window.addEventListener("ask-ai:open", handleOpen);
117
+ if ((window as AssistantOpenRequestWindow).__assistantOpenRequested) {
118
+ handleOpen();
119
+ }
120
+
121
+ return () => {
122
+ window.removeEventListener("ask-ai:open", handleOpen);
123
+ };
124
+ }, []);
125
+
126
+ return (
127
+ <div
128
+ data-pagefind-ignore
129
+ className="assistant-docs-widget"
130
+ data-side={chromeConfig.side}
131
+ style={rootStyle}
132
+ >
133
+ <div
134
+ className="assistant-docs-panel-shell"
135
+ data-state={isOpen ? "open" : "closed"}
136
+ >
137
+ <AssistantEmbedPanel
138
+ apiPath={apiPath}
139
+ docsTitle={docsTitle}
140
+ isChatAvailable={isChatAvailable}
141
+ canSendChatRequest={canSendChatRequest}
142
+ launcherThemeColor={launcherThemeColor}
143
+ launcherThemeColors={launcherThemeColors}
144
+ launcherIconColor={launcherIconColor}
145
+ launcherIconColors={launcherIconColors}
146
+ launcherIconImageSrc={launcherIconImageSrc}
147
+ emptyStateHeading={emptyStateHeading}
148
+ emptyStateQuestions={emptyStateQuestions}
149
+ devProxyToken={devProxyToken}
150
+ panelSurface="inline"
151
+ linkTarget="current"
152
+ allowApiPathQueryOverride={false}
153
+ openSignal={openSignal}
154
+ onRequestClose={closePanel}
155
+ />
156
+ </div>
157
+
158
+ <button
159
+ type="button"
160
+ className="assistant-docs-launcher"
161
+ data-open={String(isOpen)}
162
+ onClick={() => {
163
+ if (isOpen) {
164
+ closePanel();
165
+ return;
166
+ }
167
+ openPanel();
168
+ }}
169
+ aria-label={isOpen ? "Close chat" : "Open chat"}
170
+ title={isOpen ? "Close chat" : "Open chat"}
171
+ >
172
+ <AssistantPanelIcon
173
+ color={launcherIconColor}
174
+ imageSrc={launcherIconImageSrc}
175
+ className="assistant-docs-launcher-icon assistant-docs-launcher-mark"
176
+ />
177
+ <svg
178
+ className="assistant-docs-launcher-icon assistant-docs-launcher-chevron"
179
+ viewBox="0 0 24 24"
180
+ fill="none"
181
+ stroke="currentColor"
182
+ strokeWidth="2.4"
183
+ strokeLinecap="round"
184
+ strokeLinejoin="round"
185
+ aria-hidden="true"
186
+ >
187
+ <path d="m6 9 6 6 6-6" />
188
+ </svg>
189
+ </button>
190
+
191
+ <style>{`
192
+ @keyframes assistant-docs-launcher-enter {
193
+ 0% {
194
+ opacity: 0;
195
+ transform: translateY(3px) scale(.96);
196
+ }
197
+ 46% {
198
+ opacity: 1;
199
+ transform: translateY(0) scale(1.012);
200
+ }
201
+ 72% {
202
+ opacity: 1;
203
+ transform: translateY(0) scale(.998);
204
+ }
205
+ 100% {
206
+ opacity: 1;
207
+ transform: translateY(0) scale(1);
208
+ }
209
+ }
210
+
211
+ .assistant-docs-launcher {
212
+ --assistant-docs-theme: var(--assistant-docs-theme-light);
213
+ --assistant-docs-icon-color: var(--assistant-docs-icon-color-light);
214
+ position: fixed;
215
+ bottom: var(--assistant-docs-offset-y);
216
+ z-index: var(--assistant-docs-launcher-z-index);
217
+ display: inline-flex;
218
+ width: var(--assistant-docs-launcher-size);
219
+ height: var(--assistant-docs-launcher-size);
220
+ align-items: center;
221
+ justify-content: center;
222
+ padding: 0;
223
+ border: 0;
224
+ border-radius: 999px;
225
+ color: var(--assistant-docs-icon-color);
226
+ background: linear-gradient(
227
+ to bottom,
228
+ color-mix(in oklab, var(--assistant-docs-theme) 88%, white),
229
+ color-mix(in oklab, var(--assistant-docs-theme) 90%, black)
230
+ );
231
+ box-shadow: var(--assistant-docs-launcher-shadow);
232
+ cursor: pointer;
233
+ animation: assistant-docs-launcher-enter 460ms linear backwards;
234
+ transition: transform 180ms ease, opacity 160ms ease;
235
+ transform-origin: center center;
236
+ }
237
+
238
+ html.dark .assistant-docs-launcher,
239
+ html[data-theme="dark"] .assistant-docs-launcher {
240
+ --assistant-docs-theme: var(--assistant-docs-theme-dark);
241
+ --assistant-docs-icon-color: var(--assistant-docs-icon-color-dark);
242
+ }
243
+
244
+ .assistant-docs-widget[data-side="right"] .assistant-docs-launcher {
245
+ right: var(--assistant-docs-offset-x);
246
+ }
247
+
248
+ .assistant-docs-widget[data-side="left"] .assistant-docs-launcher {
249
+ left: var(--assistant-docs-offset-x);
250
+ }
251
+
252
+ .assistant-docs-launcher:hover {
253
+ opacity: .96;
254
+ transform: translateY(-1px) scale(1.03);
255
+ }
256
+
257
+ .assistant-docs-launcher:active {
258
+ transform: translateY(0) scale(.96);
259
+ }
260
+
261
+ .assistant-docs-launcher-icon {
262
+ position: absolute;
263
+ width: var(--assistant-docs-launcher-icon-size);
264
+ height: var(--assistant-docs-launcher-icon-size);
265
+ pointer-events: none;
266
+ transform-origin: center;
267
+ transition: opacity 150ms ease,
268
+ transform 180ms cubic-bezier(.2, .8, .2, 1);
269
+ }
270
+
271
+ .assistant-docs-launcher-icon img,
272
+ .assistant-docs-launcher-icon svg {
273
+ display: block;
274
+ width: 100%;
275
+ height: 100%;
276
+ object-fit: contain;
277
+ }
278
+
279
+ .assistant-docs-launcher-mark {
280
+ opacity: 1;
281
+ transform: scale(1);
282
+ }
283
+
284
+ .assistant-docs-launcher-chevron {
285
+ opacity: 0;
286
+ transform: scale(.55);
287
+ }
288
+
289
+ .assistant-docs-launcher[data-open="true"] .assistant-docs-launcher-mark {
290
+ opacity: 0;
291
+ transform: scale(.55);
292
+ }
293
+
294
+ .assistant-docs-launcher[data-open="true"] .assistant-docs-launcher-chevron {
295
+ opacity: 1;
296
+ transform: scale(1);
297
+ }
298
+
299
+ .assistant-docs-panel-shell {
300
+ position: fixed;
301
+ bottom: calc(
302
+ var(--assistant-docs-offset-y) +
303
+ var(--assistant-docs-launcher-size) +
304
+ var(--assistant-docs-panel-gap)
305
+ );
306
+ z-index: var(--assistant-docs-z-index);
307
+ box-sizing: border-box;
308
+ width: min(var(--assistant-docs-panel-width), calc(100vw - 32px));
309
+ height: min(var(--assistant-docs-panel-height), calc(100dvh - 32px));
310
+ overflow: hidden;
311
+ border: var(--assistant-docs-panel-border);
312
+ border-radius: var(--assistant-docs-panel-radius);
313
+ background: var(--assistant-docs-panel-background);
314
+ box-shadow: var(--assistant-docs-panel-shadow);
315
+ -webkit-backdrop-filter: blur(var(--assistant-docs-panel-backdrop-blur));
316
+ backdrop-filter: blur(var(--assistant-docs-panel-backdrop-blur));
317
+ opacity: 1;
318
+ pointer-events: auto;
319
+ transform: scale(1);
320
+ transform-origin: bottom right;
321
+ transition-property: transform, opacity, display;
322
+ transition-duration: var(--assistant-docs-panel-open-duration);
323
+ transition-timing-function: var(--assistant-docs-panel-open-timing);
324
+ transition-behavior: allow-discrete;
325
+ }
326
+
327
+ .dark .assistant-docs-panel-shell {
328
+ border: var(--assistant-docs-panel-dark-border);
329
+ background: var(--assistant-docs-panel-dark-background);
330
+ box-shadow: var(--assistant-docs-panel-dark-shadow);
331
+ }
332
+
333
+ .assistant-docs-widget[data-side="right"] .assistant-docs-panel-shell {
334
+ right: var(--assistant-docs-offset-x);
335
+ transform-origin: bottom right;
336
+ }
337
+
338
+ .assistant-docs-widget[data-side="left"] .assistant-docs-panel-shell {
339
+ left: var(--assistant-docs-offset-x);
340
+ transform-origin: bottom left;
341
+ }
342
+
343
+ @starting-style {
344
+ .assistant-docs-panel-shell[data-state="open"] {
345
+ opacity: 0;
346
+ transform: scale(var(--assistant-docs-panel-open-scale));
347
+ }
348
+ }
349
+
350
+ .assistant-docs-panel-shell[data-state="closed"] {
351
+ display: none;
352
+ opacity: 0;
353
+ pointer-events: none;
354
+ transform: scale(var(--assistant-docs-panel-open-scale));
355
+ transition-property: transform, opacity, display;
356
+ transition-duration: var(--assistant-docs-panel-close-duration);
357
+ transition-timing-function: var(--assistant-docs-panel-close-timing);
358
+ transition-behavior: allow-discrete;
359
+ }
360
+
361
+ @media (max-width: ${chromeConfig.mobileBreakpoint}) {
362
+ .assistant-docs-panel-shell {
363
+ inset: 0 !important;
364
+ z-index: var(--assistant-docs-mobile-panel-z-index) !important;
365
+ width: 100vw !important;
366
+ height: 100dvh !important;
367
+ border: 0 !important;
368
+ border-radius: 0 !important;
369
+ }
370
+
371
+ .assistant-docs-panel-shell > div {
372
+ border-radius: 0;
373
+ }
374
+
375
+ .assistant-docs-launcher {
376
+ bottom: var(--assistant-docs-mobile-offset-y) !important;
377
+ }
378
+
379
+ .assistant-docs-widget[data-side="right"] .assistant-docs-launcher {
380
+ right: var(--assistant-docs-mobile-offset-x) !important;
381
+ }
382
+
383
+ .assistant-docs-widget[data-side="left"] .assistant-docs-launcher {
384
+ left: var(--assistant-docs-mobile-offset-x) !important;
385
+ }
386
+ }
387
+
388
+ @media (prefers-reduced-motion: reduce) {
389
+ .assistant-docs-launcher {
390
+ animation: none !important;
391
+ }
392
+
393
+ .assistant-docs-launcher,
394
+ .assistant-docs-launcher-icon,
395
+ .assistant-docs-panel-shell {
396
+ transition: none !important;
397
+ }
398
+ }
399
+ `}</style>
400
+ </div>
401
+ );
402
+ }