@turnipxenon/pineapple 2.4.29 → 2.4.31
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/.idea/workspace.xml +171 -159
- package/.svelte-kit/__package__/components/navigation_component/NavigationComponent.svelte +229 -0
- package/.svelte-kit/__package__/components/navigation_component/NavigationComponent.svelte.d.ts +24 -0
- package/.svelte-kit/__package__/components/navigation_component/NavigationControl.svelte +121 -0
- package/.svelte-kit/__package__/components/navigation_component/NavigationControl.svelte.d.ts +18 -0
- package/.svelte-kit/__package__/components/navigation_component/PageMeta.d.ts +23 -0
- package/.svelte-kit/__package__/components/navigation_component/PageMeta.js +76 -0
- package/.svelte-kit/__package__/components/navigation_component/index.d.ts +2 -0
- package/.svelte-kit/__package__/components/navigation_component/index.js +3 -0
- package/.svelte-kit/__package__/index.d.ts +1 -0
- package/.svelte-kit/__package__/index.js +1 -0
- package/.svelte-kit/generated/client/app.js +19 -3
- package/.svelte-kit/generated/client/nodes/10.js +1 -0
- package/.svelte-kit/generated/client/nodes/11.js +1 -0
- package/.svelte-kit/generated/client/nodes/12.js +1 -0
- package/.svelte-kit/generated/client/nodes/13.js +1 -0
- package/.svelte-kit/generated/client/nodes/14.js +3 -0
- package/.svelte-kit/generated/client/nodes/15.js +3 -0
- package/.svelte-kit/generated/client/nodes/6.js +1 -3
- package/.svelte-kit/generated/client/nodes/7.js +1 -3
- package/.svelte-kit/generated/client/nodes/8.js +1 -1
- package/.svelte-kit/generated/client/nodes/9.js +1 -1
- package/.svelte-kit/generated/server/internal.js +1 -1
- package/.svelte-kit/types/route_meta_data.json +8 -0
- package/.svelte-kit/types/src/routes/$types.d.ts +1 -1
- package/.svelte-kit/types/src/routes/(pineapple)/$types.d.ts +1 -1
- package/.svelte-kit/types/src/routes/(pineapple)/pineapple/(extra-pages)/page1/$types.d.ts +17 -0
- package/.svelte-kit/types/src/routes/(pineapple)/pineapple/(extra-pages)/page2/$types.d.ts +17 -0
- package/.svelte-kit/types/src/routes/(pineapple)/pineapple/(extra-pages)/page3/$types.d.ts +17 -0
- package/.svelte-kit/types/src/routes/(pineapple)/pineapple/(extra-pages)/page3/page5/$types.d.ts +17 -0
- package/.svelte-kit/types/src/routes/(pineapple)/pineapple/(extra-pages)/page3/page6/$types.d.ts +17 -0
- package/.svelte-kit/types/src/routes/(pineapple)/pineapple/(extra-pages)/page3/page7/$types.d.ts +17 -0
- package/.svelte-kit/types/src/routes/(pineapple)/pineapple/(extra-pages)/page3/page7/(test_layout)/page8/$types.d.ts +17 -0
- package/.svelte-kit/types/src/routes/(pineapple)/pineapple/(extra-pages)/page4/$types.d.ts +17 -0
- package/dist/components/navigation_component/NavigationComponent.svelte +229 -0
- package/dist/components/navigation_component/NavigationComponent.svelte.d.ts +24 -0
- package/dist/components/navigation_component/NavigationControl.svelte +121 -0
- package/dist/components/navigation_component/NavigationControl.svelte.d.ts +18 -0
- package/dist/components/navigation_component/PageMeta.d.ts +23 -0
- package/dist/components/navigation_component/PageMeta.js +76 -0
- package/dist/components/navigation_component/index.d.ts +2 -0
- package/dist/components/navigation_component/index.js +3 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/package.json +1 -1
- package/src/lib/components/navigation_component/NavigationComponent.svelte +118 -0
- package/src/lib/components/navigation_component/NavigationControl.svelte +61 -0
- package/src/lib/components/navigation_component/PageMeta.ts +118 -0
- package/src/lib/components/navigation_component/index.ts +4 -0
- package/src/lib/index.ts +1 -0
- package/src/routes/(pineapple)/+page.svelte +1 -1
- package/src/routes/(pineapple)/pineapple/(extra-pages)/page1/+page.svelte +13 -0
- package/src/routes/(pineapple)/pineapple/(extra-pages)/page2/+page.svelte +8 -0
- package/src/routes/(pineapple)/pineapple/(extra-pages)/page3/+page.svelte +8 -0
- package/src/routes/(pineapple)/pineapple/(extra-pages)/page3/page5/+page.svelte +8 -0
- package/src/routes/(pineapple)/pineapple/(extra-pages)/page3/page6/+page.svelte +8 -0
- package/src/routes/(pineapple)/pineapple/(extra-pages)/page3/page7/(test_layout)/page8/+page.svelte +8 -0
- package/src/routes/(pineapple)/pineapple/(extra-pages)/page3/page7/+page.svelte +8 -0
- package/src/routes/(pineapple)/pineapple/(extra-pages)/page4/+page.svelte +7 -0
- package/src/routes/(pineapple)/pineapple/+page.svelte +12 -7
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from "svelte";
|
|
3
|
+
|
|
4
|
+
export let currentIndex = 0;
|
|
5
|
+
export let contentLength: number;
|
|
6
|
+
export let pageSize: number;
|
|
7
|
+
|
|
8
|
+
import { Card } from "$pkg";
|
|
9
|
+
import { page } from "$app/stores";
|
|
10
|
+
import { goto } from "$app/navigation";
|
|
11
|
+
|
|
12
|
+
const queryIndex = $page.url.searchParams.get("index");
|
|
13
|
+
if (queryIndex) {
|
|
14
|
+
currentIndex = parseInt(queryIndex) || 0;
|
|
15
|
+
}
|
|
16
|
+
const queryPageSize = $page.url.searchParams.get("pageSize");
|
|
17
|
+
if (queryPageSize) {
|
|
18
|
+
pageSize = parseInt(queryPageSize) || 5;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const movePage = (isNext: boolean) => {
|
|
22
|
+
if (isNext) {
|
|
23
|
+
currentIndex = currentIndex + 1;
|
|
24
|
+
} else {
|
|
25
|
+
currentIndex = currentIndex - 1;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const query = new URLSearchParams($page.url.searchParams.toString());
|
|
29
|
+
query.set("index", currentIndex.toString());
|
|
30
|
+
goto(`?${query.toString()}`);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
onMount(() => {
|
|
34
|
+
const query = new URLSearchParams($page.url.searchParams.toString());
|
|
35
|
+
query.set("index", currentIndex.toString());
|
|
36
|
+
query.set("pageSize", pageSize.toString());
|
|
37
|
+
goto(`?${query.toString()}`);
|
|
38
|
+
});
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
<div class="navigation-control-container">
|
|
42
|
+
<button class="navigation-control-button"
|
|
43
|
+
disabled={currentIndex <= 0}
|
|
44
|
+
on:click={() => {movePage(false)}}>{"<"}</button>
|
|
45
|
+
<Card marginBottom="0"><p slot="content" style="margin: 1em">Page {currentIndex + 1}</p></Card>
|
|
46
|
+
<button class="navigation-control-button"
|
|
47
|
+
disabled={(currentIndex + 1) * pageSize >= contentLength}
|
|
48
|
+
on:click={() => {movePage(true)}}>{">"}</button>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<style lang="postcss">
|
|
52
|
+
.navigation-control-container {
|
|
53
|
+
display: flex;
|
|
54
|
+
justify-content: space-between;
|
|
55
|
+
margin: 1lh 0;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.navigation-control-button {
|
|
59
|
+
@apply btn variant-filled-secondary;
|
|
60
|
+
}
|
|
61
|
+
</style>
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { RawGlob } from "$pkg";
|
|
2
|
+
|
|
3
|
+
export interface PageMeta {
|
|
4
|
+
// generated meta
|
|
5
|
+
relativeLink: string;
|
|
6
|
+
nestedPages: PageMeta[];
|
|
7
|
+
|
|
8
|
+
// defined meta
|
|
9
|
+
title: string; // defaults to directory name
|
|
10
|
+
tags: string[];
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Images are only limited to absolute paths (includes files in static folder)
|
|
14
|
+
*/
|
|
15
|
+
image?: string;
|
|
16
|
+
imageAlt?: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
datePublished?: string;
|
|
19
|
+
lastUpdated?: string;
|
|
20
|
+
shouldGroup?: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* todo: doc
|
|
25
|
+
* @param parentList
|
|
26
|
+
* @param child
|
|
27
|
+
*/
|
|
28
|
+
export const findPageMetaParent = (parentList: PageMeta[], child: PageMeta): boolean => {
|
|
29
|
+
let isChild = false;
|
|
30
|
+
|
|
31
|
+
parentList.every(parent => {
|
|
32
|
+
if (child.relativeLink.startsWith(`${parent.relativeLink}/`)) {
|
|
33
|
+
const isNestedChild = findPageMetaParent(parent.nestedPages, child);
|
|
34
|
+
if (!isNestedChild) {
|
|
35
|
+
parent.nestedPages.push(child);
|
|
36
|
+
}
|
|
37
|
+
isChild = true;
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return true;
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
return isChild;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export type ParsePageMetaCompareFn = ((a: PageMeta, b: PageMeta) => number);
|
|
48
|
+
|
|
49
|
+
export const parsePageMeta = (fileList: Record<string, unknown>,
|
|
50
|
+
compareFn?: ParsePageMetaCompareFn): PageMeta[] => {
|
|
51
|
+
const pageFlatList: PageMeta[] = [];
|
|
52
|
+
// save for the future
|
|
53
|
+
// let pageGroupedList: PageMeta[] = [];
|
|
54
|
+
|
|
55
|
+
for (const path in fileList) {
|
|
56
|
+
const pathParts = path.split("/");
|
|
57
|
+
pathParts.pop();
|
|
58
|
+
|
|
59
|
+
// get title
|
|
60
|
+
const title = pathParts[pathParts.length - 1].replaceAll("-", " ");
|
|
61
|
+
|
|
62
|
+
// get url path
|
|
63
|
+
const subPath = pathParts.filter(s => {
|
|
64
|
+
return s !== "." && s.indexOf("(") !== 0;
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
// todo: consider
|
|
69
|
+
// subPath.unshift("/misc");
|
|
70
|
+
const meta: PageMeta = {
|
|
71
|
+
relativeLink: subPath.join("/"),
|
|
72
|
+
title,
|
|
73
|
+
tags: [],
|
|
74
|
+
nestedPages: []
|
|
75
|
+
// todo: transform the data in server.ts?
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
const body = (fileList[path] as RawGlob).default as string;
|
|
80
|
+
// let metadata : undefined | Map<string, string | string[]>;
|
|
81
|
+
if (body.startsWith("<!--")) {
|
|
82
|
+
// todo: absorb more metadata
|
|
83
|
+
const metadata = JSON.parse(body.slice("<!--".length, body.indexOf("-->")));
|
|
84
|
+
meta.title = metadata["title"] ?? meta.title;
|
|
85
|
+
meta.tags = metadata["tags"];
|
|
86
|
+
meta.description = metadata["description"];
|
|
87
|
+
meta.datePublished = metadata["datePublished"];
|
|
88
|
+
meta.lastUpdated = metadata["lastUpdated"];
|
|
89
|
+
meta.shouldGroup = metadata["shouldGroup"] as boolean;
|
|
90
|
+
|
|
91
|
+
meta.image = metadata["image"];
|
|
92
|
+
if (meta.image) {
|
|
93
|
+
meta.imageAlt = metadata["imageAlt"];
|
|
94
|
+
if (!meta.imageAlt) {
|
|
95
|
+
console.warn(`Accessibility issues: image alt missing for image ${meta.image}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
pageFlatList.push(meta);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
pageFlatList.sort((a, b) => a.relativeLink.localeCompare(b.relativeLink));
|
|
104
|
+
|
|
105
|
+
// find groupings
|
|
106
|
+
// todo: we don't even have use for this yet!
|
|
107
|
+
// pageFlatList.forEach(p => {
|
|
108
|
+
// if (!findPageMetaParent(pageGroupedList, p)) {
|
|
109
|
+
// pageGroupedList.push(p);
|
|
110
|
+
// }
|
|
111
|
+
// });
|
|
112
|
+
|
|
113
|
+
if (compareFn) {
|
|
114
|
+
pageFlatList.sort(compareFn);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return pageFlatList;
|
|
118
|
+
};
|
package/src/lib/index.ts
CHANGED
|
@@ -6,6 +6,7 @@ export { default as LazyAsset } from "./components/LazyAsset.svelte";
|
|
|
6
6
|
export { default as Card } from "./components/Card.svelte";
|
|
7
7
|
|
|
8
8
|
export * from "$pkg/components/overrideable_meta/index";
|
|
9
|
+
export * from "$pkg/components/navigation_component/index";
|
|
9
10
|
export * from "./components/dialog_manager/DialogManagerStore";
|
|
10
11
|
export * from "./components/dialog_manager/DialogManager";
|
|
11
12
|
export * from "./components/dialog_manager/DialogUtils";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!--{
|
|
2
|
+
"title": "Custom title for page 1",
|
|
3
|
+
"image": "/favicon.png",
|
|
4
|
+
"tags": ["random"]
|
|
5
|
+
}-->
|
|
6
|
+
<script>
|
|
7
|
+
import { Card } from "$pkg";
|
|
8
|
+
import { page } from "$app/stores";
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<Card>
|
|
12
|
+
<h1 slot="content" class="default-card">{$page.url}</h1>
|
|
13
|
+
</Card>
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
import TestCard from "$pkg/components/pineapple/toast/custom-toast/TestCustomToast.svelte";
|
|
4
4
|
import TestDialogYarn from "./TestDialog.yarn?raw";
|
|
5
5
|
import { Card, dialogManager } from "$pkg";
|
|
6
|
+
import NavigationComponent from "$pkg/components/navigation_component/NavigationComponent.svelte";
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
// region Toast test scripts
|
|
8
9
|
let testingQueueNumber = 1;
|
|
9
10
|
const testingRandomPhrases = [
|
|
10
11
|
"Niko",
|
|
@@ -24,6 +25,11 @@
|
|
|
24
25
|
dialogManager.toggleDialogOverlay();
|
|
25
26
|
}
|
|
26
27
|
};
|
|
28
|
+
// endregion
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
// todo: fix fragile relative reference to the root
|
|
32
|
+
const fileList = import.meta.glob("./**/+page.svelte", { query: "?raw", eager: true });
|
|
27
33
|
</script>
|
|
28
34
|
|
|
29
35
|
<div class="pineapple-container">
|
|
@@ -45,8 +51,11 @@
|
|
|
45
51
|
on:click={onTestDialogClick}><h3>Test dialog</h3></button>
|
|
46
52
|
</div>
|
|
47
53
|
</Card>
|
|
48
|
-
|
|
49
|
-
<
|
|
54
|
+
|
|
55
|
+
<NavigationComponent title="Navigation Component Test"
|
|
56
|
+
fileList={fileList}
|
|
57
|
+
parentSubpath="/pineapple/">
|
|
58
|
+
</NavigationComponent>
|
|
50
59
|
</div>
|
|
51
60
|
|
|
52
61
|
<style lang="postcss">
|
|
@@ -60,8 +69,4 @@
|
|
|
60
69
|
display: flex;
|
|
61
70
|
flex-direction: column;
|
|
62
71
|
}
|
|
63
|
-
|
|
64
|
-
.filler {
|
|
65
|
-
padding: 2em;
|
|
66
|
-
}
|
|
67
72
|
</style>
|