@turnipxenon/pineapple 2.4.24 → 2.4.26
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 +55 -51
- package/.svelte-kit/__package__/components/overrideable_meta/OverridableMeta.svelte +51 -0
- package/.svelte-kit/__package__/components/overrideable_meta/OverridableMeta.svelte.d.ts +20 -0
- package/.svelte-kit/__package__/components/overrideable_meta/OverridableMetaProps.d.ts +7 -0
- package/.svelte-kit/__package__/components/overrideable_meta/OverridableMetaProps.js +1 -0
- package/.svelte-kit/__package__/components/overrideable_meta/index.d.ts +2 -0
- package/.svelte-kit/__package__/components/overrideable_meta/index.js +3 -0
- package/.svelte-kit/__package__/index.d.ts +1 -0
- package/.svelte-kit/__package__/index.js +2 -0
- package/.svelte-kit/__package__/template/Seaweed/GameSection.svelte +184 -184
- package/.svelte-kit/__package__/template/Seaweed/ProjectSection.svelte +268 -268
- package/.svelte-kit/__package__/template/Seaweed/SeaweedTemplate.svelte +135 -18
- package/.svelte-kit/__package__/template/Seaweed/SeaweedTemplate.svelte.d.ts +1 -0
- package/.svelte-kit/__package__/template/Seaweed/seaweed.postcss +133 -133
- package/.svelte-kit/__package__/util/util.d.ts +3 -0
- package/.svelte-kit/ambient.d.ts +0 -2
- package/.svelte-kit/generated/client/nodes/5.js +2 -0
- package/.svelte-kit/generated/client/nodes/6.js +2 -0
- package/.svelte-kit/generated/client/nodes/7.js +2 -0
- package/.svelte-kit/generated/client/nodes/8.js +1 -1
- package/.svelte-kit/generated/server/internal.js +1 -1
- package/.svelte-kit/types/route_meta_data.json +7 -2
- package/.svelte-kit/types/src/routes/(pineapple)/pineapple/$types.d.ts +3 -1
- package/.svelte-kit/types/src/routes/(seaweed)/portfolio/$types.d.ts +4 -2
- package/.svelte-kit/types/src/routes/(seaweed)/portfolio/actual/$types.d.ts +3 -1
- package/dist/components/overrideable_meta/OverridableMeta.svelte +51 -0
- package/dist/components/overrideable_meta/OverridableMeta.svelte.d.ts +20 -0
- package/dist/components/overrideable_meta/OverridableMetaProps.d.ts +7 -0
- package/dist/components/overrideable_meta/OverridableMetaProps.js +1 -0
- package/dist/components/overrideable_meta/index.d.ts +2 -0
- package/dist/components/overrideable_meta/index.js +3 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/template/Seaweed/GameSection.svelte +184 -184
- package/dist/template/Seaweed/ProjectSection.svelte +268 -268
- package/dist/template/Seaweed/SeaweedTemplate.svelte +135 -18
- package/dist/template/Seaweed/SeaweedTemplate.svelte.d.ts +1 -0
- package/dist/template/Seaweed/seaweed.postcss +133 -133
- package/dist/util/util.d.ts +3 -0
- package/package.json +1 -1
- package/src/lib/components/overrideable_meta/OverridableMeta.svelte +56 -0
- package/src/lib/components/overrideable_meta/OverridableMetaProps.ts +7 -0
- package/src/lib/components/overrideable_meta/index.ts +4 -0
- package/src/lib/index.ts +3 -0
- package/src/lib/template/Seaweed/GameSection.svelte +213 -213
- package/src/lib/template/Seaweed/ProjectSection.svelte +298 -298
- package/src/lib/template/Seaweed/SeaweedTemplate.svelte +180 -21
- package/src/lib/template/Seaweed/seaweed.postcss +133 -133
- package/src/lib/util/util.ts +38 -34
- package/src/routes/(pineapple)/+layout.svelte +0 -15
- package/src/routes/(pineapple)/+page.svelte +0 -12
- package/src/routes/(pineapple)/pineapple/+page.svelte +0 -10
- package/src/routes/(pineapple)/pineapple/+page.ts +8 -0
- package/src/routes/(seaweed)/portfolio/+page.svelte +0 -11
- package/src/routes/(seaweed)/portfolio/+page.ts +8 -0
- package/src/routes/(seaweed)/portfolio/actual/+page.ts +8 -0
- package/src/routes/+layout.svelte +21 -0
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
export let name = "Turnip";
|
|
4
4
|
export let email = "turnipxenon@gmail.com";
|
|
5
5
|
export let linkedinSlug = "turnip-xenon";
|
|
6
|
+
export let domain = "http://localhost:5173/portfolio/actual/";
|
|
6
7
|
|
|
7
8
|
import SocialSection from "$pkg/components/SocialSection.svelte";
|
|
8
9
|
import "./seaweed.postcss";
|
|
9
10
|
import SeaweedBaseLayout from "$pkg/components/layouts/SeaweedBaseLayout.svelte";
|
|
10
|
-
import { Accordion, AccordionItem, SlideToggle } from "@skeletonlabs/skeleton";
|
|
11
|
+
import { Accordion, AccordionItem, CodeBlock, SlideToggle } from "@skeletonlabs/skeleton";
|
|
11
12
|
import { page } from "$app/stores";
|
|
12
13
|
import Card from "$pkg/components/Card.svelte";
|
|
13
14
|
import { onMount } from "svelte";
|
|
@@ -20,11 +21,71 @@
|
|
|
20
21
|
|
|
21
22
|
$: isSocialsGone = !isVisible;
|
|
22
23
|
|
|
24
|
+
// region query params
|
|
25
|
+
import gameContent from "./GameSection.svelte?raw";
|
|
26
|
+
import projectContent from "./ProjectSection.svelte?raw";
|
|
27
|
+
import selfContent from "./SeaweedTemplate.svelte?raw";
|
|
23
28
|
|
|
29
|
+
let qtMap = new Map<string, boolean>();
|
|
30
|
+
const paramQTSet = new Set<string>();
|
|
31
|
+
|
|
32
|
+
const syncQT = () => {
|
|
33
|
+
if (qtMap.size === 0 || paramQTSet.size === 0) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
qtMap.forEach((_, k) => {
|
|
38
|
+
qtMap.set(k, paramQTSet.has(k));
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// force svelte refresh
|
|
42
|
+
qtMap = qtMap;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
const parseQTTerms = async () => {
|
|
46
|
+
const qtSet = new Set<string>();
|
|
47
|
+
const rawTermList: string[] = [];
|
|
48
|
+
[gameContent, projectContent, selfContent].forEach(body => {
|
|
49
|
+
// parse the qt-* term which exists within elements like:
|
|
50
|
+
// <span class="qt-*">TERM</span>
|
|
51
|
+
rawTermList.push(
|
|
52
|
+
...body // step 3: destructure the array
|
|
53
|
+
.split("\"") // step 1: split the text as double quotations (") as the delimiter
|
|
54
|
+
.filter(s => s.startsWith("qt-")) // step 2: filter out texts that does not begin with "qt-"
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// step 4: some spans contain multiple classes, split them up
|
|
59
|
+
// then add them to qtTerms
|
|
60
|
+
// e.g. <span class="qt-1 qt-2">TERM</span>
|
|
61
|
+
rawTermList.forEach(t => {
|
|
62
|
+
t.split(" ").forEach(nt => {
|
|
63
|
+
// filter out some of this meta terms
|
|
64
|
+
if (["qt-1", "qt-2", "qt-*", "qt-"].includes(nt)) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// adding to set ensures the entry is unique
|
|
69
|
+
qtSet.add(nt);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// activate svelte reactivity
|
|
74
|
+
qtSet.forEach(t => qtMap.set(t, true));
|
|
75
|
+
syncQT();
|
|
76
|
+
};
|
|
77
|
+
parseQTTerms();
|
|
78
|
+
|
|
79
|
+
// todo: fix fragile relative reference to the root
|
|
80
|
+
// const fileList = import.meta.glob("./**/+page.svelte", { query: "?raw", eager: true });
|
|
81
|
+
// const titleToLink = new Map<string, string>();
|
|
82
|
+
|
|
83
|
+
let gameSectionFirst = true;
|
|
24
84
|
let qtfontWeight = "normal";
|
|
25
85
|
let additionalFontWeight = "";
|
|
26
86
|
/** qt values and what they mean:
|
|
27
87
|
* undefined: set all qt terms to font-weight: bold
|
|
88
|
+
* todo: implement clear
|
|
28
89
|
* clear: unset all terms to font-weight: normal
|
|
29
90
|
* <term>: only set qt-<term> to bold
|
|
30
91
|
* <term1>,<term2>: only set qt-<term1> and qt-<term2> to bold,
|
|
@@ -32,6 +93,12 @@
|
|
|
32
93
|
* ONLY CALL INSIDE onMount()
|
|
33
94
|
**/
|
|
34
95
|
const filterSearchParams = (searchParams: URLSearchParams) => {
|
|
96
|
+
const gameSectionFirstParam = searchParams.get("game-section-first")?.trim();
|
|
97
|
+
if (gameSectionFirstParam === "false") {
|
|
98
|
+
gameSectionFirst = false;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// region Bold terms
|
|
35
102
|
const qtValue = searchParams.get("qt")?.trim();
|
|
36
103
|
if (qtValue === undefined) {
|
|
37
104
|
qtfontWeight = "bold";
|
|
@@ -39,6 +106,10 @@
|
|
|
39
106
|
}
|
|
40
107
|
qtfontWeight = "normal";
|
|
41
108
|
const dynamicStyle = qtValue.split(",").map((term) => {
|
|
109
|
+
// side-effect
|
|
110
|
+
paramQTSet.add(`qt-${term}`);
|
|
111
|
+
|
|
112
|
+
// main effect
|
|
42
113
|
return `span.qt-${term} { font-weight: bold !important; }`;
|
|
43
114
|
}).join("\n");
|
|
44
115
|
|
|
@@ -48,7 +119,10 @@
|
|
|
48
119
|
style.type = "text/css";
|
|
49
120
|
style.innerText = dynamicStyle;
|
|
50
121
|
document.head.appendChild(style);
|
|
122
|
+
syncQT();
|
|
123
|
+
// endregion Bold terms
|
|
51
124
|
};
|
|
125
|
+
// endregion query params
|
|
52
126
|
|
|
53
127
|
/* region chaos scripts */
|
|
54
128
|
const chaoticWordBank = ["niko", "toba", "seal", "aquarium", "ojisan", "baikal"];
|
|
@@ -96,6 +170,10 @@
|
|
|
96
170
|
}
|
|
97
171
|
};
|
|
98
172
|
|
|
173
|
+
let mainVisibility = "visible";
|
|
174
|
+
$: mainVisibility = letChaos && !chaosDone ? "hidden" : "visible";
|
|
175
|
+
/* endregion chaos scripts */
|
|
176
|
+
|
|
99
177
|
onMount(() => {
|
|
100
178
|
if (!letChaos && $page.url.searchParams) {
|
|
101
179
|
filterSearchParams($page.url.searchParams);
|
|
@@ -107,9 +185,45 @@
|
|
|
107
185
|
}
|
|
108
186
|
});
|
|
109
187
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
188
|
+
const toggleTerm = (term: string) => {
|
|
189
|
+
qtMap.set(term, !qtMap.get(term));
|
|
190
|
+
qtMap = qtMap;
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
// when either gameSectionFirst or the queryTerms are updated, update advancedUrl
|
|
194
|
+
let advancedUrl = domain;
|
|
195
|
+
const updateUrl = () => {
|
|
196
|
+
const queryParams: string[] = [];
|
|
197
|
+
|
|
198
|
+
const qtList: string[] = [];
|
|
199
|
+
qtMap.forEach((shouldBold, term) => {
|
|
200
|
+
if (shouldBold) {
|
|
201
|
+
qtList.push(term);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
if (qtList.length === 0) {
|
|
206
|
+
queryParams.push("qt=clear");
|
|
207
|
+
} else if (qtMap.size !== qtList.length) {
|
|
208
|
+
// we'll only add if the lengths are not equal
|
|
209
|
+
// dont need to add query if all terms in qtMap is true
|
|
210
|
+
queryParams.push(`qt=${qtList.map(t => t.slice(3, t.length)).join(",")}`);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (!gameSectionFirst) {
|
|
214
|
+
queryParams.push("game-section-first=false");
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (queryParams.length > 0) {
|
|
218
|
+
advancedUrl = `${domain}?${queryParams.join("&")}`;
|
|
219
|
+
} else {
|
|
220
|
+
advancedUrl = domain;
|
|
221
|
+
}
|
|
222
|
+
// advancedUrl = `${domain}?${q}`;
|
|
223
|
+
};
|
|
224
|
+
$: // noinspection CommaExpressionJS
|
|
225
|
+
gameSectionFirst, qtMap, updateUrl();
|
|
226
|
+
// $: gameSectionQuery = gameSectionFirst ? "" : "game-section-first=false";
|
|
113
227
|
</script>
|
|
114
228
|
|
|
115
229
|
<SeaweedBaseLayout bind:shouldDisplayLeadingIcons={isSocialsGone}>
|
|
@@ -246,25 +360,51 @@
|
|
|
246
360
|
|
|
247
361
|
</div>
|
|
248
362
|
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
363
|
+
{#if (gameSectionFirst)}
|
|
364
|
+
<GameSection email={email}></GameSection>
|
|
365
|
+
<ProjectSection email={email}></ProjectSection>
|
|
366
|
+
{:else }
|
|
367
|
+
<ProjectSection email={email}></ProjectSection>
|
|
368
|
+
<GameSection email={email}></GameSection>
|
|
369
|
+
{/if}
|
|
254
370
|
|
|
255
|
-
|
|
256
|
-
<div
|
|
257
|
-
<h1>Advanced settings</h1>
|
|
258
|
-
<p>This one is for those curious how I customize this page.</p>
|
|
259
|
-
<SlideToggle name="slider-label" bind:checked={isAdvanceSettingOn}>
|
|
260
|
-
Advanced settings: {isAdvanceSettingOn ? "On" : "Off"}
|
|
261
|
-
</SlideToggle>
|
|
262
|
-
{#if (isAdvanceSettingOn)}
|
|
263
|
-
<br>
|
|
264
|
-
{/if}
|
|
265
|
-
</div>
|
|
266
|
-
</Card>
|
|
371
|
+
{#if (!letChaos)}
|
|
372
|
+
<div aria-hidden="true" style="height: 25vh" />
|
|
267
373
|
|
|
374
|
+
<Card>
|
|
375
|
+
<div slot="content" class="default-card advanced-setting">
|
|
376
|
+
<h1>Advanced settings</h1>
|
|
377
|
+
<p>This one is for those curious how I customize this page.</p>
|
|
378
|
+
<SlideToggle name="advanced-setting-slider" bind:checked={isAdvanceSettingOn}>
|
|
379
|
+
Advanced settings: {isAdvanceSettingOn ? "On" : "Off"}
|
|
380
|
+
</SlideToggle>
|
|
381
|
+
{#if (isAdvanceSettingOn)}
|
|
382
|
+
<SlideToggle name="game-section-slider" bind:checked={gameSectionFirst}>
|
|
383
|
+
Should game section appear first over projects: {gameSectionFirst ? "On" : "Off"}
|
|
384
|
+
</SlideToggle>
|
|
385
|
+
|
|
386
|
+
<h3>Query terms to bold</h3>
|
|
387
|
+
<div class="query-term-grid">
|
|
388
|
+
{#each qtMap.entries() as [term, shouldBold]}
|
|
389
|
+
<!--{@const shouldBold = false}-->
|
|
390
|
+
<button
|
|
391
|
+
class="chip {shouldBold ? 'variant-filled-tertiary' : 'variant-soft-tertiary'}"
|
|
392
|
+
on:click={() => {toggleTerm(term)}}
|
|
393
|
+
>
|
|
394
|
+
<!-- todo: change shouldBold -->
|
|
395
|
+
{#if (shouldBold)}✓{/if}
|
|
396
|
+
{term}
|
|
397
|
+
</button>
|
|
398
|
+
{/each}
|
|
399
|
+
</div>
|
|
400
|
+
|
|
401
|
+
<br>
|
|
402
|
+
<p>Copy the url below and open a new page with it</p>
|
|
403
|
+
<CodeBlock language="url" code={advancedUrl}></CodeBlock>
|
|
404
|
+
{/if}
|
|
405
|
+
</div>
|
|
406
|
+
</Card>
|
|
407
|
+
{/if}
|
|
268
408
|
</main>
|
|
269
409
|
|
|
270
410
|
<SocialSection slot="extraLeadingIcons"
|
|
@@ -273,3 +413,22 @@
|
|
|
273
413
|
linkedinSlug={linkedinSlug}
|
|
274
414
|
isSmallVersion={true}></SocialSection>
|
|
275
415
|
</SeaweedBaseLayout>
|
|
416
|
+
|
|
417
|
+
<style lang="postcss">
|
|
418
|
+
.advanced-setting {
|
|
419
|
+
display: flex;
|
|
420
|
+
flex-direction: column;
|
|
421
|
+
gap: 0.5lh;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
h3 {
|
|
425
|
+
font-size: 1.5em;
|
|
426
|
+
line-height: 1.5lh;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
.query-term-grid {
|
|
430
|
+
display: flex;
|
|
431
|
+
gap: 0.25em;
|
|
432
|
+
flex-wrap: wrap;
|
|
433
|
+
}
|
|
434
|
+
</style>
|
|
@@ -1,133 +1,133 @@
|
|
|
1
|
-
main {
|
|
2
|
-
width: 100%;
|
|
3
|
-
overflow: visible;
|
|
4
|
-
display: flex;
|
|
5
|
-
flex-direction: column;
|
|
6
|
-
justify-content: center;
|
|
7
|
-
align-items: center;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
h1 {
|
|
11
|
-
font-size: 2em;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
h2 {
|
|
15
|
-
font-size: 1.5em;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
.section-card {
|
|
19
|
-
padding: 3em;
|
|
20
|
-
max-width: 800px;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
.game-card, .project-card {
|
|
24
|
-
width: 100vw;
|
|
25
|
-
max-width: 36em;
|
|
26
|
-
margin-bottom: 3em;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
.game-card > video {
|
|
30
|
-
border-top-left-radius: 1em;
|
|
31
|
-
border-top-right-radius: 1em;
|
|
32
|
-
max-height: 24em;
|
|
33
|
-
width: 100%;
|
|
34
|
-
object-fit: cover;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
#migrante-alberta, .game-card > img, .project-card > img {
|
|
38
|
-
border-top-left-radius: 1em;
|
|
39
|
-
border-top-right-radius: 1em;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
#migrante-alberta {
|
|
43
|
-
width: 100%;
|
|
44
|
-
object-fit: cover;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.game-button {
|
|
48
|
-
@apply btn variant-filled-primary;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
.game-button > img {
|
|
52
|
-
max-height: 1lh;
|
|
53
|
-
/* todo: consider night mode day mode */
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
.two-column-separated {
|
|
57
|
-
display: flex;
|
|
58
|
-
justify-content: space-between;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
.more-section {
|
|
62
|
-
padding: 1em;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
.greater-about-div {
|
|
66
|
-
display: flex;
|
|
67
|
-
flex-direction: column;
|
|
68
|
-
max-width: 36em;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
.experience-and-about-div {
|
|
72
|
-
display: flex;
|
|
73
|
-
gap: 2em;
|
|
74
|
-
flex-wrap: wrap;
|
|
75
|
-
justify-content: center;
|
|
76
|
-
align-items: flex-start;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
.game-card-body, .project-card-body {
|
|
80
|
-
padding: 1em;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
.game-card-body > blockquote {
|
|
84
|
-
margin-bottom: 0.7lh;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
.game-card-body > h1, .project-card-body > h2 {
|
|
88
|
-
text-align: center;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
.game-link-section {
|
|
92
|
-
display: flex;
|
|
93
|
-
flex-direction: row;
|
|
94
|
-
justify-content: center;
|
|
95
|
-
gap: 1em;
|
|
96
|
-
margin-top: 1em;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
.games-section, .projects-section {
|
|
100
|
-
display: flex;
|
|
101
|
-
flex-wrap: wrap;
|
|
102
|
-
gap: 2em;
|
|
103
|
-
justify-content: center;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
.projects-section {
|
|
107
|
-
align-items: flex-start;
|
|
108
|
-
/*justify-content: flex-start;*/
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
.long-btn-image {
|
|
112
|
-
max-height: 1lh;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
.itch-promo {
|
|
116
|
-
padding: 4em;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
#hepcat-video {
|
|
120
|
-
object-position: 0 0;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
.title-card {
|
|
124
|
-
width: clamp(360px, 80vw, 800px);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
[class*='qt-'] {
|
|
128
|
-
font-weight: var(--qt-font-weight);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
.accordion-header {
|
|
132
|
-
margin-top: 0.25em;
|
|
133
|
-
}
|
|
1
|
+
main {
|
|
2
|
+
width: 100%;
|
|
3
|
+
overflow: visible;
|
|
4
|
+
display: flex;
|
|
5
|
+
flex-direction: column;
|
|
6
|
+
justify-content: center;
|
|
7
|
+
align-items: center;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
h1 {
|
|
11
|
+
font-size: 2em;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
h2 {
|
|
15
|
+
font-size: 1.5em;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.section-card {
|
|
19
|
+
padding: 3em;
|
|
20
|
+
max-width: 800px;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.game-card, .project-card {
|
|
24
|
+
width: 100vw;
|
|
25
|
+
max-width: 36em;
|
|
26
|
+
margin-bottom: 3em;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.game-card > video {
|
|
30
|
+
border-top-left-radius: 1em;
|
|
31
|
+
border-top-right-radius: 1em;
|
|
32
|
+
max-height: 24em;
|
|
33
|
+
width: 100%;
|
|
34
|
+
object-fit: cover;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
#migrante-alberta, .game-card > img, .project-card > img {
|
|
38
|
+
border-top-left-radius: 1em;
|
|
39
|
+
border-top-right-radius: 1em;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
#migrante-alberta {
|
|
43
|
+
width: 100%;
|
|
44
|
+
object-fit: cover;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.game-button {
|
|
48
|
+
@apply btn variant-filled-primary;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.game-button > img {
|
|
52
|
+
max-height: 1lh;
|
|
53
|
+
/* todo: consider night mode day mode */
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.two-column-separated {
|
|
57
|
+
display: flex;
|
|
58
|
+
justify-content: space-between;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.more-section {
|
|
62
|
+
padding: 1em;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.greater-about-div {
|
|
66
|
+
display: flex;
|
|
67
|
+
flex-direction: column;
|
|
68
|
+
max-width: 36em;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.experience-and-about-div {
|
|
72
|
+
display: flex;
|
|
73
|
+
gap: 2em;
|
|
74
|
+
flex-wrap: wrap;
|
|
75
|
+
justify-content: center;
|
|
76
|
+
align-items: flex-start;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.game-card-body, .project-card-body {
|
|
80
|
+
padding: 1em;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.game-card-body > blockquote {
|
|
84
|
+
margin-bottom: 0.7lh;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.game-card-body > h1, .project-card-body > h2 {
|
|
88
|
+
text-align: center;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.game-link-section {
|
|
92
|
+
display: flex;
|
|
93
|
+
flex-direction: row;
|
|
94
|
+
justify-content: center;
|
|
95
|
+
gap: 1em;
|
|
96
|
+
margin-top: 1em;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.games-section, .projects-section {
|
|
100
|
+
display: flex;
|
|
101
|
+
flex-wrap: wrap;
|
|
102
|
+
gap: 2em;
|
|
103
|
+
justify-content: center;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.projects-section {
|
|
107
|
+
align-items: flex-start;
|
|
108
|
+
/*justify-content: flex-start;*/
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.long-btn-image {
|
|
112
|
+
max-height: 1lh;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.itch-promo {
|
|
116
|
+
padding: 4em;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
#hepcat-video {
|
|
120
|
+
object-position: 0 0;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.title-card {
|
|
124
|
+
width: clamp(360px, 80vw, 800px);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
[class*='qt-'] {
|
|
128
|
+
font-weight: var(--qt-font-weight);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.accordion-header {
|
|
132
|
+
margin-top: 0.25em;
|
|
133
|
+
}
|
package/src/lib/util/util.ts
CHANGED
|
@@ -1,34 +1,38 @@
|
|
|
1
|
-
export const generatedDailySeed = (): number => {
|
|
2
|
-
const date = new Date();
|
|
3
|
-
const time = date.getTime() + 86400000;
|
|
4
|
-
return time - (time % 86400000);
|
|
5
|
-
};
|
|
6
|
-
|
|
7
|
-
// psuedo misc with seed
|
|
8
|
-
// from https://stackoverflow.com/a/47593316
|
|
9
|
-
export const mulberry32Generator = (a: number): (() => number) => {
|
|
10
|
-
return function() {
|
|
11
|
-
var t = (a += 0x6d2b79f5);
|
|
12
|
-
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
13
|
-
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
14
|
-
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
export const createGoToFunction = (path: string): (() => void) => {
|
|
19
|
-
return (() => {
|
|
20
|
-
location.href = path;
|
|
21
|
-
});
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export interface ExternalLinkWarningArgs {
|
|
25
|
-
href: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export const createExternalLinkWarningFunction = (args: ExternalLinkWarningArgs): (() => void) => {
|
|
29
|
-
return (() => {
|
|
30
|
-
// todo: https://github.com/TurnipXenon/pineapple/issues/99
|
|
31
|
-
// add the warning here for future functions
|
|
32
|
-
location.href = args.href;
|
|
33
|
-
});
|
|
34
|
-
};
|
|
1
|
+
export const generatedDailySeed = (): number => {
|
|
2
|
+
const date = new Date();
|
|
3
|
+
const time = date.getTime() + 86400000;
|
|
4
|
+
return time - (time % 86400000);
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
// psuedo misc with seed
|
|
8
|
+
// from https://stackoverflow.com/a/47593316
|
|
9
|
+
export const mulberry32Generator = (a: number): (() => number) => {
|
|
10
|
+
return function() {
|
|
11
|
+
var t = (a += 0x6d2b79f5);
|
|
12
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
13
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
14
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const createGoToFunction = (path: string): (() => void) => {
|
|
19
|
+
return (() => {
|
|
20
|
+
location.href = path;
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export interface ExternalLinkWarningArgs {
|
|
25
|
+
href: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const createExternalLinkWarningFunction = (args: ExternalLinkWarningArgs): (() => void) => {
|
|
29
|
+
return (() => {
|
|
30
|
+
// todo: https://github.com/TurnipXenon/pineapple/issues/99
|
|
31
|
+
// add the warning here for future functions
|
|
32
|
+
location.href = args.href;
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export interface RawGlob {
|
|
37
|
+
default: string;
|
|
38
|
+
}
|
|
@@ -1,22 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import PinyaBaseLayout from "$pkg/components/pineapple/PineappleBaseLayout.svelte";
|
|
3
|
-
import { PUBLIC_CRINGE_USERNAME } from "$env/static/public";
|
|
4
3
|
</script>
|
|
5
4
|
|
|
6
|
-
<svelte:head>
|
|
7
|
-
<title>{PUBLIC_CRINGE_USERNAME}</title>
|
|
8
|
-
<meta content="summary" name="Turnip time!" />
|
|
9
|
-
<meta content="@{PUBLIC_CRINGE_USERNAME}" name="twitter:site" />
|
|
10
|
-
<meta content="@{PUBLIC_CRINGE_USERNAME}" name="twitter:creator" />
|
|
11
|
-
<meta content="https://www.{PUBLIC_CRINGE_USERNAME}.com/" name="og:url" />
|
|
12
|
-
<meta content="{PUBLIC_CRINGE_USERNAME} | Home" name="og:title" />
|
|
13
|
-
<meta
|
|
14
|
-
content="I have no idea! Anyway... Hi! I don't know what I'm doing! Also check out my games!"
|
|
15
|
-
name="og:description"
|
|
16
|
-
/>
|
|
17
|
-
<meta content="https://www.{PUBLIC_CRINGE_USERNAME}.com/default-card.png" property="og:image" />
|
|
18
|
-
</svelte:head>
|
|
19
|
-
|
|
20
5
|
<PinyaBaseLayout>
|
|
21
6
|
<slot />
|
|
22
7
|
</PinyaBaseLayout>
|
|
@@ -1,20 +1,8 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
import { PUBLIC_CRINGE_USERNAME } from "$env/static/public";
|
|
3
|
-
|
|
4
|
-
|
|
5
2
|
import { createGoToFunction } from "$pkg/util/util";
|
|
6
3
|
import { Card } from "$pkg";
|
|
7
4
|
</script>
|
|
8
5
|
|
|
9
|
-
<svelte:head>
|
|
10
|
-
<title>Welcome to {PUBLIC_CRINGE_USERNAME}'s Home</title>
|
|
11
|
-
<meta content="Welcome to {PUBLIC_CRINGE_USERNAME}'s Home" name="og:title" />
|
|
12
|
-
<meta
|
|
13
|
-
content="Welcome to {PUBLIC_CRINGE_USERNAME}'s home! It's a neat place to be at if you're feeling lost. Come hang around!"
|
|
14
|
-
name="og:description"
|
|
15
|
-
/>
|
|
16
|
-
</svelte:head>
|
|
17
|
-
|
|
18
6
|
<Card>
|
|
19
7
|
<div slot="content" class="content">
|
|
20
8
|
<h1 class="mb-8" style="font-weight: bolder">Directory</h1>
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { PUBLIC_CRINGE_USERNAME } from "$env/static/public";
|
|
3
2
|
import { showComponentInToast, showTextInToast } from "$pkg/components/pineapple/toast/Toast";
|
|
4
3
|
import TestCard from "$pkg/components/pineapple/toast/custom-toast/TestCustomToast.svelte";
|
|
5
4
|
import TestDialogYarn from "./TestDialog.yarn?raw";
|
|
@@ -27,15 +26,6 @@
|
|
|
27
26
|
};
|
|
28
27
|
</script>
|
|
29
28
|
|
|
30
|
-
<svelte:head>
|
|
31
|
-
<title>Welcome to {PUBLIC_CRINGE_USERNAME}'s Home</title>
|
|
32
|
-
<meta content="Welcome to {PUBLIC_CRINGE_USERNAME}'s Home" name="og:title" />
|
|
33
|
-
<meta
|
|
34
|
-
content="Welcome to {PUBLIC_CRINGE_USERNAME}'s home! It's a neat place to be at if you're feeling lost. Come hang around!"
|
|
35
|
-
name="og:description"
|
|
36
|
-
/>
|
|
37
|
-
</svelte:head>
|
|
38
|
-
|
|
39
29
|
<Card>
|
|
40
30
|
<div slot="content" class="default-card">
|
|
41
31
|
<button
|