@turnipxenon/pineapple 3.0.0-alpha.8 → 3.0.0
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/dist/components/blog_template/BlogTemplate.svelte +1 -1
- package/dist/components/blog_template/BlogTemplateInner.svelte +1 -1
- package/dist/components/blog_template/BlogTemplateInner.svelte.d.ts +1 -1
- package/dist/components/dialog_manager/DialogManager.d.ts +2 -1
- package/dist/components/dialog_manager/DialogMangerInit.d.ts +2 -15
- package/dist/components/dialog_manager/DialogMangerInit.js +8 -2
- package/dist/components/dialog_manager/IDialogManager.d.ts +39 -0
- package/dist/components/dialog_manager/IDialogManager.js +4 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.d.ts +3 -0
- package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.js +15 -3
- package/dist/components/dialog_overlay/DialogOverlay.svelte +31 -22
- package/dist/components/navigation_component/NavigationComponent.svelte +2 -1
- package/dist/components/navigation_component/NavigationControl.svelte +1 -1
- package/dist/components/pineapple/PineappleBaseLayout.svelte +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -2
- package/dist/styles/turnip-theme.css +64 -64
- package/dist/ui/components/SocialSection.svelte +6 -2
- package/dist/ui/components/accordion/PinyaAccordion.svelte +21 -0
- package/dist/ui/components/accordion/PinyaAccordion.svelte.d.ts +8 -0
- package/dist/ui/components/accordion/PinyaAccordionItem.svelte +29 -0
- package/dist/ui/components/accordion/PinyaAccordionItem.svelte.d.ts +9 -0
- package/dist/ui/components/accordion/index.d.ts +2 -0
- package/dist/ui/components/accordion/index.js +2 -0
- package/dist/ui/components/index.d.ts +1 -0
- package/dist/ui/components/index.js +1 -0
- package/dist/ui/elements/{pinya-button/component.svelte → PinyaButton/PinyaButton.svelte} +4 -3
- package/dist/ui/elements/PinyaButton/PinyaButton.svelte.d.ts +4 -0
- package/dist/ui/elements/{pinya-button/props.d.ts → PinyaButton/PinyaButtonProps.d.ts} +1 -0
- package/dist/ui/elements/PinyaButton/index.d.ts +2 -0
- package/dist/ui/elements/PinyaButton/index.js +2 -0
- package/dist/ui/elements/Placeholder.svelte +17 -0
- package/dist/ui/elements/Placeholder.svelte.d.ts +7 -0
- package/dist/ui/elements/index.d.ts +1 -1
- package/dist/ui/elements/index.js +1 -1
- package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts +1 -0
- package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte +7 -2
- package/dist/ui/modules/projects/Hepcat.svelte +6 -4
- package/dist/ui/modules/projects/Hepcat.svelte.d.ts +1 -1
- package/dist/ui/modules/projects/Pengi.svelte +6 -4
- package/dist/ui/modules/projects/Pengi.svelte.d.ts +1 -1
- package/dist/ui/modules/projects/Soulwork.svelte +7 -5
- package/dist/ui/modules/projects/ThisWebpage.svelte +9 -8
- package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts +1 -1
- package/dist/ui/modules/seaweed/ChumBucket.svelte +5 -4
- package/dist/ui/templates/{pinya-page-layout/component.svelte → PinyaPageLayout/PinyaPageLayout.svelte} +1 -1
- package/dist/ui/templates/PinyaPageLayout/PinyaPageLayout.svelte.d.ts +9 -0
- package/dist/ui/templates/PinyaPageLayout/index.d.ts +2 -0
- package/dist/ui/templates/PinyaPageLayout/index.js +2 -0
- package/dist/ui/templates/{pinya-page-layout → PinyaPageLayout}/runes.svelte.d.ts +1 -0
- package/dist/ui/templates/PinyaPageLayout/runes.svelte.js +4 -0
- package/dist/{template/seaweed → ui/templates/SeaweedLayout}/CreateUrlForm.svelte +2 -2
- package/dist/ui/templates/SeaweedLayout/EntryOrderConfig.svelte.d.ts +9 -0
- package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/ProjectGroupConfig.svelte.d.ts +1 -1
- package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/SeaweedLayout.svelte +7 -7
- package/dist/ui/templates/confirmation-modal/component.svelte +1 -1
- package/dist/ui/templates/index.d.ts +2 -2
- package/dist/ui/templates/index.js +2 -2
- package/package.json +3 -2
- package/dist/template/seaweed/ParseQueryTerms.d.ts +0 -1
- package/dist/template/seaweed/ParseQueryTerms.js +0 -23
- package/dist/template/seaweed/RunChaos.d.ts +0 -1
- package/dist/template/seaweed/RunChaos.js +0 -41
- package/dist/template/seaweed/SeaweedTemplate.svelte +0 -336
- package/dist/template/seaweed/SeaweedTemplate.svelte.d.ts +0 -32
- package/dist/template/seaweed/SeaweedTemplateData.d.ts +0 -30
- package/dist/template/seaweed/SeaweedTemplateData.js +0 -79
- package/dist/template/seaweed/entries/ChefWings.svelte +0 -45
- package/dist/template/seaweed/entries/ChefWings.svelte.d.ts +0 -7
- package/dist/template/seaweed/entries/CustomizedYarnspinner.svelte +0 -40
- package/dist/template/seaweed/entries/CustomizedYarnspinner.svelte.d.ts +0 -7
- package/dist/template/seaweed/entries/EntryProps.d.ts +0 -16
- package/dist/template/seaweed/entries/EntryProps.js +0 -5
- package/dist/template/seaweed/entries/Hepcat.svelte +0 -64
- package/dist/template/seaweed/entries/Hepcat.svelte.d.ts +0 -7
- package/dist/template/seaweed/entries/Pengi.svelte +0 -57
- package/dist/template/seaweed/entries/Pengi.svelte.d.ts +0 -7
- package/dist/template/seaweed/entries/Soulwork.svelte +0 -54
- package/dist/template/seaweed/entries/Soulwork.svelte.d.ts +0 -7
- package/dist/template/seaweed/entries/ThisWebpage.svelte +0 -55
- package/dist/template/seaweed/entries/ThisWebpage.svelte.d.ts +0 -7
- package/dist/template/seaweed/entries/WorkExperience.svelte +0 -130
- package/dist/template/seaweed/entries/WorkExperience.svelte.d.ts +0 -8
- package/dist/template/seaweed/entries/Workset.svelte +0 -57
- package/dist/template/seaweed/entries/Workset.svelte.d.ts +0 -7
- package/dist/template/seaweed/entry_order_config/EntryOrderConfig.d.ts +0 -1
- package/dist/template/seaweed/entry_order_config/EntryOrderConfig.js +0 -8
- package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte +0 -297
- package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte.d.ts +0 -12
- package/dist/template/seaweed/entry_order_config/entry-order-config.postcss +0 -35
- package/dist/template/seaweed/index.d.ts +0 -4
- package/dist/template/seaweed/index.js +0 -4
- package/dist/template/seaweed/seaweed.postcss +0 -125
- package/dist/ui/elements/pinya-button/component.svelte.d.ts +0 -4
- package/dist/ui/elements/pinya-button/index.d.ts +0 -2
- package/dist/ui/elements/pinya-button/index.js +0 -2
- package/dist/ui/templates/pinya-page-layout/component.svelte.d.ts +0 -9
- package/dist/ui/templates/pinya-page-layout/index.d.ts +0 -2
- package/dist/ui/templates/pinya-page-layout/index.js +0 -2
- package/dist/ui/templates/pinya-page-layout/runes.svelte.js +0 -3
- package/dist/ui/templates/seaweed-layout/EntryOrderConfig2.svelte.d.ts +0 -9
- /package/dist/ui/elements/{pinya-button/props.js → PinyaButton/PinyaButtonProps.js} +0 -0
- /package/dist/{template/seaweed → ui/templates/SeaweedLayout}/CreateUrlForm.svelte.d.ts +0 -0
- /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/EntryGroup.svelte +0 -0
- /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/EntryGroup.svelte.d.ts +0 -0
- /package/dist/ui/templates/{seaweed-layout/EntryOrderConfig2.svelte → SeaweedLayout/EntryOrderConfig.svelte} +0 -0
- /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/ProjectComponentProps.d.ts +0 -0
- /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/ProjectComponentProps.js +0 -0
- /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/ProjectGroupConfig.svelte +0 -0
- /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/SeaweedLayout.md +0 -0
- /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/SeaweedLayout.svelte.d.ts +0 -0
- /package/dist/{template/seaweed → ui/templates/SeaweedLayout}/ToastSettings.d.ts +0 -0
- /package/dist/{template/seaweed → ui/templates/SeaweedLayout}/ToastSettings.js +0 -0
- /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/index.d.ts +0 -0
- /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/index.js +0 -0
- /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/props.d.ts +0 -0
- /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/props.js +0 -0
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
<!-- @migration-task Error while migrating Svelte code: Can't migrate code with afterUpdate. Please migrate by hand. -->
|
|
2
|
-
<script lang="ts">
|
|
3
|
-
import { afterUpdate, type ComponentType, onMount } from "svelte";
|
|
4
|
-
import EntryOrderConfig from "./entry_order_config/EntryOrderConfig.svelte";
|
|
5
|
-
import { runChaos } from "./RunChaos";
|
|
6
|
-
import SocialSection from "../../ui/components/SocialSection.svelte";
|
|
7
|
-
import SeaweedBaseLayout from "../../components/layouts/SeaweedBaseLayout.svelte";
|
|
8
|
-
import { page } from "$app/stores";
|
|
9
|
-
import Card from "../../components/Card.svelte";
|
|
10
|
-
import {
|
|
11
|
-
type ComponentMeta,
|
|
12
|
-
type EntryGroup,
|
|
13
|
-
type SeaweedTemplateData,
|
|
14
|
-
TurnGroupEntriesMutable
|
|
15
|
-
} from "./SeaweedTemplateData";
|
|
16
|
-
import type { EntryProps } from "./entries/EntryProps";
|
|
17
|
-
import { parseQueryTerms } from "./ParseQueryTerms";
|
|
18
|
-
import UrlShortenerForm from "./CreateUrlForm.svelte";
|
|
19
|
-
import PineappleSlideToggle from "../../components/PineappleSlideToggle.svelte";
|
|
20
|
-
import { Chip } from "../../index";
|
|
21
|
-
import ChumBucket from "../../ui/modules/seaweed/ChumBucket.svelte";
|
|
22
|
-
|
|
23
|
-
export let seaweedTemplateData: SeaweedTemplateData;
|
|
24
|
-
export let projectFirstGroupedEntries: ReadonlyArray<EntryGroup>;
|
|
25
|
-
export let getAllEntryFromGlobal: () => Map<string, ComponentMeta>;
|
|
26
|
-
export let getEntryFromGlobal: (name: string) => undefined | ComponentMeta;
|
|
27
|
-
export let letChaos = true;
|
|
28
|
-
export let name = "Turnip";
|
|
29
|
-
export let email = "turnipxenon@gmail.com";
|
|
30
|
-
export let linkedinSlug = "turnip-xenon";
|
|
31
|
-
export let domain = "http://localhost:5173/portfolio/actual/";
|
|
32
|
-
export let serverSideQueryParams = "";
|
|
33
|
-
export let experienceSection: ComponentType;
|
|
34
|
-
|
|
35
|
-
// region query params
|
|
36
|
-
let entryProps: EntryProps = {
|
|
37
|
-
email,
|
|
38
|
-
letChaos,
|
|
39
|
-
linkedinSlug,
|
|
40
|
-
name,
|
|
41
|
-
seaweedTemplateData
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
let isVisible = true;
|
|
45
|
-
const paramQTSet = new Set<string>();
|
|
46
|
-
|
|
47
|
-
let isAdvanceSettingOn = false;
|
|
48
|
-
$: isSocialsGone = !isVisible;
|
|
49
|
-
$: console.log("is visible", isVisible);
|
|
50
|
-
|
|
51
|
-
let qtfontWeight = "normal";
|
|
52
|
-
let additionalFontWeight = "";
|
|
53
|
-
|
|
54
|
-
let chaosDone = false;
|
|
55
|
-
let mainVisibility = "visible";
|
|
56
|
-
$: mainVisibility = letChaos && !chaosDone ? "hidden" : "visible";
|
|
57
|
-
|
|
58
|
-
const syncQT = () => {
|
|
59
|
-
if (seaweedTemplateData.queryTermMap.size === 0 || paramQTSet.size === 0) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
seaweedTemplateData.queryTermMap.forEach((_, k) => {
|
|
64
|
-
seaweedTemplateData.queryTermMap.set(k, paramQTSet.has(k));
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
// force svelte refresh
|
|
68
|
-
seaweedTemplateData.queryTermMap = seaweedTemplateData.queryTermMap;
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
const parseQueryTermsLocal = async () => {
|
|
72
|
-
const qtSet = new Set<string>();
|
|
73
|
-
parseQueryTerms(document.body, qtSet);
|
|
74
|
-
qtSet.forEach(t => seaweedTemplateData.queryTermMap.set(t, true));
|
|
75
|
-
// force svelte update
|
|
76
|
-
seaweedTemplateData.queryTermMap = seaweedTemplateData.queryTermMap;
|
|
77
|
-
syncQT();
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
/** qt values and what they mean:
|
|
81
|
-
* undefined: set all qt terms to font-weight: bold
|
|
82
|
-
* todo: implement clear
|
|
83
|
-
* clear: unset all terms to font-weight: normal
|
|
84
|
-
* <term>: only set qt-<term> to bold
|
|
85
|
-
* <term1>,<term2>: only set qt-<term1> and qt-<term2> to bold,
|
|
86
|
-
*
|
|
87
|
-
* ONLY CALL INSIDE onMount()
|
|
88
|
-
**/
|
|
89
|
-
const filterSearchParams = (searchParams: URLSearchParams) => {
|
|
90
|
-
const isFunOn = searchParams.get("fun")?.trim();
|
|
91
|
-
if (isFunOn === "true") {
|
|
92
|
-
seaweedTemplateData.shouldAddFunNote = true;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// region Order
|
|
96
|
-
const gameSectionFirstParam = searchParams.get("game-section-first")?.trim();
|
|
97
|
-
const orderParam = searchParams.get("order")?.trim();
|
|
98
|
-
if (orderParam) {
|
|
99
|
-
seaweedTemplateData.groupedEntries = [];
|
|
100
|
-
|
|
101
|
-
orderParam.split(",").forEach(groupDefinition => {
|
|
102
|
-
const pair = groupDefinition.split(":");
|
|
103
|
-
if (pair.length >= 2) {
|
|
104
|
-
const group: EntryGroup = {
|
|
105
|
-
name: pair[0],
|
|
106
|
-
items: [],
|
|
107
|
-
gridClass: pair[2]
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
pair[1].split("|").forEach(e => {
|
|
111
|
-
const component = getEntryFromGlobal(e);
|
|
112
|
-
if (component) {
|
|
113
|
-
group.items.push(component);
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
seaweedTemplateData.groupedEntries.push(group);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
seaweedTemplateData.groupedEntries = seaweedTemplateData.groupedEntries;
|
|
123
|
-
} else if (gameSectionFirstParam === "false") {
|
|
124
|
-
seaweedTemplateData.groupedEntries = TurnGroupEntriesMutable(projectFirstGroupedEntries);
|
|
125
|
-
}
|
|
126
|
-
// endregion
|
|
127
|
-
|
|
128
|
-
// region Bold terms
|
|
129
|
-
const qtValue = searchParams.get("qt")?.trim();
|
|
130
|
-
if (qtValue !== undefined) {
|
|
131
|
-
qtfontWeight = "normal";
|
|
132
|
-
const dynamicStyle = qtValue.split(",").map((term) => {
|
|
133
|
-
// side-effect
|
|
134
|
-
paramQTSet.add(`qt-${term}`);
|
|
135
|
-
|
|
136
|
-
// main effect
|
|
137
|
-
return `span.qt-${term} { font-weight: bold !important; }`;
|
|
138
|
-
}).join("\n");
|
|
139
|
-
|
|
140
|
-
// https://stackoverflow.com/a/24285947/17836168
|
|
141
|
-
const style = document.createElement("style");
|
|
142
|
-
// noinspection JSDeprecatedSymbols
|
|
143
|
-
style.type = "text/css";
|
|
144
|
-
style.innerText = dynamicStyle;
|
|
145
|
-
document.head.appendChild(style);
|
|
146
|
-
syncQT();
|
|
147
|
-
} else {
|
|
148
|
-
qtfontWeight = "bold";
|
|
149
|
-
}
|
|
150
|
-
// endregion Bold terms
|
|
151
|
-
};
|
|
152
|
-
// endregion query params
|
|
153
|
-
|
|
154
|
-
/* region chaos scripts */
|
|
155
|
-
/* endregion chaos scripts */
|
|
156
|
-
|
|
157
|
-
onMount(async () => {
|
|
158
|
-
if (!letChaos && serverSideQueryParams) {
|
|
159
|
-
filterSearchParams(new URLSearchParams(serverSideQueryParams));
|
|
160
|
-
} else if (!letChaos && $page.url.searchParams) {
|
|
161
|
-
filterSearchParams($page.url.searchParams);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (letChaos) {
|
|
165
|
-
runChaos(document.body);
|
|
166
|
-
chaosDone = true;
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
// todo: figure out what this does #migration
|
|
171
|
-
// let isParsed = false;
|
|
172
|
-
// afterUpdate(async () => {
|
|
173
|
-
// if (!letChaos && !isParsed) {
|
|
174
|
-
// isParsed = true;
|
|
175
|
-
// await parseQueryTermsLocal();
|
|
176
|
-
// }
|
|
177
|
-
// });
|
|
178
|
-
|
|
179
|
-
const toggleTerm = (term: string) => {
|
|
180
|
-
seaweedTemplateData.queryTermMap.set(term, !seaweedTemplateData.queryTermMap.get(term));
|
|
181
|
-
seaweedTemplateData.queryTermMap = seaweedTemplateData.queryTermMap;
|
|
182
|
-
};
|
|
183
|
-
|
|
184
|
-
// when either gameSectionFirst or the queryTerms are updated, update advancedUrl
|
|
185
|
-
let orderUrl = "";
|
|
186
|
-
let advancedUrl = domain;
|
|
187
|
-
let advancedQuery = "";
|
|
188
|
-
const updateUrl = (seaweedTemplateData: SeaweedTemplateData) => {
|
|
189
|
-
if (seaweedTemplateData === undefined) {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
const queryParams: string[] = [];
|
|
194
|
-
|
|
195
|
-
if (orderUrl) {
|
|
196
|
-
queryParams.push(orderUrl);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
const qtList: string[] = [];
|
|
200
|
-
seaweedTemplateData.queryTermMap.forEach((shouldBold, term) => {
|
|
201
|
-
if (shouldBold) {
|
|
202
|
-
qtList.push(term);
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
if (qtList.length === 0) {
|
|
207
|
-
queryParams.push("qt=clear");
|
|
208
|
-
} else if (seaweedTemplateData.queryTermMap.size !== qtList.length) {
|
|
209
|
-
// we'll only add if the lengths are not equal
|
|
210
|
-
// dont need to add query if all terms in qtMap is true
|
|
211
|
-
queryParams.push(`qt=${qtList.map(t => t.slice(3, t.length)).join(",")}`);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
if (seaweedTemplateData.shouldAddFunNote) {
|
|
215
|
-
queryParams.push("fun=true");
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
if (!seaweedTemplateData.gameSectionFirst) {
|
|
219
|
-
queryParams.push("game-section-first=false");
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
if (queryParams.length > 0) {
|
|
223
|
-
advancedQuery = queryParams.join("&");
|
|
224
|
-
advancedUrl = `${domain}?${advancedQuery}`;
|
|
225
|
-
} else {
|
|
226
|
-
advancedUrl = domain;
|
|
227
|
-
}
|
|
228
|
-
};
|
|
229
|
-
$: updateUrl(seaweedTemplateData);
|
|
230
|
-
|
|
231
|
-
// eslint-disable-next-line
|
|
232
|
-
const updateSeaweedWhenFunNoteChanged = (_: boolean) => {
|
|
233
|
-
entryProps = entryProps;
|
|
234
|
-
};
|
|
235
|
-
$: updateSeaweedWhenFunNoteChanged(seaweedTemplateData.shouldAddFunNote);
|
|
236
|
-
</script>
|
|
237
|
-
|
|
238
|
-
<SeaweedBaseLayout bind:shouldDisplayLeadingIcons={isSocialsGone}>
|
|
239
|
-
<!-- todo: limit main size to 1080 px? -->
|
|
240
|
-
<main style={`
|
|
241
|
-
--qt-font-weight: ${qtfontWeight};${additionalFontWeight};
|
|
242
|
-
visibility: ${mainVisibility};
|
|
243
|
-
`}>
|
|
244
|
-
<svelte:component this={experienceSection}
|
|
245
|
-
entryProps={entryProps}
|
|
246
|
-
bind:isVisible={isVisible}
|
|
247
|
-
></svelte:component>
|
|
248
|
-
|
|
249
|
-
{#if seaweedTemplateData}
|
|
250
|
-
{#each seaweedTemplateData.groupedEntries as group}
|
|
251
|
-
{#if group.items.length > 0}
|
|
252
|
-
<Card>
|
|
253
|
-
<section class="section-card title-card" slot="content">
|
|
254
|
-
<h1 class="text-center">{group.name}</h1>
|
|
255
|
-
</section>
|
|
256
|
-
</Card>
|
|
257
|
-
|
|
258
|
-
<section class={group.gridClass}>
|
|
259
|
-
{#each group.items as entry}
|
|
260
|
-
<svelte:component this={entry.component} props={entryProps}></svelte:component>
|
|
261
|
-
{/each}
|
|
262
|
-
</section>
|
|
263
|
-
{/if}
|
|
264
|
-
{/each}
|
|
265
|
-
{/if}
|
|
266
|
-
|
|
267
|
-
<ChumBucket></ChumBucket>
|
|
268
|
-
|
|
269
|
-
{#if (!letChaos)}
|
|
270
|
-
<div aria-hidden="true" style="height: 3lh" />
|
|
271
|
-
|
|
272
|
-
<Card>
|
|
273
|
-
<div slot="content" class="default-card advanced-setting">
|
|
274
|
-
<h1>Advanced settings</h1>
|
|
275
|
-
<p>This one is for those curious how I customize this page.</p>
|
|
276
|
-
|
|
277
|
-
<PineappleSlideToggle name="advanced-setting-slider"
|
|
278
|
-
bind:checked={isAdvanceSettingOn}>
|
|
279
|
-
Advanced settings: {isAdvanceSettingOn ? "On" : "Off"}
|
|
280
|
-
</PineappleSlideToggle>
|
|
281
|
-
|
|
282
|
-
{#if (isAdvanceSettingOn)}
|
|
283
|
-
<PineappleSlideToggle name="game-section-slider"
|
|
284
|
-
bind:checked={seaweedTemplateData.gameSectionFirst}>
|
|
285
|
-
Should game section appear first over projects: {seaweedTemplateData.gameSectionFirst ? "On" : "Off"}
|
|
286
|
-
</PineappleSlideToggle>
|
|
287
|
-
<p>Note: the above configuration was made before the dynamic entry list and to support links sent with that params, we will act like it only swaps the two groups, and nothing more dynamic if order query param does not exist. The configuration only happens during page load with query param, and it does not apply when changed here.</p>
|
|
288
|
-
<PineappleSlideToggle name="fun-note-slider"
|
|
289
|
-
bind:checked={seaweedTemplateData.shouldAddFunNote}>
|
|
290
|
-
Should add fun note in description: {seaweedTemplateData.shouldAddFunNote ? "On" : "Off"}
|
|
291
|
-
</PineappleSlideToggle>
|
|
292
|
-
|
|
293
|
-
<h3>Query terms to bold</h3>
|
|
294
|
-
<div class="query-term-grid">
|
|
295
|
-
{#each seaweedTemplateData.queryTermMap.entries() as [term, shouldBold]}
|
|
296
|
-
<!--{@const shouldBold = false}-->
|
|
297
|
-
<Chip onClick={() => {toggleTerm(term)}}
|
|
298
|
-
checked={shouldBold}>
|
|
299
|
-
<!-- todo: change shouldBold -->
|
|
300
|
-
<span style={`font-weight: ${shouldBold ? "bold" : "normal"}`}>
|
|
301
|
-
{#if (shouldBold)}✓{/if}
|
|
302
|
-
{term}
|
|
303
|
-
</span>
|
|
304
|
-
</Chip>
|
|
305
|
-
{/each}
|
|
306
|
-
</div>
|
|
307
|
-
|
|
308
|
-
<EntryOrderConfig bind:seaweedEntries={seaweedTemplateData.groupedEntries}
|
|
309
|
-
seaweedTemplateData={seaweedTemplateData}
|
|
310
|
-
bind:orderUrl={orderUrl}
|
|
311
|
-
getAllEntryFromGlobal={getAllEntryFromGlobal}
|
|
312
|
-
getEntryFromGlobal={getEntryFromGlobal}
|
|
313
|
-
updateUrl={updateUrl}></EntryOrderConfig>
|
|
314
|
-
|
|
315
|
-
<br>
|
|
316
|
-
<p>Copy the url below and open a new page with it</p>
|
|
317
|
-
<CodeBlock language="url" code={advancedUrl}></CodeBlock>
|
|
318
|
-
|
|
319
|
-
<UrlShortenerForm queryParams={advancedQuery}></UrlShortenerForm>
|
|
320
|
-
{/if}
|
|
321
|
-
</div>
|
|
322
|
-
</Card>
|
|
323
|
-
{/if}
|
|
324
|
-
</main>
|
|
325
|
-
|
|
326
|
-
{#snippet extraLeadingIcons()}
|
|
327
|
-
<SocialSection
|
|
328
|
-
isSlot={true}
|
|
329
|
-
email={email}
|
|
330
|
-
linkedinSlug={linkedinSlug}
|
|
331
|
-
isSmallVersion={true}></SocialSection>
|
|
332
|
-
{/snippet}
|
|
333
|
-
</SeaweedBaseLayout>
|
|
334
|
-
|
|
335
|
-
<style>/*$$__STYLE_CONTENT__$$*/
|
|
336
|
-
</style>
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { type ComponentType } from "svelte";
|
|
2
|
-
import { type ComponentMeta, type EntryGroup, type SeaweedTemplateData } from "./SeaweedTemplateData";
|
|
3
|
-
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
4
|
-
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
5
|
-
$$bindings?: Bindings;
|
|
6
|
-
} & Exports;
|
|
7
|
-
(internal: unknown, props: Props & {
|
|
8
|
-
$$events?: Events;
|
|
9
|
-
$$slots?: Slots;
|
|
10
|
-
}): Exports & {
|
|
11
|
-
$set?: any;
|
|
12
|
-
$on?: any;
|
|
13
|
-
};
|
|
14
|
-
z_$$bindings?: Bindings;
|
|
15
|
-
}
|
|
16
|
-
declare const SeaweedTemplate: $$__sveltets_2_IsomorphicComponent<{
|
|
17
|
-
seaweedTemplateData: SeaweedTemplateData;
|
|
18
|
-
projectFirstGroupedEntries: ReadonlyArray<EntryGroup>;
|
|
19
|
-
getAllEntryFromGlobal: () => Map<string, ComponentMeta>;
|
|
20
|
-
getEntryFromGlobal: (name: string) => undefined | ComponentMeta;
|
|
21
|
-
letChaos?: boolean;
|
|
22
|
-
name?: string;
|
|
23
|
-
email?: string;
|
|
24
|
-
linkedinSlug?: string;
|
|
25
|
-
domain?: string;
|
|
26
|
-
serverSideQueryParams?: string;
|
|
27
|
-
experienceSection: ComponentType;
|
|
28
|
-
}, {
|
|
29
|
-
[evt: string]: CustomEvent<any>;
|
|
30
|
-
}, {}, {}, string>;
|
|
31
|
-
type SeaweedTemplate = InstanceType<typeof SeaweedTemplate>;
|
|
32
|
-
export default SeaweedTemplate;
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { ComponentType } from "svelte";
|
|
2
|
-
export declare enum GroupGridClass {
|
|
3
|
-
Games = "games-section",
|
|
4
|
-
Projects = "projects-section"
|
|
5
|
-
}
|
|
6
|
-
export interface ComponentMeta {
|
|
7
|
-
name: string;
|
|
8
|
-
component: ComponentType;
|
|
9
|
-
}
|
|
10
|
-
export interface EntryGroup {
|
|
11
|
-
name: string;
|
|
12
|
-
items: ComponentMeta[];
|
|
13
|
-
gridClass: string;
|
|
14
|
-
}
|
|
15
|
-
export declare const GameEntries: Readonly<EntryGroup>;
|
|
16
|
-
export declare const ProjectEntries: Readonly<EntryGroup>;
|
|
17
|
-
export declare const EmptyRelevantProjects: Readonly<EntryGroup>;
|
|
18
|
-
export declare const AllGroupedEntriesGameFirst: ReadonlyArray<EntryGroup>;
|
|
19
|
-
export declare const AllGroupedEntriesProjectFirst: ReadonlyArray<EntryGroup>;
|
|
20
|
-
export declare const lazyInitializeAllFlatEntries: () => void;
|
|
21
|
-
export declare const GetAllEntryFromGlobal: () => Map<string, ComponentMeta>;
|
|
22
|
-
export declare const GetEntryFromGlobal: (name: string) => ComponentMeta | undefined;
|
|
23
|
-
export declare const TurnGroupEntriesMutable: (allEntries: ReadonlyArray<EntryGroup>) => EntryGroup[];
|
|
24
|
-
export interface SeaweedTemplateData {
|
|
25
|
-
groupedEntries: EntryGroup[];
|
|
26
|
-
shouldAddFunNote: boolean;
|
|
27
|
-
queryTermMap: Map<string, boolean>;
|
|
28
|
-
gameSectionFirst: boolean;
|
|
29
|
-
}
|
|
30
|
-
export declare const seaweedTemplateData: SeaweedTemplateData;
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { DefaultHeader } from "./entries/EntryProps";
|
|
2
|
-
import Pengi from "./entries/Pengi.svelte";
|
|
3
|
-
import Hepcat from "./entries/Hepcat.svelte";
|
|
4
|
-
import ChefWings from "./entries/ChefWings.svelte";
|
|
5
|
-
import Soulwork from "./entries/Soulwork.svelte";
|
|
6
|
-
import CustomizedYarnspinner from "./entries/CustomizedYarnspinner.svelte";
|
|
7
|
-
import ThisWebpage from "./entries/ThisWebpage.svelte";
|
|
8
|
-
import { removeProxyWrapperOnString } from "./entry_order_config/EntryOrderConfig";
|
|
9
|
-
export var GroupGridClass;
|
|
10
|
-
(function (GroupGridClass) {
|
|
11
|
-
GroupGridClass["Games"] = "games-section";
|
|
12
|
-
GroupGridClass["Projects"] = "projects-section";
|
|
13
|
-
})(GroupGridClass || (GroupGridClass = {}));
|
|
14
|
-
export const GameEntries = {
|
|
15
|
-
name: DefaultHeader.Games.toString(),
|
|
16
|
-
items: [
|
|
17
|
-
{ name: "Pengi", component: Pengi },
|
|
18
|
-
{ name: "Hepcat", component: Hepcat },
|
|
19
|
-
{ name: "Chef Wings", component: ChefWings }
|
|
20
|
-
],
|
|
21
|
-
gridClass: GroupGridClass.Games.toString()
|
|
22
|
-
};
|
|
23
|
-
export const ProjectEntries = {
|
|
24
|
-
name: DefaultHeader.Projects.toString(),
|
|
25
|
-
items: [
|
|
26
|
-
{ name: "Soulwork", component: Soulwork },
|
|
27
|
-
{ name: "Customized YarnSpinner", component: CustomizedYarnspinner },
|
|
28
|
-
{ name: "This Webpage", component: ThisWebpage }
|
|
29
|
-
],
|
|
30
|
-
gridClass: GroupGridClass.Projects.toString()
|
|
31
|
-
};
|
|
32
|
-
export const EmptyRelevantProjects = {
|
|
33
|
-
name: "Relevant projects",
|
|
34
|
-
items: [],
|
|
35
|
-
gridClass: GroupGridClass.Games.toString()
|
|
36
|
-
};
|
|
37
|
-
export const AllGroupedEntriesGameFirst = [
|
|
38
|
-
EmptyRelevantProjects,
|
|
39
|
-
GameEntries,
|
|
40
|
-
ProjectEntries
|
|
41
|
-
];
|
|
42
|
-
export const AllGroupedEntriesProjectFirst = [
|
|
43
|
-
EmptyRelevantProjects,
|
|
44
|
-
ProjectEntries,
|
|
45
|
-
GameEntries
|
|
46
|
-
];
|
|
47
|
-
const allFlatEntries = new Map();
|
|
48
|
-
export const lazyInitializeAllFlatEntries = () => {
|
|
49
|
-
if (allFlatEntries.size === 0) {
|
|
50
|
-
[...ProjectEntries.items, ...GameEntries.items].forEach(e => {
|
|
51
|
-
allFlatEntries.set(removeProxyWrapperOnString(e.name), e);
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
export const GetAllEntryFromGlobal = () => {
|
|
56
|
-
lazyInitializeAllFlatEntries();
|
|
57
|
-
return allFlatEntries;
|
|
58
|
-
};
|
|
59
|
-
export const GetEntryFromGlobal = (name) => {
|
|
60
|
-
lazyInitializeAllFlatEntries();
|
|
61
|
-
return allFlatEntries.get(name);
|
|
62
|
-
};
|
|
63
|
-
export const TurnGroupEntriesMutable = (allEntries) => {
|
|
64
|
-
return allEntries.map(g => {
|
|
65
|
-
return {
|
|
66
|
-
name: g.name,
|
|
67
|
-
gridClass: g.gridClass,
|
|
68
|
-
items: g.items.map(e => e)
|
|
69
|
-
};
|
|
70
|
-
});
|
|
71
|
-
};
|
|
72
|
-
export const seaweedTemplateData = {
|
|
73
|
-
shouldAddFunNote: false,
|
|
74
|
-
queryTermMap: new Map(),
|
|
75
|
-
// todo: gameSectionFirst currently has no functionality
|
|
76
|
-
gameSectionFirst: true,
|
|
77
|
-
// copy the readonly properties into mutable values
|
|
78
|
-
groupedEntries: TurnGroupEntriesMutable(AllGroupedEntriesGameFirst)
|
|
79
|
-
};
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
import { type EntryProps } from "./EntryProps";
|
|
4
|
-
import HeaderChefWings from "../../../assets/game_dev/footage-chef-wings.gif";
|
|
5
|
-
import LinkIcon from "../../../assets/icons/link-icon.svg";
|
|
6
|
-
import Card from "../../../components/Card.svelte";
|
|
7
|
-
|
|
8
|
-
interface Props {
|
|
9
|
-
props: EntryProps;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
let { props }: Props = $props();
|
|
13
|
-
|
|
14
|
-
</script>
|
|
15
|
-
|
|
16
|
-
<Card>
|
|
17
|
-
{#snippet content()}
|
|
18
|
-
<section class="game-card" >
|
|
19
|
-
<img src={HeaderChefWings} alt="todo" loading="lazy">
|
|
20
|
-
<section class="game-card-body">
|
|
21
|
-
|
|
22
|
-
<h1>Chef Wings</h1>
|
|
23
|
-
<p>
|
|
24
|
-
A “roguelite-lite” where you gather ingredients in a procedurally-generated dungeon and use
|
|
25
|
-
them to cook for customers and then critics!
|
|
26
|
-
</p>
|
|
27
|
-
<p>
|
|
28
|
-
I built and documented several of the game’s systems including the game state management
|
|
29
|
-
system that extends <span class="qt-unity">Unity’s</span> existing Monobehavior lifecycle with new events,
|
|
30
|
-
and the dialogue, event, and level systems that coordinate the game flow using the interactive
|
|
31
|
-
dialogue tool YarnSpinner
|
|
32
|
-
</p>
|
|
33
|
-
|
|
34
|
-
<section class="game-link-section">
|
|
35
|
-
<button type="button" class="game-button turnip-button"
|
|
36
|
-
title="https://selk.io/birb-project/trunk/"
|
|
37
|
-
onclick={()=>{alert('not implemented')}}>
|
|
38
|
-
<img alt="itch.io icon" src={LinkIcon}>
|
|
39
|
-
<span>selk.io/birb-project/trunk/</span>
|
|
40
|
-
</button>
|
|
41
|
-
</section>
|
|
42
|
-
</section>
|
|
43
|
-
</section>
|
|
44
|
-
{/snippet}
|
|
45
|
-
</Card>
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { type EntryProps } from "./EntryProps";
|
|
3
|
-
import Card from "../../../components/Card.svelte";
|
|
4
|
-
import GithubIcon from "../../../assets/icons/github-mark.svg";
|
|
5
|
-
import WeaverFootage from "../../../assets/others/weaver-footage.gif";
|
|
6
|
-
|
|
7
|
-
interface Props {
|
|
8
|
-
props: EntryProps;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
let { props }: Props = $props();
|
|
12
|
-
</script>
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
<Card>
|
|
16
|
-
{#snippet content()}
|
|
17
|
-
<section class="project-card" >
|
|
18
|
-
<img alt="Footage of a visual novel-like dynamic dialog interaction happening on the same page we are on"
|
|
19
|
-
src={WeaverFootage} />
|
|
20
|
-
|
|
21
|
-
<div class="project-card-body">
|
|
22
|
-
<h2>Customized Yarnspinner interpreter and dialog runner</h2>
|
|
23
|
-
|
|
24
|
-
A custom dialog interpreter, written in <span class="qt-ts">Typescript</span>, that tokenizes then
|
|
25
|
-
transpiles custom Yarnspinner dialog into a <span class="qt-ts">Typescript</span> file. The said files can
|
|
26
|
-
be used on a corresponding runner or library, also implemented alongside it, allowing the ability to play a
|
|
27
|
-
custom-flavor of YarnSpinner dialogs on <span class="qt-svelte">Svelte</span>.
|
|
28
|
-
|
|
29
|
-
<section class="game-link-section">
|
|
30
|
-
<button type="button" class="game-button turnip-button"
|
|
31
|
-
role="link"
|
|
32
|
-
title="https://github.com/TurnipXenon/pineapple/blob/main/docs/PineappleFiberSpec.md"
|
|
33
|
-
onclick={() => window.open("https://github.com/TurnipXenon/pineapple/blob/main/docs/PineappleFiberSpec.md")}>
|
|
34
|
-
<img src={GithubIcon} alt="github icon">
|
|
35
|
-
</button>
|
|
36
|
-
</section>
|
|
37
|
-
</div>
|
|
38
|
-
</section>
|
|
39
|
-
{/snippet}
|
|
40
|
-
</Card>
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { type EntryProps } from "./EntryProps";
|
|
2
|
-
interface Props {
|
|
3
|
-
props: EntryProps;
|
|
4
|
-
}
|
|
5
|
-
declare const CustomizedYarnspinner: import("svelte").Component<Props, {}, "">;
|
|
6
|
-
type CustomizedYarnspinner = ReturnType<typeof CustomizedYarnspinner>;
|
|
7
|
-
export default CustomizedYarnspinner;
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { SeaweedTemplateData } from "../SeaweedTemplateData";
|
|
2
|
-
export declare enum DefaultHeader {
|
|
3
|
-
Games = "Games",
|
|
4
|
-
Projects = "Projects"
|
|
5
|
-
}
|
|
6
|
-
export interface EntryProps {
|
|
7
|
-
email: string;
|
|
8
|
-
letChaos: boolean;
|
|
9
|
-
linkedinSlug: string;
|
|
10
|
-
name: string;
|
|
11
|
-
seaweedTemplateData: SeaweedTemplateData;
|
|
12
|
-
}
|
|
13
|
-
export interface GroupedEntry {
|
|
14
|
-
header: string;
|
|
15
|
-
entryList: EntryProps[];
|
|
16
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { EntryProps } from "./EntryProps";
|
|
3
|
-
import HeaderHepCat from "../../../assets/temp/header-hep-cat.mp4";
|
|
4
|
-
import BitbucketIcon from "../../../assets/icons/bitbucket-icon.svg";
|
|
5
|
-
import { ItchLogoHotLink } from "../../../consts";
|
|
6
|
-
import Card from "../../../components/Card.svelte";
|
|
7
|
-
|
|
8
|
-
interface Props {
|
|
9
|
-
props: EntryProps;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
let { props }: Props = $props();
|
|
13
|
-
</script>
|
|
14
|
-
|
|
15
|
-
<Card>
|
|
16
|
-
{#snippet content()}
|
|
17
|
-
<section class="game-card" >
|
|
18
|
-
<!-- todo: move the image crop a bit lower -->
|
|
19
|
-
<video playsinline autoplay muted loop preload="none" id="hepcat-video">
|
|
20
|
-
<source src={HeaderHepCat} type="video/mp4">
|
|
21
|
-
</video>
|
|
22
|
-
|
|
23
|
-
<section class="game-card-body">
|
|
24
|
-
|
|
25
|
-
<h1>Hepcat</h1>
|
|
26
|
-
|
|
27
|
-
<blockquote>
|
|
28
|
-
"Cats, Jazz, and a little bit of Death. What more could anyone ask for?"
|
|
29
|
-
</blockquote>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
<p>This is a course project made by a team of six for <a
|
|
33
|
-
href="https://sites.google.com/ualberta.ca/cmput250/">CMPUT 250</a>, and it won <a
|
|
34
|
-
href="https://webdocs.cs.ualberta.ca/~nathanst/certificate/">Game of the year.</a>
|
|
35
|
-
</p>
|
|
36
|
-
|
|
37
|
-
<p>
|
|
38
|
-
Hep Cat is a rhythm game made in <a
|
|
39
|
-
href="https://www.rpgmakerweb.com/products/programs/rpg-maker-mv" target="_blank" class="qt-rpgmaker">
|
|
40
|
-
RPG Maker MV</a> with the help of additional custom-made <span class="qt-js">Javascript</span> plugins. I
|
|
41
|
-
wrote the rhythm game plugin's framework. For this plugin to work, I
|
|
42
|
-
had to write a <span class="qt-python">Python</span> script that parses osu! files into readable JSON
|
|
43
|
-
files.
|
|
44
|
-
</p>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
<section class="game-link-section">
|
|
48
|
-
<button type="button" class="game-button turnip-button"
|
|
49
|
-
role="link"
|
|
50
|
-
title="https://bitbucket.org/egginchicken/hep-cat/src/master/"
|
|
51
|
-
onclick={()=> window.open("https://bitbucket.org/egginchicken/hep-cat/src/master/")}>
|
|
52
|
-
<img alt="bitbucket icon" src={BitbucketIcon}>
|
|
53
|
-
</button>
|
|
54
|
-
<button type="button" class="game-button turnip-button"
|
|
55
|
-
role="link"
|
|
56
|
-
title="https://just-a-phantom.itch.io/hep-cat"
|
|
57
|
-
onclick={()=> window.open("https://just-a-phantom.itch.io/hep-cat")}>
|
|
58
|
-
<img alt="itch.io icon" src={ItchLogoHotLink}>
|
|
59
|
-
</button>
|
|
60
|
-
</section>
|
|
61
|
-
</section>
|
|
62
|
-
</section>
|
|
63
|
-
{/snippet}
|
|
64
|
-
</Card>
|