@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.
Files changed (76) hide show
  1. package/dist/assets/icons/icon-check-dark-contrast.svg +1 -0
  2. package/dist/assets/icons/icon-check-light-contrast.svg +1 -0
  3. package/dist/assets/icons/icon-copy-dark-contrast.svg +1 -0
  4. package/dist/assets/icons/icon-copy-light-contrast.svg +1 -0
  5. package/dist/components/PineappleSlideToggle.svelte +12 -6
  6. package/dist/components/PineappleSlideToggle.svelte.d.ts +3 -2
  7. package/dist/styles/app.css +92 -1
  8. package/dist/styles/turnip-theme.css +6 -2
  9. package/dist/template/seaweed/CreateUrlForm.svelte +17 -11
  10. package/dist/template/seaweed/CreateUrlForm.svelte.d.ts +4 -1
  11. package/dist/template/seaweed/ToastSettings.d.ts +15 -0
  12. package/dist/template/seaweed/ToastSettings.js +1 -0
  13. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte +34 -1
  14. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte.d.ts +0 -1
  15. package/dist/ui/elements/CodeBlock/CodeBlock.svelte +65 -0
  16. package/dist/ui/elements/CodeBlock/CodeBlock.svelte.d.ts +5 -0
  17. package/dist/ui/elements/CodeBlock/CodeBlockProps.d.ts +11 -0
  18. package/dist/ui/elements/CodeBlock/CodeBlockProps.js +1 -0
  19. package/dist/ui/elements/CodeBlock/index.d.ts +2 -0
  20. package/dist/ui/elements/CodeBlock/index.js +2 -0
  21. package/dist/ui/elements/PineappleSwitch.svelte +29 -0
  22. package/dist/ui/elements/PineappleSwitch.svelte.d.ts +10 -0
  23. package/dist/ui/elements/index.d.ts +10 -8
  24. package/dist/ui/elements/index.js +10 -8
  25. package/dist/ui/elements/pinya-card/component.svelte +10 -8
  26. package/dist/ui/elements/pinya-card/component.svelte.d.ts +3 -3
  27. package/dist/ui/elements/pinya-card/props.d.ts +3 -0
  28. package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte +35 -0
  29. package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte.d.ts +18 -0
  30. package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts +18 -0
  31. package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.js +1 -0
  32. package/dist/ui/elements/text-chip/TextChip.svelte +15 -0
  33. package/dist/ui/elements/text-chip/TextChip.svelte.d.ts +4 -0
  34. package/dist/ui/elements/text-chip/TextChipProps.d.ts +4 -0
  35. package/dist/ui/elements/text-chip/TextChipProps.js +1 -0
  36. package/dist/ui/elements/text-chip/index.d.ts +2 -0
  37. package/dist/ui/elements/text-chip/index.js +2 -0
  38. package/dist/ui/modules/index.d.ts +2 -1
  39. package/dist/ui/modules/index.js +2 -1
  40. package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte +10 -20
  41. package/dist/ui/modules/projects/Hepcat.svelte +71 -0
  42. package/dist/ui/modules/projects/Hepcat.svelte.d.ts +22 -0
  43. package/dist/ui/modules/projects/Pengi.svelte +60 -0
  44. package/dist/ui/modules/projects/Pengi.svelte.d.ts +22 -0
  45. package/dist/ui/modules/projects/Soulwork.svelte +55 -0
  46. package/dist/ui/modules/projects/Soulwork.svelte.d.ts +22 -0
  47. package/dist/ui/modules/projects/ThisWebpage.svelte +62 -0
  48. package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts +22 -0
  49. package/dist/ui/modules/projects/index.d.ts +4 -0
  50. package/dist/ui/modules/projects/index.js +4 -0
  51. package/dist/ui/modules/seaweed/ChumBucket.svelte +36 -37
  52. package/dist/ui/templates/PinyaBase.svelte +9 -6
  53. package/dist/ui/templates/PinyaBase.svelte.d.ts +1 -1
  54. package/dist/ui/templates/index.d.ts +3 -2
  55. package/dist/ui/templates/index.js +3 -2
  56. package/dist/ui/templates/pinya-page-layout/component.svelte +17 -10
  57. package/dist/ui/templates/pinya-page-layout/component.svelte.d.ts +2 -1
  58. package/dist/ui/templates/seaweed-layout/EntryGroup.svelte +89 -0
  59. package/dist/ui/templates/seaweed-layout/EntryGroup.svelte.d.ts +4 -0
  60. package/dist/ui/templates/seaweed-layout/EntryOrderConfig2.svelte +45 -0
  61. package/dist/ui/templates/seaweed-layout/EntryOrderConfig2.svelte.d.ts +9 -0
  62. package/dist/ui/templates/seaweed-layout/ProjectComponentProps.d.ts +4 -0
  63. package/dist/ui/templates/seaweed-layout/ProjectComponentProps.js +1 -0
  64. package/dist/ui/templates/seaweed-layout/ProjectGroupConfig.svelte +316 -0
  65. package/dist/ui/templates/seaweed-layout/ProjectGroupConfig.svelte.d.ts +14 -0
  66. package/dist/ui/templates/seaweed-layout/SeaweedLayout.md +4 -0
  67. package/dist/ui/templates/seaweed-layout/SeaweedLayout.svelte +196 -0
  68. package/dist/ui/templates/seaweed-layout/SeaweedLayout.svelte.d.ts +4 -0
  69. package/dist/ui/templates/seaweed-layout/index.d.ts +4 -0
  70. package/dist/ui/templates/seaweed-layout/index.js +4 -0
  71. package/dist/ui/templates/seaweed-layout/props.d.ts +25 -0
  72. package/dist/ui/templates/seaweed-layout/props.js +1 -0
  73. package/dist/util/util.d.ts +1 -0
  74. package/dist/util/util.js +9 -0
  75. package/package.json +3 -1
  76. 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,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,4 @@
