@xyd-js/framework 0.1.0-build.189

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 xyd
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,28 @@
1
+ import { Metadata } from '@xyd-js/core';
2
+
3
+ interface FooSidebarItemProps {
4
+ readonly uniqIndex: number;
5
+ readonly level?: number;
6
+ readonly groupIndex?: number;
7
+ readonly itemIndex?: number;
8
+ }
9
+
10
+ interface FwSidebarItemProps {
11
+ group: string;
12
+ groupIndex: number;
13
+ items: FwSidebarItemElementProps[];
14
+ icon?: string;
15
+ }
16
+ interface FwSidebarItemElementProps extends FooSidebarItemProps {
17
+ title: string;
18
+ group?: false;
19
+ href: string;
20
+ icon?: string;
21
+ sidebarTitle?: string;
22
+ items?: FwSidebarItemElementProps[];
23
+ active?: boolean;
24
+ url?: string;
25
+ pageMeta?: Metadata;
26
+ }
27
+
28
+ export type { FwSidebarItemProps as F };
@@ -0,0 +1,17 @@
1
+ import { Settings, MetadataMap, Metadata } from '@xyd-js/core';
2
+ import { IBreadcrumb, INavLinks } from '@xyd-js/ui';
3
+ import { F as FwSidebarItemProps } from './FwSidebarItem-CFgVFKj-.js';
4
+
5
+ declare function mapSettingsToProps(settings: Settings, pagePathMapping: {
6
+ [key: string]: string;
7
+ }, slug: string, frontmatters?: MetadataMap): Promise<{
8
+ groups: FwSidebarItemProps[];
9
+ breadcrumbs: IBreadcrumb[];
10
+ navlinks?: INavLinks;
11
+ hiddenPages?: {
12
+ [key: string]: boolean;
13
+ };
14
+ metadata?: Metadata | null;
15
+ }>;
16
+
17
+ export { mapSettingsToProps };
@@ -0,0 +1,415 @@
1
+ // packages/hydration/mapSettingsToProps.ts
2
+ import { pageFrontMatters } from "@xyd-js/content";
3
+ async function mapSettingsToProps(settings, pagePathMapping, slug, frontmatters) {
4
+ let uniqIndex = 0;
5
+ let filteredNav = filterNavigation(settings, slug);
6
+ if (!frontmatters) {
7
+ frontmatters = await pageFrontMatters(filteredNav, pagePathMapping);
8
+ }
9
+ const slugFrontmatter = frontmatters[slug] || null;
10
+ let navlinks = void 0;
11
+ const hiddenPages = Object.keys(frontmatters).reduce((acc, page) => {
12
+ if (frontmatters[page].hidden) {
13
+ acc[page] = true;
14
+ }
15
+ return acc;
16
+ }, {});
17
+ const breadcrumbs = buildBreadcrumbs(filteredNav, slug, frontmatters, hiddenPages);
18
+ function mapItems(page, currentNav, nav) {
19
+ var _a, _b;
20
+ if (!frontmatters) {
21
+ console.error("frontmatters not found");
22
+ return null;
23
+ }
24
+ if (typeof page !== "string" && !("virtual" in page)) {
25
+ const items = (_b = (_a = page.pages) == null ? void 0 : _a.map((p) => mapItems(p, page, nav))) == null ? void 0 : _b.filter(Boolean);
26
+ return {
27
+ title: page.group,
28
+ group: page.group === false ? false : void 0,
29
+ href: "",
30
+ active: false,
31
+ uniqIndex: uniqIndex++,
32
+ icon: page.icon,
33
+ items
34
+ };
35
+ }
36
+ let pageName = "";
37
+ if (typeof page === "string") {
38
+ pageName = page;
39
+ } else {
40
+ pageName = page.page;
41
+ }
42
+ if (hiddenPages[pageName]) {
43
+ return null;
44
+ }
45
+ const matterTitle = frontmatters && frontmatters[pageName] && frontmatters[pageName].title;
46
+ let title = "";
47
+ if (typeof matterTitle === "string") {
48
+ title = matterTitle;
49
+ } else {
50
+ title = matterTitle;
51
+ }
52
+ if (!title) {
53
+ console.debug(`\u26A0\uFE0F Title not found for page "${pageName}"`);
54
+ }
55
+ const meta = frontmatters[pageName];
56
+ if (slugFrontmatter && slugFrontmatter === meta) {
57
+ const nlinks = mapNavToLinks(pageName, currentNav, nav, frontmatters, hiddenPages);
58
+ if (nlinks) {
59
+ navlinks = nlinks;
60
+ }
61
+ }
62
+ return {
63
+ title,
64
+ href: safePageLink(pageName),
65
+ active: false,
66
+ uniqIndex: uniqIndex++,
67
+ icon: (meta == null ? void 0 : meta.icon) || "",
68
+ sidebarTitle: (meta == null ? void 0 : meta.sidebarTitle) || "",
69
+ url: (meta == null ? void 0 : meta.url) || "",
70
+ pageMeta: meta || null
71
+ };
72
+ }
73
+ function sidebarItems(nav, pages) {
74
+ const items = ((pages == null ? void 0 : pages.map((p) => mapItems(p, nav, filteredNav))) || []).filter(Boolean);
75
+ return {
76
+ group: nav.group,
77
+ icon: nav == null ? void 0 : nav.icon,
78
+ items
79
+ };
80
+ }
81
+ const flatItems = [];
82
+ const groups = filteredNav.map((nav) => {
83
+ var _a, _b;
84
+ if (typeof nav === "string") {
85
+ flatItems.push(nav);
86
+ return;
87
+ }
88
+ if (typeof nav !== "string" && "route" in nav) {
89
+ if ((_a = nav.pages) == null ? void 0 : _a.length) {
90
+ const items = (((_b = nav.pages) == null ? void 0 : _b.map((p) => mapItems(p, nav, filteredNav))) || []).filter(Boolean);
91
+ return {
92
+ items
93
+ };
94
+ }
95
+ return {
96
+ group: "",
97
+ items: [],
98
+ groupIndex: 0
99
+ };
100
+ }
101
+ return sidebarItems(nav, nav.pages || []);
102
+ }).filter(Boolean) || [];
103
+ if (flatItems.length) {
104
+ const items = sidebarItems({}, flatItems);
105
+ if (items) {
106
+ groups.unshift(items);
107
+ }
108
+ }
109
+ return {
110
+ groups,
111
+ breadcrumbs,
112
+ navlinks,
113
+ hiddenPages,
114
+ metadata: slugFrontmatter
115
+ };
116
+ }
117
+ function filterNavigation(settings, slug) {
118
+ var _a, _b;
119
+ const sidebarItems = [];
120
+ let multiSidebarMatch = null;
121
+ let foundRoute = false;
122
+ function findRoute(sidebar) {
123
+ var _a2;
124
+ if (typeof sidebar === "string") {
125
+ return;
126
+ }
127
+ if ("route" in sidebar) {
128
+ const sideMatch = normalizeHref(sidebar.route);
129
+ const normalizeSlug = normalizeHref(slug);
130
+ if (normalizeSlug.startsWith(sideMatch)) {
131
+ if (multiSidebarMatch) {
132
+ const findByMatchLvl = multiSidebarMatch.route.split("/").length;
133
+ const urlMatchLvl = sideMatch.split("/").length;
134
+ if (urlMatchLvl > findByMatchLvl) {
135
+ if (!foundRoute) {
136
+ foundRoute = true;
137
+ sidebarItems.length = 0;
138
+ }
139
+ multiSidebarMatch = sidebar;
140
+ }
141
+ } else {
142
+ if (!foundRoute) {
143
+ foundRoute = true;
144
+ sidebarItems.length = 0;
145
+ }
146
+ multiSidebarMatch = sidebar;
147
+ }
148
+ }
149
+ if ("pages" in sidebar && ((_a2 = sidebar.pages) == null ? void 0 : _a2.length)) {
150
+ for (const page of sidebar.pages) {
151
+ findRoute(page);
152
+ }
153
+ }
154
+ }
155
+ return;
156
+ }
157
+ (_a = settings == null ? void 0 : settings.navigation) == null ? void 0 : _a.sidebar.forEach((sidebar) => {
158
+ if (typeof sidebar !== "string" && "route" in sidebar) {
159
+ findRoute(sidebar);
160
+ }
161
+ });
162
+ if (foundRoute && multiSidebarMatch != null) {
163
+ const side = multiSidebarMatch;
164
+ sidebarItems.push(...(side == null ? void 0 : side.pages) || []);
165
+ return sidebarItems;
166
+ }
167
+ const flatPages = [];
168
+ (_b = settings == null ? void 0 : settings.navigation) == null ? void 0 : _b.sidebar.forEach((sidebar) => {
169
+ if (typeof sidebar === "string") {
170
+ flatPages.push(sidebar);
171
+ } else if (!("route" in sidebar)) {
172
+ sidebarItems.push(sidebar);
173
+ }
174
+ });
175
+ if (flatPages.length > 0) {
176
+ sidebarItems.push({
177
+ pages: flatPages
178
+ });
179
+ }
180
+ return sidebarItems;
181
+ }
182
+ function normalizeHref(href) {
183
+ if (href.startsWith("/")) {
184
+ return href;
185
+ }
186
+ return `/${href}`;
187
+ }
188
+ function safePageLink(page) {
189
+ return (page == null ? void 0 : page.startsWith("/")) ? page : `/${page}`;
190
+ }
191
+ function mapNavToLinks(page, currentNav, nav, frontmatters, hiddenPages) {
192
+ var _a, _b;
193
+ const allPages = [];
194
+ nav.forEach((group, groupIndex) => {
195
+ if (typeof group === "string") {
196
+ allPages.push({
197
+ page: group,
198
+ group: "",
199
+ groupIndex,
200
+ pageIndex: groupIndex
201
+ });
202
+ return;
203
+ }
204
+ if (group.pages) {
205
+ group.pages.forEach((pageItem, pageIndex) => {
206
+ let pageName = "";
207
+ if (typeof pageItem === "string") {
208
+ pageName = pageItem;
209
+ } else if ("virtual" in pageItem) {
210
+ pageName = pageItem.page;
211
+ } else if ("pages" in pageItem) {
212
+ const resolvedPages = findResolvedPagesBFS(pageItem);
213
+ if (resolvedPages.length > 0) {
214
+ resolvedPages.forEach((resolvedPage, resolvedIndex) => {
215
+ if (!hiddenPages[resolvedPage]) {
216
+ allPages.push({
217
+ page: resolvedPage,
218
+ group: group.group || "",
219
+ groupIndex,
220
+ pageIndex: pageIndex + resolvedIndex
221
+ });
222
+ }
223
+ });
224
+ return;
225
+ }
226
+ } else if ("page" in pageItem && typeof pageItem === "object") {
227
+ pageName = pageItem.page;
228
+ }
229
+ if (pageName && !hiddenPages[pageName]) {
230
+ allPages.push({
231
+ page: pageName,
232
+ group: group.group || "",
233
+ groupIndex,
234
+ pageIndex
235
+ });
236
+ }
237
+ });
238
+ }
239
+ });
240
+ const currentPageIndex = allPages.findIndex((p) => p.page === page);
241
+ if (currentPageIndex === -1) {
242
+ return void 0;
243
+ }
244
+ const prevPage = allPages[currentPageIndex - 1];
245
+ const nextPage = allPages[currentPageIndex + 1];
246
+ let prevLink;
247
+ let nextLink;
248
+ if (prevPage) {
249
+ const prevTitle = ((_a = frontmatters[prevPage.page]) == null ? void 0 : _a.title) || prevPage.page;
250
+ if (typeof prevTitle === "string") {
251
+ prevLink = {
252
+ title: prevTitle,
253
+ href: safePageLink(prevPage.page)
254
+ };
255
+ }
256
+ }
257
+ if (nextPage) {
258
+ const nextTitle = ((_b = frontmatters[nextPage.page]) == null ? void 0 : _b.title) || nextPage.page;
259
+ if (typeof nextTitle === "string") {
260
+ nextLink = {
261
+ title: nextTitle,
262
+ href: safePageLink(nextPage.page)
263
+ };
264
+ }
265
+ }
266
+ return {
267
+ prev: prevLink || void 0,
268
+ next: nextLink || void 0
269
+ };
270
+ }
271
+ function findResolvedPagesBFS(sidebar) {
272
+ if (!sidebar.pages || sidebar.pages.length === 0) {
273
+ return [];
274
+ }
275
+ const resolvedPages = [];
276
+ const queue = [...sidebar.pages];
277
+ while (queue.length > 0) {
278
+ const current = queue.shift();
279
+ if (typeof current === "string") {
280
+ resolvedPages.push(current);
281
+ } else if ("virtual" in current) {
282
+ resolvedPages.push(current.page);
283
+ } else if ("page" in current && typeof current === "object") {
284
+ resolvedPages.push(current.page);
285
+ } else if ("pages" in current && current.pages) {
286
+ queue.push(...current.pages);
287
+ }
288
+ }
289
+ return resolvedPages;
290
+ }
291
+ function getGroupTitle(group) {
292
+ return typeof group === "string" && group.length > 0 ? group : "";
293
+ }
294
+ function buildBreadcrumbs(navigation, currentSlug, frontmatters, hiddenPages) {
295
+ var _a;
296
+ const breadcrumbs = [];
297
+ const path = findPathToPage(navigation, currentSlug, frontmatters, hiddenPages);
298
+ if (!(path == null ? void 0 : path.length)) {
299
+ return [];
300
+ }
301
+ for (const item of path) {
302
+ if (item.type === "group") {
303
+ breadcrumbs.push({
304
+ title: item.title,
305
+ href: item.href
306
+ });
307
+ } else if (item.type === "page" && item.page) {
308
+ const pageTitle = ((_a = frontmatters[item.page]) == null ? void 0 : _a.title) || item.page;
309
+ breadcrumbs.push({
310
+ title: pageTitle,
311
+ href: safePageLink(item.page)
312
+ });
313
+ }
314
+ }
315
+ return breadcrumbs;
316
+ }
317
+ function findPathToPage(navigation, targetSlug, frontmatters, hiddenPages) {
318
+ const path = [];
319
+ function searchInNavigation(nav, currentPath) {
320
+ for (const item of nav) {
321
+ if (typeof item === "string") {
322
+ path.push(item);
323
+ return false;
324
+ }
325
+ if ("route" in item) {
326
+ if (item.pages) {
327
+ const newPath = [...currentPath];
328
+ if (item.group && typeof item.group === "string" && item.group.length > 0) {
329
+ newPath.push({
330
+ type: "group",
331
+ title: getGroupTitle(item.group),
332
+ href: item.route || ""
333
+ });
334
+ }
335
+ if (searchInPages(item.pages, newPath)) {
336
+ path.push(...newPath);
337
+ return true;
338
+ }
339
+ }
340
+ } else {
341
+ const newPath = [...currentPath];
342
+ if (item.group && typeof item.group === "string") {
343
+ newPath.push({
344
+ type: "group",
345
+ title: item.group,
346
+ href: ""
347
+ });
348
+ }
349
+ if (item.pages && searchInPages(item.pages, newPath)) {
350
+ path.push(...newPath);
351
+ return true;
352
+ }
353
+ }
354
+ }
355
+ return false;
356
+ }
357
+ function searchInPages(pages, currentPath) {
358
+ var _a, _b, _c;
359
+ for (const page of pages) {
360
+ if (typeof page === "string") {
361
+ if (page === targetSlug && !hiddenPages[page]) {
362
+ currentPath.push({
363
+ type: "page",
364
+ title: ((_a = frontmatters[page]) == null ? void 0 : _a.title) || page,
365
+ href: safePageLink(page),
366
+ page
367
+ });
368
+ return true;
369
+ }
370
+ } else if ("virtual" in page) {
371
+ if (page.page === targetSlug && !hiddenPages[page.page]) {
372
+ currentPath.push({
373
+ type: "page",
374
+ title: ((_b = frontmatters[page.page]) == null ? void 0 : _b.title) || page.page,
375
+ href: safePageLink(page.page),
376
+ page: page.page
377
+ });
378
+ return true;
379
+ }
380
+ } else if ("pages" in page) {
381
+ const newPath = [...currentPath];
382
+ if (page.group && typeof page.group === "string") {
383
+ newPath.push({
384
+ type: "group",
385
+ title: page.group,
386
+ href: ""
387
+ });
388
+ }
389
+ if (searchInPages(page.pages || [], newPath)) {
390
+ currentPath.length = 0;
391
+ currentPath.push(...newPath);
392
+ return true;
393
+ }
394
+ } else if ("page" in page && typeof page === "object") {
395
+ const pageName = page.page;
396
+ if (pageName === targetSlug && !hiddenPages[pageName]) {
397
+ currentPath.push({
398
+ type: "page",
399
+ title: ((_c = frontmatters[pageName]) == null ? void 0 : _c.title) || pageName,
400
+ href: safePageLink(pageName),
401
+ page: pageName
402
+ });
403
+ return true;
404
+ }
405
+ }
406
+ }
407
+ return false;
408
+ }
409
+ searchInNavigation(navigation, []);
410
+ return path;
411
+ }
412
+ export {
413
+ mapSettingsToProps
414
+ };
415
+ //# sourceMappingURL=hydration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/hydration/mapSettingsToProps.ts"],"sourcesContent":["// server-only\n\nimport { Sidebar, MetadataMap, Settings, SidebarRoute, Metadata, PageURL } from \"@xyd-js/core\";\nimport { pageFrontMatters } from \"@xyd-js/content\";\nimport { IBreadcrumb, INavLinks } from \"@xyd-js/ui\";\n\nimport { FwSidebarItemProps } from \"../react\";\n\n// TODO: framework vs content responsibility\n\n// mapSettingsToProps maps @xyd-js/core settings into xyd props\nexport async function mapSettingsToProps(\n settings: Settings,\n pagePathMapping: { [key: string]: string },\n slug: string,\n frontmatters?: MetadataMap\n): Promise<{\n groups: FwSidebarItemProps[],\n breadcrumbs: IBreadcrumb[]\n navlinks?: INavLinks\n hiddenPages?: { [key: string]: boolean }\n metadata?: Metadata | null\n}> {\n let uniqIndex = 0\n let filteredNav = filterNavigation(settings, slug)\n if (!frontmatters) {\n frontmatters = await pageFrontMatters(filteredNav, pagePathMapping) as MetadataMap\n }\n\n const slugFrontmatter = frontmatters[slug] || null\n let navlinks: INavLinks | undefined = undefined\n\n const hiddenPages = Object.keys(frontmatters).reduce((acc, page) => {\n if (frontmatters[page].hidden) {\n acc[page] = true\n }\n\n return acc\n }, {})\n\n // Build breadcrumbs by finding the path to the current page\n const breadcrumbs = buildBreadcrumbs(filteredNav, slug, frontmatters, hiddenPages)\n\n function mapItems(\n page: PageURL,\n currentNav: Sidebar,\n nav: Sidebar[]\n ) {\n if (!frontmatters) {\n console.error(\"frontmatters not found\")\n return null\n }\n\n if (typeof page !== \"string\" && !(\"virtual\" in page)) {\n const items = page.pages\n ?.map((p) => mapItems(p, page, nav))\n ?.filter(Boolean)\n\n return {\n title: page.group,\n group: page.group === false ? false : undefined,\n href: \"\",\n active: false,\n uniqIndex: uniqIndex++,\n icon: page.icon,\n items,\n }\n }\n let pageName = \"\"\n if (typeof page === \"string\") {\n pageName = page\n } else {\n pageName = page.page\n }\n\n if (hiddenPages[pageName]) {\n return null\n }\n\n const matterTitle = frontmatters && frontmatters[pageName] && frontmatters[pageName].title\n\n let title = \"\"\n\n if (typeof matterTitle === \"string\") {\n title = matterTitle\n } else {\n // @ts-ignore\n title = matterTitle\n }\n\n if (!title) {\n console.debug(`⚠️ Title not found for page \"${pageName}\"`)\n }\n\n const meta = frontmatters[pageName]\n\n // TODO: better data structures - for example flat array of filtered nav\n if (slugFrontmatter && (slugFrontmatter === meta)) {\n const nlinks = mapNavToLinks(pageName, currentNav, nav, frontmatters, hiddenPages)\n\n if (nlinks) {\n navlinks = nlinks\n }\n }\n\n return {\n title,\n href: safePageLink(pageName),\n active: false,\n uniqIndex: uniqIndex++,\n icon: meta?.icon || \"\",\n sidebarTitle: meta?.sidebarTitle || \"\",\n url: meta?.url || \"\",\n pageMeta: meta || null,\n }\n }\n\n function sidebarItems(\n nav: Sidebar,\n pages: PageURL[],\n ) {\n const items = (pages?.map((p) => mapItems(p, nav, filteredNav)) || [])\n .filter(Boolean)\n\n return {\n group: nav.group,\n icon: nav?.icon,\n items\n } as FwSidebarItemProps\n }\n\n const flatItems: string[] = []\n\n const groups = filteredNav\n .map((nav) => {\n if (typeof nav === \"string\") {\n flatItems.push(nav)\n\n return\n }\n\n // TODO: finish\n if (typeof nav !== \"string\" && \"route\" in nav) {\n if (nav.pages?.length) {\n const items = (nav.pages?.map((p) => mapItems(p, nav, filteredNav)) || [])\n .filter(Boolean)\n\n return {\n items\n } as FwSidebarItemProps\n }\n\n return {\n group: \"\",\n items: [],\n groupIndex: 0,\n } as FwSidebarItemProps\n }\n\n return sidebarItems(nav, nav.pages || [])\n }).filter(Boolean) as FwSidebarItemProps[] || []\n\n if (flatItems.length) {\n const items = sidebarItems({}, flatItems)\n if (items) {\n groups.unshift(items)\n }\n }\n\n return {\n groups,\n breadcrumbs,\n navlinks,\n hiddenPages,\n metadata: slugFrontmatter\n }\n}\n\nfunction filterNavigation(settings: Settings, slug: string): Sidebar[] {\n const sidebarItems: Sidebar[] = []\n\n let multiSidebarMatch: SidebarRoute | null = null\n let foundRoute = false\n\n function findRoute(sidebar: Sidebar | SidebarRoute | string) {\n if (typeof sidebar === \"string\") {\n return\n }\n\n if (\"route\" in sidebar) {\n const sideMatch = normalizeHref(sidebar.route)\n const normalizeSlug = normalizeHref(slug)\n\n // TODO: startWith is not enough e.g `/docs/apps/buildISSUE` if `/docs/apps/build`\n if (normalizeSlug.startsWith(sideMatch)) {\n if (multiSidebarMatch) {\n const findByMatchLvl = multiSidebarMatch.route.split(\"/\").length\n const urlMatchLvl = sideMatch.split(\"/\").length\n\n if (urlMatchLvl > findByMatchLvl) {\n if (!foundRoute) {\n foundRoute = true\n sidebarItems.length = 0\n }\n\n multiSidebarMatch = sidebar\n }\n } else {\n if (!foundRoute) {\n foundRoute = true\n sidebarItems.length = 0\n }\n\n multiSidebarMatch = sidebar\n }\n }\n\n if (\"pages\" in sidebar && sidebar.pages?.length) {\n for (const page of sidebar.pages) {\n findRoute(page)\n }\n }\n }\n\n return\n }\n\n // First pass: find if current route matches any route-based navigation\n settings?.navigation?.sidebar.forEach(sidebar => {\n if (typeof sidebar !== \"string\" && \"route\" in sidebar) {\n findRoute(sidebar)\n }\n })\n\n // If current route matches a route-based navigation, only process that\n if (foundRoute && multiSidebarMatch != null) {\n const side = multiSidebarMatch as SidebarRoute\n sidebarItems.push(...(side?.pages || []))\n return sidebarItems\n }\n\n // Otherwise, process flat pages and regular sidebar items\n const flatPages: string[] = []\n \n settings?.navigation?.sidebar.forEach(sidebar => {\n if (typeof sidebar === \"string\") {\n flatPages.push(sidebar)\n } else if (!(\"route\" in sidebar)) {\n sidebarItems.push(sidebar)\n }\n // Skip route-based items if they don't match current route\n })\n\n // Handle flat pages if we have any\n if (flatPages.length > 0) {\n sidebarItems.push({\n pages: flatPages\n })\n }\n\n return sidebarItems\n}\n\n// TODO: rename this because it's no longer 'navigation' because it returns breadcrumbs, sidebar and nextlinks props\n// TODO: breadcrumbs and frontmatters as content plugins?\n// TODO: idea - calculate breadcrumbs and navlinks near server-side component?\n\nfunction normalizeHrefCheck(first: string, second: string) {\n if (first.startsWith(\"/\")) {\n first = first.slice(1)\n }\n\n if (second.startsWith(\"/\")) {\n second = second.slice(1)\n }\n\n return first === second\n}\n\nfunction normalizeHref(href: string) {\n if (href.startsWith(\"/\")) {\n return href\n }\n\n return `/${href}`\n}\n\nfunction safePageLink(page: string): string {\n return page?.startsWith(\"/\") ? page : `/${page}`\n}\n\n// TODO: support next-prev for different 'groups' levels\nfunction mapNavToLinks(\n page: string,\n currentNav: Sidebar,\n nav: Sidebar[],\n frontmatters: MetadataMap,\n hiddenPages: { [key: string]: boolean }\n): INavLinks | undefined {\n // Flatten all pages from all groups to find the sequence\n const allPages: Array<{ page: string, group: string, groupIndex: number, pageIndex: number }> = []\n\n nav.forEach((group, groupIndex) => {\n if (typeof group === \"string\") {\n allPages.push({\n page: group,\n group: \"\",\n groupIndex,\n pageIndex: groupIndex,\n })\n return\n }\n if (group.pages) {\n group.pages.forEach((pageItem, pageIndex) => {\n let pageName = \"\"\n if (typeof pageItem === \"string\") {\n pageName = pageItem\n } else if (\"virtual\" in pageItem) {\n pageName = pageItem.page\n } else if (\"pages\" in pageItem) {\n // This is a nested Sidebar, use BFS to resolve all pages\n const resolvedPages = findResolvedPagesBFS(pageItem)\n if (resolvedPages.length > 0) {\n // Add all resolved pages to the allPages array\n resolvedPages.forEach((resolvedPage, resolvedIndex) => {\n if (!hiddenPages[resolvedPage]) {\n allPages.push({\n page: resolvedPage,\n group: group.group || \"\",\n groupIndex,\n pageIndex: pageIndex + resolvedIndex\n })\n }\n })\n // Skip adding the original nested sidebar since we've added all its resolved pages\n return\n }\n } else if (\"page\" in pageItem && typeof pageItem === \"object\") {\n // This is a VirtualPage object with page property\n pageName = (pageItem as { page: string }).page\n }\n\n if (pageName && !hiddenPages[pageName]) {\n allPages.push({\n page: pageName,\n group: group.group || \"\",\n groupIndex,\n pageIndex\n })\n }\n })\n }\n })\n\n // Find current page in the flattened list\n const currentPageIndex = allPages.findIndex(p => p.page === page)\n\n if (currentPageIndex === -1) {\n return undefined\n }\n\n // Get previous and next pages\n const prevPage = allPages[currentPageIndex - 1]\n const nextPage = allPages[currentPageIndex + 1]\n\n let prevLink\n let nextLink\n\n if (prevPage) {\n const prevTitle = frontmatters[prevPage.page]?.title || prevPage.page\n if (typeof prevTitle === \"string\") {\n prevLink = {\n title: prevTitle,\n href: safePageLink(prevPage.page),\n }\n }\n }\n\n if (nextPage) {\n const nextTitle = frontmatters[nextPage.page]?.title || nextPage.page\n if (typeof nextTitle === \"string\") {\n nextLink = {\n title: nextTitle,\n href: safePageLink(nextPage.page),\n }\n }\n }\n\n return {\n prev: prevLink || undefined,\n next: nextLink || undefined,\n }\n}\n\n\n// BFS algorithm to resolve all pages in a nested Sidebar structure\nfunction findResolvedPagesBFS(sidebar: Sidebar): string[] {\n if (!sidebar.pages || sidebar.pages.length === 0) {\n return []\n }\n\n const resolvedPages: string[] = []\n const queue: PageURL[] = [...sidebar.pages]\n\n while (queue.length > 0) {\n const current = queue.shift()!\n\n if (typeof current === \"string\") {\n resolvedPages.push(current)\n } else if (\"virtual\" in current) {\n resolvedPages.push(current.page)\n } else if (\"page\" in current && typeof current === \"object\") {\n resolvedPages.push((current as { page: string }).page)\n } else if (\"pages\" in current && current.pages) {\n // Add all pages from this nested sidebar to the queue\n queue.push(...current.pages)\n }\n }\n\n return resolvedPages\n}\n\n// Helper function to safely get group title\nfunction getGroupTitle(group: any): string {\n return (typeof group === 'string' && group.length > 0) ? group : ''\n}\n\n// Build breadcrumbs by finding the path to the current page\nfunction buildBreadcrumbs(\n navigation: Sidebar[],\n currentSlug: string,\n frontmatters: MetadataMap,\n hiddenPages: { [key: string]: boolean }\n): IBreadcrumb[] {\n const breadcrumbs: IBreadcrumb[] = []\n\n // Find the path to the current page\n const path = findPathToPage(navigation, currentSlug, frontmatters, hiddenPages)\n if (!path?.length) {\n return []\n }\n\n for (const item of path) {\n if (item.type === 'group') {\n breadcrumbs.push({\n title: item.title,\n href: item.href\n })\n } else if (item.type === 'page' && item.page) {\n const pageTitle = frontmatters[item.page]?.title || item.page\n breadcrumbs.push({\n title: pageTitle,\n href: safePageLink(item.page)\n })\n }\n }\n\n return breadcrumbs\n}\n\n// Find the path from root to the current page\nfunction findPathToPage(\n navigation: Sidebar[],\n targetSlug: string,\n frontmatters: MetadataMap,\n hiddenPages: { [key: string]: boolean }\n): Array<{ type: 'group' | 'page', title: string, href: string, page?: string }> {\n const path: Array<{ type: 'group' | 'page', title: string, href: string, page?: string }> = []\n\n function searchInNavigation(nav: Sidebar[], currentPath: Array<{ type: 'group' | 'page', title: string, href: string, page?: string }>): boolean {\n for (const item of nav) {\n if (typeof item === \"string\") {\n path.push(item)\n return false\n }\n\n if (\"route\" in item) {\n // Handle route-based navigation\n if (item.pages) {\n const newPath = [...currentPath]\n if (item.group && typeof item.group === 'string' && item.group.length > 0) {\n newPath.push({\n type: 'group',\n title: getGroupTitle(item.group),\n href: (item.route as string) || \"\"\n })\n }\n\n if (searchInPages(item.pages, newPath)) {\n path.push(...newPath)\n return true\n }\n }\n } else {\n // Handle regular sidebar navigation\n const newPath = [...currentPath]\n if (item.group && typeof item.group === 'string') {\n newPath.push({\n type: 'group',\n title: item.group,\n href: \"\"\n })\n }\n\n if (item.pages && searchInPages(item.pages, newPath)) {\n path.push(...newPath)\n return true\n }\n }\n }\n return false\n }\n\n function searchInPages(pages: PageURL[], currentPath: Array<{ type: 'group' | 'page', title: string, href: string, page?: string }>): boolean {\n for (const page of pages) {\n if (typeof page === \"string\") {\n if (page === targetSlug && !hiddenPages[page]) {\n currentPath.push({\n type: 'page',\n title: frontmatters[page]?.title || page,\n href: safePageLink(page),\n page: page\n })\n return true\n }\n } else if (\"virtual\" in page) {\n if (page.page === targetSlug && !hiddenPages[page.page]) {\n currentPath.push({\n type: 'page',\n title: frontmatters[page.page]?.title || page.page,\n href: safePageLink(page.page),\n page: page.page\n })\n return true\n }\n } else if (\"pages\" in page) {\n // Nested sidebar - only add to path if we find the target in this branch\n const newPath = [...currentPath]\n if (page.group && typeof page.group === 'string') {\n newPath.push({\n type: 'group',\n title: page.group,\n href: \"\"\n })\n }\n\n if (searchInPages(page.pages || [], newPath)) {\n // Replace current path with the new path that includes the group\n currentPath.length = 0\n currentPath.push(...newPath)\n return true\n }\n } else if (\"page\" in page && typeof page === \"object\") {\n const pageName = (page as { page: string }).page\n if (pageName === targetSlug && !hiddenPages[pageName]) {\n currentPath.push({\n type: 'page',\n title: frontmatters[pageName]?.title || pageName,\n href: safePageLink(pageName),\n page: pageName\n })\n return true\n }\n }\n }\n return false\n }\n\n searchInNavigation(navigation, [])\n return path\n}"],"mappings":"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","names":["_a"]}
@@ -0,0 +1,7 @@
1
+ import { Metadata, PageLayout } from '@xyd-js/core';
2
+ export { R as ROSurface, b as SurfaceOptions, S as SurfaceTarget, a as SurfaceTargetType, c as Surfaces } from './surfaces-BCt6G97W.js';
3
+ import 'react';
4
+
5
+ declare function pageMetaLayout(meta?: Metadata): PageLayout | undefined;
6
+
7
+ export { pageMetaLayout };
package/dist/index.js ADDED
@@ -0,0 +1,50 @@
1
+ // src/pagemeta.ts
2
+ function pageMetaLayout(meta) {
3
+ switch (meta == null ? void 0 : meta.component) {
4
+ case "home":
5
+ case "firstslide":
6
+ case "bloghome":
7
+ return "page";
8
+ default:
9
+ return void 0;
10
+ }
11
+ }
12
+
13
+ // src/surfaces.ts
14
+ var SurfaceTarget = /* @__PURE__ */ ((SurfaceTarget2) => {
15
+ SurfaceTarget2["NavRight"] = "nav.right";
16
+ SurfaceTarget2["SidebarTop"] = "sidebar.top";
17
+ SurfaceTarget2["PageFooterBottom"] = "page.footer.bottom";
18
+ SurfaceTarget2["SidebarItemLeft"] = "sidebar.item.left";
19
+ SurfaceTarget2["SidebarItemRight"] = "sidebar.item.right";
20
+ return SurfaceTarget2;
21
+ })(SurfaceTarget || {});
22
+ var Surfaces = class {
23
+ constructor() {
24
+ this.registry = {};
25
+ }
26
+ define(target, component, opts) {
27
+ if (opts == null ? void 0 : opts.append) {
28
+ if (Array.isArray(this.registry[target])) {
29
+ this.registry[target].push(component);
30
+ return;
31
+ }
32
+ if (this.registry[target]) {
33
+ this.registry[target] = [this.registry[target], component];
34
+ return;
35
+ }
36
+ this.registry[target] = [component];
37
+ return;
38
+ }
39
+ this.registry[target] = component;
40
+ }
41
+ get(target) {
42
+ return this.registry[target];
43
+ }
44
+ };
45
+ export {
46
+ SurfaceTarget,
47
+ Surfaces,
48
+ pageMetaLayout
49
+ };
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/pagemeta.ts","../src/surfaces.ts"],"sourcesContent":["import { Metadata, PageLayout } from \"@xyd-js/core\";\n\n// TODO: in the future it should configurable only via `@metaComponent`\nexport function pageMetaLayout(meta?: Metadata): PageLayout | undefined {\n switch (meta?.component) {\n case \"home\":\n case \"firstslide\":\n case \"bloghome\":\n return \"page\"\n default:\n return undefined\n }\n}","import React, { createContext } from 'react'\n\nexport enum SurfaceTarget {\n NavRight = \"nav.right\",\n\n SidebarTop = \"sidebar.top\",\n\n PageFooterBottom = \"page.footer.bottom\",\n\n SidebarItemLeft = \"sidebar.item.left\",\n SidebarItemRight = \"sidebar.item.right\",\n}\n\n// Type that allows both enum and string values\nexport type SurfaceTargetType = SurfaceTarget | `${SurfaceTarget}`\n\nexport interface SurfaceOptions {\n append?: boolean\n}\n\nexport interface ROSurface {\n get(target: SurfaceTargetType): React.JSX.Element | React.JSX.Element[] | undefined\n}\n\n// TODO: framework vs theme ?\nexport class Surfaces implements ROSurface {\n private registry: Partial<Record<SurfaceTargetType, React.JSX.Element | React.JSX.Element[]>> = {}\n\n public define(\n target: SurfaceTargetType,\n component: React.JSX.Element | React.ComponentType<any>, // TODO: fix any\n opts?: SurfaceOptions\n ) {\n if (opts?.append) {\n if (Array.isArray(this.registry[target])) {\n this.registry[target].push(component)\n return\n }\n\n if (this.registry[target]) {\n this.registry[target] = [this.registry[target], component]\n return\n }\n\n this.registry[target] = [component]\n\n return\n }\n\n this.registry[target] = component\n }\n\n public get(target: SurfaceTargetType): React.JSX.Element | React.JSX.Element[] | undefined {\n return this.registry[target]\n }\n}\n"],"mappings":";AAGO,SAAS,eAAe,MAAyC;AACpE,UAAQ,6BAAM,WAAW;AAAA,IACrB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACD,aAAO;AAAA,IACX;AACI,aAAO;AAAA,EACf;AACJ;;;ACVO,IAAK,gBAAL,kBAAKA,mBAAL;AACH,EAAAA,eAAA,cAAW;AAEX,EAAAA,eAAA,gBAAa;AAEb,EAAAA,eAAA,sBAAmB;AAEnB,EAAAA,eAAA,qBAAkB;AAClB,EAAAA,eAAA,sBAAmB;AARX,SAAAA;AAAA,GAAA;AAuBL,IAAM,WAAN,MAAoC;AAAA,EAApC;AACH,SAAQ,WAAwF,CAAC;AAAA;AAAA,EAE1F,OACH,QACA,WACA,MACF;AACE,QAAI,6BAAM,QAAQ;AACd,UAAI,MAAM,QAAQ,KAAK,SAAS,MAAM,CAAC,GAAG;AACtC,aAAK,SAAS,MAAM,EAAE,KAAK,SAAS;AACpC;AAAA,MACJ;AAEA,UAAI,KAAK,SAAS,MAAM,GAAG;AACvB,aAAK,SAAS,MAAM,IAAI,CAAC,KAAK,SAAS,MAAM,GAAG,SAAS;AACzD;AAAA,MACJ;AAEA,WAAK,SAAS,MAAM,IAAI,CAAC,SAAS;AAElC;AAAA,IACJ;AAEA,SAAK,SAAS,MAAM,IAAI;AAAA,EAC5B;AAAA,EAEO,IAAI,QAAgF;AACvF,WAAO,KAAK,SAAS,MAAM;AAAA,EAC/B;AACJ;","names":["SurfaceTarget"]}