@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.
Files changed (250) hide show
  1. package/dist/components/index.d.ts +4 -0
  2. package/dist/components/index.d.ts.map +1 -0
  3. package/dist/components/index.js +3 -0
  4. package/dist/components/layout/app-layout.d.ts +8 -0
  5. package/dist/components/layout/app-layout.d.ts.map +1 -0
  6. package/dist/components/layout/app-layout.js +24 -0
  7. package/dist/components/layout/app-sidebar.d.ts +2 -0
  8. package/dist/components/layout/app-sidebar.d.ts.map +1 -0
  9. package/dist/components/layout/app-sidebar.js +125 -0
  10. package/dist/components/layout/article-layout.d.ts +8 -0
  11. package/dist/components/layout/article-layout.d.ts.map +1 -0
  12. package/dist/components/layout/article-layout.js +20 -0
  13. package/dist/components/layout/grid.d.ts +2 -0
  14. package/dist/components/layout/grid.d.ts.map +1 -0
  15. package/dist/components/layout/grid.js +4 -0
  16. package/dist/components/layout/header.d.ts +5 -0
  17. package/dist/components/layout/header.d.ts.map +1 -0
  18. package/dist/components/layout/header.js +5 -0
  19. package/dist/components/layout/index.d.ts +7 -0
  20. package/dist/components/layout/index.d.ts.map +1 -0
  21. package/dist/components/layout/index.js +7 -0
  22. package/dist/components/layout/loading-bar.d.ts +12 -0
  23. package/dist/components/layout/loading-bar.d.ts.map +1 -0
  24. package/dist/components/layout/loading-bar.js +53 -0
  25. package/dist/components/layout/site-header.d.ts +8 -0
  26. package/dist/components/layout/site-header.d.ts.map +1 -0
  27. package/dist/components/layout/site-header.js +55 -0
  28. package/dist/components/layout/types.d.ts +6 -0
  29. package/dist/components/layout/types.d.ts.map +1 -0
  30. package/dist/components/layout/types.js +1 -0
  31. package/dist/components/providers/compute.d.ts +5 -0
  32. package/dist/components/providers/compute.d.ts.map +1 -0
  33. package/dist/components/providers/compute.js +6 -0
  34. package/dist/components/providers/connect.d.ts +24 -0
  35. package/dist/components/providers/connect.d.ts.map +1 -0
  36. package/dist/components/providers/connect.js +208 -0
  37. package/dist/components/providers/curvenote-providers.d.ts +52 -0
  38. package/dist/components/providers/curvenote-providers.d.ts.map +1 -0
  39. package/dist/components/providers/curvenote-providers.js +199 -0
  40. package/dist/components/providers/design.d.ts +39 -0
  41. package/dist/components/providers/design.d.ts.map +1 -0
  42. package/dist/components/providers/design.js +50 -0
  43. package/dist/components/providers/index.d.ts +10 -0
  44. package/dist/components/providers/index.d.ts.map +1 -0
  45. package/dist/components/providers/index.js +12 -0
  46. package/dist/components/providers/lightbox-provider.d.ts +31 -0
  47. package/dist/components/providers/lightbox-provider.d.ts.map +1 -0
  48. package/dist/components/providers/lightbox-provider.js +109 -0
  49. package/dist/components/providers/myst-providers.d.ts +6 -0
  50. package/dist/components/providers/myst-providers.d.ts.map +1 -0
  51. package/dist/components/providers/myst-providers.js +29 -0
  52. package/dist/components/providers/page-providers.d.ts +15 -0
  53. package/dist/components/providers/page-providers.d.ts.map +1 -0
  54. package/dist/components/providers/page-providers.js +28 -0
  55. package/dist/components/providers/ping-boundary.d.ts +40 -0
  56. package/dist/components/providers/ping-boundary.d.ts.map +1 -0
  57. package/dist/components/providers/ping-boundary.js +115 -0
  58. package/dist/components/providers/platform-providers.d.ts +18 -0
  59. package/dist/components/providers/platform-providers.d.ts.map +1 -0
  60. package/dist/components/providers/platform-providers.js +29 -0
  61. package/dist/components/providers/types.d.ts +30 -0
  62. package/dist/components/providers/types.d.ts.map +1 -0
  63. package/dist/components/providers/types.js +1 -0
  64. package/dist/components/ui/Callout.d.ts +10 -0
  65. package/dist/components/ui/Callout.d.ts.map +1 -0
  66. package/dist/components/ui/Callout.js +7 -0
  67. package/dist/components/ui/PageCards.d.ts +2 -0
  68. package/dist/components/ui/PageCards.d.ts.map +1 -0
  69. package/dist/components/ui/PageCards.js +11 -0
  70. package/dist/components/ui/abbreviations.d.ts +5 -0
  71. package/dist/components/ui/abbreviations.d.ts.map +1 -0
  72. package/dist/components/ui/abbreviations.js +31 -0
  73. package/dist/components/ui/abstract.d.ts +8 -0
  74. package/dist/components/ui/abstract.d.ts.map +1 -0
  75. package/dist/components/ui/abstract.js +9 -0
  76. package/dist/components/ui/accessibility-skip-to.d.ts +15 -0
  77. package/dist/components/ui/accessibility-skip-to.d.ts.map +1 -0
  78. package/dist/components/ui/accessibility-skip-to.js +31 -0
  79. package/dist/components/ui/acknowledgements.d.ts +4 -0
  80. package/dist/components/ui/acknowledgements.d.ts.map +1 -0
  81. package/dist/components/ui/acknowledgements.js +20 -0
  82. package/dist/components/ui/article-actions-downloads.d.ts +26 -0
  83. package/dist/components/ui/article-actions-downloads.d.ts.map +1 -0
  84. package/dist/components/ui/article-actions-downloads.js +143 -0
  85. package/dist/components/ui/article-actions-dropdown.d.ts +5 -0
  86. package/dist/components/ui/article-actions-dropdown.d.ts.map +1 -0
  87. package/dist/components/ui/article-actions-dropdown.js +68 -0
  88. package/dist/components/ui/article-actions-share.d.ts +5 -0
  89. package/dist/components/ui/article-actions-share.d.ts.map +1 -0
  90. package/dist/components/ui/article-actions-share.js +52 -0
  91. package/dist/components/ui/article-actions.d.ts +2 -0
  92. package/dist/components/ui/article-actions.d.ts.map +1 -0
  93. package/dist/components/ui/article-actions.js +20 -0
  94. package/dist/components/ui/article-bar.d.ts +8 -0
  95. package/dist/components/ui/article-bar.d.ts.map +1 -0
  96. package/dist/components/ui/article-bar.js +32 -0
  97. package/dist/components/ui/article-card.d.ts +12 -0
  98. package/dist/components/ui/article-card.d.ts.map +1 -0
  99. package/dist/components/ui/article-card.js +22 -0
  100. package/dist/components/ui/article-footer.d.ts +2 -0
  101. package/dist/components/ui/article-footer.d.ts.map +1 -0
  102. package/dist/components/ui/article-footer.js +7 -0
  103. package/dist/components/ui/author-popover.d.ts +7 -0
  104. package/dist/components/ui/author-popover.d.ts.map +1 -0
  105. package/dist/components/ui/author-popover.js +36 -0
  106. package/dist/components/ui/backmatter.d.ts +9 -0
  107. package/dist/components/ui/backmatter.d.ts.map +1 -0
  108. package/dist/components/ui/backmatter.js +49 -0
  109. package/dist/components/ui/badge.d.ts +10 -0
  110. package/dist/components/ui/badge.d.ts.map +1 -0
  111. package/dist/components/ui/badge.js +23 -0
  112. package/dist/components/ui/banner.d.ts +7 -0
  113. package/dist/components/ui/banner.d.ts.map +1 -0
  114. package/dist/components/ui/banner.js +44 -0
  115. package/dist/components/ui/bibliography.d.ts +6 -0
  116. package/dist/components/ui/bibliography.d.ts.map +1 -0
  117. package/dist/components/ui/bibliography.js +20 -0
  118. package/dist/components/ui/breadcrumb.d.ts +12 -0
  119. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  120. package/dist/components/ui/breadcrumb.js +28 -0
  121. package/dist/components/ui/button.d.ts +11 -0
  122. package/dist/components/ui/button.d.ts.map +1 -0
  123. package/dist/components/ui/button.js +33 -0
  124. package/dist/components/ui/citation.d.ts +7 -0
  125. package/dist/components/ui/citation.d.ts.map +1 -0
  126. package/dist/components/ui/citation.js +99 -0
  127. package/dist/components/ui/collapsible.d.ts +6 -0
  128. package/dist/components/ui/collapsible.d.ts.map +1 -0
  129. package/dist/components/ui/collapsible.js +12 -0
  130. package/dist/components/ui/cookie-banner.d.ts +8 -0
  131. package/dist/components/ui/cookie-banner.d.ts.map +1 -0
  132. package/dist/components/ui/cookie-banner.js +31 -0
  133. package/dist/components/ui/data-availability.d.ts +4 -0
  134. package/dist/components/ui/data-availability.d.ts.map +1 -0
  135. package/dist/components/ui/data-availability.js +20 -0
  136. package/dist/components/ui/dialog.d.ts +16 -0
  137. package/dist/components/ui/dialog.d.ts.map +1 -0
  138. package/dist/components/ui/dialog.js +36 -0
  139. package/dist/components/ui/document-outline.d.ts +8 -0
  140. package/dist/components/ui/document-outline.d.ts.map +1 -0
  141. package/dist/components/ui/document-outline.js +168 -0
  142. package/dist/components/ui/dropdown-menu.d.ts +26 -0
  143. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  144. package/dist/components/ui/dropdown-menu.js +51 -0
  145. package/dist/components/ui/error-page.d.ts +9 -0
  146. package/dist/components/ui/error-page.d.ts.map +1 -0
  147. package/dist/components/ui/error-page.js +21 -0
  148. package/dist/components/ui/footer-links.d.ts +14 -0
  149. package/dist/components/ui/footer-links.d.ts.map +1 -0
  150. package/dist/components/ui/footer-links.js +18 -0
  151. package/dist/components/ui/footnotes.d.ts +4 -0
  152. package/dist/components/ui/footnotes.d.ts.map +1 -0
  153. package/dist/components/ui/footnotes.js +30 -0
  154. package/dist/components/ui/frontmatter-badges.d.ts +27 -0
  155. package/dist/components/ui/frontmatter-badges.d.ts.map +1 -0
  156. package/dist/components/ui/frontmatter-badges.js +60 -0
  157. package/dist/components/ui/frontmatter.d.ts +7 -0
  158. package/dist/components/ui/frontmatter.d.ts.map +1 -0
  159. package/dist/components/ui/frontmatter.js +6 -0
  160. package/dist/components/ui/image.d.ts +34 -0
  161. package/dist/components/ui/image.d.ts.map +1 -0
  162. package/dist/components/ui/image.js +83 -0
  163. package/dist/components/ui/index.d.ts +50 -0
  164. package/dist/components/ui/index.d.ts.map +1 -0
  165. package/dist/components/ui/index.js +56 -0
  166. package/dist/components/ui/input.d.ts +4 -0
  167. package/dist/components/ui/input.d.ts.map +1 -0
  168. package/dist/components/ui/input.js +7 -0
  169. package/dist/components/ui/license-description.d.ts +4 -0
  170. package/dist/components/ui/license-description.d.ts.map +1 -0
  171. package/dist/components/ui/license-description.js +63 -0
  172. package/dist/components/ui/license-frontmatter.d.ts +22 -0
  173. package/dist/components/ui/license-frontmatter.d.ts.map +1 -0
  174. package/dist/components/ui/license-frontmatter.js +37 -0
  175. package/dist/components/ui/lightbox-container.d.ts +11 -0
  176. package/dist/components/ui/lightbox-container.d.ts.map +1 -0
  177. package/dist/components/ui/lightbox-container.js +13 -0
  178. package/dist/components/ui/lightbox.d.ts +17 -0
  179. package/dist/components/ui/lightbox.d.ts.map +1 -0
  180. package/dist/components/ui/lightbox.js +129 -0
  181. package/dist/components/ui/link-card.d.ts +15 -0
  182. package/dist/components/ui/link-card.d.ts.map +1 -0
  183. package/dist/components/ui/link-card.js +28 -0
  184. package/dist/components/ui/popover.d.ts +8 -0
  185. package/dist/components/ui/popover.d.ts.map +1 -0
  186. package/dist/components/ui/popover.js +17 -0
  187. package/dist/components/ui/search.d.ts +9 -0
  188. package/dist/components/ui/search.d.ts.map +1 -0
  189. package/dist/components/ui/search.js +290 -0
  190. package/dist/components/ui/separator.d.ts +5 -0
  191. package/dist/components/ui/separator.d.ts.map +1 -0
  192. package/dist/components/ui/separator.js +8 -0
  193. package/dist/components/ui/sheet.d.ts +14 -0
  194. package/dist/components/ui/sheet.d.ts.map +1 -0
  195. package/dist/components/ui/sheet.js +40 -0
  196. package/dist/components/ui/sidebar.d.ts +67 -0
  197. package/dist/components/ui/sidebar.d.ts.map +1 -0
  198. package/dist/components/ui/sidebar.js +202 -0
  199. package/dist/components/ui/skeleton.d.ts +3 -0
  200. package/dist/components/ui/skeleton.d.ts.map +1 -0
  201. package/dist/components/ui/skeleton.js +6 -0
  202. package/dist/components/ui/sonner.d.ts +5 -0
  203. package/dist/components/ui/sonner.d.ts.map +1 -0
  204. package/dist/components/ui/sonner.js +13 -0
  205. package/dist/components/ui/theme-button.d.ts +2 -0
  206. package/dist/components/ui/theme-button.d.ts.map +1 -0
  207. package/dist/components/ui/theme-button.js +9 -0
  208. package/dist/components/ui/tooltip.d.ts +13 -0
  209. package/dist/components/ui/tooltip.d.ts.map +1 -0
  210. package/dist/components/ui/tooltip.js +20 -0
  211. package/dist/components/ui/types.d.ts +11 -0
  212. package/dist/components/ui/types.d.ts.map +1 -0
  213. package/dist/components/ui/types.js +10 -0
  214. package/dist/hooks/index.d.ts +5 -0
  215. package/dist/hooks/index.d.ts.map +1 -0
  216. package/dist/hooks/index.js +4 -0
  217. package/dist/hooks/use-hydrated.d.ts +2 -0
  218. package/dist/hooks/use-hydrated.d.ts.map +1 -0
  219. package/dist/hooks/use-hydrated.js +6 -0
  220. package/dist/hooks/use-image-load.d.ts +14 -0
  221. package/dist/hooks/use-image-load.d.ts.map +1 -0
  222. package/dist/hooks/use-image-load.js +41 -0
  223. package/dist/hooks/use-mobile.d.ts +2 -0
  224. package/dist/hooks/use-mobile.d.ts.map +1 -0
  225. package/dist/hooks/use-mobile.js +15 -0
  226. package/dist/hooks/use-theme.d.ts +6 -0
  227. package/dist/hooks/use-theme.d.ts.map +1 -0
  228. package/dist/hooks/use-theme.js +23 -0
  229. package/dist/index.d.ts +6 -0
  230. package/dist/index.d.ts.map +1 -0
  231. package/dist/index.js +5 -0
  232. package/dist/lib/checkMecaExport.d.ts +5 -0
  233. package/dist/lib/checkMecaExport.d.ts.map +1 -0
  234. package/dist/lib/checkMecaExport.js +4 -0
  235. package/dist/lib/index.d.ts +6 -0
  236. package/dist/lib/index.d.ts.map +1 -0
  237. package/dist/lib/index.js +6 -0
  238. package/dist/lib/knownParts.d.ts +12 -0
  239. package/dist/lib/knownParts.d.ts.map +1 -0
  240. package/dist/lib/knownParts.js +14 -0
  241. package/dist/lib/links.d.ts +3 -0
  242. package/dist/lib/links.d.ts.map +1 -0
  243. package/dist/lib/links.js +7 -0
  244. package/dist/lib/parse-date.d.ts +2 -0
  245. package/dist/lib/parse-date.d.ts.map +1 -0
  246. package/dist/lib/parse-date.js +7 -0
  247. package/dist/lib/utils.d.ts +3 -0
  248. package/dist/lib/utils.d.ts.map +1 -0
  249. package/dist/lib/utils.js +5 -0
  250. package/package.json +67 -0
