@myst-theme/site 1.1.4 → 1.2.2
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": "@myst-theme/site",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"types": "./src/index.ts",
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@headlessui/react": "^1.7.15",
|
|
27
27
|
"@heroicons/react": "^2.0.18",
|
|
28
|
-
"@myst-theme/common": "^1.
|
|
29
|
-
"@myst-theme/diagrams": "^1.
|
|
30
|
-
"@myst-theme/frontmatter": "^1.
|
|
31
|
-
"@myst-theme/providers": "^1.
|
|
32
|
-
"@myst-theme/search": "^1.
|
|
28
|
+
"@myst-theme/common": "^1.2.2",
|
|
29
|
+
"@myst-theme/diagrams": "^1.2.2",
|
|
30
|
+
"@myst-theme/frontmatter": "^1.2.2",
|
|
31
|
+
"@myst-theme/providers": "^1.2.2",
|
|
32
|
+
"@myst-theme/search": "^1.2.2",
|
|
33
33
|
"@radix-ui/react-collapsible": "^1.0.3",
|
|
34
34
|
"@radix-ui/react-dialog": "^1.0.3",
|
|
35
35
|
"@radix-ui/react-visually-hidden": "^1.1.0",
|
|
@@ -37,9 +37,9 @@
|
|
|
37
37
|
"lodash.throttle": "^4.1.1",
|
|
38
38
|
"myst-common": "^1.8.1",
|
|
39
39
|
"myst-config": "^1.7.9",
|
|
40
|
-
"myst-demo": "^1.
|
|
40
|
+
"myst-demo": "^1.2.2",
|
|
41
41
|
"myst-spec-ext": "^1.8.1",
|
|
42
|
-
"myst-to-react": "^1.
|
|
42
|
+
"myst-to-react": "^1.2.2",
|
|
43
43
|
"nbtx": "^0.2.3",
|
|
44
44
|
"node-cache": "^5.1.2",
|
|
45
45
|
"node-fetch": "^2.6.11",
|
|
@@ -12,6 +12,7 @@ export const FooterLink = ({
|
|
|
12
12
|
}: NavigationLink & { right?: boolean }) => {
|
|
13
13
|
const baseurl = useBaseurl();
|
|
14
14
|
const Link = useLinkProvider();
|
|
15
|
+
const linkText = short_title || title;
|
|
15
16
|
return (
|
|
16
17
|
<Link
|
|
17
18
|
prefetch="intent"
|
|
@@ -20,6 +21,7 @@ export const FooterLink = ({
|
|
|
20
21
|
{ 'myst-footer-link-prev': right, 'myst-footer-link-next': !right },
|
|
21
22
|
)}
|
|
22
23
|
to={withBaseurl(url, baseurl)}
|
|
24
|
+
aria-label={`${right ? 'Previous: ' : 'Next: '}${linkText}`}
|
|
23
25
|
>
|
|
24
26
|
<div className="flex h-full align-middle">
|
|
25
27
|
{right && (
|
|
@@ -33,7 +35,7 @@ export const FooterLink = ({
|
|
|
33
35
|
<div className="myst-footer-link-group text-xs text-gray-500 dark:text-gray-400">
|
|
34
36
|
{group || ' '}
|
|
35
37
|
</div>
|
|
36
|
-
{
|
|
38
|
+
{linkText}
|
|
37
39
|
</div>
|
|
38
40
|
{!right && (
|
|
39
41
|
<ArrowRightIcon
|
|
@@ -3,6 +3,7 @@ import { PrimarySidebar } from './PrimarySidebar.js';
|
|
|
3
3
|
import type { Heading } from '@myst-theme/common';
|
|
4
4
|
import { getProjectHeadings } from '@myst-theme/common';
|
|
5
5
|
import type { SiteManifest } from 'myst-config';
|
|
6
|
+
import type { GenericParent } from 'myst-common';
|
|
6
7
|
|
|
7
8
|
/**
|
|
8
9
|
* PrimaryNavigation will load nav links and headers from the site manifest and display
|
|
@@ -15,6 +16,7 @@ export const PrimaryNavigation = ({
|
|
|
15
16
|
hide_toc,
|
|
16
17
|
mobileOnly,
|
|
17
18
|
footer,
|
|
19
|
+
navbarEnd,
|
|
18
20
|
}: {
|
|
19
21
|
children?: React.ReactNode;
|
|
20
22
|
projectSlug?: string;
|
|
@@ -22,6 +24,7 @@ export const PrimaryNavigation = ({
|
|
|
22
24
|
hide_toc?: boolean;
|
|
23
25
|
mobileOnly?: boolean;
|
|
24
26
|
footer?: React.ReactNode;
|
|
27
|
+
navbarEnd?: GenericParent;
|
|
25
28
|
}) => {
|
|
26
29
|
const config = useSiteManifest();
|
|
27
30
|
if (!config) return null;
|
|
@@ -41,6 +44,7 @@ export const PrimaryNavigation = ({
|
|
|
41
44
|
nav={nav}
|
|
42
45
|
headings={headings}
|
|
43
46
|
footer={footer}
|
|
47
|
+
navbarEnd={navbarEnd}
|
|
44
48
|
/>
|
|
45
49
|
);
|
|
46
50
|
};
|
|
@@ -63,6 +67,7 @@ export const ConfigurablePrimaryNavigation = ({
|
|
|
63
67
|
nav,
|
|
64
68
|
headings,
|
|
65
69
|
footer,
|
|
70
|
+
navbarEnd,
|
|
66
71
|
}: {
|
|
67
72
|
children?: React.ReactNode;
|
|
68
73
|
sidebarRef?: React.RefObject<HTMLDivElement>;
|
|
@@ -71,6 +76,7 @@ export const ConfigurablePrimaryNavigation = ({
|
|
|
71
76
|
nav?: SiteManifest['nav'];
|
|
72
77
|
headings?: Heading[];
|
|
73
78
|
footer?: React.ReactNode;
|
|
79
|
+
navbarEnd?: GenericParent;
|
|
74
80
|
}) => {
|
|
75
81
|
const [open, setOpen] = useNavOpen();
|
|
76
82
|
const top = useThemeTop();
|
|
@@ -107,6 +113,7 @@ export const ConfigurablePrimaryNavigation = ({
|
|
|
107
113
|
nav={nav}
|
|
108
114
|
headings={headings}
|
|
109
115
|
footer={footer}
|
|
116
|
+
navbarEnd={navbarEnd}
|
|
110
117
|
hide_toc={hide_toc}
|
|
111
118
|
mobileOnly={mobileOnly}
|
|
112
119
|
/>
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import React, { useEffect, useRef } from 'react';
|
|
2
2
|
import classNames from 'classnames';
|
|
3
3
|
import { useNavigation } from '@remix-run/react';
|
|
4
|
+
import type { GenericParent } from 'myst-common';
|
|
5
|
+
import { MyST } from 'myst-to-react';
|
|
4
6
|
import {
|
|
5
7
|
useNavOpen,
|
|
6
8
|
useSiteManifest,
|
|
@@ -149,6 +151,7 @@ export const PrimarySidebar = ({
|
|
|
149
151
|
sidebarRef,
|
|
150
152
|
nav,
|
|
151
153
|
footer,
|
|
154
|
+
navbarEnd,
|
|
152
155
|
headings,
|
|
153
156
|
hide_toc,
|
|
154
157
|
mobileOnly,
|
|
@@ -157,6 +160,7 @@ export const PrimarySidebar = ({
|
|
|
157
160
|
nav?: SiteManifest['nav'];
|
|
158
161
|
headings?: Heading[];
|
|
159
162
|
footer?: React.ReactNode;
|
|
163
|
+
navbarEnd?: GenericParent;
|
|
160
164
|
hide_toc?: boolean;
|
|
161
165
|
mobileOnly?: boolean;
|
|
162
166
|
}) => {
|
|
@@ -222,6 +226,16 @@ export const PrimarySidebar = ({
|
|
|
222
226
|
<SidebarNav nav={nav} />
|
|
223
227
|
</nav>
|
|
224
228
|
)}
|
|
229
|
+
{navbarEnd && (
|
|
230
|
+
<div
|
|
231
|
+
className={classNames(
|
|
232
|
+
'article myst-primary-sidebar-navbar-end xl:hidden p-2 my-1 flex flex-wrap gap-2 [&_p]:contents',
|
|
233
|
+
sidebarSectionInsetClass,
|
|
234
|
+
)}
|
|
235
|
+
>
|
|
236
|
+
<MyST ast={navbarEnd} />
|
|
237
|
+
</div>
|
|
238
|
+
)}
|
|
225
239
|
{nav && headings && <div className="my-3 border-b-2 lg:hidden" />}
|
|
226
240
|
{headings && (
|
|
227
241
|
<nav
|
|
@@ -245,13 +245,13 @@ function SearchResultItem({
|
|
|
245
245
|
/>
|
|
246
246
|
);
|
|
247
247
|
|
|
248
|
-
// Render the
|
|
249
|
-
let
|
|
248
|
+
// Render the context i.e. file name
|
|
249
|
+
let contextRenderer;
|
|
250
250
|
if (result.type === 'lvl1') {
|
|
251
|
-
|
|
251
|
+
contextRenderer = undefined;
|
|
252
252
|
} else {
|
|
253
|
-
const
|
|
254
|
-
|
|
253
|
+
const contextName = result.hierarchy.lvl1!;
|
|
254
|
+
contextRenderer = <MarkedText text={contextName} matches={matches} className="text-xs" />;
|
|
255
255
|
}
|
|
256
256
|
|
|
257
257
|
const enterIconRenderer = (
|
|
@@ -268,8 +268,8 @@ function SearchResultItem({
|
|
|
268
268
|
<div className="flex flex-row h-11">
|
|
269
269
|
{iconRenderer}
|
|
270
270
|
<div className="flex flex-col justify-center truncate grow">
|
|
271
|
+
{contextRenderer}
|
|
271
272
|
{titleRenderer}
|
|
272
|
-
{subtitleRenderer}
|
|
273
273
|
</div>
|
|
274
274
|
{enterIconRenderer}
|
|
275
275
|
</div>
|
|
@@ -527,6 +527,7 @@ function SearchForm({
|
|
|
527
527
|
id={searchInputID}
|
|
528
528
|
aria-labelledby={searchLabelID}
|
|
529
529
|
aria-controls={searchListID}
|
|
530
|
+
aria-expanded={!!searchResults}
|
|
530
531
|
placeholder="Search"
|
|
531
532
|
type="search"
|
|
532
533
|
required
|
|
@@ -557,9 +558,15 @@ const SearchPlaceholderButton = forwardRef<
|
|
|
557
558
|
HTMLButtonElement,
|
|
558
559
|
SearchPlaceholderButtonProps & Dialog.DialogTriggerProps
|
|
559
560
|
>(({ className, disabled, ...props }, ref) => {
|
|
561
|
+
// Here we remove aria-controls from props so we can *decide* whether to insert it later
|
|
562
|
+
// This is because radix has a bug where it'll try pointing to a non-existent element
|
|
563
|
+
// if the dialog isn't open, so that's the logic we test below.
|
|
564
|
+
// ref: https://github.com/radix-ui/primitives/issues/3560
|
|
565
|
+
const { 'aria-controls': ariaControls, ...restProps } = props;
|
|
560
566
|
return (
|
|
561
567
|
<button
|
|
562
|
-
{...
|
|
568
|
+
{...restProps}
|
|
569
|
+
aria-controls={restProps['aria-expanded'] ? ariaControls : undefined}
|
|
563
570
|
className={classNames(
|
|
564
571
|
'myst-search-bar',
|
|
565
572
|
className,
|
|
@@ -3,6 +3,8 @@ import classNames from 'classnames';
|
|
|
3
3
|
import { Menu, Transition } from '@headlessui/react';
|
|
4
4
|
import { ChevronDownIcon, Bars3Icon as MenuIcon } from '@heroicons/react/24/solid';
|
|
5
5
|
import type { SiteManifest, SiteNavItem } from 'myst-config';
|
|
6
|
+
import type { GenericParent } from 'myst-common';
|
|
7
|
+
import { MyST } from 'myst-to-react';
|
|
6
8
|
import { ThemeButton } from './ThemeButton.js';
|
|
7
9
|
import { Search } from './Search.js';
|
|
8
10
|
import {
|
|
@@ -113,7 +115,15 @@ export function NavItems({ nav }: { nav?: SiteManifest['nav'] }) {
|
|
|
113
115
|
);
|
|
114
116
|
}
|
|
115
117
|
|
|
116
|
-
export function TopNav({
|
|
118
|
+
export function TopNav({
|
|
119
|
+
hideToc,
|
|
120
|
+
hideSearch,
|
|
121
|
+
navbarEnd,
|
|
122
|
+
}: {
|
|
123
|
+
hideToc?: boolean;
|
|
124
|
+
hideSearch?: boolean;
|
|
125
|
+
navbarEnd?: GenericParent;
|
|
126
|
+
}) {
|
|
117
127
|
const [open, setOpen] = useNavOpen();
|
|
118
128
|
const config = useSiteManifest();
|
|
119
129
|
const { title, nav, actions } = config ?? {};
|
|
@@ -152,8 +162,17 @@ export function TopNav({ hideToc, hideSearch }: { hideToc?: boolean; hideSearch?
|
|
|
152
162
|
<div className="flex items-center flex-grow w-auto">
|
|
153
163
|
<NavItems nav={nav} />
|
|
154
164
|
<div className="flex-grow block"></div>
|
|
165
|
+
{/* Search bar */}
|
|
155
166
|
{!hideSearch && <Search />}
|
|
156
|
-
|
|
167
|
+
{/* Light/Dark theme button */}
|
|
168
|
+
<ThemeButton className="w-10 h-10 ml-3" />
|
|
169
|
+
{/* Custom part at end of navbar. It is `hidden` up until xl size since it will be in the sidebar drawer up to that point */}
|
|
170
|
+
{navbarEnd && (
|
|
171
|
+
<div className="article myst-navbar-end hidden xl:flex items-center ml-3 [&>*]:m-0">
|
|
172
|
+
<MyST ast={navbarEnd} />
|
|
173
|
+
</div>
|
|
174
|
+
)}
|
|
175
|
+
{/* Mobile pop-up for page actions */}
|
|
157
176
|
<div className="block sm:hidden">
|
|
158
177
|
<ActionMenu actions={actions} />
|
|
159
178
|
</div>
|