@curvenote/theme-ui 1.0.1
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/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +3 -0
- package/dist/components/layout/app-layout.d.ts +8 -0
- package/dist/components/layout/app-layout.d.ts.map +1 -0
- package/dist/components/layout/app-layout.js +24 -0
- package/dist/components/layout/app-sidebar.d.ts +2 -0
- package/dist/components/layout/app-sidebar.d.ts.map +1 -0
- package/dist/components/layout/app-sidebar.js +125 -0
- package/dist/components/layout/article-layout.d.ts +8 -0
- package/dist/components/layout/article-layout.d.ts.map +1 -0
- package/dist/components/layout/article-layout.js +20 -0
- package/dist/components/layout/grid.d.ts +2 -0
- package/dist/components/layout/grid.d.ts.map +1 -0
- package/dist/components/layout/grid.js +4 -0
- package/dist/components/layout/header.d.ts +5 -0
- package/dist/components/layout/header.d.ts.map +1 -0
- package/dist/components/layout/header.js +5 -0
- package/dist/components/layout/index.d.ts +7 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/layout/index.js +7 -0
- package/dist/components/layout/loading-bar.d.ts +12 -0
- package/dist/components/layout/loading-bar.d.ts.map +1 -0
- package/dist/components/layout/loading-bar.js +53 -0
- package/dist/components/layout/site-header.d.ts +8 -0
- package/dist/components/layout/site-header.d.ts.map +1 -0
- package/dist/components/layout/site-header.js +55 -0
- package/dist/components/layout/types.d.ts +6 -0
- package/dist/components/layout/types.d.ts.map +1 -0
- package/dist/components/layout/types.js +1 -0
- package/dist/components/providers/compute.d.ts +5 -0
- package/dist/components/providers/compute.d.ts.map +1 -0
- package/dist/components/providers/compute.js +6 -0
- package/dist/components/providers/connect.d.ts +24 -0
- package/dist/components/providers/connect.d.ts.map +1 -0
- package/dist/components/providers/connect.js +208 -0
- package/dist/components/providers/curvenote-providers.d.ts +52 -0
- package/dist/components/providers/curvenote-providers.d.ts.map +1 -0
- package/dist/components/providers/curvenote-providers.js +199 -0
- package/dist/components/providers/design.d.ts +39 -0
- package/dist/components/providers/design.d.ts.map +1 -0
- package/dist/components/providers/design.js +50 -0
- package/dist/components/providers/index.d.ts +10 -0
- package/dist/components/providers/index.d.ts.map +1 -0
- package/dist/components/providers/index.js +12 -0
- package/dist/components/providers/lightbox-provider.d.ts +31 -0
- package/dist/components/providers/lightbox-provider.d.ts.map +1 -0
- package/dist/components/providers/lightbox-provider.js +109 -0
- package/dist/components/providers/myst-providers.d.ts +6 -0
- package/dist/components/providers/myst-providers.d.ts.map +1 -0
- package/dist/components/providers/myst-providers.js +29 -0
- package/dist/components/providers/page-providers.d.ts +15 -0
- package/dist/components/providers/page-providers.d.ts.map +1 -0
- package/dist/components/providers/page-providers.js +28 -0
- package/dist/components/providers/ping-boundary.d.ts +40 -0
- package/dist/components/providers/ping-boundary.d.ts.map +1 -0
- package/dist/components/providers/ping-boundary.js +115 -0
- package/dist/components/providers/platform-providers.d.ts +18 -0
- package/dist/components/providers/platform-providers.d.ts.map +1 -0
- package/dist/components/providers/platform-providers.js +29 -0
- package/dist/components/providers/types.d.ts +30 -0
- package/dist/components/providers/types.d.ts.map +1 -0
- package/dist/components/providers/types.js +1 -0
- package/dist/components/ui/Callout.d.ts +10 -0
- package/dist/components/ui/Callout.d.ts.map +1 -0
- package/dist/components/ui/Callout.js +7 -0
- package/dist/components/ui/PageCards.d.ts +2 -0
- package/dist/components/ui/PageCards.d.ts.map +1 -0
- package/dist/components/ui/PageCards.js +11 -0
- package/dist/components/ui/abbreviations.d.ts +5 -0
- package/dist/components/ui/abbreviations.d.ts.map +1 -0
- package/dist/components/ui/abbreviations.js +31 -0
- package/dist/components/ui/abstract.d.ts +8 -0
- package/dist/components/ui/abstract.d.ts.map +1 -0
- package/dist/components/ui/abstract.js +9 -0
- package/dist/components/ui/accessibility-skip-to.d.ts +15 -0
- package/dist/components/ui/accessibility-skip-to.d.ts.map +1 -0
- package/dist/components/ui/accessibility-skip-to.js +31 -0
- package/dist/components/ui/acknowledgements.d.ts +4 -0
- package/dist/components/ui/acknowledgements.d.ts.map +1 -0
- package/dist/components/ui/acknowledgements.js +20 -0
- package/dist/components/ui/article-actions-downloads.d.ts +26 -0
- package/dist/components/ui/article-actions-downloads.d.ts.map +1 -0
- package/dist/components/ui/article-actions-downloads.js +143 -0
- package/dist/components/ui/article-actions-dropdown.d.ts +5 -0
- package/dist/components/ui/article-actions-dropdown.d.ts.map +1 -0
- package/dist/components/ui/article-actions-dropdown.js +68 -0
- package/dist/components/ui/article-actions-share.d.ts +5 -0
- package/dist/components/ui/article-actions-share.d.ts.map +1 -0
- package/dist/components/ui/article-actions-share.js +52 -0
- package/dist/components/ui/article-actions.d.ts +2 -0
- package/dist/components/ui/article-actions.d.ts.map +1 -0
- package/dist/components/ui/article-actions.js +20 -0
- package/dist/components/ui/article-bar.d.ts +8 -0
- package/dist/components/ui/article-bar.d.ts.map +1 -0
- package/dist/components/ui/article-bar.js +32 -0
- package/dist/components/ui/article-card.d.ts +12 -0
- package/dist/components/ui/article-card.d.ts.map +1 -0
- package/dist/components/ui/article-card.js +22 -0
- package/dist/components/ui/article-footer.d.ts +2 -0
- package/dist/components/ui/article-footer.d.ts.map +1 -0
- package/dist/components/ui/article-footer.js +7 -0
- package/dist/components/ui/author-popover.d.ts +7 -0
- package/dist/components/ui/author-popover.d.ts.map +1 -0
- package/dist/components/ui/author-popover.js +36 -0
- package/dist/components/ui/backmatter.d.ts +9 -0
- package/dist/components/ui/backmatter.d.ts.map +1 -0
- package/dist/components/ui/backmatter.js +49 -0
- package/dist/components/ui/badge.d.ts +10 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.js +23 -0
- package/dist/components/ui/banner.d.ts +7 -0
- package/dist/components/ui/banner.d.ts.map +1 -0
- package/dist/components/ui/banner.js +44 -0
- package/dist/components/ui/bibliography.d.ts +6 -0
- package/dist/components/ui/bibliography.d.ts.map +1 -0
- package/dist/components/ui/bibliography.js +20 -0
- package/dist/components/ui/breadcrumb.d.ts +12 -0
- package/dist/components/ui/breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb.js +28 -0
- package/dist/components/ui/button.d.ts +11 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +33 -0
- package/dist/components/ui/citation.d.ts +7 -0
- package/dist/components/ui/citation.d.ts.map +1 -0
- package/dist/components/ui/citation.js +99 -0
- package/dist/components/ui/collapsible.d.ts +6 -0
- package/dist/components/ui/collapsible.d.ts.map +1 -0
- package/dist/components/ui/collapsible.js +12 -0
- package/dist/components/ui/cookie-banner.d.ts +8 -0
- package/dist/components/ui/cookie-banner.d.ts.map +1 -0
- package/dist/components/ui/cookie-banner.js +31 -0
- package/dist/components/ui/data-availability.d.ts +4 -0
- package/dist/components/ui/data-availability.d.ts.map +1 -0
- package/dist/components/ui/data-availability.js +20 -0
- package/dist/components/ui/dialog.d.ts +16 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/dialog.js +36 -0
- package/dist/components/ui/document-outline.d.ts +8 -0
- package/dist/components/ui/document-outline.d.ts.map +1 -0
- package/dist/components/ui/document-outline.js +168 -0
- package/dist/components/ui/dropdown-menu.d.ts +26 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/components/ui/dropdown-menu.js +51 -0
- package/dist/components/ui/error-page.d.ts +9 -0
- package/dist/components/ui/error-page.d.ts.map +1 -0
- package/dist/components/ui/error-page.js +21 -0
- package/dist/components/ui/footer-links.d.ts +14 -0
- package/dist/components/ui/footer-links.d.ts.map +1 -0
- package/dist/components/ui/footer-links.js +18 -0
- package/dist/components/ui/footnotes.d.ts +4 -0
- package/dist/components/ui/footnotes.d.ts.map +1 -0
- package/dist/components/ui/footnotes.js +30 -0
- package/dist/components/ui/frontmatter-badges.d.ts +27 -0
- package/dist/components/ui/frontmatter-badges.d.ts.map +1 -0
- package/dist/components/ui/frontmatter-badges.js +60 -0
- package/dist/components/ui/frontmatter.d.ts +7 -0
- package/dist/components/ui/frontmatter.d.ts.map +1 -0
- package/dist/components/ui/frontmatter.js +6 -0
- package/dist/components/ui/image.d.ts +34 -0
- package/dist/components/ui/image.d.ts.map +1 -0
- package/dist/components/ui/image.js +83 -0
- package/dist/components/ui/index.d.ts +50 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/index.js +56 -0
- package/dist/components/ui/input.d.ts +4 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +7 -0
- package/dist/components/ui/license-description.d.ts +4 -0
- package/dist/components/ui/license-description.d.ts.map +1 -0
- package/dist/components/ui/license-description.js +63 -0
- package/dist/components/ui/license-frontmatter.d.ts +22 -0
- package/dist/components/ui/license-frontmatter.d.ts.map +1 -0
- package/dist/components/ui/license-frontmatter.js +37 -0
- package/dist/components/ui/lightbox-container.d.ts +11 -0
- package/dist/components/ui/lightbox-container.d.ts.map +1 -0
- package/dist/components/ui/lightbox-container.js +13 -0
- package/dist/components/ui/lightbox.d.ts +17 -0
- package/dist/components/ui/lightbox.d.ts.map +1 -0
- package/dist/components/ui/lightbox.js +129 -0
- package/dist/components/ui/link-card.d.ts +15 -0
- package/dist/components/ui/link-card.d.ts.map +1 -0
- package/dist/components/ui/link-card.js +28 -0
- package/dist/components/ui/popover.d.ts +8 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/popover.js +17 -0
- package/dist/components/ui/search.d.ts +9 -0
- package/dist/components/ui/search.d.ts.map +1 -0
- package/dist/components/ui/search.js +290 -0
- package/dist/components/ui/separator.d.ts +5 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/separator.js +8 -0
- package/dist/components/ui/sheet.d.ts +14 -0
- package/dist/components/ui/sheet.d.ts.map +1 -0
- package/dist/components/ui/sheet.js +40 -0
- package/dist/components/ui/sidebar.d.ts +67 -0
- package/dist/components/ui/sidebar.d.ts.map +1 -0
- package/dist/components/ui/sidebar.js +202 -0
- package/dist/components/ui/skeleton.d.ts +3 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeleton.js +6 -0
- package/dist/components/ui/sonner.d.ts +5 -0
- package/dist/components/ui/sonner.d.ts.map +1 -0
- package/dist/components/ui/sonner.js +13 -0
- package/dist/components/ui/theme-button.d.ts +2 -0
- package/dist/components/ui/theme-button.d.ts.map +1 -0
- package/dist/components/ui/theme-button.js +9 -0
- package/dist/components/ui/tooltip.d.ts +13 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +20 -0
- package/dist/components/ui/types.d.ts +11 -0
- package/dist/components/ui/types.d.ts.map +1 -0
- package/dist/components/ui/types.js +10 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +4 -0
- package/dist/hooks/use-hydrated.d.ts +2 -0
- package/dist/hooks/use-hydrated.d.ts.map +1 -0
- package/dist/hooks/use-hydrated.js +6 -0
- package/dist/hooks/use-image-load.d.ts +14 -0
- package/dist/hooks/use-image-load.d.ts.map +1 -0
- package/dist/hooks/use-image-load.js +41 -0
- package/dist/hooks/use-mobile.d.ts +2 -0
- package/dist/hooks/use-mobile.d.ts.map +1 -0
- package/dist/hooks/use-mobile.js +15 -0
- package/dist/hooks/use-theme.d.ts +6 -0
- package/dist/hooks/use-theme.d.ts.map +1 -0
- package/dist/hooks/use-theme.js +23 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/lib/checkMecaExport.d.ts +5 -0
- package/dist/lib/checkMecaExport.d.ts.map +1 -0
- package/dist/lib/checkMecaExport.js +4 -0
- package/dist/lib/index.d.ts +6 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +6 -0
- package/dist/lib/knownParts.d.ts +12 -0
- package/dist/lib/knownParts.d.ts.map +1 -0
- package/dist/lib/knownParts.js +14 -0
- package/dist/lib/links.d.ts +3 -0
- package/dist/lib/links.d.ts.map +1 -0
- package/dist/lib/links.js +7 -0
- package/dist/lib/parse-date.d.ts +2 -0
- package/dist/lib/parse-date.d.ts.map +1 -0
- package/dist/lib/parse-date.js +7 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +5 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,MAAM,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LayoutProps } from './types';
|
|
2
|
+
export declare function AppLayout({ children, header, footer }: LayoutProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export declare function AppContainer({ children, header, className, }: {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
header?: React.ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=app-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/app-layout.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,2CAuBlE;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,MAAM,EACN,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAwBA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { SidebarInset, SidebarProvider } from '../ui/sidebar';
|
|
3
|
+
import { AppSidebar } from './app-sidebar';
|
|
4
|
+
import { SiteHeader } from './site-header';
|
|
5
|
+
import { useProjectManifest, useReferences } from '@myst-theme/providers';
|
|
6
|
+
import { DocumentOutline } from '../ui/document-outline';
|
|
7
|
+
import { cn } from '../../lib/utils';
|
|
8
|
+
import { Banner } from '../ui';
|
|
9
|
+
import { createSkipToTargets, SkipTo } from '../ui/accessibility-skip-to';
|
|
10
|
+
import { useDesign } from '../providers';
|
|
11
|
+
export function AppLayout({ children, header, footer }) {
|
|
12
|
+
return (_jsxs(_Fragment, { children: [_jsx(SkipTo, { targets: createSkipToTargets() }), _jsx("div", { className: cn('flex flex-col min-h-screen', {
|
|
13
|
+
'[--header-height:calc(--spacing(22))]': header,
|
|
14
|
+
'[--header-height:calc(--spacing(14))]': !header,
|
|
15
|
+
}), children: _jsxs(SidebarProvider, { className: "flex flex-col h-full", children: [_jsx(SiteHeader, { brandBar: header, showMobileMenu: true }), _jsxs("div", { className: "flex flex-1 pt-[var(--header-height)]", children: [_jsx(AppSidebar, {}), _jsxs(SidebarInset, { className: "flex flex-col min-h-full", children: [_jsx("div", { className: "flex-grow", children: children }), footer && _jsx("div", { className: "flex-shrink-0", children: footer })] })] })] }) })] }));
|
|
16
|
+
}
|
|
17
|
+
export function AppContainer({ children, header, className, }) {
|
|
18
|
+
const references = useReferences();
|
|
19
|
+
const project = useProjectManifest();
|
|
20
|
+
const design = useDesign();
|
|
21
|
+
return (_jsxs("article", { className: cn('relative app-grid grid-gap z-0 max-w-full article', className, {
|
|
22
|
+
'pt-8': !project?.banner,
|
|
23
|
+
}), children: [project?.banner && (_jsx(Banner, { thin: true, banner: project.banner, bannerOptimized: project.bannerOptimized })), header, !!header && _jsx("div", { className: "h-0 col-screen" }), !design.hide_outline && references?.article && (_jsx("aside", { className: "hidden sticky top-24 px-2 h-0 lg:block col-margin xl:px-4", children: _jsx(DocumentOutline, { mdast: references?.article }) })), children, _jsx("div", { id: "bottom-of-article", className: "h-0 col-screen" })] }));
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/layout/app-sidebar.tsx"],"names":[],"mappings":"AA8PA,wBAAgB,UAAU,4CA2EzB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { ChevronRight, Home, Notebook } from 'lucide-react';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { useNavigation, useLocation, Link, NavLink } from 'react-router';
|
|
5
|
+
import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, } from '../ui/sidebar';
|
|
6
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui';
|
|
7
|
+
import { cn } from '../../lib/utils';
|
|
8
|
+
import { getYear } from '../../lib/parse-date';
|
|
9
|
+
import { CurvenoteLogo } from '@curvenote/icons';
|
|
10
|
+
import { ThemeButton } from '../ui/theme-button';
|
|
11
|
+
import { useBaseurl, useProjectManifest } from '@myst-theme/providers';
|
|
12
|
+
import { useHydrated } from '../../hooks';
|
|
13
|
+
import { usePage } from '../providers';
|
|
14
|
+
const icons = {
|
|
15
|
+
notebook: Notebook,
|
|
16
|
+
notebooks: Notebook,
|
|
17
|
+
'supporting notebooks': Notebook,
|
|
18
|
+
};
|
|
19
|
+
// Helper function to build nested structure from flat pages array
|
|
20
|
+
function buildNestedStructure(pages, baseUrl) {
|
|
21
|
+
const result = [];
|
|
22
|
+
const stack = [];
|
|
23
|
+
pages.forEach((page) => {
|
|
24
|
+
const item = {
|
|
25
|
+
title: page.short_title || page.title,
|
|
26
|
+
slug: page.slug,
|
|
27
|
+
url: page.slug
|
|
28
|
+
? `${baseUrl}/${page.slug.replace(/\.index$/, '').replace(/\./g, '/')}`
|
|
29
|
+
: undefined,
|
|
30
|
+
icon: icons[(page.short_title || page.title).toLowerCase()],
|
|
31
|
+
};
|
|
32
|
+
// If this is a level 1 item, add it to the root
|
|
33
|
+
if (page.level === 1) {
|
|
34
|
+
result.push(item);
|
|
35
|
+
stack.length = 0; // Clear stack
|
|
36
|
+
stack.push(item);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Find the appropriate parent based on level
|
|
40
|
+
while (stack.length > 0 && stack.length >= page.level) {
|
|
41
|
+
stack.pop();
|
|
42
|
+
}
|
|
43
|
+
if (stack.length > 0) {
|
|
44
|
+
// Add to the last item in stack
|
|
45
|
+
if (!stack[stack.length - 1].children) {
|
|
46
|
+
stack[stack.length - 1].children = [];
|
|
47
|
+
}
|
|
48
|
+
stack[stack.length - 1].children.push(item);
|
|
49
|
+
stack.push(item);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Fallback: add to root
|
|
53
|
+
result.push(item);
|
|
54
|
+
stack.push(item);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
// Helper function to check if an item or its children contain the current page
|
|
61
|
+
function containsCurrentPage(item, currentPage) {
|
|
62
|
+
if (!currentPage)
|
|
63
|
+
return false;
|
|
64
|
+
// Check if this item is the current page
|
|
65
|
+
if (item.slug === currentPage)
|
|
66
|
+
return true;
|
|
67
|
+
// Check if any children contain the current page
|
|
68
|
+
if (item.children) {
|
|
69
|
+
return item.children.some((child) => containsCurrentPage(child, currentPage));
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
// SidebarItem component to handle individual item state and effects
|
|
74
|
+
function SidebarItemComponent({ item, currentPage, depth = 0, }) {
|
|
75
|
+
const location = useLocation();
|
|
76
|
+
const navigation = useNavigation();
|
|
77
|
+
const isNavigating = React.useMemo(() => navigation.state === 'loading', [navigation.state]);
|
|
78
|
+
// Only animate open/close after hydration
|
|
79
|
+
const isHydrated = useHydrated();
|
|
80
|
+
// Determine if this section should be expanded by default based on current page
|
|
81
|
+
const defaultOpen = containsCurrentPage(item, currentPage);
|
|
82
|
+
const [open, setOpen] = React.useState(defaultOpen);
|
|
83
|
+
// Close items that are not in use after navigation completes and URL changes
|
|
84
|
+
React.useEffect(() => {
|
|
85
|
+
if (!isNavigating && !containsCurrentPage(item, currentPage)) {
|
|
86
|
+
setOpen(false);
|
|
87
|
+
}
|
|
88
|
+
else if (!isNavigating && containsCurrentPage(item, currentPage)) {
|
|
89
|
+
// Keep items open that are relevant to the current page
|
|
90
|
+
setOpen(true);
|
|
91
|
+
}
|
|
92
|
+
}, [location.pathname, isNavigating, item, currentPage]);
|
|
93
|
+
if (item.children && item.children.length > 0) {
|
|
94
|
+
return (_jsx(Collapsible, { open: open, onOpenChange: setOpen, className: "group/collapsible", children: _jsxs(SidebarMenuItem, { children: [_jsx(CollapsibleTrigger, { asChild: true, children: _jsxs("div", { className: cn('flex w-full items-center rounded-md p-2 gap-2 text-sm outline-hidden', 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground', 'disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50', 'group-has-data-[sidebar=menu-action]/menu-item:pr-8', 'data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground', 'cursor-pointer', 'font-normal [&>svg]:opacity-50'), children: [item.url && (_jsxs(_Fragment, { children: [_jsxs(NavLink, { to: item.url, end: true, className: ({ isActive }) => `flex items-center gap-2 w-full ${isActive ? 'font-bold' : ''}`, prefetch: "intent", children: [item.icon && _jsx(item.icon, { className: "shrink-0 size-4" }), _jsx("div", { children: item.title })] }), _jsx(ChevronRight, { className: cn('ml-auto transition-transform duration-200 chevron shrink-0', {
|
|
95
|
+
'rotate-90': open,
|
|
96
|
+
}), size: 16 })] })), !item.url && (_jsxs(_Fragment, { children: [item.icon && _jsx(item.icon, { className: "shrink-0 size-4" }), _jsx("div", { children: item.title }), _jsx(ChevronRight, { className: cn('ml-auto transition-transform duration-200 chevron shrink-0', {
|
|
97
|
+
'rotate-90': open,
|
|
98
|
+
}), size: 16 })] }))] }) }), _jsx(CollapsibleContent, { className: cn('sidebar-submenu-content overflow-hidden', {
|
|
99
|
+
'data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down duration-200': isHydrated,
|
|
100
|
+
}), children: _jsx(SidebarMenu, { children: item.children.map((child) => (_jsx(SidebarItemComponent, { item: child, currentPage: currentPage, depth: depth + 1 }, child.title))) }) })] }) }, item.title));
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
return (_jsx(SidebarMenuItem, { children: _jsx("div", { className: cn('flex gap-2 items-center w-full text-sm outline-hidden'), "data-slot": "sidebar-menu-button", "data-sidebar": "menu-button", "data-size": "default", children: _jsxs(NavLink, { to: item.url, end: true, className: ({ isActive }) => cn('p-2 rounded-md flex items-center gap-2 w-full', 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground', // focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground',
|
|
104
|
+
'disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50', 'group-has-data-[sidebar=menu-action]/menu-item:pr-8', 'data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground', { 'font-semibold [&>svg]:opacity-100 bg-sidebar-accent': isActive }, { 'font-normal [&>svg]:opacity-50': !isActive }), prefetch: "intent", children: [depth === 0 && item.icon && _jsx(item.icon, { className: "shrink-0 size-4" }), _jsx("div", { children: item.title })] }) }) }, item.title));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export function AppSidebar() {
|
|
108
|
+
const page = usePage();
|
|
109
|
+
const currentPage = page.slug;
|
|
110
|
+
const project = useProjectManifest();
|
|
111
|
+
const baseUrl = useBaseurl() ?? '';
|
|
112
|
+
// Build nested structure from config pages
|
|
113
|
+
const sidebarItems = React.useMemo(() => {
|
|
114
|
+
if (!project?.pages) {
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
117
|
+
return buildNestedStructure(project.pages, baseUrl);
|
|
118
|
+
}, [project]);
|
|
119
|
+
const { title, authors, date: dateString } = project ?? {};
|
|
120
|
+
const year = getYear(dateString);
|
|
121
|
+
return (_jsxs(Sidebar, { className: "top-(--header-height) h-[calc(100svh-var(--header-height))]!", children: [_jsx(SidebarHeader, { children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsx(SidebarMenuButton, { size: "lg", asChild: true, children: _jsxs(Link, { to: baseUrl || '/', children: [_jsx("div", { className: "flex justify-center items-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground aspect-square size-8", children: _jsx(Home, { className: "size-4" }) }), _jsxs("div", { className: "grid flex-1 text-sm leading-tight text-left", children: [_jsx("span", { className: "font-medium truncate", children: title }), authors && (_jsxs("div", { className: "flex overflow-hidden gap-1 items-center", children: [_jsxs("div", { className: "text-xs truncate", children: [authors
|
|
122
|
+
.map((author) => author.nameParsed?.family)
|
|
123
|
+
.slice(0, 3)
|
|
124
|
+
.join(', '), ' '] }), year && _jsxs("div", { className: "text-xs truncate shrink-0", children: ["(", year, ")"] })] }))] })] }) }) }) }) }), _jsx(SidebarContent, { children: _jsxs(SidebarGroup, { children: [_jsx(SidebarGroupLabel, { children: "Pages" }), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: sidebarItems.map((item) => (_jsx(SidebarItemComponent, { item: item, currentPage: currentPage }, item.title))) }) })] }) }), _jsx(SidebarFooter, { className: "border-t", children: _jsxs("div", { className: "flex gap-2 pl-2 opacity-80 grayscale hover:grayscale-0 hover:opacity-100", children: [_jsxs("a", { href: "https://curvenote.com", target: "_blank", rel: "noopener noreferrer", className: "flex gap-2 items-center my-1 text-xs transition-all duration-300 text-sidebar-secondary-foreground grow", children: [_jsx(CurvenoteLogo, { size: 16 }), _jsx("span", { children: "Powered by Curvenote" })] }), _jsx("div", { className: "flex-0", children: _jsx(ThemeButton, {}) })] }) })] }));
|
|
125
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LayoutProps } from './types';
|
|
2
|
+
export declare function ArticleLayout({ children, header, footer }: LayoutProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export declare function ArticleContainer({ children, header, className, }: {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
header?: React.ReactNode;
|
|
6
|
+
className?: string;
|
|
7
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=article-layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"article-layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/article-layout.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,2CAWtE;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,MAAM,EACN,SAAS,GACV,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAiCA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useProjectManifest, useReferences } from '@myst-theme/providers';
|
|
3
|
+
import { SiteHeader } from './site-header';
|
|
4
|
+
import { cn } from '../../lib/utils';
|
|
5
|
+
import { createSkipToTargets, DocumentOutline, SkipTo, Banner } from '../ui';
|
|
6
|
+
import { useDesign } from '../providers';
|
|
7
|
+
export function ArticleLayout({ children, header, footer }) {
|
|
8
|
+
return (_jsxs(_Fragment, { children: [_jsx(SkipTo, { targets: createSkipToTargets() }), _jsxs("div", { className: "flex flex-col min-h-screen", children: [_jsx(SiteHeader, { brandBar: header }), _jsx("div", { className: "flex-grow", children: children }), footer && _jsx("div", { className: "flex-shrink-0", children: footer })] })] }));
|
|
9
|
+
}
|
|
10
|
+
export function ArticleContainer({ children, header, className, }) {
|
|
11
|
+
const references = useReferences();
|
|
12
|
+
const project = useProjectManifest();
|
|
13
|
+
const design = useDesign();
|
|
14
|
+
return (_jsxs("article", { className: cn('relative article-grid grid-gap prose dark:prose-invert w-full max-w-full', {
|
|
15
|
+
// if the banner is shown, or the title block is hidden, this padding accounts for the site header
|
|
16
|
+
'pt-14': project?.banner || design.hide_title_block,
|
|
17
|
+
// if the banner is not shown, and the title block is not hidden, then more padding is needed
|
|
18
|
+
'pt-28': !project?.banner && !design.hide_title_block,
|
|
19
|
+
}, 'z-0', className), children: [project?.banner && !design.hide_title_block && (_jsx(Banner, { inset: true, banner: project.banner, bannerOptimized: project.bannerOptimized })), header, !!header && _jsx("div", { className: "col-screen h-0" }), !design.hide_outline && references?.article && (_jsx("aside", { className: "hidden sticky top-24 px-2 h-0 lg:block col-margin xl:px-4", children: _jsx(DocumentOutline, { mdast: references?.article }) })), children, _jsx("div", { id: "bottom-of-article", className: "col-screen h-0" })] }));
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../src/components/layout/grid.tsx"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,4CAkDzB"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
export function GridLayout() {
|
|
3
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { children: _jsxs("div", { className: "justify-center justify-items-center items-center p-5 m-auto w-16 h-16 text-2xl bg-blue-500 rounded", children: [_jsx("span", { className: "hidden 2xl:block", children: "2xl" }), _jsx("div", { className: "hidden xl:block 2xl:hidden", children: "xl" }), _jsx("div", { className: "hidden lg:block xl:hidden", children: "lg" }), _jsx("div", { className: "hidden md:block lg:hidden", children: "md" }), _jsx("div", { className: "hidden sm:block md:hidden", children: "sm" })] }) }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-screen", children: "col-screen" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-page", children: "col-page" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-page-inset", children: "col-page-inset" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-body-outset", children: "col-body-outset" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-body-inset", children: "col-body-inset" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-margin-left", children: "col-margin-left" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-body", children: "col-body" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-margin", children: "col-margin" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-gutter-left", children: "col-gutter-left" }), _jsx("div", { className: "row-span-2 p-3 bg-gray-200 rounded col-body-right", children: "col-body-right" }), _jsx("div", { className: "row-span-2 p-3 bg-gray-200 rounded col-margin-right-inset", children: "col-margin-right-inset" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-gutter-outset-left", children: "col-gutter-outset-left" }), _jsx("div", { className: "row-span-2 p-3 bg-gray-200 rounded col-body-left", children: "col-body-left" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-gutter-right", children: "col-gutter-right" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-gutter-outset-right", children: "col-gutter-outset-right" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-screen-right", children: "col-screen-right" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-screen-inset-right", children: "col-screen-inset-right" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-page-right", children: "col-page-right" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-page-inset-right", children: "col-page-inset-right" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-body-outset-right", children: "col-body-outset-right" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-body-inset-right", children: "col-body-inset-right" }), _jsx("div", { className: "row-span-2 p-3 bg-gray-200 rounded col-gutter-page-right", children: "col-gutter-page-right" }), _jsx("div", { className: "row-span-2 p-3 bg-gray-200 rounded col-gutter-page-left", children: "col-gutter-page-left" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-page-middle", children: "col-page-middle" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-body-inset-left", children: "col-body-inset-left" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-body-outset-left", children: "col-body-outset-left" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-page-inset-left", children: "col-page-inset-left" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-page-left", children: "col-page-left" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-screen-inset-left", children: "col-screen-inset-left" }), _jsx("div", { className: "p-3 bg-gray-200 rounded col-screen-left", children: "col-screen-left" })] }));
|
|
4
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../src/components/layout/header.tsx"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CAUA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { LoadingBar } from './loading-bar';
|
|
3
|
+
export function HeaderContainer({ brandBar, children, }) {
|
|
4
|
+
return (_jsx("header", { className: "fixed top-0 z-50 w-full border-b bg-background", children: _jsxs("div", { className: "flex flex-col items-center", children: [brandBar && _jsx("div", { className: "w-full shrink-0", children: brandBar }), children, _jsx(LoadingBar, {})] }) }));
|
|
5
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/layout/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,QAAQ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Show a loading progress bar if the load takes more than 150ms
|
|
3
|
+
*/
|
|
4
|
+
export declare function useLoading(): {
|
|
5
|
+
showLoading: boolean;
|
|
6
|
+
isLoading: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare function LoadingBar({ align, className, }: {
|
|
9
|
+
align?: 'bottom' | 'top';
|
|
10
|
+
className?: string;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element | null;
|
|
12
|
+
//# sourceMappingURL=loading-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loading-bar.d.ts","sourceRoot":"","sources":["../../../src/components/layout/loading-bar.tsx"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,UAAU;;;EAmCzB;AAED,wBAAgB,UAAU,CAAC,EACzB,KAAgB,EAChB,SAAS,GACV,EAAE;IACD,KAAK,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,kDAiBA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useNavigation } from 'react-router';
|
|
3
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
4
|
+
import { cn } from '../../lib/utils';
|
|
5
|
+
/**
|
|
6
|
+
* Show a loading progress bar if the load takes more than 150ms
|
|
7
|
+
*/
|
|
8
|
+
export function useLoading() {
|
|
9
|
+
const transitionState = useNavigation().state;
|
|
10
|
+
const ref = useMemo(() => ({}), []);
|
|
11
|
+
const [showLoading, setShowLoading] = useState(false);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (transitionState === 'loading') {
|
|
14
|
+
ref.start = setTimeout(() => {
|
|
15
|
+
setShowLoading(true);
|
|
16
|
+
}, 150);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
if (ref.start) {
|
|
20
|
+
// We have stopped loading in <150ms
|
|
21
|
+
clearTimeout(ref.start);
|
|
22
|
+
delete ref.start;
|
|
23
|
+
setShowLoading(false);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
ref.finish = setTimeout(() => {
|
|
27
|
+
setShowLoading(false);
|
|
28
|
+
}, 150);
|
|
29
|
+
}
|
|
30
|
+
return () => {
|
|
31
|
+
if (ref.start) {
|
|
32
|
+
clearTimeout(ref.start);
|
|
33
|
+
delete ref.start;
|
|
34
|
+
}
|
|
35
|
+
if (ref.finish) {
|
|
36
|
+
clearTimeout(ref.finish);
|
|
37
|
+
delete ref.finish;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}, [transitionState]);
|
|
41
|
+
return { showLoading, isLoading: transitionState === 'loading' };
|
|
42
|
+
}
|
|
43
|
+
export function LoadingBar({ align = 'bottom', className, }) {
|
|
44
|
+
const { isLoading, showLoading } = useLoading();
|
|
45
|
+
if (!showLoading)
|
|
46
|
+
return null;
|
|
47
|
+
return (_jsx("div", { className: cn('absolute left-0 w-screen bg-blue-500 transition-transform origin-left h-[2px]', {
|
|
48
|
+
'bottom-0': align === 'bottom',
|
|
49
|
+
'top-0': align === 'top',
|
|
50
|
+
'animate-load scale-x-40': isLoading,
|
|
51
|
+
'scale-x-100': !isLoading,
|
|
52
|
+
}, className) }));
|
|
53
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function SiteHeader({ showSearch, showBreadcrumbs, showArticleActions, showMobileMenu, brandBar, }: {
|
|
2
|
+
showSearch?: boolean;
|
|
3
|
+
showBreadcrumbs?: boolean;
|
|
4
|
+
showArticleActions?: boolean;
|
|
5
|
+
showMobileMenu?: boolean;
|
|
6
|
+
brandBar?: React.ReactNode;
|
|
7
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=site-header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-header.d.ts","sourceRoot":"","sources":["../../../src/components/layout/site-header.tsx"],"names":[],"mappings":"AAqKA,wBAAgB,UAAU,CAAC,EACzB,UAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,cAAqB,EACrB,QAAQ,GACT,EAAE;IACD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,2CA6IA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { ExternalLink, ChevronDown, MenuIcon, SearchIcon, SidebarIcon } from 'lucide-react';
|
|
4
|
+
import { NavLink } from 'react-router';
|
|
5
|
+
import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger, buttonVariants, SearchDialog, SimpleTooltip, BreadcrumbList, Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbSeparator, BreadcrumbPage, Separator, ArticleActions, } from '../ui';
|
|
6
|
+
import { cn } from '../../lib/utils';
|
|
7
|
+
import { usePlatformConfig, usePlatformSite } from '../providers/platform-providers';
|
|
8
|
+
import { HeaderContainer } from './header';
|
|
9
|
+
import { useBaseurl, useFrontmatter, useProjectManifest } from '@myst-theme/providers';
|
|
10
|
+
import { useSidebar } from '../ui/sidebar';
|
|
11
|
+
function NavigationItem({ item }) {
|
|
12
|
+
if (item.children && item.children.length > 0) {
|
|
13
|
+
return (_jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(Button, { variant: "ghost", className: "text-sm font-medium", children: [item.title, _jsx(ChevronDown, { className: "w-3 h-3" })] }) }), _jsx(DropdownMenuContent, { align: "end", children: item.children.map((child) => (_jsx(DropdownMenuItem, { children: _jsx(NavigationItem, { item: child }) }, child.title))) })] }, item.title));
|
|
14
|
+
}
|
|
15
|
+
if (item.internal === false) {
|
|
16
|
+
return (_jsx(Button, { variant: "ghost", asChild: true, children: _jsxs("a", { href: item.url, target: "_blank", rel: "noopener noreferrer", className: "flex items-center text-sm font-medium transition-colors hover:text-primary", children: [item.title, _jsx(ExternalLink, { className: "ml-1 w-3 h-3" })] }) }, item.title));
|
|
17
|
+
}
|
|
18
|
+
return (_jsx(NavLink, { to: item.url, className: ({ isActive }) => cn(
|
|
19
|
+
// We cannot wrap this in a button as it will cause a hydration error with the active class
|
|
20
|
+
buttonVariants({ variant: 'ghost' }), 'text-sm font-medium transition-colors hover:text-primary', isActive && 'text-primary font-semibold'), children: item.title }, item.title));
|
|
21
|
+
}
|
|
22
|
+
function MobileNavigationItem({ item, closeMobileMenu, }) {
|
|
23
|
+
if (item.children && item.children.length > 0) {
|
|
24
|
+
return (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "px-3 py-1 text-sm font-medium text-muted-foreground", children: item.title }), item.children.map((child) => (_jsx("div", { children: child.internal === false ? (_jsxs("a", { href: child.url, target: "_blank", rel: "noopener noreferrer", className: "block items-center px-6 py-2 text-sm font-medium transition-colors hover:text-primary hover:bg-muted", onClick: closeMobileMenu, children: [child.title, _jsx(ExternalLink, { className: "ml-2 w-3 h-3" })] })) : (_jsx(NavLink, { to: child.url, className: ({ isActive }) => cn('text-sm font-medium transition-colors hover:text-primary py-2 px-6 hover:bg-muted block', isActive && 'text-primary font-semibold bg-muted'), onClick: closeMobileMenu, children: child.title })) }, child.title)))] }, item.title));
|
|
25
|
+
}
|
|
26
|
+
if (item.internal === false) {
|
|
27
|
+
return (_jsxs("a", { href: item.url, target: "_blank", rel: "noopener noreferrer", className: "flex flex-row items-center px-3 py-2 text-sm font-medium transition-colors hover:text-primary hover:bg-muted", onClick: closeMobileMenu, children: [item.title, _jsx(ExternalLink, { className: "ml-1 w-3 h-3" })] }, item.title));
|
|
28
|
+
}
|
|
29
|
+
return (_jsx(NavLink, { to: item.url, className: ({ isActive }) => cn('text-sm font-medium transition-colors hover:text-primary py-2 px-3 hover:bg-muted block', isActive && 'text-primary font-semibold bg-muted'), onClick: closeMobileMenu, children: item.title }, item.title));
|
|
30
|
+
}
|
|
31
|
+
export function SiteHeader({ showSearch = false, showBreadcrumbs, showArticleActions, showMobileMenu = true, brandBar, }) {
|
|
32
|
+
const { toggleSidebar } = useSidebar() ?? {};
|
|
33
|
+
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
|
|
34
|
+
const site = usePlatformSite();
|
|
35
|
+
const config = usePlatformConfig();
|
|
36
|
+
const project = useProjectManifest();
|
|
37
|
+
const article = useFrontmatter();
|
|
38
|
+
const baseurl = useBaseurl() ?? '/';
|
|
39
|
+
const { nav, actions } = config ?? { nav: [], actions: [] };
|
|
40
|
+
const showNavLinksOnMediumScreen = (nav?.length ?? 0) < 5;
|
|
41
|
+
const showNavLinksOnLargeScreen = (nav?.length ?? 0) >= 5;
|
|
42
|
+
const logo = site?.logo || config?.options?.logo;
|
|
43
|
+
const logo_text = config?.options?.logo_text;
|
|
44
|
+
const title = site?.title || config?.title;
|
|
45
|
+
return (_jsx(HeaderContainer, { brandBar: brandBar, children: _jsxs("div", { className: "flex items-center px-2 w-full h-14", children: [_jsxs("div", { className: cn('flex gap-2 items-center h-full', { 'md:w-[200px]': !showBreadcrumbs }), children: [toggleSidebar && (_jsxs(_Fragment, { children: [_jsx(Button, { className: "w-8 h-8", variant: "ghost", size: "icon", onClick: toggleSidebar, children: _jsx(SidebarIcon, {}) }), _jsx(Separator, { orientation: "vertical", className: "mr-2 h-4" })] })), (logo || logo_text) && (_jsxs("a", { href: "/", className: "flex gap-2 items-center mr-2 shrink-0", children: [logo && _jsx("img", { src: logo, alt: title || 'Site Logo', className: "w-auto h-8 max-h-8" }), logo_text && _jsx("div", { className: "text-lg", children: logo_text })] }))] }), showBreadcrumbs && (_jsx(Breadcrumb, { className: "hidden sm:block grow", children: _jsxs(BreadcrumbList, { children: [_jsx(BreadcrumbItem, { children: _jsx(BreadcrumbLink, { href: baseurl, className: "truncate max-w-12 md:max-w-24 lg:max-w-48 xl:max-w-64", children: project?.title }) }), _jsx(BreadcrumbSeparator, {}), _jsx(BreadcrumbItem, { children: _jsx(BreadcrumbPage, { className: "truncate max-w-64 lg:max-w-96", children: article?.title }) })] }) })), !showBreadcrumbs && (_jsx("nav", { className: cn('hidden flex-1 gap-1 justify-center items-center', {
|
|
46
|
+
'md:flex': showNavLinksOnMediumScreen,
|
|
47
|
+
'lg:flex': showNavLinksOnLargeScreen,
|
|
48
|
+
}), children: nav?.map((item) => (_jsx(NavigationItem, { item: item }, item.title || item.url))) })), _jsxs("div", { className: cn('flex gap-2 justify-end items-center', {
|
|
49
|
+
'grow md:grow-0 md:w-[200px]': showNavLinksOnMediumScreen,
|
|
50
|
+
'grow lg:grow-0 lg:w-[200px]': showNavLinksOnLargeScreen,
|
|
51
|
+
}), children: [actions?.map((action) => (_jsx(Button, { variant: "outline", "aria-label": action.title, asChild: true, children: _jsx("a", { href: action.url, target: "_blank", rel: "noopener noreferrer", children: action.title }) }, action.title))), showSearch && (_jsx(SearchDialog, { children: _jsx(SimpleTooltip, { title: "Search", children: _jsx(Button, { variant: "outline", size: "icon", "aria-label": "Search", asChild: true, children: _jsx("div", { children: _jsx(SearchIcon, {}) }) }) }) })), showArticleActions && _jsx(ArticleActions, {}), showMobileMenu && nav && nav.length > 0 && (_jsxs(Sheet, { open: isMobileMenuOpen, onOpenChange: setIsMobileMenuOpen, children: [_jsx(SheetTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "sm", className: cn({
|
|
52
|
+
'md:hidden': !showBreadcrumbs && showNavLinksOnMediumScreen,
|
|
53
|
+
'lg:hidden': !showBreadcrumbs && showNavLinksOnLargeScreen,
|
|
54
|
+
}), children: _jsx(MenuIcon, { className: "w-5 h-5" }) }) }), _jsxs(SheetContent, { side: "right", className: "w-[300px] sm:w-[400px]", children: [_jsx(SheetHeader, { children: _jsx(SheetTitle, { children: "Navigation" }) }), _jsx("div", { className: "flex flex-col mt-6 space-y-4", children: _jsx("nav", { className: "flex flex-col space-y-2", children: nav?.map((item) => (_jsx(MobileNavigationItem, { item: item, closeMobileMenu: () => setIsMobileMenuOpen(false) }, item.title || item.url))) }) })] })] }))] })] }) }));
|
|
55
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/layout/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute.d.ts","sourceRoot":"","sources":["../../../src/components/providers/compute.tsx"],"names":[],"mappings":"AAMA,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,OAAO,GACR,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,EAAE,GAAG,CAAC;CACd,2CASA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { ExecuteScopeProvider, ThebeLoaderAndServer, useComputeOptions, } from '@curvenote/bridge-jupyter';
|
|
3
|
+
export function ComputeProvider({ children, article, }) {
|
|
4
|
+
const compute = useComputeOptions();
|
|
5
|
+
return (_jsx(ThebeLoaderAndServer, { connect: false, children: _jsx(ExecuteScopeProvider, { enable: compute?.enabled ?? false, contents: article, children: children }) }));
|
|
6
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ThebeServer } from 'thebe-core';
|
|
2
|
+
/**
|
|
3
|
+
* @param serviceUrl (string) e.g. https://spyglass.hhmi.2i2c.cloud, https://sproxy.curvenote.dev;
|
|
4
|
+
* @param serviceTitle (string) e.g. 'Spyglass', 'Curvenote';
|
|
5
|
+
* @returns
|
|
6
|
+
*/
|
|
7
|
+
export declare const jupyterHubStreamingConnectFnFactory: ({ serviceUrl, clientProxyUrl, serviceTitle, gitPullerTargetPath, }: {
|
|
8
|
+
serviceUrl: string;
|
|
9
|
+
clientProxyUrl?: string;
|
|
10
|
+
serviceTitle?: string;
|
|
11
|
+
gitPullerTargetPath?: string;
|
|
12
|
+
}) => (server: ThebeServer) => Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* @param serviceUrl (string) e.g. https://spyglass.hhmi.2i2c.cloud, https://sproxy.curvenote.dev;
|
|
15
|
+
* @param serviceTitle (string) e.g. 'Spyglass', 'Curvenote';
|
|
16
|
+
* @returns
|
|
17
|
+
*/
|
|
18
|
+
export declare const jupyterHubConnectFnFactory: ({ serviceUrl, clientProxyUrl, serviceTitle, gitPullerTargetPath, }: {
|
|
19
|
+
serviceUrl: string;
|
|
20
|
+
clientProxyUrl?: string;
|
|
21
|
+
serviceTitle?: string;
|
|
22
|
+
gitPullerTargetPath?: string;
|
|
23
|
+
}) => (server: ThebeServer) => Promise<void>;
|
|
24
|
+
//# sourceMappingURL=connect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../../src/components/providers/connect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;GAIG;AACH,eAAO,MAAM,mCAAmC,GAAI,oEAKjD;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,MACoD,QAAQ,WAAW,kBA6JvE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,GAAI,oEAKxC;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,MAC2C,QAAQ,WAAW,kBAwE9D,CAAC"}
|