@@ -0,0 +1,4 @@
1
+ export * from './layout';
2
+ export * from './providers';
3
+ export * from './ui';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export * from './layout';
2
+ export * from './providers';
3
+ export * from './ui';
@@ -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,2 @@
1
+ export declare function AppSidebar(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=app-sidebar.d.ts.map
@@ -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,2 @@
1
+ export declare function GridLayout(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=grid.d.ts.map
@@ -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,5 @@
1
+ export declare function HeaderContainer({ brandBar, children, }: {
2
+ brandBar?: React.ReactNode;
3
+ children: React.ReactNode;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=header.d.ts.map
@@ -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,7 @@
1
+ export * from './app-layout';
2
+ export * from './app-sidebar';
3
+ export * from './article-layout';
4
+ export * from './site-header';
5
+ export * from './loading-bar';
6
+ export * from './grid';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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,7 @@
1
+ // Layout Components
2
+ export * from './app-layout';
3
+ export * from './app-sidebar';
4
+ export * from './article-layout';
5
+ export * from './site-header';
6
+ export * from './loading-bar';
7
+ export * from './grid';
@@ -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,6 @@
1
+ export interface LayoutProps {
2
+ children: React.ReactNode;
3
+ header?: React.ReactNode;
4
+ footer?: React.ReactNode;
5
+ }
6
+ //# sourceMappingURL=types.d.ts.map
@@ -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,5 @@
1
+ export declare function ComputeProvider({ children, article, }: {
2
+ children: React.ReactNode;
3
+ article: any;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=compute.d.ts.map
@@ -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"}