mordoc 0.1.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 (243) hide show
  1. package/README.md +240 -0
  2. package/bin/cli.js +81 -0
  3. package/dist/build/Builder.d.ts +91 -0
  4. package/dist/build/Builder.d.ts.map +1 -0
  5. package/dist/build/Builder.js +391 -0
  6. package/dist/build/Builder.js.map +1 -0
  7. package/dist/build/ClientBundler.d.ts +36 -0
  8. package/dist/build/ClientBundler.d.ts.map +1 -0
  9. package/dist/build/ClientBundler.js +132 -0
  10. package/dist/build/ClientBundler.js.map +1 -0
  11. package/dist/build/HtmlGenerator.d.ts +46 -0
  12. package/dist/build/HtmlGenerator.d.ts.map +1 -0
  13. package/dist/build/HtmlGenerator.js +200 -0
  14. package/dist/build/HtmlGenerator.js.map +1 -0
  15. package/dist/build/SearchIndexer.d.ts +31 -0
  16. package/dist/build/SearchIndexer.d.ts.map +1 -0
  17. package/dist/build/SearchIndexer.js +116 -0
  18. package/dist/build/SearchIndexer.js.map +1 -0
  19. package/dist/cli/build.d.ts +20 -0
  20. package/dist/cli/build.d.ts.map +1 -0
  21. package/dist/cli/build.js +111 -0
  22. package/dist/cli/build.js.map +1 -0
  23. package/dist/cli/create-app.d.ts +14 -0
  24. package/dist/cli/create-app.d.ts.map +1 -0
  25. package/dist/cli/create-app.js +216 -0
  26. package/dist/cli/create-app.js.map +1 -0
  27. package/dist/cli/dev.d.ts +20 -0
  28. package/dist/cli/dev.d.ts.map +1 -0
  29. package/dist/cli/dev.js +169 -0
  30. package/dist/cli/dev.js.map +1 -0
  31. package/dist/client/App.d.ts +17 -0
  32. package/dist/client/App.d.ts.map +1 -0
  33. package/dist/client/App.js +94 -0
  34. package/dist/client/App.js.map +1 -0
  35. package/dist/client/contexts/ConfigContext.d.ts +22 -0
  36. package/dist/client/contexts/ConfigContext.d.ts.map +1 -0
  37. package/dist/client/contexts/ConfigContext.js +27 -0
  38. package/dist/client/contexts/ConfigContext.js.map +1 -0
  39. package/dist/client/contexts/ContentContext.d.ts +31 -0
  40. package/dist/client/contexts/ContentContext.d.ts.map +1 -0
  41. package/dist/client/contexts/ContentContext.js +46 -0
  42. package/dist/client/contexts/ContentContext.js.map +1 -0
  43. package/dist/client/contexts/SearchContext.d.ts +38 -0
  44. package/dist/client/contexts/SearchContext.d.ts.map +1 -0
  45. package/dist/client/contexts/SearchContext.js +207 -0
  46. package/dist/client/contexts/SearchContext.js.map +1 -0
  47. package/dist/client/contexts/ThemeContext.d.ts +23 -0
  48. package/dist/client/contexts/ThemeContext.d.ts.map +1 -0
  49. package/dist/client/contexts/ThemeContext.js +62 -0
  50. package/dist/client/contexts/ThemeContext.js.map +1 -0
  51. package/dist/client/hooks/useContent.d.ts +12 -0
  52. package/dist/client/hooks/useContent.d.ts.map +1 -0
  53. package/dist/client/hooks/useContent.js +74 -0
  54. package/dist/client/hooks/useContent.js.map +1 -0
  55. package/dist/client/hooks/useNavigation.d.ts +15 -0
  56. package/dist/client/hooks/useNavigation.d.ts.map +1 -0
  57. package/dist/client/hooks/useNavigation.js +101 -0
  58. package/dist/client/hooks/useNavigation.js.map +1 -0
  59. package/dist/client/hooks/useSearch.d.ts +22 -0
  60. package/dist/client/hooks/useSearch.d.ts.map +1 -0
  61. package/dist/client/hooks/useSearch.js +64 -0
  62. package/dist/client/hooks/useSearch.js.map +1 -0
  63. package/dist/client/main.d.ts +5 -0
  64. package/dist/client/main.d.ts.map +1 -0
  65. package/dist/client/main.js +66 -0
  66. package/dist/client/main.js.map +1 -0
  67. package/dist/components/Callout.d.ts +9 -0
  68. package/dist/components/Callout.d.ts.map +1 -0
  69. package/dist/components/Callout.js +24 -0
  70. package/dist/components/Callout.js.map +1 -0
  71. package/dist/components/Card.d.ts +10 -0
  72. package/dist/components/Card.d.ts.map +1 -0
  73. package/dist/components/Card.js +15 -0
  74. package/dist/components/Card.js.map +1 -0
  75. package/dist/components/CardGrid.d.ts +8 -0
  76. package/dist/components/CardGrid.d.ts.map +1 -0
  77. package/dist/components/CardGrid.js +9 -0
  78. package/dist/components/CardGrid.js.map +1 -0
  79. package/dist/components/CodeBlock.d.ts +24 -0
  80. package/dist/components/CodeBlock.d.ts.map +1 -0
  81. package/dist/components/CodeBlock.js +76 -0
  82. package/dist/components/CodeBlock.js.map +1 -0
  83. package/dist/components/ContentPage.d.ts +9 -0
  84. package/dist/components/ContentPage.d.ts.map +1 -0
  85. package/dist/components/ContentPage.js +36 -0
  86. package/dist/components/ContentPage.js.map +1 -0
  87. package/dist/components/Header.d.ts +14 -0
  88. package/dist/components/Header.d.ts.map +1 -0
  89. package/dist/components/Header.js +30 -0
  90. package/dist/components/Header.js.map +1 -0
  91. package/dist/components/Heading.d.ts +16 -0
  92. package/dist/components/Heading.d.ts.map +1 -0
  93. package/dist/components/Heading.js +31 -0
  94. package/dist/components/Heading.js.map +1 -0
  95. package/dist/components/Image.d.ts +8 -0
  96. package/dist/components/Image.d.ts.map +1 -0
  97. package/dist/components/Image.js +24 -0
  98. package/dist/components/Image.js.map +1 -0
  99. package/dist/components/Layout.d.ts +14 -0
  100. package/dist/components/Layout.d.ts.map +1 -0
  101. package/dist/components/Layout.js +32 -0
  102. package/dist/components/Layout.js.map +1 -0
  103. package/dist/components/MarkdocRenderer.d.ts +15 -0
  104. package/dist/components/MarkdocRenderer.d.ts.map +1 -0
  105. package/dist/components/MarkdocRenderer.js +73 -0
  106. package/dist/components/MarkdocRenderer.js.map +1 -0
  107. package/dist/components/MobileMenu.d.ts +14 -0
  108. package/dist/components/MobileMenu.d.ts.map +1 -0
  109. package/dist/components/MobileMenu.js +45 -0
  110. package/dist/components/MobileMenu.js.map +1 -0
  111. package/dist/components/PageNavigation.d.ts +9 -0
  112. package/dist/components/PageNavigation.d.ts.map +1 -0
  113. package/dist/components/PageNavigation.js +23 -0
  114. package/dist/components/PageNavigation.js.map +1 -0
  115. package/dist/components/SearchModal.d.ts +9 -0
  116. package/dist/components/SearchModal.d.ts.map +1 -0
  117. package/dist/components/SearchModal.js +74 -0
  118. package/dist/components/SearchModal.js.map +1 -0
  119. package/dist/components/SideNav.d.ts +9 -0
  120. package/dist/components/SideNav.d.ts.map +1 -0
  121. package/dist/components/SideNav.js +66 -0
  122. package/dist/components/SideNav.js.map +1 -0
  123. package/dist/components/TableOfContents.d.ts +10 -0
  124. package/dist/components/TableOfContents.d.ts.map +1 -0
  125. package/dist/components/TableOfContents.js +151 -0
  126. package/dist/components/TableOfContents.js.map +1 -0
  127. package/dist/config/ConfigLoader.d.ts +50 -0
  128. package/dist/config/ConfigLoader.d.ts.map +1 -0
  129. package/dist/config/ConfigLoader.js +214 -0
  130. package/dist/config/ConfigLoader.js.map +1 -0
  131. package/dist/config/StyleCompiler.d.ts +17 -0
  132. package/dist/config/StyleCompiler.d.ts.map +1 -0
  133. package/dist/config/StyleCompiler.js +116 -0
  134. package/dist/config/StyleCompiler.js.map +1 -0
  135. package/dist/config/ThemeGenerator.d.ts +14 -0
  136. package/dist/config/ThemeGenerator.d.ts.map +1 -0
  137. package/dist/config/ThemeGenerator.js +129 -0
  138. package/dist/config/ThemeGenerator.js.map +1 -0
  139. package/dist/content/ContentLoader.d.ts +70 -0
  140. package/dist/content/ContentLoader.d.ts.map +1 -0
  141. package/dist/content/ContentLoader.js +146 -0
  142. package/dist/content/ContentLoader.js.map +1 -0
  143. package/dist/content/ContentProcessor.d.ts +84 -0
  144. package/dist/content/ContentProcessor.d.ts.map +1 -0
  145. package/dist/content/ContentProcessor.js +380 -0
  146. package/dist/content/ContentProcessor.js.map +1 -0
  147. package/dist/content/RouteManager.d.ts +69 -0
  148. package/dist/content/RouteManager.d.ts.map +1 -0
  149. package/dist/content/RouteManager.js +143 -0
  150. package/dist/content/RouteManager.js.map +1 -0
  151. package/dist/styles/components/callout.d.ts +11 -0
  152. package/dist/styles/components/callout.d.ts.map +1 -0
  153. package/dist/styles/components/callout.js +83 -0
  154. package/dist/styles/components/callout.js.map +1 -0
  155. package/dist/styles/components/card.d.ts +11 -0
  156. package/dist/styles/components/card.d.ts.map +1 -0
  157. package/dist/styles/components/card.js +179 -0
  158. package/dist/styles/components/card.js.map +1 -0
  159. package/dist/styles/components/codeblock.d.ts +11 -0
  160. package/dist/styles/components/codeblock.d.ts.map +1 -0
  161. package/dist/styles/components/codeblock.js +249 -0
  162. package/dist/styles/components/codeblock.js.map +1 -0
  163. package/dist/styles/components/content.d.ts +11 -0
  164. package/dist/styles/components/content.d.ts.map +1 -0
  165. package/dist/styles/components/content.js +198 -0
  166. package/dist/styles/components/content.js.map +1 -0
  167. package/dist/styles/components/fonts.d.ts +11 -0
  168. package/dist/styles/components/fonts.d.ts.map +1 -0
  169. package/dist/styles/components/fonts.js +34 -0
  170. package/dist/styles/components/fonts.js.map +1 -0
  171. package/dist/styles/components/header.d.ts +11 -0
  172. package/dist/styles/components/header.d.ts.map +1 -0
  173. package/dist/styles/components/header.js +293 -0
  174. package/dist/styles/components/header.js.map +1 -0
  175. package/dist/styles/components/heading.d.ts +11 -0
  176. package/dist/styles/components/heading.d.ts.map +1 -0
  177. package/dist/styles/components/heading.js +115 -0
  178. package/dist/styles/components/heading.js.map +1 -0
  179. package/dist/styles/components/layout.d.ts +11 -0
  180. package/dist/styles/components/layout.d.ts.map +1 -0
  181. package/dist/styles/components/layout.js +79 -0
  182. package/dist/styles/components/layout.js.map +1 -0
  183. package/dist/styles/components/mobilemenu.d.ts +11 -0
  184. package/dist/styles/components/mobilemenu.d.ts.map +1 -0
  185. package/dist/styles/components/mobilemenu.js +112 -0
  186. package/dist/styles/components/mobilemenu.js.map +1 -0
  187. package/dist/styles/components/reset.d.ts +11 -0
  188. package/dist/styles/components/reset.d.ts.map +1 -0
  189. package/dist/styles/components/reset.js +131 -0
  190. package/dist/styles/components/reset.js.map +1 -0
  191. package/dist/styles/components/searchmodal.d.ts +11 -0
  192. package/dist/styles/components/searchmodal.d.ts.map +1 -0
  193. package/dist/styles/components/searchmodal.js +333 -0
  194. package/dist/styles/components/searchmodal.js.map +1 -0
  195. package/dist/styles/components/sidenav.d.ts +11 -0
  196. package/dist/styles/components/sidenav.d.ts.map +1 -0
  197. package/dist/styles/components/sidenav.js +209 -0
  198. package/dist/styles/components/sidenav.js.map +1 -0
  199. package/dist/styles/components/toc.d.ts +11 -0
  200. package/dist/styles/components/toc.d.ts.map +1 -0
  201. package/dist/styles/components/toc.js +112 -0
  202. package/dist/styles/components/toc.js.map +1 -0
  203. package/dist/styles/components/typography.d.ts +11 -0
  204. package/dist/styles/components/typography.d.ts.map +1 -0
  205. package/dist/styles/components/typography.js +247 -0
  206. package/dist/styles/components/typography.js.map +1 -0
  207. package/dist/styles/components/utility.d.ts +11 -0
  208. package/dist/styles/components/utility.d.ts.map +1 -0
  209. package/dist/styles/components/utility.js +231 -0
  210. package/dist/styles/components/utility.js.map +1 -0
  211. package/dist/styles/types.d.ts +79 -0
  212. package/dist/styles/types.d.ts.map +1 -0
  213. package/dist/styles/types.js +7 -0
  214. package/dist/styles/types.js.map +1 -0
  215. package/dist/styles/utils.d.ts +21 -0
  216. package/dist/styles/utils.d.ts.map +1 -0
  217. package/dist/styles/utils.js +50 -0
  218. package/dist/styles/utils.js.map +1 -0
  219. package/dist/styles/variables/main.d.ts +15 -0
  220. package/dist/styles/variables/main.d.ts.map +1 -0
  221. package/dist/styles/variables/main.js +116 -0
  222. package/dist/styles/variables/main.js.map +1 -0
  223. package/dist/types/config.d.ts +43 -0
  224. package/dist/types/config.d.ts.map +1 -0
  225. package/dist/types/config.js +7 -0
  226. package/dist/types/config.js.map +1 -0
  227. package/dist/types/content.d.ts +46 -0
  228. package/dist/types/content.d.ts.map +1 -0
  229. package/dist/types/content.js +7 -0
  230. package/dist/types/content.js.map +1 -0
  231. package/dist/types/navigation.d.ts +45 -0
  232. package/dist/types/navigation.d.ts.map +1 -0
  233. package/dist/types/navigation.js +7 -0
  234. package/dist/types/navigation.js.map +1 -0
  235. package/dist/utils/language-utils.d.ts +41 -0
  236. package/dist/utils/language-utils.d.ts.map +1 -0
  237. package/dist/utils/language-utils.js +79 -0
  238. package/dist/utils/language-utils.js.map +1 -0
  239. package/dist/utils/slugify.d.ts +20 -0
  240. package/dist/utils/slugify.d.ts.map +1 -0
  241. package/dist/utils/slugify.js +44 -0
  242. package/dist/utils/slugify.js.map +1 -0
  243. package/package.json +58 -0
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContentProvider = ContentProvider;
4
+ exports.useContent = useContent;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ /**
7
+ * ContentContext - Manages current page content and navigation state
8
+ */
9
+ const react_1 = require("react");
10
+ const ContentContext = (0, react_1.createContext)(undefined);
11
+ /**
12
+ * ContentProvider - Manages content and navigation state
13
+ */
14
+ function ContentProvider({ children, initialContent = null, initialNavigationContext = null }) {
15
+ const [currentContent, setCurrentContent] = (0, react_1.useState)(initialContent);
16
+ const [navigationContext, setNavigationContext] = (0, react_1.useState)(initialNavigationContext);
17
+ const [isLoading, setIsLoading] = (0, react_1.useState)(false);
18
+ const [error, setError] = (0, react_1.useState)(null);
19
+ const value = {
20
+ currentContent,
21
+ setCurrentContent: (0, react_1.useCallback)((content) => {
22
+ setCurrentContent(content);
23
+ setError(null);
24
+ }, []),
25
+ navigationContext,
26
+ setNavigationContext: (0, react_1.useCallback)((navContext) => {
27
+ setNavigationContext(navContext);
28
+ }, []),
29
+ isLoading,
30
+ setIsLoading,
31
+ error,
32
+ setError,
33
+ };
34
+ return ((0, jsx_runtime_1.jsx)(ContentContext.Provider, { value: value, children: children }));
35
+ }
36
+ /**
37
+ * useContent - Hook to access content state
38
+ */
39
+ function useContent() {
40
+ const context = (0, react_1.useContext)(ContentContext);
41
+ if (context === undefined) {
42
+ throw new Error('useContent must be used within a ContentProvider');
43
+ }
44
+ return context;
45
+ }
46
+ //# sourceMappingURL=ContentContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContentContext.js","sourceRoot":"","sources":["../../../src/client/contexts/ContentContext.tsx"],"names":[],"mappings":";;AAqCA,0CAiCC;AAKD,gCAQC;;AAnFD;;GAEG;AAEH,iCAA2F;AAsB3F,MAAM,cAAc,GAAG,IAAA,qBAAa,EAAkC,SAAS,CAAC,CAAC;AAQjF;;GAEG;AACH,SAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,cAAc,GAAG,IAAI,EACrB,wBAAwB,GAAG,IAAI,EACV;IACrB,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,IAAA,gBAAQ,EAA0B,cAAc,CAAC,CAAC;IAC9F,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,IAAA,gBAAQ,EACxD,wBAAwB,CACzB,CAAC;IACF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAe,IAAI,CAAC,CAAC;IAEvD,MAAM,KAAK,GAAwB;QACjC,cAAc;QACd,iBAAiB,EAAE,IAAA,mBAAW,EAAC,CAAC,OAAyB,EAAE,EAAE;YAC3D,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC,EAAE,EAAE,CAAC;QACN,iBAAiB;QACjB,oBAAoB,EAAE,IAAA,mBAAW,EAAC,CAAC,UAA6B,EAAE,EAAE;YAClE,oBAAoB,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC,EAAE,EAAE,CAAC;QACN,SAAS;QACT,YAAY;QACZ,KAAK;QACL,QAAQ;KACT,CAAC;IAEF,OAAO,CACL,uBAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAClC,QAAQ,GACe,CAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU;IACxB,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,cAAc,CAAC,CAAC;IAE3C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * SearchContext - Manages search state and functionality
3
+ */
4
+ import { ReactNode } from 'react';
5
+ export interface SearchResult {
6
+ id: string;
7
+ url: string;
8
+ title: string;
9
+ excerpt: string;
10
+ score: number;
11
+ }
12
+ interface SearchContextValue {
13
+ query: string;
14
+ setQuery: (query: string) => void;
15
+ results: SearchResult[];
16
+ setResults: (results: SearchResult[]) => void;
17
+ isOpen: boolean;
18
+ openSearch: () => void;
19
+ closeSearch: () => void;
20
+ toggleSearch: () => void;
21
+ isSearching: boolean;
22
+ setIsSearching: (searching: boolean) => void;
23
+ search: (searchQuery: string) => Promise<void>;
24
+ clearSearch: () => void;
25
+ }
26
+ interface SearchProviderProps {
27
+ children: ReactNode;
28
+ }
29
+ /**
30
+ * SearchProvider - Manages search state and modal
31
+ */
32
+ export declare function SearchProvider({ children }: SearchProviderProps): import("react/jsx-runtime").JSX.Element;
33
+ /**
34
+ * useSearch - Hook to access search state and functions
35
+ */
36
+ export declare function useSearch(): SearchContextValue;
37
+ export {};
38
+ //# sourceMappingURL=SearchContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchContext.d.ts","sourceRoot":"","sources":["../../../src/client/contexts/SearchContext.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAc,EAAuC,SAAS,EAAuB,MAAM,OAAO,CAAC;AAEnG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,kBAAkB;IAE1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAGlC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,UAAU,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC;IAG9C,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,YAAY,EAAE,MAAM,IAAI,CAAC;IAGzB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IAG7C,MAAM,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAG/C,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAID,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,SAAS,CAAC;CACrB;AA+DD;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,mBAAmB,2CAoL/D;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,kBAAkB,CAQ9C"}
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SearchProvider = SearchProvider;
37
+ exports.useSearch = useSearch;
38
+ const jsx_runtime_1 = require("react/jsx-runtime");
39
+ /**
40
+ * SearchContext - Manages search state and functionality
41
+ */
42
+ const react_1 = require("react");
43
+ const SearchContext = (0, react_1.createContext)(undefined);
44
+ /**
45
+ * SearchProvider - Manages search state and modal
46
+ */
47
+ function SearchProvider({ children }) {
48
+ const [query, setQuery] = (0, react_1.useState)('');
49
+ const [results, setResults] = (0, react_1.useState)([]);
50
+ const [isOpen, setIsOpen] = (0, react_1.useState)(false);
51
+ const [isSearching, setIsSearching] = (0, react_1.useState)(false);
52
+ // Cache Pagefind instance to avoid re-importing
53
+ const pagefindRef = (0, react_1.useRef)(null);
54
+ const pagefindLoadingRef = (0, react_1.useRef)(null);
55
+ const openSearch = (0, react_1.useCallback)(() => {
56
+ setIsOpen(true);
57
+ }, []);
58
+ const closeSearch = (0, react_1.useCallback)(() => {
59
+ setIsOpen(false);
60
+ }, []);
61
+ const toggleSearch = (0, react_1.useCallback)(() => {
62
+ setIsOpen(prev => !prev);
63
+ }, []);
64
+ const clearSearch = (0, react_1.useCallback)(() => {
65
+ setQuery('');
66
+ setResults([]);
67
+ }, []);
68
+ /**
69
+ * Load Pagefind instance (lazy loading)
70
+ */
71
+ const loadPagefind = (0, react_1.useCallback)(async () => {
72
+ // Return cached instance if available
73
+ if (pagefindRef.current) {
74
+ return pagefindRef.current;
75
+ }
76
+ // Return existing loading promise if already loading
77
+ if (pagefindLoadingRef.current) {
78
+ return pagefindLoadingRef.current;
79
+ }
80
+ // Start loading Pagefind
81
+ pagefindLoadingRef.current = (async () => {
82
+ try {
83
+ // Dynamically import Pagefind (generated at build time)
84
+ const pagefindPath = '/pagefind/pagefind.js';
85
+ const pagefindModule = await Promise.resolve(`${
86
+ /* webpackIgnore: true */
87
+ /* @vite-ignore */
88
+ pagefindPath}`).then(s => __importStar(require(s)));
89
+ const pagefind = (pagefindModule.default || pagefindModule);
90
+ // Configure Pagefind options (must be called before init)
91
+ if (pagefind.options) {
92
+ pagefind.options({
93
+ excerptLength: 10, // Set your desired excerpt length in words
94
+ });
95
+ }
96
+ // Initialize Pagefind (optional, but recommended)
97
+ if (pagefind.init) {
98
+ await pagefind.init();
99
+ }
100
+ // Cache the instance
101
+ pagefindRef.current = pagefind;
102
+ return pagefind;
103
+ }
104
+ catch (error) {
105
+ console.error('Failed to load Pagefind:', error);
106
+ console.warn('Search functionality is not available. Run "mordoc build" to generate search index.');
107
+ return null;
108
+ }
109
+ finally {
110
+ // Clear loading promise
111
+ pagefindLoadingRef.current = null;
112
+ }
113
+ })();
114
+ return pagefindLoadingRef.current;
115
+ }, []);
116
+ /**
117
+ * Perform search using Pagefind with two-tier approach
118
+ */
119
+ const search = (0, react_1.useCallback)(async (searchQuery) => {
120
+ if (!searchQuery.trim()) {
121
+ setResults([]);
122
+ return;
123
+ }
124
+ setIsSearching(true);
125
+ setQuery(searchQuery);
126
+ try {
127
+ const pagefind = await loadPagefind();
128
+ if (!pagefind) {
129
+ setResults([]);
130
+ return;
131
+ }
132
+ const trimmedQuery = searchQuery.trim();
133
+ const exactQuery = `"${trimmedQuery}"`;
134
+ const broadQuery = trimmedQuery;
135
+ // Perform both searches in parallel
136
+ const [exactResults, broadResults] = await Promise.all([
137
+ pagefind.search(exactQuery),
138
+ pagefind.search(broadQuery),
139
+ ]);
140
+ // Track exact match IDs for deduplication
141
+ const exactIds = new Set(exactResults.results.map(r => r.id));
142
+ // Process exact matches first
143
+ const exactProcessed = await Promise.all(exactResults.results.map(async (result) => {
144
+ const data = await result.data();
145
+ return {
146
+ id: result.id,
147
+ url: data.url,
148
+ title: data.meta.title || 'Untitled',
149
+ excerpt: data.excerpt || '',
150
+ score: result.score,
151
+ };
152
+ }));
153
+ // Process broad matches, excluding those already in exact results
154
+ const broadProcessed = await Promise.all(broadResults.results
155
+ .filter(result => !exactIds.has(result.id))
156
+ .map(async (result) => {
157
+ const data = await result.data();
158
+ return {
159
+ id: result.id,
160
+ url: data.url,
161
+ title: data.meta.title || 'Untitled',
162
+ excerpt: data.excerpt || '',
163
+ score: result.score,
164
+ };
165
+ }));
166
+ // Combine: exact matches first (sorted by score), then broad matches (sorted by score)
167
+ const combinedResults = [
168
+ ...exactProcessed.sort((a, b) => b.score - a.score),
169
+ ...broadProcessed.sort((a, b) => b.score - a.score),
170
+ ];
171
+ setResults(combinedResults);
172
+ }
173
+ catch (error) {
174
+ console.error('Search error:', error);
175
+ setResults([]);
176
+ }
177
+ finally {
178
+ setIsSearching(false);
179
+ }
180
+ }, [loadPagefind]);
181
+ const value = {
182
+ query,
183
+ setQuery,
184
+ results,
185
+ setResults,
186
+ isOpen,
187
+ openSearch,
188
+ closeSearch,
189
+ toggleSearch,
190
+ isSearching,
191
+ setIsSearching,
192
+ search,
193
+ clearSearch,
194
+ };
195
+ return ((0, jsx_runtime_1.jsx)(SearchContext.Provider, { value: value, children: children }));
196
+ }
197
+ /**
198
+ * useSearch - Hook to access search state and functions
199
+ */
200
+ function useSearch() {
201
+ const context = (0, react_1.useContext)(SearchContext);
202
+ if (context === undefined) {
203
+ throw new Error('useSearch must be used within a SearchProvider');
204
+ }
205
+ return context;
206
+ }
207
+ //# sourceMappingURL=SearchContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchContext.js","sourceRoot":"","sources":["../../../src/client/contexts/SearchContext.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * ThemeContext - Manages theme state (light/dark mode)
3
+ */
4
+ import { ReactNode } from 'react';
5
+ type Theme = 'light' | 'dark';
6
+ interface ThemeContextValue {
7
+ theme: Theme;
8
+ toggleTheme: () => void;
9
+ setTheme: (theme: Theme) => void;
10
+ }
11
+ interface ThemeProviderProps {
12
+ children: ReactNode;
13
+ }
14
+ /**
15
+ * ThemeProvider - Manages theme state and persistence
16
+ */
17
+ export declare function ThemeProvider({ children }: ThemeProviderProps): import("react/jsx-runtime").JSX.Element;
18
+ /**
19
+ * useTheme - Hook to access theme state and controls
20
+ */
21
+ export declare function useTheme(): ThemeContextValue;
22
+ export {};
23
+ //# sourceMappingURL=ThemeContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeContext.d.ts","sourceRoot":"","sources":["../../../src/client/contexts/ThemeContext.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAc,EAAkD,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzF,KAAK,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;AAE9B,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAID,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CAiD7D;AAED;;GAEG;AACH,wBAAgB,QAAQ,IAAI,iBAAiB,CAQ5C"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ThemeProvider = ThemeProvider;
4
+ exports.useTheme = useTheme;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ /**
7
+ * ThemeContext - Manages theme state (light/dark mode)
8
+ */
9
+ const react_1 = require("react");
10
+ const ThemeContext = (0, react_1.createContext)(undefined);
11
+ /**
12
+ * ThemeProvider - Manages theme state and persistence
13
+ */
14
+ function ThemeProvider({ children }) {
15
+ const [theme, setThemeState] = (0, react_1.useState)(() => {
16
+ // Server-side: Always return 'light' (default)
17
+ if (typeof window === 'undefined') {
18
+ return 'light';
19
+ }
20
+ // Client-side: Read from data-theme attribute (set by inline script)
21
+ const currentTheme = document.documentElement.getAttribute('data-theme');
22
+ if (currentTheme === 'light' || currentTheme === 'dark') {
23
+ return currentTheme;
24
+ }
25
+ // Fallback: Check localStorage
26
+ const stored = localStorage.getItem('theme');
27
+ if (stored === 'light' || stored === 'dark') {
28
+ return stored;
29
+ }
30
+ // Fall back to system preference
31
+ if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
32
+ return 'dark';
33
+ }
34
+ return 'light';
35
+ });
36
+ // Apply theme to document and save to localStorage
37
+ (0, react_1.useEffect)(() => {
38
+ if (typeof window === 'undefined')
39
+ return;
40
+ const root = document.documentElement;
41
+ root.setAttribute('data-theme', theme);
42
+ localStorage.setItem('theme', theme);
43
+ }, [theme]);
44
+ const toggleTheme = () => {
45
+ setThemeState(prev => prev === 'light' ? 'dark' : 'light');
46
+ };
47
+ const setTheme = (newTheme) => {
48
+ setThemeState(newTheme);
49
+ };
50
+ return ((0, jsx_runtime_1.jsx)(ThemeContext.Provider, { value: { theme, toggleTheme, setTheme }, children: children }));
51
+ }
52
+ /**
53
+ * useTheme - Hook to access theme state and controls
54
+ */
55
+ function useTheme() {
56
+ const context = (0, react_1.useContext)(ThemeContext);
57
+ if (context === undefined) {
58
+ throw new Error('useTheme must be used within a ThemeProvider');
59
+ }
60
+ return context;
61
+ }
62
+ //# sourceMappingURL=ThemeContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeContext.js","sourceRoot":"","sources":["../../../src/client/contexts/ThemeContext.tsx"],"names":[],"mappings":";;AAuBA,sCAiDC;AAKD,4BAQC;;AArFD;;GAEG;AAEH,iCAAyF;AAUzF,MAAM,YAAY,GAAG,IAAA,qBAAa,EAAgC,SAAS,CAAC,CAAC;AAM7E;;GAEG;AACH,SAAgB,aAAa,CAAC,EAAE,QAAQ,EAAsB;IAC5D,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,GAAG,IAAA,gBAAQ,EAAQ,GAAG,EAAE;QAClD,+CAA+C;QAC/C,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,qEAAqE;QACrE,MAAM,YAAY,GAAG,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QACzE,IAAI,YAAY,KAAK,OAAO,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;YACxD,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,+BAA+B;QAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAiB,CAAC;QAC7D,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5C,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,iCAAiC;QACjC,IAAI,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,EAAE,CAAC;YAC9D,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,mDAAmD;IACnD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAE1C,MAAM,IAAI,GAAG,QAAQ,CAAC,eAAe,CAAC;QACtC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACvC,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,QAAe,EAAE,EAAE;QACnC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,OAAO,CACL,uBAAC,YAAY,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,YAC3D,QAAQ,GACa,CACzB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,QAAQ;IACtB,MAAM,OAAO,GAAG,IAAA,kBAAU,EAAC,YAAY,CAAC,CAAC;IAEzC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * useContent hook - Fetches and manages content data
3
+ */
4
+ import { ProcessedContent } from '../../types/content';
5
+ /**
6
+ * Hook for fetching content data for SPA navigation
7
+ */
8
+ export declare function useContentData(): {
9
+ fetchContent: (path: string) => Promise<ProcessedContent | null>;
10
+ prefetchContent: (path: string) => Promise<void>;
11
+ };
12
+ //# sourceMappingURL=useContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useContent.d.ts","sourceRoot":"","sources":["../../../src/client/hooks/useContent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,gBAAgB,EAAmB,MAAM,qBAAqB,CAAC;AAExE;;GAEG;AACH,wBAAgB,cAAc;yBAOb,MAAM,KAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;4BA6CP,MAAM,KAAG,OAAO,CAAC,IAAI,CAAC;EAqBxE"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * useContent hook - Fetches and manages content data
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.useContentData = useContentData;
7
+ const react_1 = require("react");
8
+ const ContentContext_1 = require("../contexts/ContentContext");
9
+ /**
10
+ * Hook for fetching content data for SPA navigation
11
+ */
12
+ function useContentData() {
13
+ const { setCurrentContent, setIsLoading, setError } = (0, ContentContext_1.useContent)();
14
+ /**
15
+ * Fetch content data from JSON file
16
+ */
17
+ const fetchContent = (0, react_1.useCallback)(async (path) => {
18
+ setIsLoading(true);
19
+ setError(null);
20
+ try {
21
+ // Build content data path
22
+ // For default language pages: /content-data/slug.json
23
+ // For other languages: /content-data/lang/slug.json
24
+ const contentDataPath = path === '/'
25
+ ? '/content-data/index.json'
26
+ : `${path.replace(/\/$/, '')}.json`.replace(/^\//, '/content-data/');
27
+ // Fetch content data
28
+ const response = await fetch(contentDataPath);
29
+ if (!response.ok) {
30
+ throw new Error(`Failed to fetch content: ${response.status}`);
31
+ }
32
+ const data = await response.json();
33
+ // Convert to ProcessedContent
34
+ const content = {
35
+ metadata: data.metadata,
36
+ renderable: data.renderable,
37
+ };
38
+ setCurrentContent(content);
39
+ setIsLoading(false);
40
+ return content;
41
+ }
42
+ catch (error) {
43
+ const err = error;
44
+ setError(err);
45
+ setIsLoading(false);
46
+ console.error('Failed to fetch content:', err);
47
+ return null;
48
+ }
49
+ }, [setCurrentContent, setIsLoading, setError]);
50
+ /**
51
+ * Prefetch content for a given path (for hover/link preloading)
52
+ */
53
+ const prefetchContent = (0, react_1.useCallback)(async (path) => {
54
+ try {
55
+ const contentDataPath = path === '/'
56
+ ? '/content-data/index.json'
57
+ : `${path.replace(/\/$/, '')}.json`.replace(/^\//, '/content-data/');
58
+ // Use link prefetch
59
+ const link = document.createElement('link');
60
+ link.rel = 'prefetch';
61
+ link.href = contentDataPath;
62
+ document.head.appendChild(link);
63
+ }
64
+ catch (error) {
65
+ // Silent fail for prefetch
66
+ console.warn('Prefetch failed:', error);
67
+ }
68
+ }, []);
69
+ return {
70
+ fetchContent,
71
+ prefetchContent,
72
+ };
73
+ }
74
+ //# sourceMappingURL=useContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useContent.js","sourceRoot":"","sources":["../../../src/client/hooks/useContent.ts"],"names":[],"mappings":";AAAA;;GAEG;;AASH,wCAyEC;AAhFD,iCAA+C;AAC/C,+DAA6E;AAG7E;;GAEG;AACH,SAAgB,cAAc;IAC5B,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,IAAA,2BAAiB,GAAE,CAAC;IAE1E;;OAEG;IACH,MAAM,YAAY,GAAG,IAAA,mBAAW,EAC9B,KAAK,EAAE,IAAY,EAAoC,EAAE;QACvD,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,IAAI,CAAC;YACH,0BAA0B;YAC1B,sDAAsD;YACtD,oDAAoD;YACpD,MAAM,eAAe,GAAG,IAAI,KAAK,GAAG;gBAClC,CAAC,CAAC,0BAA0B;gBAC5B,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YAEvE,qBAAqB;YACrB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,CAAC;YAE9C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAqB,CAAC;YAEtD,8BAA8B;YAC9B,MAAM,OAAO,GAAqB;gBAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B,CAAC;YAEF,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC3B,YAAY,CAAC,KAAK,CAAC,CAAC;YAEpB,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAc,CAAC;YAC3B,QAAQ,CAAC,GAAG,CAAC,CAAC;YACd,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;YAC/C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,EACD,CAAC,iBAAiB,EAAE,YAAY,EAAE,QAAQ,CAAC,CAC5C,CAAC;IAEF;;OAEG;IACH,MAAM,eAAe,GAAG,IAAA,mBAAW,EAAC,KAAK,EAAE,IAAY,EAAiB,EAAE;QACxE,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,IAAI,KAAK,GAAG;gBAClC,CAAC,CAAC,0BAA0B;gBAC5B,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YAEvE,oBAAoB;YACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC;YACtB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2BAA2B;YAC3B,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,YAAY;QACZ,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * useNavigation hook - Navigation helpers and utilities
3
+ */
4
+ /**
5
+ * Hook for handling navigation with SPA content loading
6
+ */
7
+ export declare function useNavigation(): {
8
+ navigateToPath: (path: string) => Promise<void>;
9
+ handleLinkClick: (event: React.MouseEvent<HTMLAnchorElement>, href: string) => void;
10
+ handleLinkHover: (href: string) => void;
11
+ getCurrentLanguage: () => string;
12
+ buildLanguagePath: (slug: string, language: string, defaultLanguage?: string) => string;
13
+ currentPath: string;
14
+ };
15
+ //# sourceMappingURL=useNavigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNavigation.d.ts","sourceRoot":"","sources":["../../../src/client/hooks/useNavigation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,wBAAgB,aAAa;2BAUZ,MAAM;6BAiCX,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,QAAQ,MAAM;4BAyBlD,MAAM;8BAc4B,MAAM;8BAexC,MAAM,YAAY,MAAM,oBAAmB,MAAM,KAAU,MAAM;;EAkB3E"}
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ /**
3
+ * useNavigation hook - Navigation helpers and utilities
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.useNavigation = useNavigation;
7
+ const react_1 = require("react");
8
+ const react_router_dom_1 = require("react-router-dom");
9
+ const useContent_1 = require("./useContent");
10
+ const ContentContext_1 = require("../contexts/ContentContext");
11
+ /**
12
+ * Hook for handling navigation with SPA content loading
13
+ */
14
+ function useNavigation() {
15
+ const navigate = (0, react_router_dom_1.useNavigate)();
16
+ const location = (0, react_router_dom_1.useLocation)();
17
+ const { fetchContent, prefetchContent } = (0, useContent_1.useContentData)();
18
+ const { setIsLoading, setError } = (0, ContentContext_1.useContent)();
19
+ /**
20
+ * Navigate to a path and load its content
21
+ */
22
+ const navigateToPath = (0, react_1.useCallback)(async (path) => {
23
+ // Don't navigate if already on this path
24
+ if (location.pathname === path) {
25
+ return;
26
+ }
27
+ setIsLoading(true);
28
+ setError(null);
29
+ try {
30
+ // Fetch content first
31
+ const content = await fetchContent(path);
32
+ if (content) {
33
+ // Navigate to the NORMALIZED path (same as what fetchContent uses)
34
+ const normalizedPath = path === '/' ? '/' : path.replace(/\/$/, '');
35
+ navigate(normalizedPath);
36
+ // Scroll to top
37
+ window.scrollTo(0, 0);
38
+ }
39
+ }
40
+ catch (error) {
41
+ setError(error);
42
+ setIsLoading(false);
43
+ }
44
+ }, [location.pathname, navigate, fetchContent, setIsLoading, setError]);
45
+ /**
46
+ * Handle link click for SPA navigation
47
+ */
48
+ const handleLinkClick = (0, react_1.useCallback)((event, href) => {
49
+ // Check if it's an external link
50
+ const isExternal = href.startsWith('http://') || href.startsWith('https://');
51
+ // Check if it's a hash link (anchor)
52
+ const isHash = href.startsWith('#');
53
+ // Let browser handle external links and hash links
54
+ if (isExternal || isHash) {
55
+ return;
56
+ }
57
+ // Prevent default navigation
58
+ event.preventDefault();
59
+ // Use SPA navigation
60
+ navigateToPath(href);
61
+ }, [navigateToPath]);
62
+ /**
63
+ * Prefetch content on link hover
64
+ */
65
+ const handleLinkHover = (0, react_1.useCallback)((href) => {
66
+ const isExternal = href.startsWith('http://') || href.startsWith('https://');
67
+ const isHash = href.startsWith('#');
68
+ if (!isExternal && !isHash) {
69
+ prefetchContent(href);
70
+ }
71
+ }, [prefetchContent]);
72
+ /**
73
+ * Get current language from path
74
+ */
75
+ const getCurrentLanguage = (0, react_1.useCallback)(() => {
76
+ const parts = location.pathname.split('/').filter(Boolean);
77
+ // Check if first segment is a language code (2-3 letters)
78
+ if (parts.length > 0 && /^[a-z]{2,3}$/i.test(parts[0])) {
79
+ return parts[0];
80
+ }
81
+ return 'en'; // Default language
82
+ }, [location.pathname]);
83
+ /**
84
+ * Build language-specific path
85
+ */
86
+ const buildLanguagePath = (0, react_1.useCallback)((slug, language, defaultLanguage = 'en') => {
87
+ if (language === defaultLanguage) {
88
+ return slug === 'index' || slug === '' ? '/' : `/${slug}`;
89
+ }
90
+ return slug === 'index' || slug === '' ? `/${language}` : `/${language}/${slug}`;
91
+ }, []);
92
+ return {
93
+ navigateToPath,
94
+ handleLinkClick,
95
+ handleLinkHover,
96
+ getCurrentLanguage,
97
+ buildLanguagePath,
98
+ currentPath: location.pathname,
99
+ };
100
+ }
101
+ //# sourceMappingURL=useNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNavigation.js","sourceRoot":"","sources":["../../../src/client/hooks/useNavigation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * useSearch hook - Re-export and extend search functionality
3
+ */
4
+ /**
5
+ * Hook for search functionality with keyboard shortcuts
6
+ */
7
+ export declare function useSearch(): {
8
+ debouncedSearch: (query: string, delay?: number) => void;
9
+ query: string;
10
+ setQuery: (query: string) => void;
11
+ results: import("../contexts/SearchContext").SearchResult[];
12
+ setResults: (results: import("../contexts/SearchContext").SearchResult[]) => void;
13
+ isOpen: boolean;
14
+ openSearch: () => void;
15
+ closeSearch: () => void;
16
+ toggleSearch: () => void;
17
+ isSearching: boolean;
18
+ setIsSearching: (searching: boolean) => void;
19
+ search: (searchQuery: string) => Promise<void>;
20
+ clearSearch: () => void;
21
+ };
22
+ //# sourceMappingURL=useSearch.d.ts.map