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,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TableOfContents = TableOfContents;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /**
6
+ * TableOfContents - Displays page headings for quick navigation
7
+ */
8
+ const react_1 = require("react");
9
+ function TableOfContents({ toc }) {
10
+ const [activeId, setActiveId] = (0, react_1.useState)('');
11
+ const [isScrolling, setIsScrolling] = (0, react_1.useState)(false);
12
+ const scrollTimeoutRef = (0, react_1.useRef)(null);
13
+ // Handle initial page load with hash in URL
14
+ (0, react_1.useEffect)(() => {
15
+ const hash = window.location.hash;
16
+ if (hash) {
17
+ const id = hash.slice(1);
18
+ const element = document.getElementById(id);
19
+ if (element) {
20
+ // Delay to ensure DOM is fully rendered
21
+ setTimeout(() => {
22
+ setIsScrolling(true);
23
+ setActiveId(id);
24
+ scrollToElement(element);
25
+ startScrollEndDetection();
26
+ }, 100);
27
+ }
28
+ }
29
+ }, []);
30
+ // Track which heading is currently visible using IntersectionObserver
31
+ (0, react_1.useEffect)(() => {
32
+ const observer = new IntersectionObserver((entries) => {
33
+ // Only update during manual scrolling, not programmatic scrolling
34
+ if (!isScrolling) {
35
+ entries.forEach((entry) => {
36
+ if (entry.isIntersecting) {
37
+ setActiveId(entry.target.id);
38
+ }
39
+ });
40
+ }
41
+ }, {
42
+ // Focus on viewport area below header and above bottom 80%
43
+ rootMargin: '-80px 0px -80% 0px',
44
+ });
45
+ const headings = document.querySelectorAll('h1[id], h2[id], h3[id], h4[id], h5[id], h6[id]');
46
+ headings.forEach((heading) => observer.observe(heading));
47
+ return () => {
48
+ headings.forEach((heading) => observer.unobserve(heading));
49
+ };
50
+ }, [toc, isScrolling]);
51
+ const scrollToElement = (element) => {
52
+ const scrollContainer = document.querySelector('.layout-main');
53
+ const offset = 100;
54
+ if (scrollContainer) {
55
+ const containerTop = scrollContainer.getBoundingClientRect().top;
56
+ const elementTop = element.getBoundingClientRect().top;
57
+ const scrollOffset = scrollContainer.scrollTop + (elementTop - containerTop) - offset;
58
+ scrollContainer.scrollTo({
59
+ top: scrollOffset,
60
+ behavior: 'smooth',
61
+ });
62
+ }
63
+ else {
64
+ const elementPosition = element.getBoundingClientRect().top + window.pageYOffset;
65
+ const offsetPosition = elementPosition - offset;
66
+ window.scrollTo({
67
+ top: offsetPosition,
68
+ behavior: 'smooth',
69
+ });
70
+ }
71
+ };
72
+ /**
73
+ * Detects when smooth scrolling completes using debounced scroll events.
74
+ * Re-enables IntersectionObserver 150ms after the last scroll event.
75
+ * This approach works for any scroll distance, unlike fixed timeouts.
76
+ */
77
+ const startScrollEndDetection = () => {
78
+ const scrollContainer = document.querySelector('.layout-main');
79
+ const handleScrollEnd = () => {
80
+ // Clear previous timeout on each scroll event (debouncing)
81
+ if (scrollTimeoutRef.current) {
82
+ clearTimeout(scrollTimeoutRef.current);
83
+ }
84
+ // Wait 150ms after last scroll event to consider scrolling complete
85
+ scrollTimeoutRef.current = setTimeout(() => {
86
+ setIsScrolling(false);
87
+ // Clean up event listener
88
+ if (scrollContainer) {
89
+ scrollContainer.removeEventListener('scroll', handleScrollEnd);
90
+ }
91
+ else {
92
+ window.removeEventListener('scroll', handleScrollEnd);
93
+ }
94
+ }, 150);
95
+ };
96
+ if (scrollContainer) {
97
+ scrollContainer.addEventListener('scroll', handleScrollEnd);
98
+ }
99
+ else {
100
+ window.addEventListener('scroll', handleScrollEnd);
101
+ }
102
+ };
103
+ const handleClick = (id) => {
104
+ const element = document.getElementById(id);
105
+ if (!element)
106
+ return;
107
+ // Disable IntersectionObserver to prevent TOC from animating through sections
108
+ setIsScrolling(true);
109
+ // Set active immediately so TOC highlights the target section right away
110
+ setActiveId(id);
111
+ scrollToElement(element);
112
+ window.history.pushState(null, '', `#${id}`);
113
+ // Start listening for scroll completion
114
+ startScrollEndDetection();
115
+ };
116
+ // Handle browser back/forward navigation
117
+ (0, react_1.useEffect)(() => {
118
+ const handleHashChange = () => {
119
+ const hash = window.location.hash;
120
+ if (hash) {
121
+ const id = hash.slice(1);
122
+ handleClick(id);
123
+ }
124
+ };
125
+ window.addEventListener('hashchange', handleHashChange);
126
+ return () => {
127
+ window.removeEventListener('hashchange', handleHashChange);
128
+ // Cleanup timeout on unmount to prevent memory leaks
129
+ if (scrollTimeoutRef.current) {
130
+ clearTimeout(scrollTimeoutRef.current);
131
+ }
132
+ };
133
+ }, []);
134
+ const flattenToc = (entries) => {
135
+ const result = [];
136
+ const flatten = (items) => {
137
+ items.forEach((item) => {
138
+ result.push(item);
139
+ if (item.children && item.children.length > 0) {
140
+ flatten(item.children);
141
+ }
142
+ });
143
+ };
144
+ flatten(entries);
145
+ return result;
146
+ };
147
+ const flatToc = flattenToc(toc);
148
+ return ((0, jsx_runtime_1.jsxs)("nav", { className: "toc", children: [(0, jsx_runtime_1.jsx)("p", { className: "toc-title", children: "On this page" }), (0, jsx_runtime_1.jsx)("ul", { className: "toc-list", children: flatToc.map((entry) => ((0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsx)("button", { className: `toc-link ${entry.id === activeId ? 'active' : ''}`, "data-level": entry.level, onClick: () => handleClick(entry.id), children: entry.text }) }, entry.id))) })] }));
149
+ }
150
+ exports.default = TableOfContents;
151
+ //# sourceMappingURL=TableOfContents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableOfContents.js","sourceRoot":"","sources":["../../src/components/TableOfContents.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * ConfigLoader - Loads and validates user configuration files
3
+ * Merges user config with sensible defaults
4
+ */
5
+ import { SiteConfig } from '../types/config';
6
+ export declare class ConfigLoader {
7
+ private configDir;
8
+ constructor(projectRoot: string);
9
+ /**
10
+ * Load complete site configuration
11
+ */
12
+ load(): Promise<SiteConfig>;
13
+ /**
14
+ * Load site metadata
15
+ */
16
+ private loadMetadata;
17
+ /**
18
+ * Load language configuration
19
+ */
20
+ private loadLanguages;
21
+ /**
22
+ * Load navigation configuration
23
+ */
24
+ private loadNavigationConfig;
25
+ /**
26
+ * Load main sidenav configuration
27
+ */
28
+ private loadSideNav;
29
+ /**
30
+ * Load top navigation configuration
31
+ */
32
+ private loadTopNav;
33
+ /**
34
+ * Load additional sidenav files (e.g., guides-sidenav.yaml, api-sidenav.yaml)
35
+ */
36
+ private loadAdditionalSidenavs;
37
+ /**
38
+ * Load asset configuration
39
+ */
40
+ private loadAssets;
41
+ /**
42
+ * Validate the complete configuration
43
+ */
44
+ private validateConfig;
45
+ /**
46
+ * Validate navigation items recursively
47
+ */
48
+ private validateNavigationItems;
49
+ }
50
+ //# sourceMappingURL=ConfigLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigLoader.d.ts","sourceRoot":"","sources":["../../src/config/ConfigLoader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EACL,UAAU,EAOX,MAAM,iBAAiB,CAAC;AAEzB,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;gBAEd,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;IAsBjC;;OAEG;IACH,OAAO,CAAC,YAAY;IAwBpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAcrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgB5B;;OAEG;IACH,OAAO,CAAC,WAAW;IAiBnB;;OAEG;IACH,OAAO,CAAC,UAAU;IAgBlB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;OAEG;IACH,OAAO,CAAC,UAAU;IAgClB;;OAEG;IACH,OAAO,CAAC,cAAc;IAyBtB;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAWhC"}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ /**
3
+ * ConfigLoader - Loads and validates user configuration files
4
+ * Merges user config with sensible defaults
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ConfigLoader = void 0;
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const js_yaml_1 = __importDefault(require("js-yaml"));
14
+ class ConfigLoader {
15
+ constructor(projectRoot) {
16
+ this.configDir = path_1.default.join(projectRoot, 'config');
17
+ }
18
+ /**
19
+ * Load complete site configuration
20
+ */
21
+ async load() {
22
+ // Load individual config components
23
+ const metadata = this.loadMetadata();
24
+ const languages = this.loadLanguages();
25
+ const navigation = this.loadNavigationConfig();
26
+ const assets = this.loadAssets();
27
+ const config = {
28
+ metadata,
29
+ languages,
30
+ defaultLanguage: languages.find((lang) => lang.default)?.code || 'en',
31
+ navigation,
32
+ assets,
33
+ assetsPath: '/assets',
34
+ };
35
+ // Validate the complete configuration
36
+ this.validateConfig(config);
37
+ return config;
38
+ }
39
+ /**
40
+ * Load site metadata
41
+ */
42
+ loadMetadata() {
43
+ const defaultMetadata = {
44
+ title: 'Documentation',
45
+ description: 'Product documentation',
46
+ keywords: [],
47
+ baseUrl: '',
48
+ };
49
+ const siteJsonPath = path_1.default.join(this.configDir, 'site.json');
50
+ if (!fs_1.default.existsSync(siteJsonPath)) {
51
+ return defaultMetadata;
52
+ }
53
+ try {
54
+ const siteJsonContent = fs_1.default.readFileSync(siteJsonPath, 'utf8');
55
+ const userMetadata = JSON.parse(siteJsonContent);
56
+ // Merge user metadata with defaults
57
+ return { ...defaultMetadata, ...userMetadata };
58
+ }
59
+ catch (error) {
60
+ throw new Error(`Failed to parse site.json: ${error.message}`);
61
+ }
62
+ }
63
+ /**
64
+ * Load language configuration
65
+ */
66
+ loadLanguages() {
67
+ // Default: English only
68
+ const defaultLanguages = [
69
+ {
70
+ code: 'en',
71
+ label: 'English',
72
+ default: true,
73
+ },
74
+ ];
75
+ // TODO: Load from languages.json if exists
76
+ return defaultLanguages;
77
+ }
78
+ /**
79
+ * Load navigation configuration
80
+ */
81
+ loadNavigationConfig() {
82
+ const sidenav = this.loadSideNav('sidenav.yaml');
83
+ const topnav = this.loadTopNav();
84
+ const additionalSidenavs = this.loadAdditionalSidenavs();
85
+ return {
86
+ sidenav,
87
+ topnav,
88
+ additionalSidenavs,
89
+ };
90
+ }
91
+ /**
92
+ * Load main sidenav configuration
93
+ */
94
+ loadSideNav(filename) {
95
+ const sidenavPath = path_1.default.join(this.configDir, filename);
96
+ if (!fs_1.default.existsSync(sidenavPath)) {
97
+ // Return empty sidenav if file doesn't exist
98
+ return [];
99
+ }
100
+ try {
101
+ const content = fs_1.default.readFileSync(sidenavPath, 'utf8');
102
+ const parsed = js_yaml_1.default.load(content);
103
+ return parsed || [];
104
+ }
105
+ catch (error) {
106
+ throw new Error(`Failed to parse ${filename}: ${error.message}`);
107
+ }
108
+ }
109
+ /**
110
+ * Load top navigation configuration
111
+ */
112
+ loadTopNav() {
113
+ const topnavPath = path_1.default.join(this.configDir, 'topnav.yaml');
114
+ if (!fs_1.default.existsSync(topnavPath)) {
115
+ return undefined;
116
+ }
117
+ try {
118
+ const content = fs_1.default.readFileSync(topnavPath, 'utf8');
119
+ const parsed = js_yaml_1.default.load(content);
120
+ return parsed || [];
121
+ }
122
+ catch (error) {
123
+ throw new Error(`Failed to parse topnav.yaml: ${error.message}`);
124
+ }
125
+ }
126
+ /**
127
+ * Load additional sidenav files (e.g., guides-sidenav.yaml, api-sidenav.yaml)
128
+ */
129
+ loadAdditionalSidenavs() {
130
+ if (!fs_1.default.existsSync(this.configDir)) {
131
+ return undefined;
132
+ }
133
+ const files = fs_1.default.readdirSync(this.configDir);
134
+ const sidenavFiles = files.filter((file) => file.endsWith('-sidenav.yaml') ||
135
+ (file.endsWith('-sidenav.yml') && file !== 'sidenav.yaml' && file !== 'sidenav.yml'));
136
+ if (sidenavFiles.length === 0) {
137
+ return undefined;
138
+ }
139
+ const additionalSidenavs = {};
140
+ for (const file of sidenavFiles) {
141
+ // Extract name: "guides-sidenav.yaml" -> "guides"
142
+ const name = file.replace(/-sidenav\.ya?ml$/, '');
143
+ additionalSidenavs[name] = this.loadSideNav(file);
144
+ }
145
+ return additionalSidenavs;
146
+ }
147
+ /**
148
+ * Load asset configuration
149
+ */
150
+ loadAssets() {
151
+ const assets = {};
152
+ // Check for logo in different formats (SVG preferred, then PNG, then JPG)
153
+ const logoFormats = ['svg', 'png', 'jpg', 'jpeg'];
154
+ for (const format of logoFormats) {
155
+ const logoPath = path_1.default.join(this.configDir, `logo.${format}`);
156
+ if (fs_1.default.existsSync(logoPath)) {
157
+ assets.logo = `logo.${format}`;
158
+ break; // Use the first format found
159
+ }
160
+ }
161
+ // Check for dark mode logo
162
+ for (const format of logoFormats) {
163
+ const logoDarkPath = path_1.default.join(this.configDir, `logo-dark.${format}`);
164
+ if (fs_1.default.existsSync(logoDarkPath)) {
165
+ assets.logoDark = `logo-dark.${format}`;
166
+ break; // Use the first format found
167
+ }
168
+ }
169
+ // Check for favicon
170
+ const faviconPath = path_1.default.join(this.configDir, 'favicon.ico');
171
+ if (fs_1.default.existsSync(faviconPath)) {
172
+ assets.favicon = 'favicon.ico';
173
+ }
174
+ return assets;
175
+ }
176
+ /**
177
+ * Validate the complete configuration
178
+ */
179
+ validateConfig(config) {
180
+ // Validate required fields
181
+ if (!config.metadata.title) {
182
+ throw new Error('Site title is required in metadata');
183
+ }
184
+ if (config.languages.length === 0) {
185
+ throw new Error('At least one language must be configured');
186
+ }
187
+ const defaultLang = config.languages.find((lang) => lang.default);
188
+ if (!defaultLang) {
189
+ throw new Error('A default language must be specified');
190
+ }
191
+ // Validate navigation structure
192
+ if (config.navigation.sidenav) {
193
+ this.validateNavigationItems(config.navigation.sidenav);
194
+ }
195
+ if (config.navigation.topnav) {
196
+ this.validateNavigationItems(config.navigation.topnav);
197
+ }
198
+ }
199
+ /**
200
+ * Validate navigation items recursively
201
+ */
202
+ validateNavigationItems(items) {
203
+ for (const item of items) {
204
+ if (!item.label) {
205
+ throw new Error('Navigation item must have a label');
206
+ }
207
+ if (item.children && item.children.length > 0) {
208
+ this.validateNavigationItems(item.children);
209
+ }
210
+ }
211
+ }
212
+ }
213
+ exports.ConfigLoader = ConfigLoader;
214
+ //# sourceMappingURL=ConfigLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigLoader.js","sourceRoot":"","sources":["../../src/config/ConfigLoader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * StyleCompiler - Orchestrates style generation
3
+ * Loads user overrides and compiles all component styles into final CSS
4
+ */
5
+ export declare class StyleCompiler {
6
+ private projectRoot;
7
+ constructor(projectRoot: string);
8
+ /**
9
+ * Load user style overrides from config/styles/ directory
10
+ */
11
+ private loadUserOverrides;
12
+ /**
13
+ * Generate complete CSS stylesheet
14
+ */
15
+ generateCSS(): string;
16
+ }
17
+ //# sourceMappingURL=StyleCompiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StyleCompiler.d.ts","sourceRoot":"","sources":["../../src/config/StyleCompiler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAI/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoCzB;;OAEG;IACH,WAAW,IAAI,MAAM;CA+CtB"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ /**
3
+ * StyleCompiler - Orchestrates style generation
4
+ * Loads user overrides and compiles all component styles into final CSS
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.StyleCompiler = void 0;
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const main_1 = require("../styles/variables/main");
14
+ // Import all component generators
15
+ const reset_1 = require("../styles/components/reset");
16
+ const fonts_1 = require("../styles/components/fonts");
17
+ const layout_1 = require("../styles/components/layout");
18
+ const typography_1 = require("../styles/components/typography");
19
+ const header_1 = require("../styles/components/header");
20
+ const sidenav_1 = require("../styles/components/sidenav");
21
+ const mobilemenu_1 = require("../styles/components/mobilemenu");
22
+ const content_1 = require("../styles/components/content");
23
+ const heading_1 = require("../styles/components/heading");
24
+ const codeblock_1 = require("../styles/components/codeblock");
25
+ const card_1 = require("../styles/components/card");
26
+ const toc_1 = require("../styles/components/toc");
27
+ const searchmodal_1 = require("../styles/components/searchmodal");
28
+ const utility_1 = require("../styles/components/utility");
29
+ const callout_1 = require("../styles/components/callout");
30
+ class StyleCompiler {
31
+ constructor(projectRoot) {
32
+ this.projectRoot = projectRoot;
33
+ }
34
+ /**
35
+ * Load user style overrides from config/styles/ directory
36
+ */
37
+ loadUserOverrides() {
38
+ const stylesDir = path_1.default.join(this.projectRoot, 'config', 'styles');
39
+ if (!fs_1.default.existsSync(stylesDir)) {
40
+ return { components: {} };
41
+ }
42
+ const result = { components: {} };
43
+ try {
44
+ // Load main.json (global overrides)
45
+ const mainPath = path_1.default.join(stylesDir, 'main.json');
46
+ if (fs_1.default.existsSync(mainPath)) {
47
+ const mainContent = fs_1.default.readFileSync(mainPath, 'utf8');
48
+ result.global = JSON.parse(mainContent);
49
+ }
50
+ // Load component-specific JSON files
51
+ const files = fs_1.default.readdirSync(stylesDir);
52
+ files.forEach(file => {
53
+ if (file.endsWith('.json') && file !== 'main.json') {
54
+ const componentName = file.replace('.json', '');
55
+ const filePath = path_1.default.join(stylesDir, file);
56
+ const content = fs_1.default.readFileSync(filePath, 'utf8');
57
+ result.components[componentName] = JSON.parse(content);
58
+ }
59
+ });
60
+ }
61
+ catch (error) {
62
+ console.error('Error loading style overrides:', error);
63
+ // Return empty overrides if there's an error
64
+ return { components: {} };
65
+ }
66
+ return result;
67
+ }
68
+ /**
69
+ * Generate complete CSS stylesheet
70
+ */
71
+ generateCSS() {
72
+ // Load user overrides
73
+ const userOverrides = this.loadUserOverrides();
74
+ // Merge global variables with user overrides
75
+ const globalVars = (0, main_1.mergeGlobalOverrides)(userOverrides.global);
76
+ // Instantiate all component generators
77
+ const resetGen = new reset_1.ResetStyleGenerator(globalVars);
78
+ const fontGen = new fonts_1.FontStyleGenerator(globalVars);
79
+ const layoutGen = new layout_1.LayoutStyleGenerator(globalVars);
80
+ const typographyGen = new typography_1.TypographyStyleGenerator(globalVars);
81
+ const headerGen = new header_1.HeaderStyleGenerator(globalVars);
82
+ const sidenavGen = new sidenav_1.SideNavStyleGenerator(globalVars);
83
+ const mobilemenuGen = new mobilemenu_1.MobileMenuStyleGenerator(globalVars);
84
+ const contentGen = new content_1.ContentStyleGenerator(globalVars);
85
+ const headingGen = new heading_1.HeadingStyleGenerator(globalVars);
86
+ const codeblockGen = new codeblock_1.CodeBlockStyleGenerator(globalVars);
87
+ const cardGen = new card_1.CardStyleGenerator(globalVars);
88
+ const calloutGen = new callout_1.CalloutStyleGenerator(globalVars);
89
+ const tocGen = new toc_1.TOCStyleGenerator(globalVars);
90
+ const searchmodalGen = new searchmodal_1.SearchModalStyleGenerator(globalVars);
91
+ const utilityGen = new utility_1.UtilityStyleGenerator(globalVars);
92
+ // Generate CSS for each component in order
93
+ // Order matters: base styles first, then components, utilities last
94
+ const sections = [
95
+ resetGen.generate(),
96
+ fontGen.generate(),
97
+ layoutGen.generate(),
98
+ typographyGen.generate(userOverrides.components['typography']),
99
+ headerGen.generate(userOverrides.components['header']),
100
+ sidenavGen.generate(userOverrides.components['sidenav']),
101
+ mobilemenuGen.generate(),
102
+ contentGen.generate(),
103
+ headingGen.generate(userOverrides.components['heading']),
104
+ codeblockGen.generate(),
105
+ cardGen.generate(userOverrides.components['card']),
106
+ calloutGen.generate(),
107
+ tocGen.generate(userOverrides.components['toc']),
108
+ searchmodalGen.generate(),
109
+ utilityGen.generate(),
110
+ ];
111
+ // Join all sections with double newlines
112
+ return sections.join('\n\n');
113
+ }
114
+ }
115
+ exports.StyleCompiler = StyleCompiler;
116
+ //# sourceMappingURL=StyleCompiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StyleCompiler.js","sourceRoot":"","sources":["../../src/config/StyleCompiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * ThemeGenerator - Generates CSS variables from GlobalVariables
3
+ * Converts global design tokens into CSS custom properties
4
+ */
5
+ import { GlobalVariables } from '../styles/types';
6
+ export declare class ThemeGenerator {
7
+ private globalVars;
8
+ constructor(globalVars: GlobalVariables);
9
+ /**
10
+ * Generate CSS custom properties (variables) for colors, typography, and layout
11
+ */
12
+ generateCSSVariables(): string;
13
+ }
14
+ //# sourceMappingURL=ThemeGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeGenerator.d.ts","sourceRoot":"","sources":["../../src/config/ThemeGenerator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,qBAAa,cAAc;IACb,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,eAAe;IAE/C;;OAEG;IACH,oBAAoB,IAAI,MAAM;CA+H/B"}