@turnipxenon/pineapple 3.0.0-alpha.1 → 3.0.0-alpha.2
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/assets/icons/icon-check-dark-contrast.svg +1 -0
- package/dist/assets/icons/icon-check-light-contrast.svg +1 -0
- package/dist/assets/icons/icon-copy-dark-contrast.svg +1 -0
- package/dist/assets/icons/icon-copy-light-contrast.svg +1 -0
- package/dist/components/PineappleSlideToggle.svelte +12 -6
- package/dist/components/PineappleSlideToggle.svelte.d.ts +3 -2
- package/dist/styles/app.css +92 -1
- package/dist/styles/turnip-theme.css +6 -2
- package/dist/template/seaweed/CreateUrlForm.svelte +17 -11
- package/dist/template/seaweed/CreateUrlForm.svelte.d.ts +4 -1
- package/dist/template/seaweed/ToastSettings.d.ts +15 -0
- package/dist/template/seaweed/ToastSettings.js +1 -0
- package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte +34 -1
- package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte.d.ts +0 -1
- package/dist/ui/elements/CodeBlock/CodeBlock.svelte +65 -0
- package/dist/ui/elements/CodeBlock/CodeBlock.svelte.d.ts +5 -0
- package/dist/ui/elements/CodeBlock/CodeBlockProps.d.ts +11 -0
- package/dist/ui/elements/CodeBlock/CodeBlockProps.js +1 -0
- package/dist/ui/elements/CodeBlock/index.d.ts +2 -0
- package/dist/ui/elements/CodeBlock/index.js +2 -0
- package/dist/ui/elements/PineappleSwitch.svelte +29 -0
- package/dist/ui/elements/PineappleSwitch.svelte.d.ts +10 -0
- package/dist/ui/elements/index.d.ts +10 -8
- package/dist/ui/elements/index.js +10 -8
- package/dist/ui/elements/pinya-card/component.svelte +10 -8
- package/dist/ui/elements/pinya-card/component.svelte.d.ts +3 -3
- package/dist/ui/elements/pinya-card/props.d.ts +3 -0
- package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte +35 -0
- package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte.d.ts +18 -0
- package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts +18 -0
- package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.js +1 -0
- package/dist/ui/elements/text-chip/TextChip.svelte +15 -0
- package/dist/ui/elements/text-chip/TextChip.svelte.d.ts +4 -0
- package/dist/ui/elements/text-chip/TextChipProps.d.ts +4 -0
- package/dist/ui/elements/text-chip/TextChipProps.js +1 -0
- package/dist/ui/elements/text-chip/index.d.ts +2 -0
- package/dist/ui/elements/text-chip/index.js +2 -0
- package/dist/ui/modules/index.d.ts +2 -1
- package/dist/ui/modules/index.js +2 -1
- package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte +10 -20
- package/dist/ui/modules/projects/Hepcat.svelte +71 -0
- package/dist/ui/modules/projects/Hepcat.svelte.d.ts +22 -0
- package/dist/ui/modules/projects/Pengi.svelte +60 -0
- package/dist/ui/modules/projects/Pengi.svelte.d.ts +22 -0
- package/dist/ui/modules/projects/Soulwork.svelte +55 -0
- package/dist/ui/modules/projects/Soulwork.svelte.d.ts +22 -0
- package/dist/ui/modules/projects/ThisWebpage.svelte +62 -0
- package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts +22 -0
- package/dist/ui/modules/projects/index.d.ts +4 -0
- package/dist/ui/modules/projects/index.js +4 -0
- package/dist/ui/modules/seaweed/ChumBucket.svelte +36 -37
- package/dist/ui/templates/PinyaBase.svelte +9 -6
- package/dist/ui/templates/PinyaBase.svelte.d.ts +1 -1
- package/dist/ui/templates/index.d.ts +3 -2
- package/dist/ui/templates/index.js +3 -2
- package/dist/ui/templates/pinya-page-layout/component.svelte +17 -10
- package/dist/ui/templates/pinya-page-layout/component.svelte.d.ts +2 -1
- package/dist/ui/templates/seaweed-layout/EntryGroup.svelte +89 -0
- package/dist/ui/templates/seaweed-layout/EntryGroup.svelte.d.ts +4 -0
- package/dist/ui/templates/seaweed-layout/EntryOrderConfig2.svelte +45 -0
- package/dist/ui/templates/seaweed-layout/EntryOrderConfig2.svelte.d.ts +9 -0
- package/dist/ui/templates/seaweed-layout/ProjectComponentProps.d.ts +4 -0
- package/dist/ui/templates/seaweed-layout/ProjectComponentProps.js +1 -0
- package/dist/ui/templates/seaweed-layout/ProjectGroupConfig.svelte +316 -0
- package/dist/ui/templates/seaweed-layout/ProjectGroupConfig.svelte.d.ts +14 -0
- package/dist/ui/templates/seaweed-layout/SeaweedLayout.md +4 -0
- package/dist/ui/templates/seaweed-layout/SeaweedLayout.svelte +196 -0
- package/dist/ui/templates/seaweed-layout/SeaweedLayout.svelte.d.ts +4 -0
- package/dist/ui/templates/seaweed-layout/index.d.ts +4 -0
- package/dist/ui/templates/seaweed-layout/index.js +4 -0
- package/dist/ui/templates/seaweed-layout/props.d.ts +25 -0
- package/dist/ui/templates/seaweed-layout/props.js +1 -0
- package/dist/util/util.d.ts +1 -0
- package/dist/util/util.js +9 -0
- package/package.json +3 -1
- package/src/lib/styles/app.css +92 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface GenericComboboxItem<T extends string> {
|
|
2
|
+
label: string;
|
|
3
|
+
value: T;
|
|
4
|
+
}
|
|
5
|
+
export interface ValueChangeDetails<T extends string> {
|
|
6
|
+
value: string[];
|
|
7
|
+
items: T[];
|
|
8
|
+
}
|
|
9
|
+
export interface PinyaComboboxProps<T extends string> {
|
|
10
|
+
data: GenericComboboxItem<T>[];
|
|
11
|
+
defaultValue: T[];
|
|
12
|
+
value: T[];
|
|
13
|
+
label: string;
|
|
14
|
+
placeholder: string;
|
|
15
|
+
onValueChange?: (selectedList: ValueChangeDetails<T>) => void;
|
|
16
|
+
onValueChangeBase?: (selectedList: ValueChangeDetails<T>) => void;
|
|
17
|
+
contentZIndex?: string;
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { TextChipProps } from "./TextChipProps";
|
|
3
|
+
|
|
4
|
+
let { children, queryClass = "" }: TextChipProps = $props();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<span class={`chip text-chip font-bold pointer-events-none ${queryClass}`}>{@render children()}</span>
|
|
8
|
+
|
|
9
|
+
<style>
|
|
10
|
+
/*noinspection CssUnusedSymbol*/
|
|
11
|
+
:global(.highlight-chip.text-chip) {
|
|
12
|
+
background-color: var(--color-secondary-500) /* oklch(55.6% 0 0deg) = #737373 */;
|
|
13
|
+
color: var(--color-secondary-contrast-500) /* var(--color-secondary-contrast-light) */;
|
|
14
|
+
}
|
|
15
|
+
</style>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export * from "./seaweed
|
|
1
|
+
export * from "./seaweed";
|
|
2
|
+
export * from "./projects";
|
package/dist/ui/modules/index.js
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export * from "./seaweed
|
|
1
|
+
export * from "./seaweed";
|
|
2
|
+
export * from "./projects";
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
2
|
+
import { getLocale, localizeHref } from "../../../../paraglide/runtime";
|
|
3
|
+
import PinyaCombobox from "../../../elements/pinya-combobox/PinyaCombobox.svelte";
|
|
4
4
|
|
|
5
5
|
interface ComboxData {
|
|
6
6
|
label: string;
|
|
7
|
-
value:
|
|
7
|
+
value: "en" | "fr" | "tl";
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
const comboboxData: ComboxData[] = [
|
|
11
|
-
{ label:
|
|
12
|
-
{ label:
|
|
13
|
-
{ label:
|
|
11
|
+
{ label: "English", value: "en" },
|
|
12
|
+
{ label: "French", value: "fr" },
|
|
13
|
+
{ label: "Tagalog", value: "tl" }
|
|
14
14
|
];
|
|
15
15
|
|
|
16
16
|
let selectedCountry = $state([getLocale()]);
|
|
@@ -23,26 +23,16 @@
|
|
|
23
23
|
const data = comboboxData.find((d) => d.value === e.value[0]);
|
|
24
24
|
if (data) {
|
|
25
25
|
selectedCountry = [data.value];
|
|
26
|
-
location.href = localizeHref(
|
|
26
|
+
location.href = localizeHref("./", { locale: data.value });
|
|
27
27
|
}
|
|
28
28
|
};
|
|
29
29
|
</script>
|
|
30
30
|
|
|
31
|
-
<
|
|
32
|
-
width="w-full"
|
|
33
|
-
labelText="text-md"
|
|
34
|
-
inputGroupBase="w-full flex items-center border-primary-500 border-2 rounded-xl"
|
|
35
|
-
inputGroupInput="grow bg-transparent border-0 dark:placeholder-surface-50 pl-4"
|
|
36
|
-
inputGroupButton="size-[3rem]"
|
|
37
|
-
inputGroupArrow="size-[2rem] m-auto"
|
|
38
|
-
contentBackground="bg-surface-100-900 border-primary-500 border-2"
|
|
39
|
-
optionActive="bg-secondary-400-600"
|
|
40
|
-
optionHover="hover:brightness-75 dark:hover:brightness-125"
|
|
41
|
-
optionClasses='aria-selected:brightness-75 aria-selected:dark:brightness-125'
|
|
31
|
+
<PinyaCombobox
|
|
42
32
|
data={comboboxData}
|
|
43
|
-
defaultValue={selectedCountry}
|
|
44
33
|
value={selectedCountry}
|
|
45
|
-
|
|
34
|
+
defaultValue={selectedCountry}
|
|
46
35
|
label="Select Language"
|
|
47
36
|
placeholder="Select Language"
|
|
37
|
+
{onValueChange}
|
|
48
38
|
/>
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
import HeaderHepCat from "../../../assets/temp/header-hep-cat.mp4";
|
|
3
|
+
import BitbucketIcon from "../../../assets/icons/bitbucket-icon.svg";
|
|
4
|
+
import type { ProjectComponentProps } from "../../templates/seaweed-layout/ProjectComponentProps";
|
|
5
|
+
import { FourPartCard } from "../../components/index.js";
|
|
6
|
+
import { ButtonVariant, ImageIcon, PinyaButton } from "../../elements/index.js";
|
|
7
|
+
import { ItchLogoHotLink } from "../../../consts.js";
|
|
8
|
+
|
|
9
|
+
const key = "Hepcat";
|
|
10
|
+
export { component, key };
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
{#snippet component(props: ProjectComponentProps)}
|
|
14
|
+
<FourPartCard>
|
|
15
|
+
{#snippet headerCover()}
|
|
16
|
+
<video playsinline autoplay muted loop preload="none" id="hepcat-video" class="game-video-cover">
|
|
17
|
+
<source src={HeaderHepCat} type="video/mp4">
|
|
18
|
+
</video>
|
|
19
|
+
{/snippet}
|
|
20
|
+
|
|
21
|
+
{#snippet header()}
|
|
22
|
+
<h3>Hepcat</h3>
|
|
23
|
+
|
|
24
|
+
<blockquote>
|
|
25
|
+
"Cats, Jazz, and a little bit of Death. What more could anyone ask for?"
|
|
26
|
+
</blockquote>
|
|
27
|
+
{/snippet}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
<p>This is a course project made by a team of six for <a
|
|
31
|
+
href="https://sites.google.com/ualberta.ca/cmput250/">CMPUT 250</a>, and it won <a
|
|
32
|
+
href="https://webdocs.cs.ualberta.ca/~nathanst/certificate/">Game of the year.</a>
|
|
33
|
+
</p>
|
|
34
|
+
|
|
35
|
+
<p>
|
|
36
|
+
Hep Cat is a <span class="qt-rhythm">rhythm</span> game made in <a
|
|
37
|
+
href="https://www.rpgmakerweb.com/products/programs/rpg-maker-mv" target="_blank"
|
|
38
|
+
class='qt-rpgmaker'>
|
|
39
|
+
RPG Maker MV</a> with the help of additional custom-made <span class='qt-js'>Javascript</span>
|
|
40
|
+
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
|
|
43
|
+
into readable JSON
|
|
44
|
+
files.
|
|
45
|
+
</p>
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
<section class="game-link-section">
|
|
49
|
+
<PinyaButton
|
|
50
|
+
buttonVariant={ButtonVariant.Image}
|
|
51
|
+
title="https://bitbucket.org/egginchicken/hep-cat/src/master/"
|
|
52
|
+
onclick={()=> window.open("https://bitbucket.org/egginchicken/hep-cat/src/master/")}>
|
|
53
|
+
<ImageIcon alt="bitbucket icon" src={BitbucketIcon} />
|
|
54
|
+
</PinyaButton>
|
|
55
|
+
<PinyaButton
|
|
56
|
+
buttonVariant={ButtonVariant.Image}
|
|
57
|
+
title="https://just-a-phantom.itch.io/hep-cat"
|
|
58
|
+
onclick={()=> window.open("https://just-a-phantom.itch.io/hep-cat")}>
|
|
59
|
+
<ImageIcon alt="itch.io icon" src={ItchLogoHotLink}></ImageIcon>
|
|
60
|
+
</PinyaButton>
|
|
61
|
+
</section>
|
|
62
|
+
</FourPartCard>
|
|
63
|
+
{/snippet}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
<style>
|
|
67
|
+
#hepcat-video {
|
|
68
|
+
object-position: top;
|
|
69
|
+
max-height: 64rem;
|
|
70
|
+
}
|
|
71
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ProjectComponentProps } from "../../templates/seaweed-layout/ProjectComponentProps";
|
|
2
|
+
declare const key = "Hepcat";
|
|
3
|
+
export { component, key };
|
|
4
|
+
declare const component: (props: ProjectComponentProps) => ReturnType<import("svelte").Snippet>;
|
|
5
|
+
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> {
|
|
6
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
7
|
+
$$bindings?: Bindings;
|
|
8
|
+
} & Exports;
|
|
9
|
+
(internal: unknown, props: {
|
|
10
|
+
$$events?: Events;
|
|
11
|
+
$$slots?: Slots;
|
|
12
|
+
}): Exports & {
|
|
13
|
+
$set?: any;
|
|
14
|
+
$on?: any;
|
|
15
|
+
};
|
|
16
|
+
z_$$bindings?: Bindings;
|
|
17
|
+
}
|
|
18
|
+
declare const Hepcat: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
19
|
+
[evt: string]: CustomEvent<any>;
|
|
20
|
+
}, {}, {}, string>;
|
|
21
|
+
type Hepcat = InstanceType<typeof Hepcat>;
|
|
22
|
+
export default Hepcat;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
import HeaderPengi from "../../../assets/temp/header-pengi.mp4";
|
|
3
|
+
import GithubIcon from "../../../assets/icons/github-mark.svg";
|
|
4
|
+
import type { ProjectComponentProps } from "../../templates/index";
|
|
5
|
+
import { FourPartCard } from "../../components/index.js";
|
|
6
|
+
import { ButtonVariant, ImageIcon, PinyaButton } from "../../elements/index.js";
|
|
7
|
+
import { ItchLogoHotLink } from "../../../consts.js";
|
|
8
|
+
|
|
9
|
+
const key = "Pengi";
|
|
10
|
+
export { component, key };
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
{#snippet component(props: ProjectComponentProps)}
|
|
14
|
+
<FourPartCard>
|
|
15
|
+
{#snippet headerCover()}
|
|
16
|
+
<video class="rounded-t-xl max-h-64 not-prose object-cover w-full" playsinline autoplay muted loop preload="none">
|
|
17
|
+
video unavailable. original video contains pengi gameplay showing the dynamic dialog
|
|
18
|
+
layout and character animation.
|
|
19
|
+
<source src={HeaderPengi} type="video/mp4">
|
|
20
|
+
</video>
|
|
21
|
+
{/snippet}
|
|
22
|
+
|
|
23
|
+
{#snippet header()}
|
|
24
|
+
<h3>Pengi</h3>
|
|
25
|
+
|
|
26
|
+
<blockquote>
|
|
27
|
+
Well well, quite the dreamer, aren’t you? Might be hard to get in... costs a lot of
|
|
28
|
+
money...
|
|
29
|
+
</blockquote>
|
|
30
|
+
{/snippet}
|
|
31
|
+
|
|
32
|
+
<p>
|
|
33
|
+
Pengi is a text-based adventure made in <span class='qt-unity'>Unity</span> (<span class='qt-cs'>C#</span>). I
|
|
34
|
+
acted as the sole
|
|
35
|
+
programmer for the team. Most of the work revolves around UI and creating <a
|
|
36
|
+
href="https://yarnspinner.dev/" target="_blank">YarnSpinner</a> commands for writers
|
|
37
|
+
to use to create expressive stage directions in the script.
|
|
38
|
+
</p>
|
|
39
|
+
|
|
40
|
+
<section class="game-link-section">
|
|
41
|
+
<PinyaButton
|
|
42
|
+
buttonVariant={ButtonVariant.Image}
|
|
43
|
+
aria-label="Click to go to Project Pengi in Github"
|
|
44
|
+
title="https://github.com/GreenTea-M/ProjectPengi"
|
|
45
|
+
onclick={() => window.open("https://github.com/GreenTea-M/ProjectPengi")}
|
|
46
|
+
>
|
|
47
|
+
<ImageIcon alt="" aria-hidden="true" src={GithubIcon} />
|
|
48
|
+
</PinyaButton>
|
|
49
|
+
<PinyaButton
|
|
50
|
+
buttonVariant={ButtonVariant.Image}
|
|
51
|
+
aria-label="Click to go to Project Pengi in Itch.io"
|
|
52
|
+
title="https://turnipxenon.itch.io/pengi"
|
|
53
|
+
onclick={() => window.open("https://turnipxenon.itch.io/pengi")}
|
|
54
|
+
>
|
|
55
|
+
<ImageIcon alt="" aria-hidden="true" src={ItchLogoHotLink} />
|
|
56
|
+
</PinyaButton>
|
|
57
|
+
</section>
|
|
58
|
+
|
|
59
|
+
</FourPartCard>
|
|
60
|
+
{/snippet}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ProjectComponentProps } from "../../templates/index";
|
|
2
|
+
declare const key = "Pengi";
|
|
3
|
+
export { component, key };
|
|
4
|
+
declare const component: (props: ProjectComponentProps) => ReturnType<import("svelte").Snippet>;
|
|
5
|
+
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> {
|
|
6
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
7
|
+
$$bindings?: Bindings;
|
|
8
|
+
} & Exports;
|
|
9
|
+
(internal: unknown, props: {
|
|
10
|
+
$$events?: Events;
|
|
11
|
+
$$slots?: Slots;
|
|
12
|
+
}): Exports & {
|
|
13
|
+
$set?: any;
|
|
14
|
+
$on?: any;
|
|
15
|
+
};
|
|
16
|
+
z_$$bindings?: Bindings;
|
|
17
|
+
}
|
|
18
|
+
declare const Pengi: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
19
|
+
[evt: string]: CustomEvent<any>;
|
|
20
|
+
}, {}, {}, string>;
|
|
21
|
+
type Pengi = InstanceType<typeof Pengi>;
|
|
22
|
+
export default Pengi;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
import HeaderSoulwork from '../../../assets/temp/header-soulwork.mp4';
|
|
3
|
+
import GithubIcon from '../../../assets/icons/github-mark.svg';
|
|
4
|
+
import type { ProjectComponentProps } from "../../templates/index";
|
|
5
|
+
import { FourPartCard } from "../../components/index";
|
|
6
|
+
import { ButtonVariant, ImageIcon, PinyaButton } from "../../elements/index.js";
|
|
7
|
+
import { ItchLogoHotLink } from "../../../consts.js";
|
|
8
|
+
|
|
9
|
+
const key = "Soulwork";
|
|
10
|
+
export { component, key };
|
|
11
|
+
</script>
|
|
12
|
+
|
|
13
|
+
{#snippet component(props: ProjectComponentProps)}
|
|
14
|
+
<FourPartCard>
|
|
15
|
+
{#snippet headerCover()}
|
|
16
|
+
<video
|
|
17
|
+
playsinline autoplay muted loop preload="none"
|
|
18
|
+
class="game-video-cover"
|
|
19
|
+
>
|
|
20
|
+
<source src={HeaderSoulwork} type="video/mp4">
|
|
21
|
+
</video>
|
|
22
|
+
{/snippet}
|
|
23
|
+
|
|
24
|
+
{#snippet header()}
|
|
25
|
+
<h1>Soulwork</h1>
|
|
26
|
+
{/snippet}
|
|
27
|
+
|
|
28
|
+
<p>
|
|
29
|
+
Soulwork is a 2D platforming game that uses unique physics to solve puzzle-based levels.
|
|
30
|
+
This project is a Time to Game Jam entry, restricting game development to be under 48
|
|
31
|
+
hours.
|
|
32
|
+
</p>
|
|
33
|
+
<p>
|
|
34
|
+
I helped make the level designing tools used by the designers to drag-and-drop objects
|
|
35
|
+
on the stage. I also helped program the unique physics-based gameplay mechanic. This was
|
|
36
|
+
was made in <span class="qt-unity">Unity</span> written using <span class="qt-cs">C#</span>.
|
|
37
|
+
</p>
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
<section class="game-link-section">
|
|
41
|
+
<PinyaButton
|
|
42
|
+
buttonVariant={ButtonVariant.Image}
|
|
43
|
+
title="https://github.com/Zeyu-Li/Clockwork"
|
|
44
|
+
onclick={()=> window.open("https://github.com/Zeyu-Li/Clockwork")}>
|
|
45
|
+
<ImageIcon alt="github icon" src={GithubIcon} />
|
|
46
|
+
</PinyaButton>
|
|
47
|
+
<PinyaButton
|
|
48
|
+
buttonVariant={ButtonVariant.Image}
|
|
49
|
+
title="https://itch.io/jam/time-to-game-jam-gadec-fall-game-jam/rate/514331"
|
|
50
|
+
onclick={()=> window.open("https://itch.io/jam/time-to-game-jam-gadec-fall-game-jam/rate/514331")}>
|
|
51
|
+
<ImageIcon alt="itch.io icon" src={ItchLogoHotLink} />
|
|
52
|
+
</PinyaButton>
|
|
53
|
+
</section>
|
|
54
|
+
</FourPartCard>
|
|
55
|
+
{/snippet}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ProjectComponentProps } from "../../templates/index";
|
|
2
|
+
declare const key = "Soulwork";
|
|
3
|
+
export { component, key };
|
|
4
|
+
declare const component: (props: ProjectComponentProps) => ReturnType<import("svelte").Snippet>;
|
|
5
|
+
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> {
|
|
6
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
7
|
+
$$bindings?: Bindings;
|
|
8
|
+
} & Exports;
|
|
9
|
+
(internal: unknown, props: {
|
|
10
|
+
$$events?: Events;
|
|
11
|
+
$$slots?: Slots;
|
|
12
|
+
}): Exports & {
|
|
13
|
+
$set?: any;
|
|
14
|
+
$on?: any;
|
|
15
|
+
};
|
|
16
|
+
z_$$bindings?: Bindings;
|
|
17
|
+
}
|
|
18
|
+
declare const Soulwork: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
19
|
+
[evt: string]: CustomEvent<any>;
|
|
20
|
+
}, {}, {}, string>;
|
|
21
|
+
type Soulwork = InstanceType<typeof Soulwork>;
|
|
22
|
+
export default Soulwork;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<script module lang="ts">
|
|
2
|
+
import GithubIcon from '../../../assets/icons/github-mark.svg';
|
|
3
|
+
import ThisWebsiteFootage from '../../../assets/others/seaweed-showcase.mp4';
|
|
4
|
+
import type { ProjectComponentProps } from '../../templates/seaweed-layout/ProjectComponentProps';
|
|
5
|
+
|
|
6
|
+
const key = 'This Webpage';
|
|
7
|
+
export { component, key };
|
|
8
|
+
</script>
|
|
9
|
+
<script>
|
|
10
|
+
import { FourPartCard } from "../../components/index";
|
|
11
|
+
import { ButtonVariant, ImageIcon, PinyaButton, TextChip } from "../../elements/index.js";
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
{#snippet component(props: ProjectComponentProps)}
|
|
15
|
+
<FourPartCard>
|
|
16
|
+
|
|
17
|
+
{#snippet headerCover()}
|
|
18
|
+
<video
|
|
19
|
+
playsinline autoplay muted loop preload="none"
|
|
20
|
+
class="game-video-cover"
|
|
21
|
+
>
|
|
22
|
+
<source src={ThisWebsiteFootage} type="video/mp4">
|
|
23
|
+
video unavailable. original video contains clips of this website being resized and light-dark mode being
|
|
24
|
+
toggled.
|
|
25
|
+
</video>
|
|
26
|
+
{/snippet}
|
|
27
|
+
|
|
28
|
+
{#snippet header()}
|
|
29
|
+
<h2>This webpage!</h2>
|
|
30
|
+
{/snippet}
|
|
31
|
+
|
|
32
|
+
<p>
|
|
33
|
+
The webpage is made with two parts. The webpage that has the content for everything here, I've lovingly called
|
|
34
|
+
Seaweed. I kept seaweed as a private package. On the other hand, the base package which I want to use for all
|
|
35
|
+
spin offs of my websites is called Pineapple and have kept that codebase public.
|
|
36
|
+
</p>
|
|
37
|
+
<p>The webpage can dynamically emphasize terms, rearrange the layout, use different terms, and save all these
|
|
38
|
+
configurations as a shortened link. Additionally fetches the latest blog entries from turnipxenon.com via REST
|
|
39
|
+
calls.</p>
|
|
40
|
+
|
|
41
|
+
<div class="text-chip-container">
|
|
42
|
+
<TextChip queryClass="qt-svelte">Svelte 5</TextChip>
|
|
43
|
+
<TextChip queryClass="qt-tailwind">Tailwind 4</TextChip>
|
|
44
|
+
<TextChip queryClass="qt-skeleton">Skeleton (Svelte UI library)</TextChip>
|
|
45
|
+
<TextChip queryClass="qt-ts">Typescript</TextChip>
|
|
46
|
+
<TextChip queryClass="qt-vercel qt-cicd">Vercel</TextChip>
|
|
47
|
+
<TextChip queryClass="qt-gamedev">YarnSpinner</TextChip>
|
|
48
|
+
<TextChip queryClass="qt-postgres qt-db">Postgres (SQL database)</TextChip>
|
|
49
|
+
<TextChip queryClass="qt-prisma qt-db">Prisma ORM</TextChip>
|
|
50
|
+
<TextChip queryClass="qt-rest">RESTful API</TextChip>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<section class="game-link-section">
|
|
54
|
+
<PinyaButton
|
|
55
|
+
buttonVariant={ButtonVariant.Image}
|
|
56
|
+
title="https://github.com/TurnipXenon/pineapple"
|
|
57
|
+
onclick={() => window.open("https://github.com/TurnipXenon/pineapple")}>
|
|
58
|
+
<ImageIcon src={GithubIcon} class="long-btn-image" alt="github icon" />
|
|
59
|
+
</PinyaButton>
|
|
60
|
+
</section>
|
|
61
|
+
</FourPartCard>
|
|
62
|
+
{/snippet}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ProjectComponentProps } from '../../templates/seaweed-layout/ProjectComponentProps';
|
|
2
|
+
declare const key = "This Webpage";
|
|
3
|
+
export { component, key };
|
|
4
|
+
declare const component: (props: ProjectComponentProps) => ReturnType<import("svelte").Snippet>;
|
|
5
|
+
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> {
|
|
6
|
+
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
7
|
+
$$bindings?: Bindings;
|
|
8
|
+
} & Exports;
|
|
9
|
+
(internal: unknown, props: {
|
|
10
|
+
$$events?: Events;
|
|
11
|
+
$$slots?: Slots;
|
|
12
|
+
}): Exports & {
|
|
13
|
+
$set?: any;
|
|
14
|
+
$on?: any;
|
|
15
|
+
};
|
|
16
|
+
z_$$bindings?: Bindings;
|
|
17
|
+
}
|
|
18
|
+
declare const ThisWebpage: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
|
|
19
|
+
[evt: string]: CustomEvent<any>;
|
|
20
|
+
}, {}, {}, string>;
|
|
21
|
+
type ThisWebpage = InstanceType<typeof ThisWebpage>;
|
|
22
|
+
export default ThisWebpage;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { type PageMeta } from "../../..";
|
|
3
3
|
import { onMount } from "svelte";
|
|
4
|
-
import { PinyaCard } from "../../elements/index";
|
|
5
4
|
|
|
6
5
|
let hasTriedGettingChumBucket = $state(false);
|
|
7
6
|
let pageMetaList: PageMeta[] = $state([]);
|
|
@@ -19,43 +18,42 @@
|
|
|
19
18
|
});
|
|
20
19
|
</script>
|
|
21
20
|
|
|
22
|
-
<
|
|
23
|
-
|
|
24
|
-
<
|
|
25
|
-
<
|
|
26
|
-
<
|
|
27
|
-
|
|
28
|
-
<a href="https://turnipxenon.com/blogs/coding-chagrin" target="_blank">turnipxenon.com/blogs/coding-chagrin.</a>
|
|
29
|
-
</p>
|
|
21
|
+
<div class="chum-bucket">
|
|
22
|
+
<h2 class="text-start">More about me...</h2>
|
|
23
|
+
<p>Check out the latest things I've been rambling about at
|
|
24
|
+
<a href="https://turnipxenon.com" target="_blank">turnipxenon.com</a> or at
|
|
25
|
+
<a href="https://turnipxenon.com/blogs/coding-chagrin" target="_blank">turnipxenon.com/blogs/coding-chagrin.</a>
|
|
26
|
+
</p>
|
|
30
27
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
<
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
</
|
|
28
|
+
<div class="chum-bucket-grid">
|
|
29
|
+
{#if hasTriedGettingChumBucket}
|
|
30
|
+
{#each pageMetaList as pageMeta}
|
|
31
|
+
<div class="chum-bucket-item">
|
|
32
|
+
{#if pageMeta.imageUrl}
|
|
33
|
+
<img src={`https://turnipxenon.com${pageMeta.imageUrl}`}
|
|
34
|
+
class="chum-bucket-image"
|
|
35
|
+
alt={pageMeta.imageAlt}>
|
|
36
|
+
{/if}
|
|
37
|
+
<div>
|
|
38
|
+
<h3 class="text-start">
|
|
39
|
+
<a href={`https://turnipxenon.com/${pageMeta.relativeLink}`}>{pageMeta.title}</a>
|
|
40
|
+
</h3>
|
|
41
|
+
<p>Published: {pageMeta.datePublished}
|
|
42
|
+
{#if pageMeta.lastUpdated}
|
|
43
|
+
| Last updated: {pageMeta.lastUpdated}
|
|
44
|
+
{/if}
|
|
45
|
+
</p>
|
|
46
|
+
<p>{pageMeta.description}</p>
|
|
49
47
|
</div>
|
|
50
|
-
|
|
51
|
-
{
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
{/
|
|
56
|
-
|
|
48
|
+
</div>
|
|
49
|
+
{/each}
|
|
50
|
+
{:else}
|
|
51
|
+
{#each { length: 10 } as _}
|
|
52
|
+
<div class="placeholder"></div>
|
|
53
|
+
{/each}
|
|
54
|
+
{/if}
|
|
57
55
|
</div>
|
|
58
|
-
</
|
|
56
|
+
</div>
|
|
59
57
|
|
|
60
58
|
<style>
|
|
61
59
|
.chum-bucket-item {
|
|
@@ -72,10 +70,11 @@
|
|
|
72
70
|
margin-inline-end: 1em;
|
|
73
71
|
}
|
|
74
72
|
|
|
75
|
-
|
|
76
73
|
.chum-bucket {
|
|
74
|
+
margin-top: 2lh;
|
|
77
75
|
padding: 1.5lh 0;
|
|
78
|
-
|
|
76
|
+
width: 100%;
|
|
77
|
+
max-width: var(--container-3xl);
|
|
79
78
|
}
|
|
80
79
|
|
|
81
80
|
.chum-bucket-grid {
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { ModeWatcher } from
|
|
3
|
-
import { Modals } from
|
|
4
|
-
import { page } from
|
|
5
|
-
import { locales, localizeHref } from
|
|
2
|
+
import { ModeWatcher } from "mode-watcher";
|
|
3
|
+
import { Modals } from "svelte-modals";
|
|
4
|
+
import { page } from "$app/state";
|
|
5
|
+
import { locales, localizeHref } from "../../paraglide/runtime";
|
|
6
6
|
import "../../styles/global.css";
|
|
7
7
|
|
|
8
|
-
import
|
|
8
|
+
import "../../styles/app.css";
|
|
9
|
+
import { ToastProvider } from "@skeletonlabs/skeleton-svelte";
|
|
9
10
|
|
|
10
11
|
let { children } = $props();
|
|
11
12
|
</script>
|
|
@@ -22,7 +23,9 @@
|
|
|
22
23
|
</Modals>
|
|
23
24
|
<ModeWatcher defaultTheme="turnip" />
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
<ToastProvider>
|
|
27
|
+
{@render children()}
|
|
28
|
+
</ToastProvider>
|
|
26
29
|
|
|
27
30
|
<!--invisible ink-->
|
|
28
31
|
<div style="display:none">
|