@turnipxenon/pineapple 3.0.0-alpha.9 → 3.1.0-alpha.1

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 (142) hide show
  1. package/dist/components/blog_template/BlogTemplate.svelte +2 -2
  2. package/dist/components/blog_template/BlogTemplate.svelte.d.ts +1 -1
  3. package/dist/components/blog_template/BlogTemplateInner.svelte +1 -1
  4. package/dist/components/blog_template/BlogTemplateInner.svelte.d.ts +1 -1
  5. package/dist/components/dialog_manager/DialogManager.d.ts +2 -1
  6. package/dist/components/dialog_manager/DialogMangerInit.d.ts +2 -15
  7. package/dist/components/dialog_manager/DialogMangerInit.js +8 -2
  8. package/dist/components/dialog_manager/IDialogManager.d.ts +39 -0
  9. package/dist/components/dialog_manager/IDialogManager.js +4 -0
  10. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.d.ts +3 -0
  11. package/dist/components/dialog_manager/behavior_tree/line_processors/commands/JumpCommand.js +15 -3
  12. package/dist/components/dialog_overlay/DialogOverlay.svelte +155 -36
  13. package/dist/components/layouts/SeaweedBaseLayout.svelte +0 -6
  14. package/dist/components/pineapple/PineappleBaseLayout.svelte +2 -21
  15. package/dist/index.d.ts +3 -3
  16. package/dist/index.js +2 -3
  17. package/dist/styles/app.css +9 -14
  18. package/dist/ui/components/ModalBase.svelte +74 -74
  19. package/dist/ui/components/SocialSection.svelte +6 -2
  20. package/dist/ui/components/accordion/PinyaAccordion.svelte +20 -20
  21. package/dist/ui/components/accordion/PinyaAccordionItem.svelte +28 -28
  22. package/dist/ui/elements/CodeBlock/CodeBlock.svelte +64 -64
  23. package/dist/ui/elements/ImageIcon.svelte +53 -53
  24. package/dist/ui/elements/{pinya-button/component.svelte → PinyaButton/PinyaButton.svelte} +4 -3
  25. package/dist/ui/elements/PinyaButton/PinyaButton.svelte.d.ts +4 -0
  26. package/dist/ui/elements/{pinya-button/props.d.ts → PinyaButton/PinyaButtonProps.d.ts} +1 -0
  27. package/dist/ui/elements/PinyaButton/index.d.ts +2 -0
  28. package/dist/ui/elements/PinyaButton/index.js +2 -0
  29. package/dist/ui/elements/{pinya-card/component.svelte → PinyaCard/PinyaCard.svelte} +21 -20
  30. package/dist/ui/elements/PinyaCard/PinyaCard.svelte.d.ts +7 -0
  31. package/dist/ui/elements/PinyaCard/index.d.ts +2 -0
  32. package/dist/ui/elements/PinyaCard/index.js +2 -0
  33. package/dist/ui/elements/Placeholder.svelte +17 -17
  34. package/dist/ui/elements/TextLink.svelte +16 -16
  35. package/dist/ui/elements/index.d.ts +2 -2
  36. package/dist/ui/elements/index.js +2 -2
  37. package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte +34 -34
  38. package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts +1 -0
  39. package/dist/ui/elements/text-chip/TextChip.svelte +14 -14
  40. package/dist/{components/navigation_component → ui/modules/NavigationMenu}/NavigationControl.svelte +24 -20
  41. package/dist/{components/navigation_component/NavigationComponent.svelte → ui/modules/NavigationMenu/NavigationMenu.svelte} +69 -43
  42. package/dist/{components/navigation_component/NavigationComponent.svelte.d.ts → ui/modules/NavigationMenu/NavigationMenu.svelte.d.ts} +6 -6
  43. package/dist/{components/navigation_component → ui/modules/NavigationMenu}/PageMeta.d.ts +4 -4
  44. package/dist/ui/modules/NavigationMenu/index.d.ts +2 -0
  45. package/dist/ui/modules/NavigationMenu/index.js +2 -0
  46. package/dist/ui/modules/index.d.ts +1 -1
  47. package/dist/ui/modules/index.js +1 -1
  48. package/dist/ui/modules/modals/general-settings/GeneralSettingsModal.svelte +109 -109
  49. package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte +42 -37
  50. package/dist/ui/modules/projects/Hepcat.svelte +6 -4
  51. package/dist/ui/modules/projects/Hepcat.svelte.d.ts +1 -1
  52. package/dist/ui/modules/projects/Pengi.svelte +61 -59
  53. package/dist/ui/modules/projects/Pengi.svelte.d.ts +1 -1
  54. package/dist/ui/modules/projects/Soulwork.svelte +7 -5
  55. package/dist/ui/modules/projects/ThisWebpage.svelte +19 -16
  56. package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts +1 -1
  57. package/dist/ui/templates/{pinya-page-layout/component.svelte → PinyaPageLayout/PinyaPageLayout.svelte} +1 -1
  58. package/dist/ui/templates/PinyaPageLayout/PinyaPageLayout.svelte.d.ts +9 -0
  59. package/dist/ui/templates/PinyaPageLayout/index.d.ts +2 -0
  60. package/dist/ui/templates/PinyaPageLayout/index.js +2 -0
  61. package/dist/ui/templates/{pinya-page-layout → PinyaPageLayout}/runes.svelte.d.ts +3 -0
  62. package/dist/ui/templates/PinyaPageLayout/runes.svelte.js +4 -0
  63. package/dist/ui/{modules/seaweed → templates/SeaweedLayout}/ChumBucket.svelte +1 -1
  64. package/dist/{template/seaweed → ui/templates/SeaweedLayout}/CreateUrlForm.svelte +2 -2
  65. package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/EntryGroup.svelte +65 -88
  66. package/dist/ui/templates/SeaweedLayout/EntryOrderConfig.svelte.d.ts +9 -0
  67. package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/ProjectComponentProps.d.ts +1 -0
  68. package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/ProjectGroupConfig.svelte +316 -316
  69. package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/ProjectGroupConfig.svelte.d.ts +1 -1
  70. package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/SeaweedLayout.md +3 -3
  71. package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/SeaweedLayout.svelte +278 -276
  72. package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/props.d.ts +2 -2
  73. package/dist/ui/templates/confirmation-modal/component.svelte +46 -46
  74. package/dist/ui/templates/index.d.ts +2 -2
  75. package/dist/ui/templates/index.js +2 -2
  76. package/package.json +3 -2
  77. package/src/lib/styles/app.css +9 -14
  78. package/dist/components/navigation_component/index.d.ts +0 -2
  79. package/dist/components/navigation_component/index.js +0 -3
  80. package/dist/template/seaweed/ParseQueryTerms.d.ts +0 -1
  81. package/dist/template/seaweed/ParseQueryTerms.js +0 -23
  82. package/dist/template/seaweed/RunChaos.d.ts +0 -1
  83. package/dist/template/seaweed/RunChaos.js +0 -41
  84. package/dist/template/seaweed/SeaweedTemplate.svelte +0 -336
  85. package/dist/template/seaweed/SeaweedTemplate.svelte.d.ts +0 -32
  86. package/dist/template/seaweed/SeaweedTemplateData.d.ts +0 -30
  87. package/dist/template/seaweed/SeaweedTemplateData.js +0 -79
  88. package/dist/template/seaweed/entries/ChefWings.svelte +0 -45
  89. package/dist/template/seaweed/entries/ChefWings.svelte.d.ts +0 -7
  90. package/dist/template/seaweed/entries/CustomizedYarnspinner.svelte +0 -40
  91. package/dist/template/seaweed/entries/CustomizedYarnspinner.svelte.d.ts +0 -7
  92. package/dist/template/seaweed/entries/EntryProps.d.ts +0 -16
  93. package/dist/template/seaweed/entries/EntryProps.js +0 -5
  94. package/dist/template/seaweed/entries/Hepcat.svelte +0 -64
  95. package/dist/template/seaweed/entries/Hepcat.svelte.d.ts +0 -7
  96. package/dist/template/seaweed/entries/Pengi.svelte +0 -57
  97. package/dist/template/seaweed/entries/Pengi.svelte.d.ts +0 -7
  98. package/dist/template/seaweed/entries/Soulwork.svelte +0 -54
  99. package/dist/template/seaweed/entries/Soulwork.svelte.d.ts +0 -7
  100. package/dist/template/seaweed/entries/ThisWebpage.svelte +0 -55
  101. package/dist/template/seaweed/entries/ThisWebpage.svelte.d.ts +0 -7
  102. package/dist/template/seaweed/entries/WorkExperience.svelte +0 -130
  103. package/dist/template/seaweed/entries/WorkExperience.svelte.d.ts +0 -8
  104. package/dist/template/seaweed/entries/Workset.svelte +0 -57
  105. package/dist/template/seaweed/entries/Workset.svelte.d.ts +0 -7
  106. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.d.ts +0 -1
  107. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.js +0 -8
  108. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte +0 -297
  109. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte.d.ts +0 -12
  110. package/dist/template/seaweed/entry_order_config/entry-order-config.postcss +0 -35
  111. package/dist/template/seaweed/index.d.ts +0 -4
  112. package/dist/template/seaweed/index.js +0 -4
  113. package/dist/template/seaweed/seaweed.postcss +0 -125
  114. package/dist/ui/elements/pinya-button/component.svelte.d.ts +0 -4
  115. package/dist/ui/elements/pinya-button/index.d.ts +0 -2
  116. package/dist/ui/elements/pinya-button/index.js +0 -2
  117. package/dist/ui/elements/pinya-card/component.svelte.d.ts +0 -7
  118. package/dist/ui/elements/pinya-card/index.d.ts +0 -2
  119. package/dist/ui/elements/pinya-card/index.js +0 -2
  120. package/dist/ui/modules/seaweed/index.d.ts +0 -3
  121. package/dist/ui/modules/seaweed/index.js +0 -4
  122. package/dist/ui/templates/pinya-page-layout/component.svelte.d.ts +0 -9
  123. package/dist/ui/templates/pinya-page-layout/index.d.ts +0 -2
  124. package/dist/ui/templates/pinya-page-layout/index.js +0 -2
  125. package/dist/ui/templates/pinya-page-layout/runes.svelte.js +0 -3
  126. package/dist/ui/templates/seaweed-layout/EntryOrderConfig2.svelte.d.ts +0 -9
  127. /package/dist/ui/elements/{pinya-button/props.js → PinyaButton/PinyaButtonProps.js} +0 -0
  128. /package/dist/ui/elements/{pinya-card/props.d.ts → PinyaCard/PinyaCardProps.d.ts} +0 -0
  129. /package/dist/{template/seaweed/ToastSettings.js → ui/elements/PinyaCard/PinyaCardProps.js} +0 -0
  130. /package/dist/{components/navigation_component → ui/modules/NavigationMenu}/NavigationControl.svelte.d.ts +0 -0
  131. /package/dist/{components/navigation_component → ui/modules/NavigationMenu}/PageMeta.js +0 -0
  132. /package/dist/ui/{modules/seaweed → templates/SeaweedLayout}/ChumBucket.svelte.d.ts +0 -0
  133. /package/dist/{template/seaweed → ui/templates/SeaweedLayout}/CreateUrlForm.svelte.d.ts +0 -0
  134. /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/EntryGroup.svelte.d.ts +0 -0
  135. /package/dist/ui/templates/{seaweed-layout/EntryOrderConfig2.svelte → SeaweedLayout/EntryOrderConfig.svelte} +0 -0
  136. /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/ProjectComponentProps.js +0 -0
  137. /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/SeaweedLayout.svelte.d.ts +0 -0
  138. /package/dist/{template/seaweed → ui/templates/SeaweedLayout}/ToastSettings.d.ts +0 -0
  139. /package/dist/ui/{elements/pinya-card/props.js → templates/SeaweedLayout/ToastSettings.js} +0 -0
  140. /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/index.d.ts +0 -0
  141. /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/index.js +0 -0
  142. /package/dist/ui/templates/{seaweed-layout → SeaweedLayout}/props.js +0 -0