1
+ import type { TextChipProps } from "./TextChipProps";
2
+ declare const TextChip: import("svelte").Component<TextChipProps, {}, "">;
3
+ type TextChip = ReturnType<typeof TextChip>;
4
+ export default TextChip;
@@ -0,0 +1,4 @@
1
+ import type { WrapperProps } from "../index";
2
+ export interface TextChipProps extends WrapperProps {
3
+ queryClass?: string;
4
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export { default as TextChip } from "./TextChip.svelte";
2
+ export * from "./TextChipProps";
@@ -0,0 +1,2 @@
1
+ export { default as TextChip } from "./TextChip.svelte";
2
+ export * from "./TextChipProps";
@@ -1 +1,2 @@
1
- export * from "./seaweed/index";
1
+ export * from "./seaweed";
2
+ export * from "./projects";
@@ -1 +1,2 @@
1
- export * from "./seaweed/index";
1
+ export * from "./seaweed";
2
+ export * from "./projects";
@@ -1,16 +1,16 @@
1
1
  <script lang="ts">
2
- import { Combobox } from '@skeletonlabs/skeleton-svelte';
3
- import { getLocale, localizeHref } from '../../../../paraglide/runtime';
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: 'en' | 'fr' | 'tl';
7
+ value: "en" | "fr" | "tl";
8
8
  }
9
9
 
10
10
  const comboboxData: ComboxData[] = [
11
- { label: 'English', value: 'en' },
12
- { label: 'French', value: 'fr' },
13
- { label: 'Tagalog', value: 'tl' }
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('./', { locale: data.value });
26
+ location.href = localizeHref("./", { locale: data.value });
27
27
  }
28
28
  };
29
29
  </script>
30
30
 
31
- <Combobox
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
- onValueChange={onValueChange}
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;
@@ -0,0 +1,4 @@
1
+ export * as Hepcat from "./Hepcat.svelte";
2
+ export * as Pengi from "./Pengi.svelte";
3
+ export * as Soulwork from "./Soulwork.svelte";
4
+ export * as ThisWebpage from "./ThisWebpage.svelte";
@@ -0,0 +1,4 @@
1
+ export * as Hepcat from "./Hepcat.svelte";
2
+ export * as Pengi from "./Pengi.svelte";
3
+ export * as Soulwork from "./Soulwork.svelte";
4
+ export * as ThisWebpage from "./ThisWebpage.svelte";
@@ -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
- <PinyaCard
23
- widthClass='max-w-3xl'>
24
- <div class="chum-bucket">
25
- <h2 class="text-start">More about me...</h2>
26
- <p>Check out the latest things I've been rambling about at
27
- <a href="https://turnipxenon.com" target="_blank">turnipxenon.com</a> or at
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
- <div class="chum-bucket-grid">
32
- {#if hasTriedGettingChumBucket}
33
- {#each pageMetaList as pageMeta}
34
- <div class="chum-bucket-item">
35
- {#if pageMeta.imageUrl}
36
- <img src={`https://turnipxenon.com${pageMeta.imageUrl}`}
37
- class="chum-bucket-image"
38
- alt={pageMeta.imageAlt}>
39
- {/if}
40
- <div>
41
- <h3 class="text-start"><a href={`https://turnipxenon.com/${pageMeta.relativeLink}`}>{pageMeta.title}</a></h3>
42
- <p>Published: {pageMeta.datePublished}
43
- {#if pageMeta.lastUpdated}
44
- | Last updated: {pageMeta.lastUpdated}
45
- {/if}
46
- </p>
47
- <p>{pageMeta.description}</p>
48
- </div>
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
- {/each}
51
- {:else}
52
- {#each { length: 10 } as _}
53
- <div class="placeholder"></div>
54
- {/each}
55
- {/if}
56
- </div>
48
+ </div>
49
+ {/each}
50
+ {:else}
51
+ {#each { length: 10 } as _}
52
+ <div class="placeholder"></div>
53
+ {/each}
54
+ {/if}
57
55
  </div>
58
- </PinyaCard>
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
- width: 100%;
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 'mode-watcher';
3
- import { Modals } from 'svelte-modals';
4
- import { page } from '$app/state';
5
- import { locales, localizeHref } from '../../paraglide/runtime';
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 '../../styles/app.css';
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
- {@render children()}
26
+ <ToastProvider>
27
+ {@render children()}
28
+ </ToastProvider>
26
29
 
27
30
  <!--invisible ink-->
28
31
  <div style="display:none">
@@ -1,5 +1,5 @@
1
1
  import "../../styles/global.css";
2
- import '../../styles/app.css';
2
+ import "../../styles/app.css";
3
3
  declare const PinyaBase: import("svelte").Component<{
4
4
  children: any;
5
5
  }, {}, "">;
@@ -1,3 +1,4 @@
1
1
  export { default as PinyaBase } from "./PinyaBase.svelte";
2
- export * from "./pinya-page-layout/index";
3
- export * from "./confirmation-modal/index";
2
+ export * from "./pinya-page-layout";
3
+ export * from "./seaweed-layout";
4
+ export * from "./confirmation-modal";
@@ -1,3 +1,4 @@
1
1
  export { default as PinyaBase } from "./PinyaBase.svelte";
2
- export * from "./pinya-page-layout/index";
3
- export * from "./confirmation-modal/index";
2
+ export * from "./pinya-page-layout";
3
+ export * from "./seaweed-layout";
4
+ export * from "./confirmation-modal";