@@ -1,4 +1,4 @@
1
1
  export { default as PinyaBase } from "./PinyaBase.svelte";
2
- export * from "./pinya-page-layout";
3
- export * from "./seaweed-layout";
2
+ export * from "./PinyaPageLayout";
3
+ export * from "./SeaweedLayout";
4
4
  export * from "./confirmation-modal";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@turnipxenon/pineapple",
3
3
  "description": "personal package for base styling for other personal projects",
4
- "version": "3.0.0-alpha.9",
4
+ "version": "3.1.0-alpha.1",
5
5
  "scripts": {
6
6
  "dev": "vite dev",
7
7
  "build": "vite build && yarn package",
@@ -21,13 +21,13 @@
21
21
  "@eslint/compat": "^1.2.5",
22
22
  "@eslint/js": "^9.18.0",
23
23
  "@sveltejs/adapter-auto": "^4.0.0",
24
- "@sveltejs/kit": "^2.5.27",
25
24
  "@sveltejs/package": "^2.3.7",
26
25
  "@sveltejs/vite-plugin-svelte": "^4.0.0",
27
26
  "eslint": "^9.18.0",
28
27
  "eslint-config-prettier": "^10.0.1",
29
28
  "eslint-plugin-svelte": "^3.0.0",
30
29
  "globals": "^16.0.0",
30
+ "madge": "^8.0.0",
31
31
  "prettier": "^3.4.2",
32
32
  "prettier-plugin-svelte": "^3.3.3",
33
33
  "prettier-plugin-tailwindcss": "^0.6.11",
@@ -44,6 +44,7 @@
44
44
  "@prisma/client": "^5.12.1",
45
45
  "@skeletonlabs/skeleton": "^3.1.0",
46
46
  "@skeletonlabs/skeleton-svelte": "^1.0.0",
47
+ "@sveltejs/kit": "^2.5.27",
47
48
  "@sveltejs/vite-plugin-svelte": "^4.0.0",
48
49
  "@tailwindcss/vite": "^4.0.14",
49
50
  "@types/htmlparser2": "^3.10.7",
@@ -10,16 +10,25 @@
10
10
 
11
11
  @custom-variant turnip (&:where([data-theme=turnip], [data-theme=turnip] *));
12
12
 
13
+ html {
14
+ --dialog-start-pad: clamp(0em, 5vw, 2em);
15
+ --dialog-box-width: min(calc(54em), calc(100vw - var(--dialog-start-pad) - 2px));
16
+ --dialog-box-height: clamp(15em, 50vw, 18em);
17
+ --fab-margin: 1rem;
18
+ }
19
+
13
20
  .footer-space {
14
21
  width: 100%;
15
22
  height: calc(var(--dialog-box-height) + 4em);
16
23
  }
17
24
 
18
25
  a.dialog-choice {
26
+ font-size: inherit;
19
27
  cursor: url("$pkg/assets/icons/chat-cursor.svg"), auto;
20
28
  }
21
29
 
22
30
  a.external-link {
31
+ font-size: inherit;
23
32
  cursor: url("$pkg/assets/icons/external-link.svg"), auto;
24
33
  }
25
34
 
@@ -37,20 +46,6 @@ a.external-link {
37
46
  background: rgba(var(--color-secondary-500));
38
47
  }
39
48
 
40
- .dialog-box {
41
- background-color: rgb(var(--color-surface-500) / 0.9);
42
- position: fixed;
43
- bottom: 0;
44
- width: var(--dialog-box-width); /*75em + 4em padding*/
45
- height: var(--dialog-box-height);
46
- max-width: calc(100vw - ((var(--fab-margin) * 2) + 4em));
47
- }
48
-
49
- .dark .dialog-box {
50
- background-color: rgb(var(--color-surface-900) / 0.95);
51
- --tw-ring-color: rgb(var(--color-text-400));
52
- /*background-color: red;*/
53
- }
54
49
 
55
50
  @layer base {
56
51
  .game-link-section {
@@ -1,2 +0,0 @@
1
- export { default as NavigationComponent } from "./NavigationComponent.svelte";
2
- export * from "./PageMeta";
@@ -1,3 +0,0 @@
1
- // noinspection JSUnusedGlobalSymbols
2
- export { default as NavigationComponent } from "./NavigationComponent.svelte";
3
- export * from "./PageMeta";
@@ -1 +0,0 @@
1
- export declare const parseQueryTerms: (node: Element, querySet: Set<string>) => void;
@@ -1,23 +0,0 @@
1
- export const parseQueryTerms = (node, querySet) => {
2
- // change all text content to gibberish
3
- for (const child of Array.from(node.children)) {
4
- if (child.nodeType === Node.ELEMENT_NODE) {
5
- parseQueryTerms(child, querySet);
6
- // todo: if it's a span and it wraps a word, and qt class then we count that as query
7
- // for (const childOfChild of child.childNodes) {
8
- // if (childOfChild.nodeType === Node.TEXT_NODE && childOfChild.textContent?.trim()) {
9
- // // todo analyze textcontent
10
- // }
11
- // }
12
- // Warning: below is not redundant and is a catch-all
13
- // Long-term solution: figure out the correct typing
14
- if ((typeof child.className === "string") && child.className?.includes("qt-")) {
15
- child.className.split(" ").forEach(c => {
16
- if (c.startsWith("qt-")) {
17
- querySet.add(c);
18
- }
19
- });
20
- }
21
- }
22
- }
23
- };
@@ -1 +0,0 @@
1
- export declare const runChaos: (node: Element) => void;
@@ -1,41 +0,0 @@
1
- const chaoticWordBank = ["niko", "toba", "seal", "aquarium", "ojisan", "baikal"];
2
- export const runChaos = (node) => {
3
- // change all text content to gibberish
4
- for (const child of Array.from(node.children)) {
5
- if (child.nodeType === Node.ELEMENT_NODE) {
6
- runChaos(child);
7
- for (const childOfChild of child.childNodes) {
8
- if (childOfChild.nodeType === Node.TEXT_NODE && childOfChild.textContent?.trim()) {
9
- const max = childOfChild.textContent.length;
10
- childOfChild.textContent = "";
11
- while (childOfChild.textContent.length < max) {
12
- childOfChild.textContent += (chaoticWordBank[Math.floor(Math.random() * chaoticWordBank.length)] + " ");
13
- }
14
- }
15
- }
16
- // change all links to crouton
17
- if (child.hasAttribute("href")) {
18
- child.setAttribute("href", "https://crouton.net/");
19
- }
20
- // change all images to niko if aria != hidden?
21
- if (child.hasAttribute("src") && !child.hasAttribute("aria-hidden")) {
22
- if (child.hasAttribute("alt")) {
23
- child.setAttribute("src", "https://p.potaufeu.asahi.com/a2b9-p/picture/21583312/5c3310aec77068e24844c663aa62b37c.jpg");
24
- }
25
- else {
26
- child.setAttribute("src", "https://video.twimg.com/ext_tw_video/1318728494256410624/pu/vid/640x360/TMklz6hiTkQu3xhn.mp4");
27
- child.setAttribute("muted", "true");
28
- }
29
- }
30
- if (child.tagName.trim() === "VIDEO") {
31
- child.setAttribute("src", "https://video.twimg.com/ext_tw_video/1318728494256410624/pu/vid/640x360/TMklz6hiTkQu3xhn.mp4");
32
- child.setAttribute("muted", "true");
33
- }
34
- // change all button events
35
- if (child.tagName.trim() === "BUTTON") {
36
- // remove anon function: https://stackoverflow.com/a/41343451/17836168
37
- child.setAttribute("disabled", "true");
38
- }
39
- }
40
- }
41
- };
@@ -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
- };