@turnipxenon/pineapple 2.4.44 → 2.4.45

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 (565) hide show
  1. package/.idea/codeStyles/Project.xml +12 -1
  2. package/.idea/modules.xml +1 -0
  3. package/.idea/workspace.xml +308 -262
  4. package/.svelte-kit/__package__/components/combo_box/ComboBox.svelte +11 -0
  5. package/.svelte-kit/__package__/components/combo_box/ComboBox.svelte.d.ts +18 -0
  6. package/.svelte-kit/__package__/components/combo_box/ComboBoxWithButton.svelte +15 -0
  7. package/.svelte-kit/__package__/components/combo_box/ComboBoxWithButton.svelte.d.ts +19 -0
  8. package/.svelte-kit/__package__/components/combo_box/combo-box.postcss +22 -0
  9. package/.svelte-kit/__package__/index.d.ts +1 -1
  10. package/.svelte-kit/__package__/index.js +1 -1
  11. package/.svelte-kit/__package__/template/seaweed/RunChaos.d.ts +1 -0
  12. package/.svelte-kit/__package__/template/seaweed/RunChaos.js +41 -0
  13. package/.svelte-kit/__package__/template/{Seaweed → seaweed}/SeaweedTemplate.svelte +113 -97
  14. package/.svelte-kit/__package__/template/{Seaweed → seaweed}/SeaweedTemplate.svelte.d.ts +3 -0
  15. package/.svelte-kit/__package__/template/seaweed/SeaweedTemplateData.d.ts +23 -0
  16. package/.svelte-kit/__package__/template/seaweed/SeaweedTemplateData.js +68 -0
  17. package/.svelte-kit/__package__/template/seaweed/entries/ChefWings.svelte +47 -0
  18. package/.svelte-kit/__package__/template/seaweed/entries/ChefWings.svelte.d.ts +17 -0
  19. package/.svelte-kit/__package__/template/seaweed/entries/CustomizedYarnspinner.svelte +32 -0
  20. package/.svelte-kit/__package__/template/seaweed/entries/CustomizedYarnspinner.svelte.d.ts +17 -0
  21. package/.svelte-kit/__package__/template/seaweed/entries/DecentralizedSocialMedia.svelte +52 -0
  22. package/.svelte-kit/__package__/template/seaweed/entries/DecentralizedSocialMedia.svelte.d.ts +17 -0
  23. package/.svelte-kit/__package__/template/seaweed/entries/EntryProps.d.ts +11 -0
  24. package/.svelte-kit/__package__/template/seaweed/entries/EntryProps.js +5 -0
  25. package/.svelte-kit/__package__/template/seaweed/entries/FullStackC.svelte +33 -0
  26. package/.svelte-kit/__package__/template/seaweed/entries/FullStackC.svelte.d.ts +17 -0
  27. package/.svelte-kit/__package__/template/seaweed/entries/Hepcat.svelte +55 -0
  28. package/.svelte-kit/__package__/template/seaweed/entries/Hepcat.svelte.d.ts +17 -0
  29. package/.svelte-kit/__package__/template/seaweed/entries/ItchPromo.svelte +21 -0
  30. package/.svelte-kit/__package__/template/seaweed/entries/ItchPromo.svelte.d.ts +17 -0
  31. package/.svelte-kit/__package__/template/seaweed/entries/MigranteAlberta.svelte +54 -0
  32. package/.svelte-kit/__package__/template/seaweed/entries/MigranteAlberta.svelte.d.ts +17 -0
  33. package/.svelte-kit/__package__/template/seaweed/entries/MockUberApp.svelte +38 -0
  34. package/.svelte-kit/__package__/template/seaweed/entries/MockUberApp.svelte.d.ts +17 -0
  35. package/.svelte-kit/__package__/template/seaweed/entries/Pengi.svelte +49 -0
  36. package/.svelte-kit/__package__/template/seaweed/entries/Pengi.svelte.d.ts +17 -0
  37. package/.svelte-kit/__package__/template/seaweed/entries/Soulwork.svelte +46 -0
  38. package/.svelte-kit/__package__/template/seaweed/entries/Soulwork.svelte.d.ts +17 -0
  39. package/.svelte-kit/__package__/template/seaweed/entries/ThisWebpage.svelte +45 -0
  40. package/.svelte-kit/__package__/template/seaweed/entries/ThisWebpage.svelte.d.ts +17 -0
  41. package/.svelte-kit/__package__/template/seaweed/entries/Workset.svelte +48 -0
  42. package/.svelte-kit/__package__/template/seaweed/entries/Workset.svelte.d.ts +17 -0
  43. package/.svelte-kit/__package__/template/seaweed/entry_order_config/EntryOrderConfig.d.ts +1 -0
  44. package/.svelte-kit/__package__/template/seaweed/entry_order_config/EntryOrderConfig.js +3 -0
  45. package/.svelte-kit/__package__/template/seaweed/entry_order_config/EntryOrderConfig.svelte +209 -0
  46. package/.svelte-kit/__package__/template/seaweed/entry_order_config/EntryOrderConfig.svelte.d.ts +19 -0
  47. package/.svelte-kit/adapter-node/.vite/manifest.json +612 -0
  48. package/.svelte-kit/{output/client/_app/immutable/assets/store.y2fRW0z7.css → adapter-node/_app/immutable/assets/Card.BAkK2DAr.css} +1 -1
  49. package/.svelte-kit/adapter-node/_app/immutable/assets/NavigationComponent.DAojhPuD.css +1 -0
  50. package/.svelte-kit/adapter-node/_app/immutable/assets/PineappleBaseLayout.syfctdq0.css +1 -0
  51. package/.svelte-kit/adapter-node/_app/immutable/assets/ProgressBar.Cirlo5Z8.css +1 -0
  52. package/.svelte-kit/adapter-node/_app/immutable/assets/SeaweedTemplate.CVXyf0f_.css +1 -0
  53. package/.svelte-kit/adapter-node/_app/immutable/assets/_layout.h2ESO4YN.css +10 -0
  54. package/.svelte-kit/adapter-node/_app/immutable/assets/_page.BIMIBpeM.css +1 -0
  55. package/.svelte-kit/adapter-node/_app/immutable/assets/_page.ClTmhFiH.css +1 -0
  56. package/.svelte-kit/adapter-node/chunks/Card.js +37 -0
  57. package/{.vercel/output/functions/fn.func/.svelte-kit/output/server → .svelte-kit/adapter-node}/chunks/DialogManagerStore.js +159 -16
  58. package/{.vercel/output/functions/fn.func/.svelte-kit/output/server → .svelte-kit/adapter-node}/chunks/ProgressBar.svelte_svelte_type_style_lang.js +1 -1
  59. package/.svelte-kit/adapter-node/chunks/SeaweedTemplate.js +1094 -0
  60. package/.svelte-kit/adapter-node/chunks/SlideToggle.js +84 -0
  61. package/.svelte-kit/adapter-node/chunks/_page.js +4 -0
  62. package/.svelte-kit/adapter-node/chunks/_page2.js +4 -0
  63. package/.svelte-kit/adapter-node/chunks/_page3.js +4 -0
  64. package/.svelte-kit/adapter-node/chunks/_page4.js +4 -0
  65. package/.svelte-kit/adapter-node/chunks/_page5.js +4 -0
  66. package/.svelte-kit/adapter-node/chunks/_page6.js +4 -0
  67. package/.svelte-kit/adapter-node/chunks/_page7.js +4 -0
  68. package/.svelte-kit/adapter-node/chunks/_page8.js +4 -0
  69. package/.svelte-kit/adapter-node/chunks/client.js +12 -0
  70. package/{.vercel/output/functions/fn.func/.svelte-kit/output/server → .svelte-kit/adapter-node}/chunks/index.js +1 -1
  71. package/.svelte-kit/adapter-node/chunks/index2.js +100 -0
  72. package/{.vercel/output/functions/fn.func/.svelte-kit/output/server/chunks/index2.js → .svelte-kit/adapter-node/chunks/index3.js} +2 -37
  73. package/.svelte-kit/adapter-node/chunks/index4.js +12 -0
  74. package/{.vercel/output/functions/fn.func/.svelte-kit/output/server → .svelte-kit/adapter-node}/chunks/internal.js +1 -1
  75. package/{.vercel/output/functions/fn.func/.svelte-kit/output/server → .svelte-kit/adapter-node}/chunks/ssr.js +28 -14
  76. package/{.vercel/output/functions/fn.func/.svelte-kit/output/server → .svelte-kit/adapter-node}/chunks/store.js +19 -51
  77. package/.svelte-kit/adapter-node/chunks/stores.js +5 -0
  78. package/.svelte-kit/adapter-node/chunks/stores2.js +26 -0
  79. package/.svelte-kit/adapter-node/chunks/stores3.js +38 -0
  80. package/.svelte-kit/adapter-node/entries/pages/(pineapple)/_layout.svelte.js +292 -0
  81. package/.svelte-kit/adapter-node/entries/pages/(pineapple)/_page.svelte.js +23 -0
  82. package/.svelte-kit/adapter-node/entries/pages/(pineapple)/pineapple/(extra-pages)/page1/_page.svelte.js +22 -0
  83. package/.svelte-kit/adapter-node/entries/pages/(pineapple)/pineapple/(extra-pages)/page2/_page.svelte.js +22 -0
  84. package/.svelte-kit/adapter-node/entries/pages/(pineapple)/pineapple/(extra-pages)/page3/_page.svelte.js +22 -0
  85. package/.svelte-kit/adapter-node/entries/pages/(pineapple)/pineapple/(extra-pages)/page3/page5/_page.svelte.js +22 -0
  86. package/.svelte-kit/adapter-node/entries/pages/(pineapple)/pineapple/(extra-pages)/page3/page6/_page.svelte.js +22 -0
  87. package/.svelte-kit/adapter-node/entries/pages/(pineapple)/pineapple/(extra-pages)/page3/page7/(test_layout)/page8/_page.svelte.js +22 -0
  88. package/.svelte-kit/adapter-node/entries/pages/(pineapple)/pineapple/(extra-pages)/page3/page7/_page.svelte.js +22 -0
  89. package/.svelte-kit/adapter-node/entries/pages/(pineapple)/pineapple/(extra-pages)/page4/_page.svelte.js +18 -0
  90. package/.svelte-kit/adapter-node/entries/pages/(pineapple)/pineapple/(pineapple)/_page.svelte.js +332 -0
  91. package/.svelte-kit/adapter-node/entries/pages/(pineapple)/pineapple/(pineapple)/_page.ts.js +9 -0
  92. package/{.vercel/output/functions/fn.func/.svelte-kit/output/server/entries/pages → .svelte-kit/adapter-node/entries/pages/(seaweed)}/_layout.svelte.js +5 -98
  93. package/.svelte-kit/adapter-node/entries/pages/(seaweed)/portfolio/_page.svelte.js +8 -0
  94. package/.svelte-kit/adapter-node/entries/pages/(seaweed)/portfolio/_page.ts.js +9 -0
  95. package/{.vercel/output/functions/fn.func/.svelte-kit/output/server/entries/pages → .svelte-kit/adapter-node/entries/pages/(seaweed)}/portfolio/actual/_page.svelte.js +4 -4
  96. package/.svelte-kit/adapter-node/entries/pages/(seaweed)/portfolio/actual/_page.ts.js +9 -0
  97. package/.svelte-kit/adapter-node/entries/pages/_layout.svelte.js +58 -0
  98. package/{.vercel/output/functions/fn.func/.svelte-kit/output/server → .svelte-kit/adapter-node}/index.js +1 -1
  99. package/.svelte-kit/adapter-node/internal.js +13 -0
  100. package/.svelte-kit/adapter-node/manifest-full.js +125 -0
  101. package/.svelte-kit/adapter-node/manifest.js +121 -0
  102. package/.svelte-kit/adapter-node/nodes/0.js +8 -0
  103. package/.svelte-kit/adapter-node/nodes/1.js +8 -0
  104. package/.svelte-kit/adapter-node/nodes/10.js +8 -0
  105. package/.svelte-kit/adapter-node/nodes/11.js +8 -0
  106. package/.svelte-kit/adapter-node/nodes/12.js +8 -0
  107. package/.svelte-kit/adapter-node/nodes/13.js +10 -0
  108. package/.svelte-kit/adapter-node/nodes/14.js +13 -0
  109. package/.svelte-kit/adapter-node/nodes/15.js +10 -0
  110. package/.svelte-kit/adapter-node/nodes/2.js +8 -0
  111. package/.svelte-kit/adapter-node/nodes/3.js +8 -0
  112. package/.svelte-kit/adapter-node/nodes/4.js +8 -0
  113. package/.svelte-kit/adapter-node/nodes/5.js +8 -0
  114. package/.svelte-kit/adapter-node/nodes/6.js +8 -0
  115. package/.svelte-kit/adapter-node/nodes/7.js +8 -0
  116. package/.svelte-kit/adapter-node/nodes/8.js +8 -0
  117. package/.svelte-kit/adapter-node/nodes/9.js +8 -0
  118. package/.svelte-kit/ambient.d.ts +4 -4
  119. package/.svelte-kit/azure-tmp/api/host.json +7 -0
  120. package/.svelte-kit/azure-tmp/api/local.settings.json +6 -0
  121. package/.svelte-kit/azure-tmp/api/package.json +1 -0
  122. package/.svelte-kit/azure-tmp/entry.d.ts +8 -0
  123. package/.svelte-kit/azure-tmp/entry.js +103 -0
  124. package/.svelte-kit/azure-tmp/headers.js +67 -0
  125. package/.svelte-kit/azure-tmp/manifest.js +117 -0
  126. package/.svelte-kit/generated/client-optimized/app.js +22 -5
  127. package/.svelte-kit/generated/client-optimized/nodes/10.js +1 -0
  128. package/.svelte-kit/generated/client-optimized/nodes/11.js +1 -0
  129. package/.svelte-kit/generated/client-optimized/nodes/12.js +1 -0
  130. package/.svelte-kit/generated/client-optimized/nodes/13.js +3 -0
  131. package/.svelte-kit/generated/client-optimized/nodes/14.js +3 -0
  132. package/.svelte-kit/generated/client-optimized/nodes/15.js +3 -0
  133. package/.svelte-kit/generated/client-optimized/nodes/2.js +1 -1
  134. package/.svelte-kit/generated/client-optimized/nodes/3.js +1 -1
  135. package/.svelte-kit/generated/client-optimized/nodes/4.js +1 -1
  136. package/.svelte-kit/generated/client-optimized/nodes/5.js +1 -1
  137. package/.svelte-kit/generated/client-optimized/nodes/6.js +1 -1
  138. package/.svelte-kit/generated/client-optimized/nodes/7.js +1 -0
  139. package/.svelte-kit/generated/client-optimized/nodes/8.js +1 -0
  140. package/.svelte-kit/generated/client-optimized/nodes/9.js +1 -0
  141. package/.svelte-kit/generated/server/internal.js +1 -1
  142. package/.svelte-kit/output/client/.vite/manifest.json +452 -124
  143. package/.svelte-kit/output/client/_app/immutable/assets/0.vT28YyQg.css +10 -0
  144. package/.svelte-kit/output/client/_app/immutable/assets/13.BIMIBpeM.css +1 -0
  145. package/.svelte-kit/output/client/_app/immutable/assets/4.ClTmhFiH.css +1 -0
  146. package/.svelte-kit/output/{server/_app/immutable/assets/store.y2fRW0z7.css → client/_app/immutable/assets/Card.BAkK2DAr.css} +1 -1
  147. package/.svelte-kit/output/client/_app/immutable/assets/NavigationComponent.DAojhPuD.css +1 -0
  148. package/.svelte-kit/output/client/_app/immutable/assets/PineappleBaseLayout.syfctdq0.css +1 -0
  149. package/.svelte-kit/output/client/_app/immutable/assets/SeaweedTemplate.CVXyf0f_.css +1 -0
  150. package/.svelte-kit/output/client/_app/immutable/assets/_layout.h2ESO4YN.css +10 -0
  151. package/.svelte-kit/output/client/_app/immutable/assets/_page.BIMIBpeM.css +1 -0
  152. package/.svelte-kit/output/client/_app/immutable/assets/_page.ClTmhFiH.css +1 -0
  153. package/.svelte-kit/output/client/_app/immutable/chunks/Card.DH87RA66.js +5 -0
  154. package/.svelte-kit/output/client/_app/immutable/chunks/DialogManagerStore.p-R7jA3N.js +7 -0
  155. package/.svelte-kit/output/client/_app/immutable/chunks/{ProgressBar.svelte_svelte_type_style_lang.sh-s555A.js → ProgressBar.svelte_svelte_type_style_lang.DiY8SXB3.js} +1 -1
  156. package/.svelte-kit/output/client/_app/immutable/chunks/SeaweedTemplate.DeqnsKrn.js +1064 -0
  157. package/.svelte-kit/output/client/_app/immutable/chunks/SlideToggle.DGF7DQhk.js +1 -0
  158. package/.svelte-kit/output/client/_app/immutable/chunks/Toast.Dil_rTuG.js +1 -0
  159. package/.svelte-kit/output/client/_app/immutable/chunks/_page.BCsXwAds.js +8 -0
  160. package/.svelte-kit/output/client/_app/immutable/chunks/_page.CER3LJw4.js +8 -0
  161. package/.svelte-kit/output/client/_app/immutable/chunks/_page.CJqYI1vC.js +7 -0
  162. package/.svelte-kit/output/client/_app/immutable/chunks/_page.CRke_Vt-.js +8 -0
  163. package/.svelte-kit/output/client/_app/immutable/chunks/_page.CdlE3ZqM.js +8 -0
  164. package/.svelte-kit/output/client/_app/immutable/chunks/_page.D8F_fKwN.js +8 -0
  165. package/.svelte-kit/output/client/_app/immutable/chunks/_page.DOjmKWLN.js +8 -0
  166. package/.svelte-kit/output/client/_app/immutable/chunks/_page.UybeXHGE.js +8 -0
  167. package/.svelte-kit/output/client/_app/immutable/chunks/each.D6YF6ztN.js +1 -0
  168. package/.svelte-kit/output/client/_app/immutable/chunks/entry.DIDAHtmj.js +3 -0
  169. package/.svelte-kit/output/client/_app/immutable/chunks/index.BwUaF0YV.js +6 -0
  170. package/.svelte-kit/output/client/_app/immutable/chunks/index.CWCbcDVt.js +4 -0
  171. package/.svelte-kit/output/client/_app/immutable/chunks/index.DbwYs1Xx.js +1 -0
  172. package/.svelte-kit/output/client/_app/immutable/chunks/{index.DM9YwQfI.js → index.HfS4ysOO.js} +1 -1
  173. package/.svelte-kit/output/client/_app/immutable/chunks/index.TTW-3Z8m.js +1 -0
  174. package/.svelte-kit/output/client/_app/immutable/chunks/preload-helper.BQ24v_F8.js +1 -0
  175. package/.svelte-kit/output/client/_app/immutable/chunks/scheduler.LgnVA12N.js +1 -0
  176. package/.svelte-kit/output/client/_app/immutable/chunks/spread.CgU5AtxT.js +1 -0
  177. package/.svelte-kit/output/client/_app/immutable/chunks/store.BMp6_Mv-.js +1 -0
  178. package/.svelte-kit/output/client/_app/immutable/chunks/stores.C1y1vsDB.js +1 -0
  179. package/.svelte-kit/output/client/_app/immutable/chunks/stores.CTStYDmk.js +1 -0
  180. package/.svelte-kit/output/client/_app/immutable/chunks/stores.CmlHsN0j.js +1 -0
  181. package/.svelte-kit/output/client/_app/immutable/chunks/transitions.FXurGCgU.js +1 -0
  182. package/.svelte-kit/output/client/_app/immutable/chunks/util.CpV-3U2s.js +1 -0
  183. package/.svelte-kit/output/client/_app/immutable/entry/app.DBmRlvle.js +7 -0
  184. package/.svelte-kit/output/client/_app/immutable/entry/start.DsC5h-eu.js +1 -0
  185. package/.svelte-kit/output/client/_app/immutable/nodes/0.DSodj2wf.js +2 -0
  186. package/.svelte-kit/output/client/_app/immutable/nodes/{1.D3OJXEpT.js → 1.BRjT3J9Z.js} +2 -2
  187. package/.svelte-kit/output/client/_app/immutable/nodes/10.CNjqd06K.js +1 -0
  188. package/.svelte-kit/output/client/_app/immutable/nodes/11.CNjqd06K.js +1 -0
  189. package/.svelte-kit/output/client/_app/immutable/nodes/12.BYSc8zlB.js +1 -0
  190. package/.svelte-kit/output/client/_app/immutable/nodes/13.BlqYNJ3t.js +61 -0
  191. package/.svelte-kit/output/client/_app/immutable/nodes/14.CVCdnjGH.js +1 -0
  192. package/.svelte-kit/output/client/_app/immutable/nodes/15.BzziCvFz.js +1 -0
  193. package/.svelte-kit/output/client/_app/immutable/nodes/2.Ug_nHwAt.js +5 -0
  194. package/.svelte-kit/output/client/_app/immutable/nodes/3.baFnd1R-.js +1 -0
  195. package/.svelte-kit/output/client/_app/immutable/nodes/4.BVz7IBBS.js +1 -0
  196. package/.svelte-kit/output/client/_app/immutable/nodes/5.CNjqd06K.js +1 -0
  197. package/.svelte-kit/output/client/_app/immutable/nodes/6.CNjqd06K.js +1 -0
  198. package/.svelte-kit/output/client/_app/immutable/nodes/7.CNjqd06K.js +1 -0
  199. package/.svelte-kit/output/client/_app/immutable/nodes/8.CNjqd06K.js +1 -0
  200. package/.svelte-kit/output/client/_app/immutable/nodes/9.CNjqd06K.js +1 -0
  201. package/.svelte-kit/output/client/_app/version.json +1 -1
  202. package/.svelte-kit/output/client/robots.txt +5 -5
  203. package/.svelte-kit/output/prerendered/dependencies/portfolio/__data.json +1 -1
  204. package/.svelte-kit/output/prerendered/pages/portfolio.html +146 -132
  205. package/.svelte-kit/output/server/.vite/manifest.json +354 -66
  206. package/{.vercel/output/static/_app/immutable/assets/store.y2fRW0z7.css → .svelte-kit/output/server/_app/immutable/assets/Card.BAkK2DAr.css} +1 -1
  207. package/.svelte-kit/output/server/_app/immutable/assets/NavigationComponent.DAojhPuD.css +1 -0
  208. package/.svelte-kit/output/server/_app/immutable/assets/PineappleBaseLayout.syfctdq0.css +1 -0
  209. package/.svelte-kit/output/server/_app/immutable/assets/SeaweedTemplate.CVXyf0f_.css +1 -0
  210. package/.svelte-kit/output/server/_app/immutable/assets/_layout.h2ESO4YN.css +10 -0
  211. package/.svelte-kit/output/server/_app/immutable/assets/_page.BIMIBpeM.css +1 -0
  212. package/.svelte-kit/output/server/_app/immutable/assets/_page.ClTmhFiH.css +1 -0
  213. package/.svelte-kit/output/server/chunks/Card.js +37 -0
  214. package/.svelte-kit/output/server/chunks/DialogManagerStore.js +159 -16
  215. package/.svelte-kit/output/server/chunks/ProgressBar.svelte_svelte_type_style_lang.js +1 -1
  216. package/.svelte-kit/output/server/chunks/SeaweedTemplate.js +730 -229
  217. package/.svelte-kit/output/server/chunks/SlideToggle.js +84 -0
  218. package/.svelte-kit/output/server/chunks/_page.js +4 -0
  219. package/.svelte-kit/output/server/chunks/_page2.js +4 -0
  220. package/.svelte-kit/output/server/chunks/_page3.js +4 -0
  221. package/.svelte-kit/output/server/chunks/_page4.js +4 -0
  222. package/.svelte-kit/output/server/chunks/_page5.js +4 -0
  223. package/.svelte-kit/output/server/chunks/_page6.js +4 -0
  224. package/.svelte-kit/output/server/chunks/_page7.js +4 -0
  225. package/.svelte-kit/output/server/chunks/_page8.js +4 -0
  226. package/.svelte-kit/output/server/chunks/client.js +12 -0
  227. package/.svelte-kit/output/server/chunks/index.js +1 -1
  228. package/.svelte-kit/output/server/chunks/index2.js +85 -68
  229. package/.svelte-kit/output/server/chunks/index3.js +45 -4
  230. package/.svelte-kit/output/server/chunks/index4.js +12 -0
  231. package/.svelte-kit/output/server/chunks/internal.js +1 -1
  232. package/.svelte-kit/output/server/chunks/ssr.js +28 -14
  233. package/.svelte-kit/output/server/chunks/store.js +19 -51
  234. package/.svelte-kit/output/server/chunks/stores.js +5 -0
  235. package/.svelte-kit/output/server/chunks/stores2.js +26 -0
  236. package/.svelte-kit/output/server/chunks/stores3.js +38 -0
  237. package/.svelte-kit/output/server/entries/pages/(pineapple)/_layout.svelte.js +292 -0
  238. package/.svelte-kit/output/server/entries/pages/(pineapple)/_page.svelte.js +23 -0
  239. package/.svelte-kit/output/server/entries/pages/(pineapple)/pineapple/(extra-pages)/page1/_page.svelte.js +22 -0
  240. package/.svelte-kit/output/server/entries/pages/(pineapple)/pineapple/(extra-pages)/page2/_page.svelte.js +22 -0
  241. package/.svelte-kit/output/server/entries/pages/(pineapple)/pineapple/(extra-pages)/page3/_page.svelte.js +22 -0
  242. package/.svelte-kit/output/server/entries/pages/(pineapple)/pineapple/(extra-pages)/page3/page5/_page.svelte.js +22 -0
  243. package/.svelte-kit/output/server/entries/pages/(pineapple)/pineapple/(extra-pages)/page3/page6/_page.svelte.js +22 -0
  244. package/.svelte-kit/output/server/entries/pages/(pineapple)/pineapple/(extra-pages)/page3/page7/(test_layout)/page8/_page.svelte.js +22 -0
  245. package/.svelte-kit/output/server/entries/pages/(pineapple)/pineapple/(extra-pages)/page3/page7/_page.svelte.js +22 -0
  246. package/.svelte-kit/output/server/entries/pages/(pineapple)/pineapple/(extra-pages)/page4/_page.svelte.js +18 -0
  247. package/.svelte-kit/output/server/entries/pages/(pineapple)/pineapple/(pineapple)/_page.svelte.js +332 -0
  248. package/.svelte-kit/output/server/entries/pages/(pineapple)/pineapple/(pineapple)/_page.ts.js +9 -0
  249. package/.svelte-kit/output/server/entries/pages/(seaweed)/_layout.svelte.js +186 -0
  250. package/.svelte-kit/output/server/entries/pages/(seaweed)/portfolio/_page.server.ts.js +8 -0
  251. package/.svelte-kit/output/server/entries/pages/(seaweed)/portfolio/_page.svelte.js +8 -0
  252. package/.svelte-kit/output/server/entries/pages/(seaweed)/portfolio/_page.ts.js +9 -0
  253. package/.svelte-kit/output/server/entries/pages/{portfolio → (seaweed)/portfolio}/actual/_page.svelte.js +4 -4
  254. package/.svelte-kit/output/server/entries/pages/(seaweed)/portfolio/actual/_page.ts.js +9 -0
  255. package/.svelte-kit/output/server/entries/pages/_layout.svelte.js +49 -270
  256. package/.svelte-kit/output/server/index.js +1 -1
  257. package/.svelte-kit/output/server/manifest-full.js +77 -12
  258. package/.svelte-kit/output/server/manifest.js +75 -10
  259. package/.svelte-kit/output/server/nodes/0.js +2 -2
  260. package/.svelte-kit/output/server/nodes/1.js +1 -1
  261. package/.svelte-kit/output/server/nodes/10.js +8 -0
  262. package/.svelte-kit/output/server/nodes/11.js +8 -0
  263. package/.svelte-kit/output/server/nodes/12.js +8 -0
  264. package/.svelte-kit/output/server/nodes/13.js +10 -0
  265. package/.svelte-kit/output/server/nodes/14.js +13 -0
  266. package/.svelte-kit/output/server/nodes/15.js +10 -0
  267. package/.svelte-kit/output/server/nodes/2.js +3 -3
  268. package/.svelte-kit/output/server/nodes/3.js +3 -3
  269. package/.svelte-kit/output/server/nodes/4.js +3 -3
  270. package/.svelte-kit/output/server/nodes/5.js +4 -6
  271. package/.svelte-kit/output/server/nodes/6.js +3 -3
  272. package/.svelte-kit/output/server/nodes/7.js +8 -0
  273. package/.svelte-kit/output/server/nodes/8.js +8 -0
  274. package/.svelte-kit/output/server/nodes/9.js +8 -0
  275. package/build/server/host.json +7 -0
  276. package/build/server/local.settings.json +6 -0
  277. package/build/server/package-lock.json +6 -0
  278. package/build/server/package.json +1 -0
  279. package/build/server/sk_render/function.json +17 -0
  280. package/build/server/sk_render/index.js +11489 -0
  281. package/build/server/sk_render/index.js.map +7 -0
  282. package/build/static/_app/immutable/assets/0.vT28YyQg.css +10 -0
  283. package/build/static/_app/immutable/assets/13.BIMIBpeM.css +1 -0
  284. package/build/static/_app/immutable/assets/4.ClTmhFiH.css +1 -0
  285. package/build/static/_app/immutable/assets/Card.BAkK2DAr.css +1 -0
  286. package/build/static/_app/immutable/assets/NavigationComponent.DAojhPuD.css +1 -0
  287. package/build/static/_app/immutable/assets/PineappleBaseLayout.syfctdq0.css +1 -0
  288. package/build/static/_app/immutable/assets/ProgressBar.Cirlo5Z8.css +1 -0
  289. package/build/static/_app/immutable/assets/SeaweedTemplate.CVXyf0f_.css +1 -0
  290. package/build/static/_app/immutable/assets/_layout.h2ESO4YN.css +10 -0
  291. package/build/static/_app/immutable/assets/_page.BIMIBpeM.css +1 -0
  292. package/build/static/_app/immutable/assets/_page.ClTmhFiH.css +1 -0
  293. package/build/static/_app/immutable/assets/ares_blushing.B6Q0SsBp.webp +0 -0
  294. package/build/static/_app/immutable/assets/ares_disappointed.LOpkh7Q7.webp +0 -0
  295. package/build/static/_app/immutable/assets/ares_happy.Cz9WhdwO.webp +0 -0
  296. package/build/static/_app/immutable/assets/ares_lets_go.BxjJjKUv.webp +0 -0
  297. package/build/static/_app/immutable/assets/ares_logo.C_a3ZQAP.webp +0 -0
  298. package/build/static/_app/immutable/assets/ares_mad.DofDLDmM.webp +0 -0
  299. package/build/static/_app/immutable/assets/ares_neutral.Hp923t8N.webp +0 -0
  300. package/build/static/_app/immutable/assets/ares_slightly_mad.DdwOp6J5.webp +0 -0
  301. package/build/static/_app/immutable/assets/ares_surprised.BxbNH_w8.webp +0 -0
  302. package/build/static/_app/immutable/assets/ares_yay.EM2SNr0e.webp +0 -0
  303. package/build/static/_app/immutable/assets/bg_tiled_ares.DTcFskeK.png +0 -0
  304. package/build/static/_app/immutable/assets/bg_tiled_corn.D22ZwTZ0.png +0 -0
  305. package/build/static/_app/immutable/assets/bg_tiled_pineapple.D28N65_A.png +0 -0
  306. package/build/static/_app/immutable/assets/bg_tiled_reinhard.D22NV0xw.png +0 -0
  307. package/build/static/_app/immutable/assets/bg_tiled_tomato.O9Z7_E07.png +0 -0
  308. package/build/static/_app/immutable/assets/bg_tiled_turnip.DMU0uHH4.png +0 -0
  309. package/build/static/_app/immutable/assets/footage-chef-wings.dVBm8Uit.gif +0 -0
  310. package/build/static/_app/immutable/assets/header-hep-cat.DcyPS3Oy.mp4 +0 -0
  311. package/build/static/_app/immutable/assets/header-pengi.DWAOeO4q.mp4 +0 -0
  312. package/build/static/_app/immutable/assets/header-soulwork.BQRWmhTu.mp4 +0 -0
  313. package/build/static/_app/immutable/assets/placeholder_circle.Ij3bN7bI.png +0 -0
  314. package/build/static/_app/immutable/assets/seaweed-showcase.TTVTTC5m.mp4 +0 -0
  315. package/build/static/_app/immutable/assets/weaver-footage.sjDEbkrX.gif +0 -0
  316. package/build/static/_app/immutable/assets/window-set.IpgsYUna.png +0 -0
  317. package/build/static/_app/immutable/chunks/Card.DH87RA66.js +5 -0
  318. package/build/static/_app/immutable/chunks/DialogManagerStore.p-R7jA3N.js +7 -0
  319. package/{.vercel/output/static/_app/immutable/chunks/ProgressBar.svelte_svelte_type_style_lang.CmgCUata.js → build/static/_app/immutable/chunks/ProgressBar.svelte_svelte_type_style_lang.DiY8SXB3.js} +1 -1
  320. package/build/static/_app/immutable/chunks/SeaweedTemplate.DeqnsKrn.js +1064 -0
  321. package/build/static/_app/immutable/chunks/SlideToggle.DGF7DQhk.js +1 -0
  322. package/build/static/_app/immutable/chunks/Toast.Dil_rTuG.js +1 -0
  323. package/build/static/_app/immutable/chunks/_page.BCsXwAds.js +8 -0
  324. package/build/static/_app/immutable/chunks/_page.CER3LJw4.js +8 -0
  325. package/build/static/_app/immutable/chunks/_page.CJqYI1vC.js +7 -0
  326. package/build/static/_app/immutable/chunks/_page.CRke_Vt-.js +8 -0
  327. package/build/static/_app/immutable/chunks/_page.CdlE3ZqM.js +8 -0
  328. package/build/static/_app/immutable/chunks/_page.D8F_fKwN.js +8 -0
  329. package/build/static/_app/immutable/chunks/_page.DOjmKWLN.js +8 -0
  330. package/build/static/_app/immutable/chunks/_page.UybeXHGE.js +8 -0
  331. package/build/static/_app/immutable/chunks/each.D6YF6ztN.js +1 -0
  332. package/build/static/_app/immutable/chunks/entry.DIDAHtmj.js +3 -0
  333. package/build/static/_app/immutable/chunks/index.BwUaF0YV.js +6 -0
  334. package/build/static/_app/immutable/chunks/index.CWCbcDVt.js +4 -0
  335. package/build/static/_app/immutable/chunks/index.DbwYs1Xx.js +1 -0
  336. package/{.vercel/output/static/_app/immutable/chunks/index.Duksw40K.js → build/static/_app/immutable/chunks/index.HfS4ysOO.js} +1 -1
  337. package/build/static/_app/immutable/chunks/index.TTW-3Z8m.js +1 -0
  338. package/build/static/_app/immutable/chunks/preload-helper.BQ24v_F8.js +1 -0
  339. package/build/static/_app/immutable/chunks/scheduler.LgnVA12N.js +1 -0
  340. package/build/static/_app/immutable/chunks/spread.CgU5AtxT.js +1 -0
  341. package/build/static/_app/immutable/chunks/store.BMp6_Mv-.js +1 -0
  342. package/build/static/_app/immutable/chunks/stores.C1y1vsDB.js +1 -0
  343. package/build/static/_app/immutable/chunks/stores.CTStYDmk.js +1 -0
  344. package/build/static/_app/immutable/chunks/stores.CmlHsN0j.js +1 -0
  345. package/build/static/_app/immutable/chunks/transitions.FXurGCgU.js +1 -0
  346. package/build/static/_app/immutable/chunks/util.CpV-3U2s.js +1 -0
  347. package/build/static/_app/immutable/entry/app.DBmRlvle.js +7 -0
  348. package/build/static/_app/immutable/entry/start.DsC5h-eu.js +1 -0
  349. package/build/static/_app/immutable/nodes/0.DSodj2wf.js +2 -0
  350. package/{.vercel/output/static/_app/immutable/nodes/1.I7DMxkG1.js → build/static/_app/immutable/nodes/1.BRjT3J9Z.js} +2 -2
  351. package/build/static/_app/immutable/nodes/10.CNjqd06K.js +1 -0
  352. package/build/static/_app/immutable/nodes/11.CNjqd06K.js +1 -0
  353. package/build/static/_app/immutable/nodes/12.BYSc8zlB.js +1 -0
  354. package/build/static/_app/immutable/nodes/13.BlqYNJ3t.js +61 -0
  355. package/build/static/_app/immutable/nodes/14.CVCdnjGH.js +1 -0
  356. package/build/static/_app/immutable/nodes/15.BzziCvFz.js +1 -0
  357. package/build/static/_app/immutable/nodes/2.Ug_nHwAt.js +5 -0
  358. package/build/static/_app/immutable/nodes/3.baFnd1R-.js +1 -0
  359. package/build/static/_app/immutable/nodes/4.BVz7IBBS.js +1 -0
  360. package/build/static/_app/immutable/nodes/5.CNjqd06K.js +1 -0
  361. package/build/static/_app/immutable/nodes/6.CNjqd06K.js +1 -0
  362. package/build/static/_app/immutable/nodes/7.CNjqd06K.js +1 -0
  363. package/build/static/_app/immutable/nodes/8.CNjqd06K.js +1 -0
  364. package/build/static/_app/immutable/nodes/9.CNjqd06K.js +1 -0
  365. package/build/static/_app/version.json +1 -0
  366. package/build/static/portfolio/__data.json +1 -0
  367. package/build/static/portfolio.html +239 -0
  368. package/{.vercel/output → build}/static/robots.txt +5 -5
  369. package/build/staticwebapp.config.json +39 -0
  370. package/dist/components/combo_box/ComboBox.svelte +11 -0
  371. package/dist/components/combo_box/ComboBox.svelte.d.ts +18 -0
  372. package/dist/components/combo_box/ComboBoxWithButton.svelte +15 -0
  373. package/dist/components/combo_box/ComboBoxWithButton.svelte.d.ts +19 -0
  374. package/dist/components/combo_box/combo-box.postcss +22 -0
  375. package/dist/index.d.ts +1 -1
  376. package/dist/index.js +1 -1
  377. package/dist/template/seaweed/RunChaos.d.ts +1 -0
  378. package/dist/template/seaweed/RunChaos.js +41 -0
  379. package/dist/template/{Seaweed → seaweed}/SeaweedTemplate.svelte +113 -97
  380. package/dist/template/{Seaweed → seaweed}/SeaweedTemplate.svelte.d.ts +3 -0
  381. package/dist/template/seaweed/SeaweedTemplateData.d.ts +23 -0
  382. package/dist/template/seaweed/SeaweedTemplateData.js +68 -0
  383. package/dist/template/seaweed/entries/ChefWings.svelte +47 -0
  384. package/dist/template/seaweed/entries/ChefWings.svelte.d.ts +17 -0
  385. package/dist/template/seaweed/entries/CustomizedYarnspinner.svelte +32 -0
  386. package/dist/template/seaweed/entries/CustomizedYarnspinner.svelte.d.ts +17 -0
  387. package/dist/template/seaweed/entries/DecentralizedSocialMedia.svelte +52 -0
  388. package/dist/template/seaweed/entries/DecentralizedSocialMedia.svelte.d.ts +17 -0
  389. package/dist/template/seaweed/entries/EntryProps.d.ts +11 -0
  390. package/dist/template/seaweed/entries/EntryProps.js +5 -0
  391. package/dist/template/seaweed/entries/FullStackC.svelte +33 -0
  392. package/dist/template/seaweed/entries/FullStackC.svelte.d.ts +17 -0
  393. package/dist/template/seaweed/entries/Hepcat.svelte +55 -0
  394. package/dist/template/seaweed/entries/Hepcat.svelte.d.ts +17 -0
  395. package/dist/template/seaweed/entries/ItchPromo.svelte +21 -0
  396. package/dist/template/seaweed/entries/ItchPromo.svelte.d.ts +17 -0
  397. package/dist/template/seaweed/entries/MigranteAlberta.svelte +54 -0
  398. package/dist/template/seaweed/entries/MigranteAlberta.svelte.d.ts +17 -0
  399. package/dist/template/seaweed/entries/MockUberApp.svelte +38 -0
  400. package/dist/template/seaweed/entries/MockUberApp.svelte.d.ts +17 -0
  401. package/dist/template/seaweed/entries/Pengi.svelte +49 -0
  402. package/dist/template/seaweed/entries/Pengi.svelte.d.ts +17 -0
  403. package/dist/template/seaweed/entries/Soulwork.svelte +46 -0
  404. package/dist/template/seaweed/entries/Soulwork.svelte.d.ts +17 -0
  405. package/dist/template/seaweed/entries/ThisWebpage.svelte +45 -0
  406. package/dist/template/seaweed/entries/ThisWebpage.svelte.d.ts +17 -0
  407. package/dist/template/seaweed/entries/Workset.svelte +48 -0
  408. package/dist/template/seaweed/entries/Workset.svelte.d.ts +17 -0
  409. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.d.ts +1 -0
  410. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.js +3 -0
  411. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte +209 -0
  412. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte.d.ts +19 -0
  413. package/docs/archive/MigrationToAzure.md +102 -0
  414. package/package.json +5 -3
  415. package/src/lib/components/combo_box/ComboBox.svelte +13 -0
  416. package/src/lib/components/combo_box/ComboBoxWithButton.svelte +18 -0
  417. package/src/lib/components/combo_box/combo-box.postcss +22 -0
  418. package/src/lib/index.ts +1 -1
  419. package/src/lib/template/seaweed/RunChaos.ts +44 -0
  420. package/src/lib/template/{Seaweed → seaweed}/SeaweedTemplate.svelte +138 -121
  421. package/src/lib/template/seaweed/SeaweedTemplateData.ts +93 -0
  422. package/src/lib/template/seaweed/entries/ChefWings.svelte +54 -0
  423. package/src/lib/template/seaweed/entries/CustomizedYarnspinner.svelte +34 -0
  424. package/src/lib/template/seaweed/entries/DecentralizedSocialMedia.svelte +54 -0
  425. package/src/lib/template/seaweed/entries/EntryProps.ts +13 -0
  426. package/src/lib/template/seaweed/entries/FullStackC.svelte +36 -0
  427. package/src/lib/template/seaweed/entries/Hepcat.svelte +58 -0
  428. package/src/lib/template/seaweed/entries/ItchPromo.svelte +23 -0
  429. package/src/lib/template/seaweed/entries/MigranteAlberta.svelte +62 -0
  430. package/src/lib/template/seaweed/entries/MockUberApp.svelte +41 -0
  431. package/src/lib/template/seaweed/entries/Pengi.svelte +51 -0
  432. package/src/lib/template/seaweed/entries/Soulwork.svelte +48 -0
  433. package/src/lib/template/seaweed/entries/ThisWebpage.svelte +48 -0
  434. package/src/lib/template/seaweed/entries/Workset.svelte +51 -0
  435. package/src/lib/template/seaweed/entry_order_config/EntryOrderConfig.svelte +166 -0
  436. package/src/lib/template/seaweed/entry_order_config/EntryOrderConfig.ts +3 -0
  437. package/src/routes/(seaweed)/portfolio/+page.svelte +2 -2
  438. package/src/routes/(seaweed)/portfolio/actual/+page.svelte +4 -1
  439. package/src/routes/(seaweed)/portfolio/actual/RandomComponent.svelte +7 -0
  440. package/svelte.config.js +1 -1
  441. package/yarn.lock +305 -312
  442. package/.svelte-kit/__package__/template/Seaweed/GameSection.svelte +0 -207
  443. package/.svelte-kit/__package__/template/Seaweed/GameSection.svelte.d.ts +0 -17
  444. package/.svelte-kit/__package__/template/Seaweed/ProjectSection.svelte +0 -289
  445. package/.svelte-kit/__package__/template/Seaweed/ProjectSection.svelte.d.ts +0 -17
  446. package/.svelte-kit/output/client/_app/immutable/assets/0.CIpy7FrR.css +0 -1
  447. package/.svelte-kit/output/client/_app/immutable/assets/4.B8rxJaIe.css +0 -1
  448. package/.svelte-kit/output/client/_app/immutable/assets/PineappleBaseLayout.zNkuL9Xf.css +0 -1
  449. package/.svelte-kit/output/client/_app/immutable/assets/SeaweedTemplate.Dne103Fv.css +0 -1
  450. package/.svelte-kit/output/client/_app/immutable/assets/_layout.h10Yaexo.css +0 -1
  451. package/.svelte-kit/output/client/_app/immutable/assets/_page.B8rxJaIe.css +0 -1
  452. package/.svelte-kit/output/client/_app/immutable/chunks/DialogManagerStore.CauD3dIa.js +0 -3
  453. package/.svelte-kit/output/client/_app/immutable/chunks/PineappleBaseLayout.DLZBJSuK.js +0 -1
  454. package/.svelte-kit/output/client/_app/immutable/chunks/SeaweedTemplate.3-zGXu-z.js +0 -98
  455. package/.svelte-kit/output/client/_app/immutable/chunks/entry.C_e0Mj5-.js +0 -3
  456. package/.svelte-kit/output/client/_app/immutable/chunks/index.BgUXYai5.js +0 -4
  457. package/.svelte-kit/output/client/_app/immutable/chunks/index.CvmYViMX.js +0 -1
  458. package/.svelte-kit/output/client/_app/immutable/chunks/public.kPGcNb8-.js +0 -1
  459. package/.svelte-kit/output/client/_app/immutable/chunks/scheduler.DJdG0Qxb.js +0 -1
  460. package/.svelte-kit/output/client/_app/immutable/chunks/store.DeTea_VV.js +0 -1
  461. package/.svelte-kit/output/client/_app/immutable/chunks/transitions.DM45rqx4.js +0 -3
  462. package/.svelte-kit/output/client/_app/immutable/entry/app.CtI5urfJ.js +0 -7
  463. package/.svelte-kit/output/client/_app/immutable/entry/start.xt1NqQCl.js +0 -1
  464. package/.svelte-kit/output/client/_app/immutable/nodes/0.5ibwyEBM.js +0 -1
  465. package/.svelte-kit/output/client/_app/immutable/nodes/2.tgk_XChV.js +0 -1
  466. package/.svelte-kit/output/client/_app/immutable/nodes/3.CxPwEJYT.js +0 -1
  467. package/.svelte-kit/output/client/_app/immutable/nodes/4.Is9K1FIL.js +0 -1
  468. package/.svelte-kit/output/client/_app/immutable/nodes/5.Bt89_iH4.js +0 -1
  469. package/.svelte-kit/output/client/_app/immutable/nodes/6.BEdq2882.js +0 -1
  470. package/.svelte-kit/output/server/_app/immutable/assets/PineappleBaseLayout.zNkuL9Xf.css +0 -1
  471. package/.svelte-kit/output/server/_app/immutable/assets/SeaweedTemplate.Dne103Fv.css +0 -1
  472. package/.svelte-kit/output/server/_app/immutable/assets/_layout.h10Yaexo.css +0 -1
  473. package/.svelte-kit/output/server/_app/immutable/assets/_page.B8rxJaIe.css +0 -1
  474. package/.svelte-kit/output/server/chunks/PineappleBaseLayout.js +0 -94
  475. package/.svelte-kit/output/server/chunks/public.js +0 -4
  476. package/.svelte-kit/output/server/entries/pages/_page.svelte.js +0 -18
  477. package/.svelte-kit/output/server/entries/pages/personal/_layout.svelte.js +0 -13
  478. package/.svelte-kit/output/server/entries/pages/personal/_page.svelte.js +0 -13
  479. package/.svelte-kit/output/server/entries/pages/portfolio/_page.svelte.js +0 -12
  480. package/.vercel/output/config.json +0 -34
  481. package/.vercel/output/functions/fn.func/.svelte-kit/output/server/chunks/PineappleBaseLayout.js +0 -94
  482. package/.vercel/output/functions/fn.func/.svelte-kit/output/server/chunks/SeaweedTemplate.js +0 -597
  483. package/.vercel/output/functions/fn.func/.svelte-kit/output/server/chunks/index3.js +0 -7
  484. package/.vercel/output/functions/fn.func/.svelte-kit/output/server/chunks/public.js +0 -4
  485. package/.vercel/output/functions/fn.func/.svelte-kit/output/server/entries/pages/_page.svelte.js +0 -18
  486. package/.vercel/output/functions/fn.func/.svelte-kit/output/server/entries/pages/personal/_layout.svelte.js +0 -13
  487. package/.vercel/output/functions/fn.func/.svelte-kit/output/server/entries/pages/personal/_page.svelte.js +0 -13
  488. package/.vercel/output/functions/fn.func/.svelte-kit/output/server/nodes/0.js +0 -8
  489. package/.vercel/output/functions/fn.func/.svelte-kit/output/server/nodes/1.js +0 -8
  490. package/.vercel/output/functions/fn.func/.svelte-kit/output/server/nodes/2.js +0 -8
  491. package/.vercel/output/functions/fn.func/.svelte-kit/output/server/nodes/3.js +0 -8
  492. package/.vercel/output/functions/fn.func/.svelte-kit/output/server/nodes/4.js +0 -8
  493. package/.vercel/output/functions/fn.func/.svelte-kit/output/server/nodes/6.js +0 -8
  494. package/.vercel/output/functions/fn.func/.svelte-kit/vercel-tmp/index.js +0 -46
  495. package/.vercel/output/functions/fn.func/.svelte-kit/vercel-tmp/manifest.js +0 -52
  496. package/.vercel/output/functions/fn.func/.vc-config.json +0 -6
  497. package/.vercel/output/functions/fn.func/package.json +0 -1
  498. package/.vercel/output/static/_app/immutable/assets/4.B8rxJaIe.css +0 -1
  499. package/.vercel/output/static/_app/immutable/assets/PineappleBaseLayout.zNkuL9Xf.css +0 -1
  500. package/.vercel/output/static/_app/immutable/assets/ProgressBar.CaHExdkQ.css +0 -1
  501. package/.vercel/output/static/_app/immutable/assets/ProgressBar.DmpmGWm6.css +0 -1
  502. package/.vercel/output/static/_app/immutable/assets/SeaweedTemplate.CjiLUExY.css +0 -1
  503. package/.vercel/output/static/_app/immutable/assets/_layout.B_SY1GJM.css +0 -0
  504. package/.vercel/output/static/_app/immutable/assets/_page.B8rxJaIe.css +0 -1
  505. package/.vercel/output/static/_app/immutable/chunks/DialogManagerStore.CGTbGbVf.js +0 -3
  506. package/.vercel/output/static/_app/immutable/chunks/PineappleBaseLayout.Juc0v1b7.js +0 -1
  507. package/.vercel/output/static/_app/immutable/chunks/SeaweedTemplate.DS-Z3LcL.js +0 -98
  508. package/.vercel/output/static/_app/immutable/chunks/entry.BViziCKK.js +0 -3
  509. package/.vercel/output/static/_app/immutable/chunks/index.CvmYViMX.js +0 -1
  510. package/.vercel/output/static/_app/immutable/chunks/index.DcUpu3_h.js +0 -4
  511. package/.vercel/output/static/_app/immutable/chunks/public.kPGcNb8-.js +0 -1
  512. package/.vercel/output/static/_app/immutable/chunks/scheduler.DXwjFp5a.js +0 -1
  513. package/.vercel/output/static/_app/immutable/chunks/store.D47Cl8J0.js +0 -1
  514. package/.vercel/output/static/_app/immutable/chunks/transitions.BzalH0R-.js +0 -3
  515. package/.vercel/output/static/_app/immutable/entry/app.hYBk6umV.js +0 -7
  516. package/.vercel/output/static/_app/immutable/entry/start.bPtW9zOj.js +0 -1
  517. package/.vercel/output/static/_app/immutable/nodes/0.Dp97myFE.js +0 -1
  518. package/.vercel/output/static/_app/immutable/nodes/2.C7G9m2NJ.js +0 -1
  519. package/.vercel/output/static/_app/immutable/nodes/3.D9NOS4Wy.js +0 -1
  520. package/.vercel/output/static/_app/immutable/nodes/4.C0MZnSyC.js +0 -1
  521. package/.vercel/output/static/_app/immutable/nodes/5.ARW_iEad.js +0 -1
  522. package/.vercel/output/static/_app/immutable/nodes/6.CJVGAs6D.js +0 -1
  523. package/.vercel/output/static/_app/version.json +0 -1
  524. package/.vercel/output/static/portfolio/__data.json +0 -1
  525. package/.vercel/output/static/portfolio.html +0 -225
  526. package/dist/template/Seaweed/GameSection.svelte +0 -207
  527. package/dist/template/Seaweed/GameSection.svelte.d.ts +0 -17
  528. package/dist/template/Seaweed/ProjectSection.svelte +0 -289
  529. package/dist/template/Seaweed/ProjectSection.svelte.d.ts +0 -17
  530. package/src/lib/template/Seaweed/GameSection.svelte +0 -213
  531. package/src/lib/template/Seaweed/ProjectSection.svelte +0 -298
  532. /package/.svelte-kit/__package__/template/{Seaweed → seaweed}/seaweed.postcss +0 -0
  533. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/ares_blushing.B6Q0SsBp.webp +0 -0
  534. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/ares_disappointed.LOpkh7Q7.webp +0 -0
  535. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/ares_happy.Cz9WhdwO.webp +0 -0
  536. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/ares_lets_go.BxjJjKUv.webp +0 -0
  537. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/ares_logo.C_a3ZQAP.webp +0 -0
  538. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/ares_mad.DofDLDmM.webp +0 -0
  539. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/ares_neutral.Hp923t8N.webp +0 -0
  540. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/ares_slightly_mad.DdwOp6J5.webp +0 -0
  541. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/ares_surprised.BxbNH_w8.webp +0 -0
  542. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/ares_yay.EM2SNr0e.webp +0 -0
  543. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/bg_tiled_ares.DTcFskeK.png +0 -0
  544. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/bg_tiled_corn.D22ZwTZ0.png +0 -0
  545. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/bg_tiled_pineapple.D28N65_A.png +0 -0
  546. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/bg_tiled_reinhard.D22NV0xw.png +0 -0
  547. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/bg_tiled_tomato.O9Z7_E07.png +0 -0
  548. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/bg_tiled_turnip.DMU0uHH4.png +0 -0
  549. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/footage-chef-wings.dVBm8Uit.gif +0 -0
  550. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/header-hep-cat.DcyPS3Oy.mp4 +0 -0
  551. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/header-pengi.DWAOeO4q.mp4 +0 -0
  552. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/header-soulwork.BQRWmhTu.mp4 +0 -0
  553. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/placeholder_circle.Ij3bN7bI.png +0 -0
  554. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/seaweed-showcase.TTVTTC5m.mp4 +0 -0
  555. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/weaver-footage.sjDEbkrX.gif +0 -0
  556. /package/{.vercel/output/static → .svelte-kit/adapter-node}/_app/immutable/assets/window-set.IpgsYUna.png +0 -0
  557. /package/{.vercel/output/functions/fn.func/.svelte-kit/output/server → .svelte-kit/adapter-node}/chunks/exports.js +0 -0
  558. /package/{.vercel/output/functions/fn.func/.svelte-kit/output/server → .svelte-kit/adapter-node}/chunks/prod-ssr.js +0 -0
  559. /package/.svelte-kit/{output/server/entries/pages → adapter-node/entries/pages/(seaweed)}/portfolio/_page.server.ts.js +0 -0
  560. /package/{.vercel/output/functions/fn.func/.svelte-kit/output/server → .svelte-kit/adapter-node}/entries/pages/_error.svelte.js +0 -0
  561. /package/{.vercel/output → build}/static/default-card.png +0 -0
  562. /package/{.vercel/output → build}/static/favicon.png +0 -0
  563. /package/{.vercel/output/static/_app/immutable/assets/0.B_SY1GJM.css → build/static/index.html} +0 -0
  564. /package/dist/template/{Seaweed → seaweed}/seaweed.postcss +0 -0
  565. /package/src/lib/template/{Seaweed → seaweed}/seaweed.postcss +0 -0
@@ -1,9 +1,15 @@
1
- import { c as create_ssr_component, a as subscribe, s as setContext, e as escape, b as createEventDispatcher, i as getContext, d as add_attribute, j as compute_slots, v as validate_component } from "./ssr.js";
1
+ import { c as create_ssr_component, b as subscribe, s as setContext, e as escape, f as createEventDispatcher, i as getContext, a as add_attribute, j as compute_slots, v as validate_component, d as each } from "./ssr.js";
2
+ /* empty css */
2
3
  import { w as writable } from "./index.js";
3
4
  import { p as prefersReducedMotionStore, a as autoModeWatcher } from "./ProgressBar.svelte_svelte_type_style_lang.js";
4
- import { e as enableBackground, A as AppShell, a as AppBar, L as LightSwitch, R as RandomizedBackground, p as page } from "./store.js";
5
+ import { e as enableBackground, A as AppShell, a as AppBar, L as LightSwitch, R as RandomizedBackground } from "./store.js";
5
6
  import { e as enableDialogueOverlay } from "./DialogManagerStore.js";
6
- import { s as slide, g as getModalStore } from "./index2.js";
7
+ import { s as slide } from "./index3.js";
8
+ import { S as SlideToggle } from "./SlideToggle.js";
9
+ import { s as storeHighlightJs } from "./stores.js";
10
+ import { p as page } from "./stores2.js";
11
+ import { C as Card } from "./Card.js";
12
+ import { g as getModalStore } from "./stores3.js";
7
13
  const Accordion = create_ssr_component(($$result, $$props, $$bindings, slots) => {
8
14
  let classesBase;
9
15
  let $prefersReducedMotionStore, $$unsubscribe_prefersReducedMotionStore;
@@ -80,7 +86,7 @@ const Accordion = create_ssr_component(($$result, $$props, $$bindings, slots) =>
80
86
  $$unsubscribe_prefersReducedMotionStore();
81
87
  return ` <div class="${"accordion " + escape(classesBase, true)}" data-testid="accordion">${slots.default ? slots.default({}) : ``}</div>`;
82
88
  });
83
- const cBase = "";
89
+ const cBase$1 = "";
84
90
  const cControl = "text-start w-full flex items-center space-x-4";
85
91
  const cControlIcons = "fill-current w-3 transition-transform duration-[200ms]";
86
92
  const cPanel = "";
@@ -179,7 +185,7 @@ const AccordionItem = create_ssr_component(($$result, $$props, $$bindings, slots
179
185
  setActive();
180
186
  }
181
187
  openState = autocollapse ? $active === id : open;
182
- classesBase = `${cBase} ${$$props.class ?? ""}`;
188
+ classesBase = `${cBase$1} ${$$props.class ?? ""}`;
183
189
  classesControl = `${cControl} ${padding} ${hover} ${rounded} ${regionControl}`;
184
190
  classesCaretState = openState ? caretOpen : caretClosed;
185
191
  classesControlCaret = `${cControlIcons} ${regionCaret} ${classesCaretState}`;
@@ -188,11 +194,84 @@ const AccordionItem = create_ssr_component(($$result, $$props, $$bindings, slots
188
194
  $$unsubscribe_active();
189
195
  return ` <div class="${"accordion-item " + escape(classesBase, true)}" data-testid="accordion-item"> <button type="button" class="${"accordion-control " + escape(classesControl, true)}"${add_attribute("id", id, 0)}${add_attribute("aria-expanded", openState, 0)} aria-controls="${"accordion-panel-" + escape(id, true)}" ${disabled ? "disabled" : ""}> ${$$slots.lead ? `<div class="accordion-lead">${slots.lead ? slots.lead({}) : ``}</div>` : ``} <div class="accordion-summary flex-1">${slots.summary ? slots.summary({}) : `(summary)`}</div> ${$$slots.iconClosed || $$slots.iconOpen ? ` <div class="${"accordion-summary-icons " + escape(classesControlIcons, true)}">${openState ? `${slots.iconClosed ? slots.iconClosed({}) : `<!-- HTML_TAG_START -->${svgCaretIcon}<!-- HTML_TAG_END -->`}` : `${slots.iconOpen ? slots.iconOpen({}) : `<!-- HTML_TAG_START -->${svgCaretIcon}<!-- HTML_TAG_END -->`}`}</div>` : ` <div class="${"accordion-summary-caret " + escape(classesControlCaret, true)}"><!-- HTML_TAG_START -->${svgCaretIcon}<!-- HTML_TAG_END --></div>`}</button> ${openState ? `<div class="${"accordion-panel " + escape(classesPanel, true)}" id="${"accordion-panel-" + escape(id, true)}" role="region"${add_attribute("aria-hidden", !openState, 0)}${add_attribute("aria-labelledby", id, 0)}>${slots.content ? slots.content({}) : `(content)`}</div>` : ``}</div>`;
190
196
  });
197
+ const cBase = "overflow-hidden shadow";
198
+ const cHeader = "text-xs text-white/50 uppercase flex justify-between items-center p-2 pl-4";
199
+ const cPre = "whitespace-pre-wrap break-all p-4 pt-1";
200
+ function languageFormatter(lang) {
201
+ if (lang === "js")
202
+ return "javascript";
203
+ if (lang === "ts")
204
+ return "typescript";
205
+ if (lang === "shell")
206
+ return "terminal";
207
+ return lang;
208
+ }
209
+ const CodeBlock = create_ssr_component(($$result, $$props, $$bindings, slots) => {
210
+ let classesBase;
211
+ let $storeHighlightJs, $$unsubscribe_storeHighlightJs;
212
+ $$unsubscribe_storeHighlightJs = subscribe(storeHighlightJs, (value) => $storeHighlightJs = value);
213
+ createEventDispatcher();
214
+ let { language = "plaintext" } = $$props;
215
+ let { code = "" } = $$props;
216
+ let { lineNumbers = false } = $$props;
217
+ let { background = "bg-neutral-900/90" } = $$props;
218
+ let { blur = "" } = $$props;
219
+ let { text = "text-sm" } = $$props;
220
+ let { color = "text-white" } = $$props;
221
+ let { rounded = "rounded-container-token" } = $$props;
222
+ let { shadow = "shadow" } = $$props;
223
+ let { button = "btn btn-sm variant-soft !text-white" } = $$props;
224
+ let { buttonLabel = "Copy" } = $$props;
225
+ let { buttonCopied = "👍" } = $$props;
226
+ let formatted = false;
227
+ let displayCode = code;
228
+ if ($$props.language === void 0 && $$bindings.language && language !== void 0)
229
+ $$bindings.language(language);
230
+ if ($$props.code === void 0 && $$bindings.code && code !== void 0)
231
+ $$bindings.code(code);
232
+ if ($$props.lineNumbers === void 0 && $$bindings.lineNumbers && lineNumbers !== void 0)
233
+ $$bindings.lineNumbers(lineNumbers);
234
+ if ($$props.background === void 0 && $$bindings.background && background !== void 0)
235
+ $$bindings.background(background);
236
+ if ($$props.blur === void 0 && $$bindings.blur && blur !== void 0)
237
+ $$bindings.blur(blur);
238
+ if ($$props.text === void 0 && $$bindings.text && text !== void 0)
239
+ $$bindings.text(text);
240
+ if ($$props.color === void 0 && $$bindings.color && color !== void 0)
241
+ $$bindings.color(color);
242
+ if ($$props.rounded === void 0 && $$bindings.rounded && rounded !== void 0)
243
+ $$bindings.rounded(rounded);
244
+ if ($$props.shadow === void 0 && $$bindings.shadow && shadow !== void 0)
245
+ $$bindings.shadow(shadow);
246
+ if ($$props.button === void 0 && $$bindings.button && button !== void 0)
247
+ $$bindings.button(button);
248
+ if ($$props.buttonLabel === void 0 && $$bindings.buttonLabel && buttonLabel !== void 0)
249
+ $$bindings.buttonLabel(buttonLabel);
250
+ if ($$props.buttonCopied === void 0 && $$bindings.buttonCopied && buttonCopied !== void 0)
251
+ $$bindings.buttonCopied(buttonCopied);
252
+ {
253
+ if ($storeHighlightJs !== void 0) {
254
+ displayCode = $storeHighlightJs.highlight(code, { language }).value.trim();
255
+ formatted = true;
256
+ }
257
+ }
258
+ {
259
+ if (lineNumbers) {
260
+ displayCode = displayCode.replace(/^/gm, () => {
261
+ return '<span class="line"></span> ';
262
+ });
263
+ formatted = true;
264
+ }
265
+ }
266
+ classesBase = `${cBase} ${background} ${blur} ${text} ${color} ${rounded} ${shadow} ${$$props.class ?? ""}`;
267
+ $$unsubscribe_storeHighlightJs();
268
+ return ` ${language && code ? `<div class="${"codeblock " + escape(classesBase, true)}" data-testid="codeblock"> <header class="${"codeblock-header " + escape(cHeader, true)}"> <span class="codeblock-language">${escape(languageFormatter(language))}</span> <button type="button" class="${"codeblock-btn " + escape(button, true)}">${escape(buttonLabel)}</button></header> <pre class="${"codeblock-pre " + escape(cPre, true)}"><code class="${"codeblock-code language-" + escape(language, true) + " lineNumbers"}">${formatted ? `<!-- HTML_TAG_START -->${displayCode}<!-- HTML_TAG_END -->` : `${escape(code.trim())}`}</code></pre></div>` : ``}`;
269
+ });
270
+ const ItchLogoHotLink = "https://static.itch.io/images/itchio-textless-black.svg";
191
271
  const MailIcon = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20height='24'%20viewBox='0%20-960%20960%20960'%20width='24'%3e%3cpath%20d='M160-160q-33%200-56.5-23.5T80-240v-480q0-33%2023.5-56.5T160-800h640q33%200%2056.5%2023.5T880-720v480q0%2033-23.5%2056.5T800-160H160Zm320-280L160-640v400h640v-400L480-440Zm0-80%20320-200H160l320%20200ZM160-640v-80%20480-400Z'/%3e%3c/svg%3e";
192
272
  const GithubIcon = "data:image/svg+xml,%3csvg%20width='98'%20height='96'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M48.854%200C21.839%200%200%2022%200%2049.217c0%2021.756%2013.993%2040.172%2033.405%2046.69%202.427.49%203.316-1.059%203.316-2.362%200-1.141-.08-5.052-.08-9.127-13.59%202.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015%204.934.326%207.523%205.052%207.523%205.052%204.367%207.496%2011.404%205.378%2014.235%204.074.404-3.178%201.699-5.378%203.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283%200-5.378%201.94-9.778%205.014-13.2-.485-1.222-2.184-6.275.486-13.038%200%200%204.125-1.304%2013.426%205.052a46.97%2046.97%200%200%201%2012.214-1.63c4.125%200%208.33.571%2012.213%201.63%209.302-6.356%2013.427-5.052%2013.427-5.052%202.67%206.763.97%2011.816.485%2013.038%203.155%203.422%205.015%207.822%205.015%2013.2%200%2018.905-11.404%2023.06-22.324%2024.283%201.78%201.548%203.316%204.481%203.316%209.126%200%206.6-.08%2011.897-.08%2013.526%200%201.304.89%202.853%203.316%202.364%2019.412-6.52%2033.405-24.935%2033.405-46.691C97.707%2022%2075.788%200%2048.854%200z'%20fill='%2324292f'/%3e%3c/svg%3e";
193
- const ItchLogoHotLink = "https://static.itch.io/images/itchio-textless-black.svg";
194
273
  const LinkedinIcon = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%3e%3cpath%20d='M19%200h-14c-2.761%200-5%202.239-5%205v14c0%202.761%202.239%205%205%205h14c2.762%200%205-2.239%205-5v-14c0-2.761-2.238-5-5-5zm-11%2019h-3v-11h3v11zm-1.5-12.268c-.966%200-1.75-.79-1.75-1.764s.784-1.764%201.75-1.764%201.75.79%201.75%201.764-.783%201.764-1.75%201.764zm13.5%2012.268h-3v-5.604c0-3.368-4-3.113-4%200v5.604h-3v-11h3v1.765c1.396-2.586%207-2.777%207%202.476v6.759z'/%3e%3c/svg%3e";
195
- const css$4 = {
274
+ const css$3 = {
196
275
  code: ".svelte-urhqdc.svelte-urhqdc.svelte-urhqdc:is(.dark .social-button){--tw-bg-opacity:1;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity));color:rgb(var(--on-primary))}.social-button.svelte-urhqdc.svelte-urhqdc.svelte-urhqdc:disabled{cursor:not-allowed;opacity:0.5}.social-button.svelte-urhqdc.svelte-urhqdc.svelte-urhqdc:disabled:hover{--tw-brightness:brightness(1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.social-button.svelte-urhqdc.svelte-urhqdc.svelte-urhqdc:disabled:active{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.social-button.svelte-urhqdc.svelte-urhqdc.svelte-urhqdc{font-size:1rem;line-height:1.5rem;padding-left:1.25rem;padding-right:1.25rem;padding-top:9px;padding-bottom:9px;white-space:nowrap;text-align:center;display:inline-flex;align-items:center;justify-content:center;transition-property:all;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;border-radius:var(--theme-rounded-base)}.social-button.svelte-urhqdc>.svelte-urhqdc:not([hidden])~.svelte-urhqdc:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0.5rem * var(--tw-space-x-reverse));margin-left:calc(0.5rem * calc(1 - var(--tw-space-x-reverse)))}.social-button.svelte-urhqdc.svelte-urhqdc.svelte-urhqdc:hover{--tw-brightness:brightness(1.15);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.social-button.svelte-urhqdc.svelte-urhqdc.svelte-urhqdc:active{--tw-scale-x:95%;--tw-scale-y:95%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.social-button.svelte-urhqdc.svelte-urhqdc.svelte-urhqdc{--tw-bg-opacity:1;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity));color:rgb(var(--on-primary))}.svelte-urhqdc.svelte-urhqdc.svelte-urhqdc:is(.dark .social-button){--tw-bg-opacity:1;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity));color:rgb(var(--on-primary))}button.svelte-urhqdc>img.svelte-urhqdc.svelte-urhqdc{max-height:1lh}button.svelte-urhqdc.svelte-urhqdc.svelte-urhqdc{min-width:0;min-height:0}.socials.svelte-urhqdc.svelte-urhqdc.svelte-urhqdc{display:flex;flex-wrap:wrap;justify-content:var(--preferred-justify-content)}.socials.svelte-urhqdc>button.svelte-urhqdc.svelte-urhqdc{margin:0 0.5em var(--preferred-overall-margin-bottom)}.socials.isSmall.svelte-urhqdc>button.svelte-urhqdc.svelte-urhqdc{margin-left:0.25em;margin-right:0.25em}",
197
276
  map: null
198
277
  };
@@ -201,6 +280,7 @@ const SocialSection = create_ssr_component(($$result, $$props, $$bindings, slots
201
280
  let { email = "turnipxenon@gmail.com" } = $$props;
202
281
  let { linkedinSlug = "turnip-xenon" } = $$props;
203
282
  let { isSlot = false } = $$props;
283
+ let { allowLinkedIn = true } = $$props;
204
284
  const style = `
205
285
  --preferred-justify-content: ${isSlot ? "flex-start" : "center"};
206
286
  --preferred-overall-margin-bottom: ${isSlot ? "0" : "0.75lh"};
@@ -213,11 +293,13 @@ const SocialSection = create_ssr_component(($$result, $$props, $$bindings, slots
213
293
  $$bindings.linkedinSlug(linkedinSlug);
214
294
  if ($$props.isSlot === void 0 && $$bindings.isSlot && isSlot !== void 0)
215
295
  $$bindings.isSlot(isSlot);
216
- $$result.css.add(css$4);
217
- return `<div class="${["socials svelte-urhqdc", isSmallVersion ? "isSmall" : ""].join(" ").trim()}"${add_attribute("style", style, 0)} data-nosnippet><button type="button" class="social-button turnip-button svelte-urhqdc" role="link" title="https://github.com/TurnipXenon"><img${add_attribute("src", GithubIcon, 0)} alt="github icon" class="svelte-urhqdc"> ${!isSmallVersion ? `<span class="svelte-urhqdc" data-svelte-h="svelte-1yx4gc2">TurnipXenon</span>` : ``}</button> <button type="button" class="social-button turnip-button svelte-urhqdc" role="link"${add_attribute("title", `https://www.linkedin.com/in/${linkedinSlug}/`, 0)}><img${add_attribute("src", LinkedinIcon, 0)} alt="linkedikn icon" class="svelte-urhqdc"> ${!isSmallVersion ? `<span class="svelte-urhqdc">${escape(linkedinSlug)}</span>` : ``}</button> <button type="button" class="social-button turnip-button svelte-urhqdc" role="link"${add_attribute("title", `mailto:${email}`, 0)}><img${add_attribute("src", MailIcon, 0)} alt="mail icon" class="svelte-urhqdc"> ${!isSmallVersion ? `<span class="svelte-urhqdc">${escape(email)}</span>` : ``}</button> ${``} </div>`;
296
+ if ($$props.allowLinkedIn === void 0 && $$bindings.allowLinkedIn && allowLinkedIn !== void 0)
297
+ $$bindings.allowLinkedIn(allowLinkedIn);
298
+ $$result.css.add(css$3);
299
+ return `<div class="${["socials svelte-urhqdc", isSmallVersion ? "isSmall" : ""].join(" ").trim()}"${add_attribute("style", style, 0)} data-nosnippet><button type="button" class="social-button turnip-button svelte-urhqdc" role="link" title="https://github.com/TurnipXenon"><img${add_attribute("src", GithubIcon, 0)} alt="github icon" class="svelte-urhqdc"> ${!isSmallVersion ? `<span class="svelte-urhqdc" data-svelte-h="svelte-1yx4gc2">TurnipXenon</span>` : ``}</button> ${allowLinkedIn ? `<button type="button" class="social-button turnip-button svelte-urhqdc" role="link"${add_attribute("title", `https://www.linkedin.com/in/${linkedinSlug}/`, 0)}><img${add_attribute("src", LinkedinIcon, 0)} alt="linkedin icon" class="svelte-urhqdc"> ${!isSmallVersion ? `<span class="svelte-urhqdc">${escape(linkedinSlug)}</span>` : ``}</button>` : ``} <button type="button" class="social-button turnip-button svelte-urhqdc" role="link"${add_attribute("title", `mailto:${email}`, 0)}><img${add_attribute("src", MailIcon, 0)} alt="mail icon" class="svelte-urhqdc"> ${!isSmallVersion ? `<span class="svelte-urhqdc">${escape(email)}</span>` : ``}</button> ${``} </div>`;
218
300
  });
219
- const css$3 = {
220
- code: ":root{--dialog-left-pad:clamp(0em, 5vw, 2em);--dialog-box-width:min(calc(50em + 4em), calc(100vw - var(--dialog-left-pad) - var(--theme-border-base)));--dialog-box-height:clamp(15em, 50vw, 18em)}.default-page-container.svelte-12byvuz{max-width:2100px;margin:4em auto;flex-direction:column;z-index:0}.lead-slot-placeholder.svelte-12byvuz{height:3em;margin-inline-end:0.5em}",
301
+ const css$2 = {
302
+ code: ":root{--dialog-start-pad:clamp(0em, 5vw, 2em);--dialog-box-width:min(calc(50em + 4em), calc(100vw - var(--dialog-start-pad) - var(--theme-border-base)));--dialog-box-height:clamp(15em, 50vw, 18em)}.default-page-container.svelte-17jndg7{max-width:2100px;margin:4em auto;flex-direction:column;z-index:0}.lead-slot-placeholder.svelte-17jndg7{height:3em;margin-inline-end:0.5em}",
221
303
  map: null
222
304
  };
223
305
  const SeaweedBaseLayout = create_ssr_component(($$result, $$props, $$bindings, slots) => {
@@ -231,8 +313,8 @@ const SeaweedBaseLayout = create_ssr_component(($$result, $$props, $$bindings, s
231
313
  let shouldDisplaySocialIcons = writable(false);
232
314
  if ($$props.shouldDisplayLeadingIcons === void 0 && $$bindings.shouldDisplayLeadingIcons && shouldDisplayLeadingIcons !== void 0)
233
315
  $$bindings.shouldDisplayLeadingIcons(shouldDisplayLeadingIcons);
234
- $$result.css.add(css$3);
235
- return ` ${$$result.head += `<!-- HEAD_svelte-19or0ga_START --><!-- HTML_TAG_START -->${`<script>${autoModeWatcher.toString()} autoModeWatcher();<\/script>`}<!-- HTML_TAG_END --><!-- HEAD_svelte-19or0ga_END -->`, ""} ${validate_component(AppShell, "AppShell").$$render($$result, {}, {}, {
316
+ $$result.css.add(css$2);
317
+ return ` ${$$result.head += `<!-- HEAD_svelte-19or0ga_START --><!-- HTML_TAG_START -->${`<script>${autoModeWatcher.toString()} autoModeWatcher();<\/script>`}<!-- HTML_TAG_END --><!-- HEAD_svelte-19or0ga_END -->`, ""} ${validate_component(AppShell, "AppShell").$$render($$result, {}, {}, {
236
318
  header: () => {
237
319
  return ` ${validate_component(AppBar, "AppBar").$$render(
238
320
  $$result,
@@ -246,53 +328,16 @@ const SeaweedBaseLayout = create_ssr_component(($$result, $$props, $$bindings, s
246
328
  return `${validate_component(LightSwitch, "LightSwitch").$$render($$result, { bgLight: "bg-surface-400" }, {}, {})} `;
247
329
  },
248
330
  lead: () => {
249
- return `<span class="lead-slot-placeholder svelte-12byvuz"></span> ${$$slots.extraLeadingIcons && shouldDisplayLeadingIcons ? `<div>${slots.extraLeadingIcons ? slots.extraLeadingIcons({}) : ``}</div>` : `${$$slots.extraLeadingIcons ? `<div hidden>${slots.extraLeadingIcons ? slots.extraLeadingIcons({}) : ``}</div>` : ``}`}`;
331
+ return `<span class="lead-slot-placeholder svelte-17jndg7"></span> ${$$slots.extraLeadingIcons && shouldDisplayLeadingIcons ? `<div>${slots.extraLeadingIcons ? slots.extraLeadingIcons({}) : ``}</div>` : `${$$slots.extraLeadingIcons ? `<div hidden>${slots.s ? slots.s({}) : ``}</div>` : ``}`}`;
250
332
  }
251
333
  }
252
334
  )} `;
253
335
  },
254
336
  default: () => {
255
- return `${validate_component(RandomizedBackground, "RandomizedBackground").$$render($$result, { enable: enableBackgroundValue }, {}, {})} <div class="default-page-container svelte-12byvuz">${slots.default ? slots.default({ shouldDisplaySocialIcons }) : ``} <div class="footer-space"></div></div> `;
337
+ return `${validate_component(RandomizedBackground, "RandomizedBackground").$$render($$result, { enable: enableBackgroundValue }, {}, {})} <div class="default-page-container svelte-17jndg7">${slots.default ? slots.default({ shouldDisplaySocialIcons }) : ``} <div class="footer-space"></div></div> `;
256
338
  }
257
339
  })}`;
258
340
  });
259
- const css$2 = {
260
- code: ".turnip-card.svelte-isla4e{--tw-bg-opacity:1;background-color:rgb(var(--color-surface-100) / var(--tw-bg-opacity))}.svelte-isla4e:is(.dark .turnip-card){--tw-bg-opacity:1;background-color:rgb(var(--color-surface-900) / var(--tw-bg-opacity))}.turnip-card.svelte-isla4e{margin:var(--turnip-card-margin);margin-bottom:var(--turnip-card-margin-bottom);border-radius:var(--theme-rounded-container)}",
261
- map: null
262
- };
263
- const Card = create_ssr_component(($$result, $$props, $$bindings, slots) => {
264
- let { margin = "0" } = $$props;
265
- let { marginBottom = "3em" } = $$props;
266
- let { overrideStyle = "" } = $$props;
267
- let { includeDataNoSnippet = true } = $$props;
268
- const style = `
269
- --turnip-card-margin: ${margin};
270
- --turnip-card-margin-bottom: ${marginBottom};
271
- ${overrideStyle};
272
- `;
273
- if ($$props.margin === void 0 && $$bindings.margin && margin !== void 0)
274
- $$bindings.margin(margin);
275
- if ($$props.marginBottom === void 0 && $$bindings.marginBottom && marginBottom !== void 0)
276
- $$bindings.marginBottom(marginBottom);
277
- if ($$props.overrideStyle === void 0 && $$bindings.overrideStyle && overrideStyle !== void 0)
278
- $$bindings.overrideStyle(overrideStyle);
279
- if ($$props.includeDataNoSnippet === void 0 && $$bindings.includeDataNoSnippet && includeDataNoSnippet !== void 0)
280
- $$bindings.includeDataNoSnippet(includeDataNoSnippet);
281
- $$result.css.add(css$2);
282
- return `${includeDataNoSnippet ? `<div class="card turnip-card svelte-isla4e"${add_attribute("style", style, 0)} data-no-snippet>${slots.content ? slots.content({ class: "card svelte-isla4e" }) : ``}</div>` : `<div class="card turnip-card svelte-isla4e"${add_attribute("style", style, 0)}>${slots.content ? slots.content({ class: "card svelte-isla4e" }) : ``}</div>`}`;
283
- });
284
- const css$1 = {
285
- code: ".chip.svelte-1usmrsu{border-radius:1em;margin:0.25em;font-weight:bold;pointer-events:none}",
286
- map: null
287
- };
288
- const Chip = create_ssr_component(($$result, $$props, $$bindings, slots) => {
289
- $$result.css.add(css$1);
290
- return `<span class="chip variant-filled-tertiary svelte-1usmrsu">${slots.default ? slots.default({}) : ``} </span>`;
291
- });
292
- const HeaderPengi = "/_app/immutable/assets/header-pengi.DWAOeO4q.mp4";
293
- const HeaderSoulwork = "/_app/immutable/assets/header-soulwork.BQRWmhTu.mp4";
294
- const HeaderHepCat = "/_app/immutable/assets/header-hep-cat.DcyPS3Oy.mp4";
295
- const HeaderChefWings = "/_app/immutable/assets/footage-chef-wings.dVBm8Uit.gif";
296
341
  const ElementVisbilityDetector = create_ssr_component(($$result, $$props, $$bindings, slots) => {
297
342
  let { isVisible = true } = $$props;
298
343
  let stickyElem;
@@ -300,13 +345,497 @@ const ElementVisbilityDetector = create_ssr_component(($$result, $$props, $$bind
300
345
  $$bindings.isVisible(isVisible);
301
346
  return `<span${add_attribute("this", stickyElem, 0)}>${slots.default ? slots.default({}) : ``}</span>`;
302
347
  });
348
+ const HeaderPengi = "/_app/immutable/assets/header-pengi.DWAOeO4q.mp4";
349
+ const HeaderHepCat = "/_app/immutable/assets/header-hep-cat.DcyPS3Oy.mp4";
303
350
  const BitbucketIcon = "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGhlaWdodD0iNTEycHgiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUxMiA1MTI7IiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiB3aWR0aD0iNTEycHgiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxnIGlkPSJfeDM0XzQtYml0YnVja2V0Ij48Zz48cGF0aCBkPSJNNDAuOTI5LDQ5LjE3OGMtOC4xMDgtMC4wOTItMTQuODM1LDYuMzU4LTE0LjkyOCwxNC41NTljMCwwLjgyOSwwLjA5MywxLjc1LDAuMTg2LDIuNTggICAgbDYyLjU2NiwzNzkuNzM1YzEuNTY2LDkuNTgyLDkuODYsMTYuNjgsMTkuNjI3LDE2Ljc3aDMwMC4xMThjNy4yODEsMC4wOTMsMTMuNTQ2LTUuMTU5LDE0Ljc0NS0xMi4zNDdMNDg1LjgxLDY2LjQwOSAgICBjMS4yOS04LjAxNi00LjE0Ni0xNS41NzItMTIuMTYzLTE2Ljg2MmMtMC44MjktMC4wOTEtMS42NTgtMC4xODQtMi41NzgtMC4xODRMNDAuOTI5LDQ5LjE3OEw0MC45MjksNDkuMTc4eiBNMzA0LjM3NSwzMjMuNTkgICAgaC05NS44MzFsLTI1Ljg5NS0xMzUuNDU2aDE0NC45NDVMMzA0LjM3NSwzMjMuNTlMMzA0LjM3NSwzMjMuNTl6IiBzdHlsZT0iZmlsbDojMjY4NEZGOyIvPjwvZz48L2c+PGcgaWQ9IkxheWVyXzEiLz48L3N2Zz4=";
351
+ const HeaderChefWings = "/_app/immutable/assets/footage-chef-wings.dVBm8Uit.gif";
304
352
  const LinkIcon = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20height='24'%20viewBox='0%20-960%20960%20960'%20width='24'%3e%3cpath%20d='M440-280H280q-83%200-141.5-58.5T80-480q0-83%2058.5-141.5T280-680h160v80H280q-50%200-85%2035t-35%2085q0%2050%2035%2085t85%2035h160v80ZM320-440v-80h320v80H320Zm200%20160v-80h160q50%200%2085-35t35-85q0-50-35-85t-85-35H520v-80h160q83%200%20141.5%2058.5T880-480q0%2083-58.5%20141.5T680-280H520Z'/%3e%3c/svg%3e";
353
+ const HeaderSoulwork = "/_app/immutable/assets/header-soulwork.BQRWmhTu.mp4";
354
+ const GameSection = create_ssr_component(($$result, $$props, $$bindings, slots) => {
355
+ let { email = "turnipxenon@gmail.com" } = $$props;
356
+ getModalStore();
357
+ if ($$props.email === void 0 && $$bindings.email && email !== void 0)
358
+ $$bindings.email(email);
359
+ return `${validate_component(Card, "Card").$$render($$result, {}, {}, {
360
+ content: () => {
361
+ return `<div class="section-card title-card" slot="content" data-svelte-h="svelte-1b7bf2z"><h1 class="text-center">Games</h1></div>`;
362
+ }
363
+ })} <section class="games-section">${validate_component(Card, "Card").$$render($$result, {}, {}, {
364
+ content: () => {
365
+ return `<section class="game-card" slot="content"><video playsinline autoplay muted loop preload="none" data-svelte-h="svelte-14tfe19">video unavailable. original video contains pengi gameplay showing the dynamic dialog
366
+ layout and character animation.
367
+ <source${add_attribute("src", HeaderPengi, 0)} type="video/mp4"></video> <section class="game-card-body"><h1 data-svelte-h="svelte-kn1e7n">Pengi</h1> <blockquote data-svelte-h="svelte-nbh0iu">Well well, quite the dreamer, aren’t you? Might be hard to get in... costs a lot of
368
+ money...</blockquote> <p data-svelte-h="svelte-17y45xl">Pengi is a text-based adventure made in <span class="qt-unity">Unity</span>. I acted as the sole
369
+ programmer for the team. Most of the work revolves around UI and creating <a href="https://yarnspinner.dev/" target="_blank">YarnSpinner</a> commands for writers
370
+ to use to create expressive stage directions in the script.</p> <section class="game-link-section"><button type="button" class="game-button turnip-button" role="link" title="https://github.com/GreenTea-M/ProjectPengi" data-svelte-h="svelte-l7s9gj"><img alt="github icon"${add_attribute("src", GithubIcon, 0)}></button> <button type="button" class="game-button turnip-button" role="link" title="https://turnipxenon.itch.io/pengi" data-svelte-h="svelte-uciqk6"><img alt="itch.io icon"${add_attribute("src", ItchLogoHotLink, 0)}></button></section></section></section>`;
371
+ }
372
+ })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
373
+ content: () => {
374
+ return `<section class="game-card" slot="content"> <video playsinline autoplay muted loop preload="none" id="hepcat-video" data-svelte-h="svelte-f94lws"><source${add_attribute("src", HeaderHepCat, 0)} type="video/mp4"></video> <section class="game-card-body"><h1 data-svelte-h="svelte-1iabfbj">Hepcat</h1> <blockquote data-svelte-h="svelte-tw25hi">&quot;Cats, Jazz, and a little bit of Death. What more could anyone ask for?&quot;</blockquote> <p data-svelte-h="svelte-qudb2d">This is a course project made by a team of six for <a href="https://sites.google.com/ualberta.ca/cmput250/">CMPUT 250</a>, and it won <a href="https://webdocs.cs.ualberta.ca/~nathanst/certificate/">Game of the year.</a></p> <p data-svelte-h="svelte-1bf1ah2">Hep Cat is a rhythm game made in <a href="https://www.rpgmakerweb.com/products/programs/rpg-maker-mv" target="_blank" class="qt-rpgmaker">RPG Maker MV</a> with the help of additional custom-made <span class="qt-js">Javascript</span> plugins. I
375
+ wrote the rhythm game plugin&#39;s framework. For this plugin to work, I
376
+ had to write a <span class="qt-python">Python</span> script that parses osu! files into readable JSON
377
+ files.</p> <section class="game-link-section"><button type="button" class="game-button turnip-button" role="link" title="https://bitbucket.org/egginchicken/hep-cat/src/master/" data-svelte-h="svelte-62tj5f"><img alt="bitbucket icon"${add_attribute("src", BitbucketIcon, 0)}></button> <button type="button" class="game-button turnip-button" role="link" title="https://just-a-phantom.itch.io/hep-cat" data-svelte-h="svelte-yjc836"><img alt="itch.io icon"${add_attribute("src", ItchLogoHotLink, 0)}></button></section></section></section>`;
378
+ }
379
+ })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
380
+ content: () => {
381
+ return `<section class="game-card" slot="content"><img${add_attribute("src", HeaderChefWings, 0)} alt="todo" loading="lazy"> <section class="game-card-body"><h1 data-svelte-h="svelte-u3x25k">Chef Wings</h1> <p data-svelte-h="svelte-vvbg9r">A “roguelite-lite” where you gather ingredients in a procedurally-generated dungeon and use
382
+ them to cook for customers and then critics!</p> <p data-svelte-h="svelte-okkjf">I built and documented several of the game’s systems including the game state management
383
+ system that extends <span class="qt-unity">Unity’s</span> existing Monobehavior lifecycle with new events,
384
+ and the dialogue, event, and level systems that coordinate the game flow using the interactive
385
+ dialogue tool YarnSpinner</p> <section class="game-link-section"><button type="button" class="game-button turnip-button" title="https://selk.io/birb-project/trunk/" data-svelte-h="svelte-1ta0pkf"><img alt="itch.io icon"${add_attribute("src", LinkIcon, 0)}> <span>selk.io/birb-project/trunk/</span></button></section></section></section>`;
386
+ }
387
+ })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
388
+ content: () => {
389
+ return `<section class="game-card" slot="content"><video playsinline autoplay muted loop preload="none" data-svelte-h="svelte-1bwkex8"><source${add_attribute("src", HeaderSoulwork, 0)} type="video/mp4"></video> <section class="game-card-body"><h1 data-svelte-h="svelte-2ce69i">Soulwork</h1> <p data-svelte-h="svelte-1fxnla3">Soulwork is a 2D platforming game that uses unique physics to solve puzzle-based levels.
390
+ This project is a Time to Game Jam entry, restricting game development to be under 48
391
+ hours.</p> <p data-svelte-h="svelte-lzcrfa">I helped make the level designing tools used by the designers to drag-and-drop objects
392
+ on the stage. I also helped program the unique physics-based gameplay mechanic. This was
393
+ was made in <span class="qt-unity">Unity</span> written using <span class="qt-cs">C#</span>.</p> <section class="game-link-section"><button type="button" class="game-button turnip-button" role="link" title="https://github.com/Zeyu-Li/Clockwork" data-svelte-h="svelte-bq417h"><img alt="github icon"${add_attribute("src", GithubIcon, 0)}></button> <button type="button" class="game-button turnip-button" role="link" title="https://itch.io/jam/time-to-game-jam-gadec-fall-game-jam/rate/514331" data-svelte-h="svelte-1e6rmoq"><img alt="itch.io icon"${add_attribute("src", ItchLogoHotLink, 0)}></button></section></section></section>`;
394
+ }
395
+ })} ${validate_component(Card, "Card").$$render($$result, { overrideStyle: "align-self: flex-start;" }, {}, {
396
+ content: () => {
397
+ return `<section class="game-card itch-promo" slot="content"><h1 class="mb-12 text-center" data-svelte-h="svelte-10vk3r5">Check out my itch.io page for more games</h1> <section class="game-link-section"><button type="button" class="btn variant-filled-primary turnip-button" role="link" title="https://turnipxenon.itch.io/" data-svelte-h="svelte-w8jle3"><img${add_attribute("src", ItchLogoHotLink, 0)} class="long-btn-image" alt="itch icon"> <span>TurnipXenon</span></button></section></section>`;
398
+ }
399
+ })}</section>`;
400
+ });
305
401
  const WeaverFootage = "/_app/immutable/assets/weaver-footage.sjDEbkrX.gif";
306
402
  const WindowSetGraph = "/_app/immutable/assets/window-set.IpgsYUna.png";
307
403
  const ThisWebsiteFootage = "/_app/immutable/assets/seaweed-showcase.TTVTTC5m.mp4";
404
+ const css$1 = {
405
+ code: ".chip.svelte-11qczsb{border-radius:1em;margin:0.25em;font-weight:bold;pointer-events:none;background-color:rgb(var(--color-tertiary-500) / var(--tw-bg-opacity))}",
406
+ map: null
407
+ };
408
+ const Chip = create_ssr_component(($$result, $$props, $$bindings, slots) => {
409
+ $$result.css.add(css$1);
410
+ return `<span class="chip variant-filled-tertiary svelte-11qczsb">${slots.default ? slots.default({}) : ``} </span>`;
411
+ });
412
+ const ProjectSection = create_ssr_component(($$result, $$props, $$bindings, slots) => {
413
+ let { email = "turnipxenon@gmail.com" } = $$props;
414
+ getModalStore();
415
+ if ($$props.email === void 0 && $$bindings.email && email !== void 0)
416
+ $$bindings.email(email);
417
+ return `${validate_component(Card, "Card").$$render($$result, {}, {}, {
418
+ content: () => {
419
+ return `<section class="section-card title-card" slot="content" data-svelte-h="svelte-co2bri"><h1 class="text-center">Projects</h1></section>`;
420
+ }
421
+ })} <section class="projects-section">${validate_component(Card, "Card").$$render($$result, {}, {}, {
422
+ content: () => {
423
+ return `<section class="project-card" slot="content"><iframe id="migrante-alberta" width="560" height="315" src="https://www.youtube.com/embed/ZemWwf8jh8E?si=RZwSfYHI-0Ael-RE" title="YouTube video player" style="border: none" allowfullscreen></iframe> <div class="project-card-body"> <h2 data-svelte-h="svelte-1eni4fk">Migrante Alberta</h2> <p data-svelte-h="svelte-78l1f9">We developed a mobile-first cross-platform application to be used by the Canadian-based
424
+ Filipino non-profit advocacy group, Migrante Alberta, to help new immigrants navigate
425
+ through local services and events</p> <p>${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
426
+ default: () => {
427
+ return `Flutter`;
428
+ }
429
+ })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
430
+ default: () => {
431
+ return `Dart`;
432
+ }
433
+ })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
434
+ default: () => {
435
+ return `Python`;
436
+ }
437
+ })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
438
+ default: () => {
439
+ return `Django`;
440
+ }
441
+ })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
442
+ default: () => {
443
+ return `Heroku`;
444
+ }
445
+ })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
446
+ default: () => {
447
+ return `Android`;
448
+ }
449
+ })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
450
+ default: () => {
451
+ return `Postgresql`;
452
+ }
453
+ })}</p> <section class="game-link-section"><button type="button" class="btn variant-filled-primary turnip-button" title="https://selk.io/birb-project/trunk/" data-svelte-h="svelte-13nvyw"><img${add_attribute("src", LinkIcon, 0)} class="long-btn-image" alt="itch icon"> <span>cmput401.ca</span></button></section></div></section>`;
454
+ }
455
+ })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
456
+ content: () => {
457
+ return `<section class="project-card" slot="content"><div class="project-card-body"><h2 data-svelte-h="svelte-1ir48d3">Decentralized social media</h2> <p data-svelte-h="svelte-1sz4jzz">We made a full stack decentralized social media app made with <span class="qt-react">React</span> +
458
+ <span class="qt-js">Javascript</span> for the client code, <span class="qt-django">Django</span> + <span class="qt-python">Python</span> for the backend code, and <span class="qt-heroku">Heroku</span> for
459
+ deployment. This project was made
460
+ for
461
+ our Web Applications and Architecture class.</p> <p data-svelte-h="svelte-w4z81z">The application can connect with three other decentralized social media app in the same class:</p> <ul data-svelte-h="svelte-8b0hfl"><li><a href="https://github.com/hgshah/cmput404-project/blob/main/docs/testing_other_teams.md#team-14" target="_blank">Also
462
+ a social media with the same Django + Python backend server where they act on behalf of
463
+ our users interacting with theirs</a></li> <li><a href="https://github.com/hgshah/cmput404-project/blob/main/docs/testing_other_teams.md#team-7" target="_blank">A
464
+ social media that uses Fast API + Python for their backend server</a></li> <li><a href="https://github.com/hgshah/cmput404-project/blob/main/docs/testing_other_teams.md#team-12" target="_blank">Another
465
+ social media that has Django + Python for their backend but we have to act on behalf of
466
+ our
467
+ users interacting with their users</a></li></ul> <section class="game-link-section"><button type="button" class="game-button turnip-button" role="link" title="https://github.com/hgshah/cmput404-project" data-svelte-h="svelte-1uoj7sj"><img${add_attribute("src", GithubIcon, 0)} alt="github icon"></button></section></div></section>`;
468
+ }
469
+ })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
470
+ content: () => {
471
+ return `<section class="project-card" slot="content"><img alt="Footage of a visual novel-like dynamic dialog interaction happening on the same page we are on"${add_attribute("src", WeaverFootage, 0)}> <div class="project-card-body"><h2 data-svelte-h="svelte-1tprdy5">Customized Yarnspinner interpreter and dialog runner</h2>
472
+
473
+ A custom dialog interpreter, written in <span class="qt-ts" data-svelte-h="svelte-o30c37">Typescript</span>, that tokenizes then
474
+ transpiles custom Yarnspinner dialog into a <span class="qt-ts" data-svelte-h="svelte-o30c37">Typescript</span> file. The said files can
475
+ be used on a corresponding runner or library, also implemented alongside it, allowing the ability to play a
476
+ custom-flavor of YarnSpinner dialogs on <span class="qt-svelte" data-svelte-h="svelte-19momqd">Svelte</span>.
477
+
478
+ <section class="game-link-section"><button type="button" class="game-button turnip-button" role="link" title="https://github.com/TurnipXenon/pineapple/blob/main/docs/PineappleFiberSpec.md" data-svelte-h="svelte-o238xj"><img${add_attribute("src", GithubIcon, 0)} alt="github icon"></button></section></div></section>`;
479
+ }
480
+ })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
481
+ content: () => {
482
+ return `<section class="project-card" slot="content"><div class="project-card-body"><h2 data-svelte-h="svelte-1g6x1gh">Full-stack <span class="qt-c">C</span> app</h2> <p data-svelte-h="svelte-jmxifv">A terminal-based app consisting of a server observing several terminal apps all concurrently
483
+ sending updates to the server, which then broadcasts these information concurrently to all the
484
+ other terminal apps connected.</p> <p data-svelte-h="svelte-1a1crpo">The project involves <span class="qt-foundation">multiprocessing</span> programming featuring pthreads and
485
+ mutexes, and <span class="qt-foundation">networking</span> via sockets.</p> <section class="game-link-section"><button type="button" class="game-button turnip-button" role="link" title="https://github.com/TurnipXenon/C380-1Code/blob/main/Assignment02/DESIGN.md" data-svelte-h="svelte-zxt8b7"><img${add_attribute("src", GithubIcon, 0)} class="long-btn-image" alt="github icon"></button></section></div></section>`;
486
+ }
487
+ })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
488
+ content: () => {
489
+ return `<section class="project-card" slot="content"><img alt="A graph that visualizes the number of memory pages made by Quicksort cached within the window set as
490
+ time goes by. The trend appears to look like a damping harmonic motion that does not go below the zero line. More
491
+ details include the data size being 200000 entries, each data point skips 1060174 data points, with a
492
+ page size of 4096 bytes, and window size of 100000 bytes."${add_attribute("src", WindowSetGraph, 0)}> <div class="project-card-body"><h2 data-svelte-h="svelte-1owlizc">Working set simulation</h2> <p data-svelte-h="svelte-xtyavc">A <span class="qt-c">C</span> program that simulates the working set model based on the output of memory
493
+ addresses
494
+ <span class="qt-valgrind">valgrind</span> detects as being accessed by a program being ran. It&#39;s
495
+ implemented using a nested hashmap <span class="qt-foundation">data structure</span> implemented from
496
+ scratch. The working set is the collection of memory pages referenced by a program within a certain time
497
+ frame. It comes with a report analyzing and benchmarking how memory allocation, between sorting <span class="qt-foundation">algorithms</span> heapsort, quicksort, and radixsort, is affected by the window set
498
+ size, page size, and their input size.</p> <section class="game-link-section"><button type="button" class="game-button turnip-button" role="link" title="https://github.com/TurnipXenon/C380-1Code/blob/main/Assignment03/REPORT.pdf" data-svelte-h="svelte-8dctad"><img${add_attribute("src", GithubIcon, 0)} class="long-btn-image" alt="github icon"> <span>Benchmark report</span></button> <button type="button" class="game-button turnip-button" role="link" title="https://github.com/TurnipXenon/C380-1Code/blob/main/Assignment03/DESIGN.md" data-svelte-h="svelte-119y13c"><img${add_attribute("src", GithubIcon, 0)} class="long-btn-image" alt="github icon"> <span>Design</span></button></section></div></section>`;
499
+ }
500
+ })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
501
+ content: () => {
502
+ return `<section class="project-card" slot="content"><video playsinline autoplay muted loop preload="none" data-svelte-h="svelte-cfgpwb"><source${add_attribute("src", ThisWebsiteFootage, 0)} type="video/mp4">
503
+ video unavailable. original video contains clips of this website being resized and light-dark mode being
504
+ toggled.</video> <div class="project-card-body"><h2 data-svelte-h="svelte-5puumm">This webpage!</h2> <p data-svelte-h="svelte-19b5rkl">The webpage is made of two parts. The webpage that has the content for everything here, I&#39;ve
505
+ lovingly called Seaweed. I kept seaweed as a private package. On the other hand, the base package which I
506
+ want to use for all spin offs of my websites is called Pineapple and have kept that codebase public.</p> <p>${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
507
+ default: () => {
508
+ return `Svelte`;
509
+ }
510
+ })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
511
+ default: () => {
512
+ return `Skeleton (Svelte UI library)`;
513
+ }
514
+ })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
515
+ default: () => {
516
+ return `Typescript`;
517
+ }
518
+ })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
519
+ default: () => {
520
+ return `Vercel`;
521
+ }
522
+ })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
523
+ default: () => {
524
+ return `YarnSpinner`;
525
+ }
526
+ })}</p> <section class="game-link-section"><button type="button" class="btn variant-filled-primary turnip-button" role="link" title="https://github.com/TurnipXenon/pineapple" data-svelte-h="svelte-3ahxmv"><img${add_attribute("src", GithubIcon, 0)} class="long-btn-image" alt="github icon"></button></section></div></section>`;
527
+ }
528
+ })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
529
+ content: () => {
530
+ return `<section class="project-card" slot="content"><div class="project-card-body"><h2 data-svelte-h="svelte-1vw6xk1">Mock Uber App</h2> <p data-svelte-h="svelte-1o0nprs">A course project app meant to emulate how Uber works by playing with <span class="qt-google">Google Maps API</span>.</p> <p data-svelte-h="svelte-14gprsk">I implemented all interfaces related to the NoSQL cloud database <span class="qt-firebase qt-google qt-infra">Firebase</span>, making writing code easier for other programmers
531
+ (<span class="qt-android">Android</span> / <span class="qt-java">Java</span>). I also wrote documentation to said
532
+ code and added instrumented tests that are tested by the continuous integration tool <span class="qt-infra">Travis CI</span>, ensuring that our code is tested</p> <section class="game-link-section"> <button type="button" class="game-button turnip-button" role="link" title="https://github.com/CMPUT301W20T10/UberApp" data-svelte-h="svelte-oq5unl"><img${add_attribute("src", GithubIcon, 0)} class="long-btn-image" alt="github icon"></button></section></div></section>`;
533
+ }
534
+ })}</section>`;
535
+ });
536
+ const gameContent = '<script lang="ts">\n export let email = "turnipxenon@gmail.com";\n\n import "./seaweed.postcss";\n import HeaderPengi from "$pkg/assets/temp/header-pengi.mp4";\n import GithubIcon from "$pkg/assets/icons/github-mark.svg";\n import { ItchLogoHotLink } from "$pkg/consts";\n import HeaderHepCat from "$pkg/assets/temp/header-hep-cat.mp4";\n import BitbucketIcon from "$pkg/assets/icons/bitbucket-icon.svg";\n import HeaderChefWings from "$pkg/assets/game_dev/footage-chef-wings.gif";\n import LinkIcon from "$pkg/assets/icons/link-icon.svg";\n import HeaderSoulwork from "$pkg/assets/temp/header-soulwork.mp4";\n import Card from "$pkg/components/Card.svelte";\n import { getModalStore, type ModalSettings } from "@skeletonlabs/skeleton";\n\n const modalStore = getModalStore();\n const chefWingsWarning: ModalSettings = {\n type: "confirm",\n title: "Warning: please confirm",\n body: "This will directly link to the game itself, since this game does not have any game page or any " +\n "publicly viewable source code. The game is only playable on desktop. " +\n `Are you sure you wish to proceed? If there are any bugs, please report at <a href=\'mailto:${email}\' target=\'_blank\'>` +\n `${email}</a>.`,\n response: (r: boolean) => {\n if (r) {\n window.open("https://selk.io/birb-project/trunk/");\n }\n }\n };\n<\/script>\n\n<Card>\n <div class="section-card title-card" slot="content">\n <h1 class="text-center">Games</h1>\n </div>\n</Card>\n\n<section class="games-section">\n\n <Card>\n <section class="game-card" slot="content">\n <video playsinline autoplay muted loop preload="none">\n video unavailable. original video contains pengi gameplay showing the dynamic dialog\n layout and character animation.\n <source src={HeaderPengi} type="video/mp4">\n </video>\n\n <section class="game-card-body">\n\n <h1>Pengi</h1>\n\n <blockquote>\n Well well, quite the dreamer, aren’t you? Might be hard to get in... costs a lot of\n money...\n </blockquote>\n\n <p>\n Pengi is a text-based adventure made in <span class="qt-unity">Unity</span>. I acted as the sole\n programmer for the team. Most of the work revolves around UI and creating <a\n href="https://yarnspinner.dev/" target="_blank">YarnSpinner</a> commands for writers\n to use to create expressive stage directions in the script.\n </p>\n\n <section class="game-link-section">\n <button type="button" class="game-button turnip-button"\n role="link"\n title="https://github.com/GreenTea-M/ProjectPengi"\n on:click={()=> window.open("https://github.com/GreenTea-M/ProjectPengi")}>\n <img alt="github icon" src={GithubIcon}>\n </button>\n <button type="button" class="game-button turnip-button"\n role="link"\n title="https://turnipxenon.itch.io/pengi"\n on:click={()=> window.open("https://turnipxenon.itch.io/pengi")}>\n <img alt="itch.io icon" src={ItchLogoHotLink}>\n </button>\n </section>\n </section>\n </section>\n </Card>\n\n <Card>\n <section class="game-card" slot="content">\n <!-- todo: move the image crop a bit lower -->\n <video playsinline autoplay muted loop preload="none" id="hepcat-video">\n <source src={HeaderHepCat} type="video/mp4">\n </video>\n\n <section class="game-card-body">\n\n <h1>Hepcat</h1>\n\n <blockquote>\n "Cats, Jazz, and a little bit of Death. What more could anyone ask for?"\n </blockquote>\n\n\n <p>This is a course project made by a team of six for <a\n href="https://sites.google.com/ualberta.ca/cmput250/">CMPUT 250</a>, and it won <a\n href="https://webdocs.cs.ualberta.ca/~nathanst/certificate/">Game of the year.</a>\n </p>\n\n <p>\n Hep Cat is a rhythm game made in <a\n href="https://www.rpgmakerweb.com/products/programs/rpg-maker-mv" target="_blank" class="qt-rpgmaker">\n RPG Maker MV</a> with the help of additional custom-made <span class="qt-js">Javascript</span> plugins. I\n wrote the rhythm game plugin\'s framework. For this plugin to work, I\n had to write a <span class="qt-python">Python</span> script that parses osu! files into readable JSON\n files.\n </p>\n\n\n <section class="game-link-section">\n <button type="button" class="game-button turnip-button"\n role="link"\n title="https://bitbucket.org/egginchicken/hep-cat/src/master/"\n on:click={()=> window.open("https://bitbucket.org/egginchicken/hep-cat/src/master/")}>\n <img alt="bitbucket icon" src={BitbucketIcon}>\n </button>\n <button type="button" class="game-button turnip-button"\n role="link"\n title="https://just-a-phantom.itch.io/hep-cat"\n on:click={()=> window.open("https://just-a-phantom.itch.io/hep-cat")}>\n <img alt="itch.io icon" src={ItchLogoHotLink}>\n </button>\n </section>\n </section>\n </section>\n </Card>\n\n <Card>\n <section class="game-card" slot="content">\n <img src={HeaderChefWings} alt="todo" loading="lazy">\n <section class="game-card-body">\n\n <h1>Chef Wings</h1>\n <p>\n A “roguelite-lite” where you gather ingredients in a procedurally-generated dungeon and use\n them to cook for customers and then critics!\n </p>\n <p>\n I built and documented several of the game’s systems including the game state management\n system that extends <span class="qt-unity">Unity’s</span> existing Monobehavior lifecycle with new events,\n and the dialogue, event, and level systems that coordinate the game flow using the interactive\n dialogue tool YarnSpinner\n </p>\n\n <section class="game-link-section">\n <button type="button" class="game-button turnip-button"\n title="https://selk.io/birb-project/trunk/"\n on:click={()=>modalStore.trigger(chefWingsWarning)}>\n <img alt="itch.io icon" src={LinkIcon}>\n <span>selk.io/birb-project/trunk/</span>\n </button>\n </section>\n </section>\n </section>\n </Card>\n <Card>\n <section class="game-card" slot="content">\n <video playsinline autoplay muted loop preload="none">\n <source src={HeaderSoulwork} type="video/mp4">\n </video>\n <section class="game-card-body">\n\n <h1>Soulwork</h1>\n\n <p>\n Soulwork is a 2D platforming game that uses unique physics to solve puzzle-based levels.\n This project is a Time to Game Jam entry, restricting game development to be under 48\n hours.\n </p>\n <p>\n I helped make the level designing tools used by the designers to drag-and-drop objects\n on the stage. I also helped program the unique physics-based gameplay mechanic. This was\n was made in <span class="qt-unity">Unity</span> written using <span class="qt-cs">C#</span>.\n </p>\n\n\n <section class="game-link-section">\n <button type="button" class="game-button turnip-button"\n role="link"\n title="https://github.com/Zeyu-Li/Clockwork"\n on:click={()=> window.open("https://github.com/Zeyu-Li/Clockwork")}>\n <img alt="github icon" src={GithubIcon}>\n </button>\n <button type="button" class="game-button turnip-button"\n role="link"\n title="https://itch.io/jam/time-to-game-jam-gadec-fall-game-jam/rate/514331"\n on:click={()=> window.open("https://itch.io/jam/time-to-game-jam-gadec-fall-game-jam/rate/514331")}>\n <img alt="itch.io icon" src={ItchLogoHotLink}>\n </button>\n </section>\n </section>\n </section>\n </Card>\n <Card overrideStyle="align-self: flex-start;">\n <section class="game-card itch-promo" slot="content">\n <h1 class="mb-12 text-center">Check out my itch.io page for more games</h1>\n\n <section class="game-link-section">\n <button type="button" class="btn variant-filled-primary turnip-button"\n role="link"\n title="https://turnipxenon.itch.io/"\n on:click={() => window.open("https://turnipxenon.itch.io/")}>\n <img src={ItchLogoHotLink} class="long-btn-image" alt="itch icon">\n <span>TurnipXenon</span>\n </button>\n </section>\n\n </section>\n </Card>\n</section>\n';
537
+ const projectContent = `<script lang="ts">
538
+
539
+ export let email = "turnipxenon@gmail.com";
540
+
541
+ import "./seaweed.postcss";
542
+ import { getModalStore } from "@skeletonlabs/skeleton";
543
+ import LinkIcon from "$pkg/assets/icons/link-icon.svg";
544
+ import GithubIcon from "$pkg/assets/icons/github-mark.svg";
545
+ import WeaverFootage from "$pkg/assets/others/weaver-footage.gif";
546
+ import WindowSetGraph from "$pkg/assets/others/window-set.png";
547
+ import ThisWebsiteFootage from "$pkg/assets/others/seaweed-showcase.mp4";
548
+ import Card from "$pkg/components/Card.svelte";
549
+ import Chip from "$pkg/components/Chip.svelte";
550
+ import type { ModalSettings } from "@skeletonlabs/skeleton";
551
+
552
+ const modalStore = getModalStore();
553
+ const cmput401Info: ModalSettings = {
554
+ type: "confirm",
555
+ title: "Information",
556
+ body: "As a full disclosure, this link will lead you to <a href='https://cmput401.ca/projects/e5b13586-09c7-4ddd-baf6-fdb078d23398' target='_blank'>" +
557
+ "https://cmput401.ca/projects/e5b13586-09c7-4ddd-baf6-fdb078d23398</a>. " +
558
+ "We currently don't have any tests yet ensuring that the link is correct. " +
559
+ \`Click confirm to go to the site. Please report any bugs at <a href='mailto:\${email}' target='_blank'>\` +
560
+ \`\${email}</a>.\`,
561
+ response: (r: boolean) => {
562
+ if (r) {
563
+ window.open("https://cmput401.ca/projects/e5b13586-09c7-4ddd-baf6-fdb078d23398");
564
+ }
565
+ }
566
+ };
567
+ <\/script>
568
+
569
+ <Card>
570
+ <section class="section-card title-card" slot="content">
571
+ <h1 class="text-center">Projects</h1>
572
+ </section>
573
+ </Card>
574
+
575
+ <section class="projects-section">
576
+ <Card>
577
+ <section class="project-card" slot="content">
578
+ <iframe id="migrante-alberta"
579
+ width="560" height="315" src="https://www.youtube.com/embed/ZemWwf8jh8E?si=RZwSfYHI-0Ael-RE"
580
+ title="YouTube video player" style="border: none"
581
+ allowfullscreen></iframe>
582
+ <div class="project-card-body">
583
+ <!-- todo: add regression to see if page is gone: https://cmput401.ca/api/projects/e5b13586-09c7-4ddd-baf6-fdb078d23398 -->
584
+
585
+ <h2>Migrante Alberta</h2>
586
+ <p>We developed a mobile-first cross-platform application to be used by the Canadian-based
587
+ Filipino non-profit advocacy group, Migrante Alberta, to help new immigrants navigate
588
+ through local services and events
589
+ </p>
590
+ <p>
591
+ <Chip>Flutter</Chip>
592
+ <Chip>Dart</Chip>
593
+ <Chip>Python</Chip>
594
+ <Chip>Django</Chip>
595
+ <Chip>Heroku</Chip>
596
+ <Chip>Android</Chip>
597
+ <Chip>Postgresql</Chip>
598
+ </p>
599
+ <!-- todo: add a way to ask what did i do via chat? -->
600
+ <!-- <p>-->
601
+ <!-- I helped make reusable Flutter components for the application’s frontend, Dart utility files to-->
602
+ <!-- help ease writing and debugging calls to the backend, and a troubleshooting documentation-->
603
+ <!-- for handling common issues-->
604
+ <!-- </p>-->
605
+ <!-- <p>-->
606
+ <!-- Added Python unit tests to the backend endpoints, refactored the backend’s authentication-->
607
+ <!-- system from plain text to using Django’s authentication system, and wrote a script to ease-->
608
+ <!-- deployment to Heroku-->
609
+ <!-- </p>-->
610
+
611
+ <!-- todo: add tags with Dart, Flutter, Python, Django, Heroku, Android -->
612
+
613
+ <section class="game-link-section">
614
+ <button type="button" class="btn variant-filled-primary turnip-button"
615
+ title="https://selk.io/birb-project/trunk/"
616
+ on:click={() => modalStore.trigger(cmput401Info)}>
617
+ <img src={LinkIcon} class="long-btn-image" alt="itch icon">
618
+ <span>cmput401.ca</span>
619
+ </button>
620
+ </section>
621
+
622
+ </div>
623
+ </section>
624
+ </Card>
625
+
626
+ <Card>
627
+ <section class="project-card" slot="content">
628
+ <div class="project-card-body">
629
+
630
+ <h2>Decentralized social media</h2>
631
+
632
+ <p>We made a full stack decentralized social media app made with <span class="qt-react">React</span> +
633
+ <span class="qt-js">Javascript</span> for the client code, <span class="qt-django">Django</span> + <span
634
+ class="qt-python">Python</span> for the backend code, and <span class="qt-heroku">Heroku</span> for
635
+ deployment. This project was made
636
+ for
637
+ our Web Applications and Architecture class.</p>
638
+ <p>The application can connect with three other decentralized social media app in the same class:
639
+ </p>
640
+ <ul>
641
+ <li>
642
+ <a href="https://github.com/hgshah/cmput404-project/blob/main/docs/testing_other_teams.md#team-14"
643
+ target="_blank">Also
644
+ a social media with the same Django + Python backend server where they act on behalf of
645
+ our users interacting with theirs</a></li>
646
+ <li>
647
+ <a href="https://github.com/hgshah/cmput404-project/blob/main/docs/testing_other_teams.md#team-7"
648
+ target="_blank">A
649
+ social media that uses Fast API + Python for their backend server</a></li>
650
+ <li>
651
+ <a href="https://github.com/hgshah/cmput404-project/blob/main/docs/testing_other_teams.md#team-12"
652
+ target="_blank">Another
653
+ social media that has Django + Python for their backend but we have to act on behalf of
654
+ our
655
+ users interacting with their users</a>
656
+ </li>
657
+ </ul>
658
+
659
+ <!-- todo: add tags with Javascript, React, Python, Django, Heroku -->
660
+
661
+ <section class="game-link-section">
662
+ <button type="button" class="game-button turnip-button"
663
+ role="link"
664
+ title="https://github.com/hgshah/cmput404-project"
665
+ on:click={() => window.open("https://github.com/hgshah/cmput404-project")}>
666
+ <img src={GithubIcon} alt="github icon">
667
+ </button>
668
+ </section>
669
+ </div>
670
+ </section>
671
+ </Card>
672
+
673
+ <Card>
674
+ <section class="project-card" slot="content">
675
+ <img alt="Footage of a visual novel-like dynamic dialog interaction happening on the same page we are on"
676
+ src={WeaverFootage} />
677
+
678
+ <div class="project-card-body">
679
+ <h2>Customized Yarnspinner interpreter and dialog runner</h2>
680
+
681
+ A custom dialog interpreter, written in <span class="qt-ts">Typescript</span>, that tokenizes then
682
+ transpiles custom Yarnspinner dialog into a <span class="qt-ts">Typescript</span> file. The said files can
683
+ be used on a corresponding runner or library, also implemented alongside it, allowing the ability to play a
684
+ custom-flavor of YarnSpinner dialogs on <span class="qt-svelte">Svelte</span>.
685
+
686
+ <section class="game-link-section">
687
+ <button type="button" class="game-button turnip-button"
688
+ role="link"
689
+ title="https://github.com/TurnipXenon/pineapple/blob/main/docs/PineappleFiberSpec.md"
690
+ on:click={() => window.open("https://github.com/TurnipXenon/pineapple/blob/main/docs/PineappleFiberSpec.md")}>
691
+ <img src={GithubIcon} alt="github icon">
692
+ </button>
693
+ </section>
694
+ </div>
695
+ </section>
696
+ </Card>
697
+
698
+ <Card>
699
+ <section class="project-card" slot="content">
700
+ <div class="project-card-body">
701
+ <h2>Full-stack <span class="qt-c">C</span> app</h2>
702
+
703
+ <p>
704
+ A terminal-based app consisting of a server observing several terminal apps all concurrently
705
+ sending updates to the server, which then broadcasts these information concurrently to all the
706
+ other terminal apps connected.
707
+ </p>
708
+ <p>
709
+ The project involves <span class="qt-foundation">multiprocessing</span> programming featuring pthreads and
710
+ mutexes, and <span class="qt-foundation">networking</span> via sockets.
711
+ </p>
712
+
713
+ <section class="game-link-section">
714
+ <button type="button" class="game-button turnip-button"
715
+ role="link"
716
+ title="https://github.com/TurnipXenon/C380-1Code/blob/main/Assignment02/DESIGN.md"
717
+ on:click={() => window.open("https://github.com/TurnipXenon/C380-1Code/blob/main/Assignment02/DESIGN.md")}>
718
+ <img src={GithubIcon} class="long-btn-image" alt="github icon">
719
+ </button>
720
+ </section>
721
+ </div>
722
+ </section>
723
+ </Card>
724
+
725
+ <Card>
726
+ <section class="project-card" slot="content">
727
+ <img
728
+ alt="A graph that visualizes the number of memory pages made by Quicksort cached within the window set as
729
+ time goes by. The trend appears to look like a damping harmonic motion that does not go below the zero line. More
730
+ details include the data size being 200000 entries, each data point skips 1060174 data points, with a
731
+ page size of 4096 bytes, and window size of 100000 bytes."
732
+ src={WindowSetGraph} />
733
+ <div class="project-card-body">
734
+ <h2>Working set simulation</h2>
735
+
736
+ <p>
737
+ A <span class="qt-c">C</span> program that simulates the working set model based on the output of memory
738
+ addresses
739
+ <span class="qt-valgrind">valgrind</span> detects as being accessed by a program being ran. It's
740
+ implemented using a nested hashmap <span class="qt-foundation">data structure</span> implemented from
741
+ scratch. The working set is the collection of memory pages referenced by a program within a certain time
742
+ frame. It comes with a report analyzing and benchmarking how memory allocation, between sorting <span
743
+ class="qt-foundation">algorithms</span> heapsort, quicksort, and radixsort, is affected by the window set
744
+ size, page size, and their input size.
745
+ </p>
746
+
747
+ <section class="game-link-section">
748
+ <button type="button" class="game-button turnip-button"
749
+ role="link"
750
+ title="https://github.com/TurnipXenon/C380-1Code/blob/main/Assignment03/REPORT.pdf"
751
+ on:click={() => window.open("https://github.com/TurnipXenon/C380-1Code/blob/main/Assignment03/REPORT.pdf")}>
752
+ <img src={GithubIcon} class="long-btn-image" alt="github icon">
753
+ <span>Benchmark report</span>
754
+ </button>
755
+ <button type="button" class="game-button turnip-button"
756
+ role="link"
757
+ title="https://github.com/TurnipXenon/C380-1Code/blob/main/Assignment03/DESIGN.md"
758
+ on:click={() => window.open("https://github.com/TurnipXenon/C380-1Code/blob/main/Assignment03/DESIGN.md")}>
759
+ <img src={GithubIcon} class="long-btn-image" alt="github icon">
760
+ <span>Design</span>
761
+ </button>
762
+ </section>
763
+ </div>
764
+ </section>
765
+ </Card>
766
+
767
+ <Card>
768
+ <section class="project-card" slot="content">
769
+
770
+ <video playsinline autoplay muted loop preload="none">
771
+ <source src={ThisWebsiteFootage} type="video/mp4">
772
+ video unavailable. original video contains clips of this website being resized and light-dark mode being
773
+ toggled.
774
+ </video>
775
+ <div class="project-card-body">
776
+ <h2>This webpage!</h2>
777
+
778
+ <p>
779
+ The webpage is made of two parts. The webpage that has the content for everything here, I've
780
+ lovingly called Seaweed. I kept seaweed as a private package. On the other hand, the base package which I
781
+ want to use for all spin offs of my websites is called Pineapple and have kept that codebase public.
782
+ </p>
783
+
784
+ <p>
785
+ <Chip>Svelte</Chip>
786
+ <Chip>Skeleton (Svelte UI library)</Chip>
787
+ <Chip>Typescript</Chip>
788
+ <Chip>Vercel</Chip>
789
+ <Chip>YarnSpinner</Chip>
790
+ </p>
791
+
792
+ <section class="game-link-section">
793
+ <button type="button" class="btn variant-filled-primary turnip-button"
794
+ role="link"
795
+ title="https://github.com/TurnipXenon/pineapple"
796
+ on:click={() => window.open("https://github.com/TurnipXenon/pineapple")}>
797
+ <img src={GithubIcon} class="long-btn-image" alt="github icon">
798
+ </button>
799
+ </section>
800
+ </div>
801
+ </section>
802
+ </Card>
803
+
804
+ <Card>
805
+ <section class="project-card" slot="content">
806
+ <div class="project-card-body">
807
+ <h2>Mock Uber App</h2>
808
+
809
+ <p>A course project app meant to emulate how Uber works by playing with <span
810
+ class="qt-google">Google Maps API</span>.
811
+ </p>
812
+ <p>
813
+ I implemented all interfaces related to the NoSQL cloud database <span
814
+ class="qt-firebase qt-google qt-infra">Firebase</span>, making writing code easier for other programmers
815
+ (<span
816
+ class="qt-android">Android</span> / <span class="qt-java">Java</span>). I also wrote documentation to said
817
+ code and added instrumented tests that are tested by the continuous integration tool <span
818
+ class="qt-infra">Travis CI</span>, ensuring that our code is tested
819
+ </p>
820
+
821
+ <section class="game-link-section">
822
+ <!-- todo: mock uber app find link -->
823
+ <button type="button" class="game-button turnip-button"
824
+ role="link"
825
+ title="https://github.com/CMPUT301W20T10/UberApp"
826
+ on:click={() => window.open("https://github.com/CMPUT301W20T10/UberApp")}>
827
+ <img src={GithubIcon} class="long-btn-image" alt="github icon">
828
+ </button>
829
+ </section>
830
+ </div>
831
+ </section>
832
+ </Card>
833
+
834
+ </section>
835
+ `;
836
+ const selfContent = '<script lang="ts">\n export let letChaos = true;\n export let name = "Turnip";\n export let email = "turnipxenon@gmail.com";\n export let linkedinSlug = "turnip-xenon";\n export let domain = "http://localhost:5173/portfolio/actual/";\n\n import SocialSection from "$pkg/components/SocialSection.svelte";\n import "./seaweed.postcss";\n import SeaweedBaseLayout from "$pkg/components/layouts/SeaweedBaseLayout.svelte";\n import { Accordion, AccordionItem, CodeBlock, SlideToggle } from "@skeletonlabs/skeleton";\n import { page } from "$app/stores";\n import Card from "$pkg/components/Card.svelte";\n import { onMount } from "svelte";\n import ElementVisbilityDetector from "$pkg/components/ElementVisbilityDetector.svelte";\n import GameSection from "$pkg/template/Seaweed/GameSection.svelte";\n import ProjectSection from "$pkg/template/Seaweed/ProjectSection.svelte";\n\n let isVisible = true;\n let isAdvanceSettingOn = false;\n let shouldAddFunNote = false;\n\n $: isSocialsGone = !isVisible;\n\n // region query params\n import gameContent from "./GameSection.svelte?raw";\n import projectContent from "./ProjectSection.svelte?raw";\n import selfContent from "./SeaweedTemplate.svelte?raw";\n\n let qtMap = new Map<string, boolean>();\n const paramQTSet = new Set<string>();\n\n const syncQT = () => {\n if (qtMap.size === 0 || paramQTSet.size === 0) {\n return;\n }\n\n qtMap.forEach((_, k) => {\n qtMap.set(k, paramQTSet.has(k));\n });\n\n // force svelte refresh\n qtMap = qtMap;\n };\n\n const parseQTTerms = async () => {\n const qtSet = new Set<string>();\n const rawTermList: string[] = [];\n [gameContent, projectContent, selfContent].forEach(body => {\n // parse the qt-* term which exists within elements like:\n // <span class="qt-*">TERM</span>\n rawTermList.push(\n ...body // step 3: destructure the array\n .split("\\"") // step 1: split the text as double quotations (") as the delimiter\n .filter(s => s.startsWith("qt-")) // step 2: filter out texts that does not begin with "qt-"\n );\n });\n\n // step 4: some spans contain multiple classes, split them up\n // then add them to qtTerms\n // e.g. <span class="qt-1 qt-2">TERM</span>\n rawTermList.forEach(t => {\n t.split(" ").forEach(nt => {\n // filter out some of this meta terms\n if (["qt-1", "qt-2", "qt-*", "qt-"].includes(nt)) {\n return;\n }\n\n // adding to set ensures the entry is unique\n qtSet.add(nt);\n });\n });\n\n // activate svelte reactivity\n qtSet.forEach(t => qtMap.set(t, true));\n syncQT();\n };\n parseQTTerms();\n\n // todo: fix fragile relative reference to the root\n // const fileList = import.meta.glob("./**/+page.svelte", { query: "?raw", eager: true });\n // const titleToLink = new Map<string, string>();\n\n let gameSectionFirst = true;\n let qtfontWeight = "normal";\n let additionalFontWeight = "";\n /** qt values and what they mean:\n * undefined: set all qt terms to font-weight: bold\n * todo: implement clear\n * clear: unset all terms to font-weight: normal\n * <term>: only set qt-<term> to bold\n * <term1>,<term2>: only set qt-<term1> and qt-<term2> to bold,\n *\n * ONLY CALL INSIDE onMount()\n **/\n const filterSearchParams = (searchParams: URLSearchParams) => {\n const isFunOn = searchParams.get("fun")?.trim();\n if (isFunOn === "true") {\n shouldAddFunNote = true;\n }\n\n const gameSectionFirstParam = searchParams.get("game-section-first")?.trim();\n if (gameSectionFirstParam === "false") {\n gameSectionFirst = false;\n }\n\n // region Bold terms\n const qtValue = searchParams.get("qt")?.trim();\n if (qtValue === undefined) {\n qtfontWeight = "bold";\n return;\n }\n qtfontWeight = "normal";\n const dynamicStyle = qtValue.split(",").map((term) => {\n // side-effect\n paramQTSet.add(`qt-${term}`);\n\n // main effect\n return `span.qt-${term} { font-weight: bold !important; }`;\n }).join("\\n");\n\n // https://stackoverflow.com/a/24285947/17836168\n const style = document.createElement("style");\n // noinspection JSDeprecatedSymbols\n style.type = "text/css";\n style.innerText = dynamicStyle;\n document.head.appendChild(style);\n syncQT();\n // endregion Bold terms\n };\n // endregion query params\n\n /* region chaos scripts */\n const chaoticWordBank = ["niko", "toba", "seal", "aquarium", "ojisan", "baikal"];\n let chaosDone = false;\n const runChaos = (node: Element) => {\n // change all text content to gibberish\n for (let child of Array.from(node.children)) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n runChaos(child);\n for (const childOfChild of child.childNodes) {\n if (childOfChild.nodeType === Node.TEXT_NODE && childOfChild.textContent?.trim()) {\n const max = childOfChild.textContent.length;\n childOfChild.textContent = "";\n while (childOfChild.textContent.length < max) {\n childOfChild.textContent += (chaoticWordBank[Math.floor(Math.random() * chaoticWordBank.length)] + " ");\n }\n }\n }\n\n // change all links to crouton\n if (child.hasAttribute("href")) {\n child.setAttribute("href", "https://crouton.net/");\n }\n\n // change all images to niko if aria != hidden?\n if (child.hasAttribute("src") && !child.hasAttribute("aria-hidden")) {\n if (child.hasAttribute("alt")) {\n child.setAttribute("src", "https://p.potaufeu.asahi.com/a2b9-p/picture/21583312/5c3310aec77068e24844c663aa62b37c.jpg");\n } else {\n child.setAttribute("src", "https://video.twimg.com/ext_tw_video/1318728494256410624/pu/vid/640x360/TMklz6hiTkQu3xhn.mp4");\n child.setAttribute("muted", "true");\n }\n }\n if (child.tagName.trim() === "VIDEO") {\n child.setAttribute("src", "https://video.twimg.com/ext_tw_video/1318728494256410624/pu/vid/640x360/TMklz6hiTkQu3xhn.mp4");\n child.setAttribute("muted", "true");\n }\n\n // change all button events\n if (child.tagName.trim() === "BUTTON") {\n // remove anon function: https://stackoverflow.com/a/41343451/17836168\n child.setAttribute("disabled", "true");\n }\n }\n }\n };\n\n let mainVisibility = "visible";\n $: mainVisibility = letChaos && !chaosDone ? "hidden" : "visible";\n /* endregion chaos scripts */\n\n onMount(() => {\n if (!letChaos && $page.url.searchParams) {\n filterSearchParams($page.url.searchParams);\n }\n\n if (letChaos) {\n runChaos(document.body);\n chaosDone = true;\n }\n });\n\n const toggleTerm = (term: string) => {\n qtMap.set(term, !qtMap.get(term));\n qtMap = qtMap;\n };\n\n // when either gameSectionFirst or the queryTerms are updated, update advancedUrl\n let advancedUrl = domain;\n const updateUrl = () => {\n const queryParams: string[] = [];\n\n const qtList: string[] = [];\n qtMap.forEach((shouldBold, term) => {\n if (shouldBold) {\n qtList.push(term);\n }\n });\n\n if (qtList.length === 0) {\n queryParams.push("qt=clear");\n } else if (qtMap.size !== qtList.length) {\n // we\'ll only add if the lengths are not equal\n // dont need to add query if all terms in qtMap is true\n queryParams.push(`qt=${qtList.map(t => t.slice(3, t.length)).join(",")}`);\n }\n\n if (shouldAddFunNote) {\n queryParams.push("fun=true");\n }\n\n if (!gameSectionFirst) {\n queryParams.push("game-section-first=false");\n }\n\n if (queryParams.length > 0) {\n advancedUrl = `${domain}?${queryParams.join("&")}`;\n } else {\n advancedUrl = domain;\n }\n };\n $: // noinspection CommaExpressionJS\n gameSectionFirst, qtMap, shouldAddFunNote, updateUrl();\n // $: gameSectionQuery = gameSectionFirst ? "" : "game-section-first=false";\n<\/script>\n\n<SeaweedBaseLayout bind:shouldDisplayLeadingIcons={isSocialsGone}>\n <!-- todo: limit main size to 1080 px? -->\n <main style={`\n --qt-font-weight: ${qtfontWeight};${additionalFontWeight};\n visibility: ${mainVisibility};\n `}>\n\n <div class="experience-and-about-div">\n\n <div class="greater-about-div">\n\n <Card includeDataNoSnippet={false}>\n <section class="section-card" slot="content">\n\n <h1>About</h1>\n\n <p>\n Hi! My name is {name}! I work as a software developer. Outside of that, I like making games, and\n trying to do everything in between required to make one. I have some showcased below, our visit\n my itch.io page for more of them.\n </p>\n <!-- todo: link the degree details idk -->\n <p>\n I also graduated with BS Computing Science, Specializing in Software Practice, and a\n certificate in Computer Game Development at University of Alberta.\n </p>\n {#if shouldAddFunNote}\n <p>\n I\'m inspired by games like Harvest Moon: Friends of Mineral Town, Rune Factory 4, Theatrhythm,\n Bravely Default: Flying Fairy, Boku no Natsuyasumi 2, and A Short Hike.\n </p>\n {/if}\n\n <!-- todo: maybe put cute stuff here -->\n <!-- </ToggleableContent>-->\n </section>\n </Card>\n\n <Card>\n <section class="section-card" slot="content">\n <SocialSection email={email} linkedinSlug={linkedinSlug}></SocialSection>\n <ElementVisbilityDetector bind:isVisible={isVisible}>\n </ElementVisbilityDetector>\n </section>\n </Card>\n\n </div>\n\n <Card>\n <section class="section-card" slot="content">\n <h1>Experience</h1>\n\n <h2>Highlight</h2>\n <p>Worked on Go backend microservices and Typescript React frontend app, serving <b>over 30 million daily\n active users</b> at Twitch</p>\n\n <h2>Software Engineer</h2>\n <div class="two-column-separated">\n <div>July 2023 – January 2024</div>\n <div style="text-align: end">Twitch, Remote</div>\n </div>\n <ul>\n <li>\n Contributed to\n <span class="qt-go">Golang</span>\n microservices and\n <span class="qt-ts">Typescript</span>\n <span class="qt-react">React</span> codebases, across several teams, to accommodate public-facing user safety features to better comply with EU’s Digital Services Act, which applies to no more than\n <a href="https://safety.twitch.tv/s/article/Digital-Services-Act-Information?language=en_US">30.5 million users</a>\n . Work includes feature flags, alarms, unit tests, end-to-end testing, and documentation.\n </li>\n <li>\n Improved observability for upcoming features by setting up new AWS resources to integrate internal data platform tools with existing alarms in our team’s microservice, utilizing\n <span class="qt-aws qt-observability">Cloudwatch</span>,\n <span class="qt-aws qt-observability">Grafana</span>,\n <span class="qt-aws">Kinesis Data Stream</span>,\n <span class="qt-aws qt-infra">AWS CDK (infrastructure as code)</span>, and\n <span class="qt-aws qt-cicd">CodePipeline (CI/CD)</span>\n </li>\n </ul>\n <br>\n\n <h2>Software Engineer Intern</h2>\n <div class="two-column-separated">\n <div>May 2022 – Aug 2022</div>\n <div style="text-align: end">Twitch, San Francisco</div>\n </div>\n <ul>\n <li>\n Built a <span class="qt-infra">load testing service</span> that can be configured to generate different\n message types at different volumes that can be easily extended to target different chat services\n </li>\n <li>\n Used Twitch’s set of custom tools, including Twitch’s custom RPC protocol, to create a backend\n service with business logic written in <span class="qt-go">Go</span> and cloud infrastructure utilizing\n <span\n class="qt-infra qt-aws">ECS on Fargate, Cloudwatch, and DynamoDB</span>\n , defined in <span class="qt-ts">Typescript</span>-flavored CDK\n </li>\n <li>\n Wrote a technical specification document for the service’s MVP and possible future features, and\n additional documentation on how to use the service and how to extend the load testing service to include\n new services to test\n </li>\n </ul>\n <br>\n <!-- todo: turn off flashing when accordion is expanded -->\n <Accordion>\n <AccordionItem>\n <div slot="summary">\n <h2 class="accordion-header">More experience</h2>\n </div>\n <svelte:fragment slot="content">\n <section class="more-section">\n {#if (!letChaos)}\n <h2>Software Engineer Intern</h2>\n <div class="two-column-separated">\n <div>May 2021 – Dec 2021</div>\n <div style="text-align: end">Twitch / Amazon Web Services Canada, Remote</div>\n </div>\n <ul>\n <li>\n Implemented and wrote tests for a feature in Twitch’s\n <span class="qt-go">Golang</span> backend authentication microservices and\n <span class="qt-ts">Typescript</span>\n <span class="qt-react">React</span> frontend web app that will help suggest security improvements to\n <b>over 100k+ users daily</b>\n </li>\n </ul>\n {:else}\n niko baikal seal from toba aquarium\n {/if}\n <br>\n </section>\n </svelte:fragment>\n </AccordionItem>\n </Accordion>\n </section>\n </Card>\n\n </div>\n\n {#if (gameSectionFirst)}\n <GameSection email={email}></GameSection>\n <ProjectSection email={email}></ProjectSection>\n {:else }\n <ProjectSection email={email}></ProjectSection>\n <GameSection email={email}></GameSection>\n {/if}\n\n {#if (!letChaos)}\n <div aria-hidden="true" style="height: 25vh" />\n\n <Card>\n <div slot="content" class="default-card advanced-setting">\n <h1>Advanced settings</h1>\n <p>This one is for those curious how I customize this page.</p>\n <SlideToggle name="advanced-setting-slider" bind:checked={isAdvanceSettingOn}>\n Advanced settings: {isAdvanceSettingOn ? "On" : "Off"}\n </SlideToggle>\n {#if (isAdvanceSettingOn)}\n <SlideToggle name="game-section-slider" bind:checked={gameSectionFirst}>\n Should game section appear first over projects: {gameSectionFirst ? "On" : "Off"}\n </SlideToggle>\n <SlideToggle name="fun-note-slider" bind:checked={shouldAddFunNote}>\n Should add fun note in description: {shouldAddFunNote ? "On" : "Off"}\n </SlideToggle>\n\n <h3>Query terms to bold</h3>\n <div class="query-term-grid">\n {#each qtMap.entries() as [term, shouldBold]}\n <!--{@const shouldBold = false}-->\n <button\n class="chip {shouldBold ? \'variant-filled-tertiary\' : \'variant-soft-tertiary\'}"\n on:click={() => {toggleTerm(term)}}\n >\n <!-- todo: change shouldBold -->\n {#if (shouldBold)}&check;{/if}\n {term}\n </button>\n {/each}\n </div>\n\n <br>\n <p>Copy the url below and open a new page with it</p>\n <CodeBlock language="url" code={advancedUrl}></CodeBlock>\n {/if}\n </div>\n </Card>\n {/if}\n </main>\n\n <SocialSection slot="extraLeadingIcons"\n isSlot={true}\n email={email}\n linkedinSlug={linkedinSlug}\n isSmallVersion={true}></SocialSection>\n</SeaweedBaseLayout>\n\n<style lang="postcss">\n .advanced-setting {\n display: flex;\n flex-direction: column;\n gap: 0.5lh;\n }\n\n h3 {\n font-size: 1.5em;\n line-height: 1.5lh;\n }\n\n .query-term-grid {\n display: flex;\n gap: 0.25em;\n flex-wrap: wrap;\n }\n</style>';
308
837
  const css = {
309
- code: "main.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{width:100%;overflow:visible;display:flex;flex-direction:column;justify-content:center;align-items:center}h1.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{font-size:2em}h2.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{font-size:1.5em}.section-card.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{padding:3em;max-width:800px}.game-card.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg,.project-card.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{width:100vw;max-width:36em;margin-bottom:3em}.game-card.svelte-f3i6qg>video.svelte-f3i6qg.svelte-f3i6qg{border-top-left-radius:1em;border-top-right-radius:1em;max-height:24em;width:100%;-o-object-fit:cover;object-fit:cover}#migrante-alberta.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg,.game-card.svelte-f3i6qg>img.svelte-f3i6qg.svelte-f3i6qg,.project-card.svelte-f3i6qg>img.svelte-f3i6qg.svelte-f3i6qg{border-top-left-radius:1em;border-top-right-radius:1em}#migrante-alberta.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{width:100%;-o-object-fit:cover;object-fit:cover}.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg:is(.dark .game-button){--tw-bg-opacity:1;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity));color:rgb(var(--on-primary))}.game-button.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg:disabled{cursor:not-allowed;opacity:0.5}.game-button.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg:disabled:hover{--tw-brightness:brightness(1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.game-button.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg:disabled:active{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.game-button.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{font-size:1rem;line-height:1.5rem;padding-left:1.25rem;padding-right:1.25rem;padding-top:9px;padding-bottom:9px;white-space:nowrap;text-align:center;display:inline-flex;align-items:center;justify-content:center;transition-property:all;transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);transition-duration:150ms;border-radius:var(--theme-rounded-base)}.game-button.svelte-f3i6qg>.svelte-f3i6qg:not([hidden])~.svelte-f3i6qg:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(0.5rem * var(--tw-space-x-reverse));margin-left:calc(0.5rem * calc(1 - var(--tw-space-x-reverse)))}.game-button.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg:hover{--tw-brightness:brightness(1.15);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.game-button.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg:active{--tw-scale-x:95%;--tw-scale-y:95%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-brightness:brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.game-button.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{--tw-bg-opacity:1;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity));color:rgb(var(--on-primary))}.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg:is(.dark .game-button){--tw-bg-opacity:1;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity));color:rgb(var(--on-primary))}.game-button.svelte-f3i6qg>img.svelte-f3i6qg.svelte-f3i6qg{max-height:1lh}.two-column-separated.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{display:flex;justify-content:space-between}.more-section.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{padding:1em}.greater-about-div.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{display:flex;flex-direction:column;max-width:36em}.experience-and-about-div.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{display:flex;gap:2em;flex-wrap:wrap;justify-content:center;align-items:flex-start}.game-card-body.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg,.project-card-body.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{padding:1em}.game-card-body.svelte-f3i6qg>blockquote.svelte-f3i6qg.svelte-f3i6qg{margin-bottom:0.7lh}.game-card-body.svelte-f3i6qg>h1.svelte-f3i6qg.svelte-f3i6qg,.project-card-body.svelte-f3i6qg>h2.svelte-f3i6qg.svelte-f3i6qg{text-align:center}.game-link-section.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{display:flex;flex-direction:row;justify-content:center;gap:1em;margin-top:1em}.games-section.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg,.projects-section.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{display:flex;flex-wrap:wrap;gap:2em;justify-content:center}.projects-section.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{align-items:flex-start}.long-btn-image.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{max-height:1lh}.itch-promo.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{padding:4em}#hepcat-video.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{-o-object-position:0 0;object-position:0 0}.title-card.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{width:clamp(360px, 80vw, 800px)}[class*='qt-'].svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{font-weight:var(--qt-font-weight)}.accordion-header.svelte-f3i6qg.svelte-f3i6qg.svelte-f3i6qg{margin-top:0.25em}",
838
+ code: ".advanced-setting.svelte-1r5yyuh{display:flex;flex-direction:column;gap:0.5lh}h3.svelte-1r5yyuh{font-size:1.5em;line-height:1.5lh}.query-term-grid.svelte-1r5yyuh{display:flex;gap:0.25em;flex-wrap:wrap}",
310
839
  map: null
311
840
  };
312
841
  let additionalFontWeight = "";
@@ -318,11 +847,69 @@ const SeaweedTemplate = create_ssr_component(($$result, $$props, $$bindings, slo
318
847
  let { name = "Turnip" } = $$props;
319
848
  let { email = "turnipxenon@gmail.com" } = $$props;
320
849
  let { linkedinSlug = "turnip-xenon" } = $$props;
321
- getModalStore();
850
+ let { domain = "http://localhost:5173/portfolio/actual/" } = $$props;
322
851
  let isVisible = true;
852
+ let isAdvanceSettingOn = false;
853
+ let shouldAddFunNote = false;
854
+ let qtMap = /* @__PURE__ */ new Map();
855
+ const paramQTSet = /* @__PURE__ */ new Set();
856
+ const syncQT = () => {
857
+ if (qtMap.size === 0 || paramQTSet.size === 0) {
858
+ return;
859
+ }
860
+ qtMap.forEach((_, k) => {
861
+ qtMap.set(k, paramQTSet.has(k));
862
+ });
863
+ qtMap = qtMap;
864
+ };
865
+ const parseQTTerms = async () => {
866
+ const qtSet = /* @__PURE__ */ new Set();
867
+ const rawTermList = [];
868
+ [gameContent, projectContent, selfContent].forEach((body) => {
869
+ rawTermList.push(...body.split('"').filter((s) => s.startsWith("qt-")));
870
+ });
871
+ rawTermList.forEach((t) => {
872
+ t.split(" ").forEach((nt) => {
873
+ if (["qt-1", "qt-2", "qt-*", "qt-"].includes(nt)) {
874
+ return;
875
+ }
876
+ qtSet.add(nt);
877
+ });
878
+ });
879
+ qtSet.forEach((t) => qtMap.set(t, true));
880
+ syncQT();
881
+ };
882
+ parseQTTerms();
883
+ let gameSectionFirst = true;
323
884
  let qtfontWeight = "normal";
324
885
  let chaosDone = false;
325
886
  let mainVisibility = "visible";
887
+ let advancedUrl = domain;
888
+ const updateUrl = () => {
889
+ const queryParams = [];
890
+ const qtList = [];
891
+ qtMap.forEach((shouldBold, term) => {
892
+ if (shouldBold) {
893
+ qtList.push(term);
894
+ }
895
+ });
896
+ if (qtList.length === 0) {
897
+ queryParams.push("qt=clear");
898
+ } else if (qtMap.size !== qtList.length) {
899
+ queryParams.push(`qt=${qtList.map((t) => t.slice(3, t.length)).join(",")}`);
900
+ }
901
+ if (shouldAddFunNote) {
902
+ queryParams.push("fun=true");
903
+ }
904
+ if (!gameSectionFirst) {
905
+ queryParams.push("game-section-first=false");
906
+ }
907
+ if (queryParams.length > 0) {
908
+ advancedUrl = `${domain}?${queryParams.join("&")}`;
909
+ } else {
910
+ advancedUrl = domain;
911
+ }
912
+ };
326
913
  if ($$props.letChaos === void 0 && $$bindings.letChaos && letChaos !== void 0)
327
914
  $$bindings.letChaos(letChaos);
328
915
  if ($$props.name === void 0 && $$bindings.name && name !== void 0)
@@ -331,6 +918,8 @@ const SeaweedTemplate = create_ssr_component(($$result, $$props, $$bindings, slo
331
918
  $$bindings.email(email);
332
919
  if ($$props.linkedinSlug === void 0 && $$bindings.linkedinSlug && linkedinSlug !== void 0)
333
920
  $$bindings.linkedinSlug(linkedinSlug);
921
+ if ($$props.domain === void 0 && $$bindings.domain && domain !== void 0)
922
+ $$bindings.domain(domain);
334
923
  $$result.css.add(css);
335
924
  let $$settled;
336
925
  let $$rendered;
@@ -340,6 +929,9 @@ const SeaweedTemplate = create_ssr_component(($$result, $$props, $$bindings, slo
340
929
  $$result.head = previous_head;
341
930
  isSocialsGone = !isVisible;
342
931
  mainVisibility = letChaos && !chaosDone ? "hidden" : "visible";
932
+ {
933
+ updateUrl();
934
+ }
343
935
  $$rendered = `${validate_component(SeaweedBaseLayout, "SeaweedBaseLayout").$$render(
344
936
  $$result,
345
937
  { shouldDisplayLeadingIcons: isSocialsGone },
@@ -372,17 +964,17 @@ const SeaweedTemplate = create_ssr_component(($$result, $$props, $$bindings, slo
372
964
  visibility: ${mainVisibility};
373
965
  `,
374
966
  0
375
- )} class="svelte-f3i6qg"><div class="experience-and-about-div svelte-f3i6qg"><div class="greater-about-div svelte-f3i6qg">${validate_component(Card, "Card").$$render($$result, { includeDataNoSnippet: false }, {}, {
967
+ )}><div class="experience-and-about-div"><div class="greater-about-div">${validate_component(Card, "Card").$$render($$result, { includeDataNoSnippet: false }, {}, {
376
968
  content: () => {
377
- return `<section class="section-card svelte-f3i6qg" slot="content"><h1 class="svelte-f3i6qg" data-svelte-h="svelte-soqi9t">About</h1> <p class="svelte-f3i6qg">Hi! My name is ${escape(name)}! I work as a software developer. Outside of that, I like making games, and
969
+ return `<section class="section-card" slot="content"><h1 data-svelte-h="svelte-soqi9t">About</h1> <p>Hi! My name is ${escape(name)}! I work as a software developer. Outside of that, I like making games, and
378
970
  trying to do everything in between required to make one. I have some showcased below, our visit
379
- my itch.io page for more of them.</p> <p class="svelte-f3i6qg" data-svelte-h="svelte-1htq5b8">I also graduated with BS Computing Science, Specializing in Software Practice, and a
380
- certificate in Computer Game Development at University of Alberta.</p> <p class="svelte-f3i6qg" data-svelte-h="svelte-1tjf6ho">I&#39;m inspired by games like Harvest Moon: Friends of Mineral Town, Rune Factory 4, Theatrhythm,
381
- Bravely Default: Flying Fairy, Boku no Natsuyasumi 2, and A Short Hike.</p> </section>`;
971
+ my itch.io page for more of them.</p> <p data-svelte-h="svelte-1htq5b8">I also graduated with BS Computing Science, Specializing in Software Practice, and a
972
+ certificate in Computer Game Development at University of Alberta.</p> ${shouldAddFunNote ? `<p data-svelte-h="svelte-1cp5bb">I&#39;m inspired by games like Harvest Moon: Friends of Mineral Town, Rune Factory 4, Theatrhythm,
973
+ Bravely Default: Flying Fairy, Boku no Natsuyasumi 2, and A Short Hike.</p>` : ``} </section>`;
382
974
  }
383
975
  })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
384
976
  content: () => {
385
- return `<section class="section-card svelte-f3i6qg" slot="content">${validate_component(SocialSection, "SocialSection").$$render($$result, { email, linkedinSlug }, {}, {})} ${validate_component(ElementVisbilityDetector, "ElementVisbilityDetector").$$render(
977
+ return `<section class="section-card" slot="content">${validate_component(SocialSection, "SocialSection").$$render($$result, { email, linkedinSlug }, {}, {})} ${validate_component(ElementVisbilityDetector, "ElementVisbilityDetector").$$render(
386
978
  $$result,
387
979
  { isVisible },
388
980
  {
@@ -396,191 +988,100 @@ const SeaweedTemplate = create_ssr_component(($$result, $$props, $$bindings, slo
396
988
  }
397
989
  })}</div> ${validate_component(Card, "Card").$$render($$result, {}, {}, {
398
990
  content: () => {
399
- return `<section class="section-card svelte-f3i6qg" slot="content"><h1 class="svelte-f3i6qg" data-svelte-h="svelte-1r6ig88">Experience</h1> <h2 class="svelte-f3i6qg" data-svelte-h="svelte-a3jo9c">Software Engineer</h2> <div class="two-column-separated svelte-f3i6qg" data-svelte-h="svelte-psdxr0"><div class="svelte-f3i6qg">July 2023 January 2024</div> <div style="text-align: end" class="svelte-f3i6qg">Twitch, Remote</div></div> <ul class="svelte-f3i6qg" data-svelte-h="svelte-1k94u2s"><li class="svelte-f3i6qg">Contributed to <span class="qt-go svelte-f3i6qg">Golang</span> and <span class="qt-ts svelte-f3i6qg">Typescript</span> codebases,
400
- across several teams, to accommodate adjustments for public-facing user safety related features, to better
401
- comply with EU’s <a target="_blank" href="https://commission.europa.eu/strategy-and-policy/priorities-2019-2024/europe-fit-digital-age/digital-services-act/europe-fit-digital-age-new-online-rules-platforms_en" class="svelte-f3i6qg">Digital Services Act</a>, also including feature flags, alarms, unit tests, end-to-end testing, and
402
- documentation</li> <li class="svelte-f3i6qg">Improved observability for upcoming features by setting up new <span class="qt-aws qt-infra svelte-f3i6qg">AWS</span>
403
- resources to integrate internal data platform tools with existing alarms in our team’s microservice,
404
- utilizing <span class="qt-aws qt-infra svelte-f3i6qg">Cloudwatch</span> and <span class="qt-aws qt-infra svelte-f3i6qg">Kinesis Data Stream</span>,
405
- while adhering to best practices for <span class="qt-aws qt-infra svelte-f3i6qg">AWS CDK</span> (infrastructure as code)</li></ul> <br class="svelte-f3i6qg"> <h2 class="svelte-f3i6qg" data-svelte-h="svelte-wd964g">Software Engineer Intern</h2> <div class="two-column-separated svelte-f3i6qg" data-svelte-h="svelte-cx1fi3"><div class="svelte-f3i6qg">May 2022 Aug 2022</div> <div style="text-align: end" class="svelte-f3i6qg">Twitch, San Francisco</div></div> <ul class="svelte-f3i6qg" data-svelte-h="svelte-1coh9hk"><li class="svelte-f3i6qg">Built a <span class="qt-infra svelte-f3i6qg">load testing service</span> that can be configured to generate different
406
- message types at different volumes that can be easily extended to target different chat services</li> <li class="svelte-f3i6qg">Used Twitch’s set of custom tools, including Twitch’s custom RPC protocol, to create a backend
407
- service with business logic written in <span class="qt-go svelte-f3i6qg">Go</span> and cloud infrastructure utilizing
408
- <span class="qt-infra qt-aws svelte-f3i6qg">ECS on Fargate, Cloudwatch, and DynamoDB</span>
409
- , defined in <span class="qt-ts svelte-f3i6qg">Typescript</span>-flavored CDK</li> <li class="svelte-f3i6qg">Wrote a technical specification document for the service’s MVP and possible future features, and
991
+ return `<section class="section-card" slot="content"><h1 data-svelte-h="svelte-1r6ig88">Experience</h1> <h2 data-svelte-h="svelte-vsxr46">Highlight</h2> <p data-svelte-h="svelte-1aso2jy">Worked on Go backend microservices and Typescript React frontend app, serving <b>over 30 million daily
992
+ active users</b> at Twitch</p> <h2 data-svelte-h="svelte-a3jo9c">Software Engineer</h2> <div class="two-column-separated" data-svelte-h="svelte-psdxr0"><div>July 2023 January 2024</div> <div style="text-align: end">Twitch, Remote</div></div> <ul data-svelte-h="svelte-1htsnlv"><li>Contributed to
993
+ <span class="qt-go">Golang</span>
994
+ microservices and
995
+ <span class="qt-ts">Typescript</span> <span class="qt-react">React</span> codebases, across several teams, to accommodate public-facing user safety features to better comply with EU’s Digital Services Act, which applies to no more than
996
+ <a href="https://safety.twitch.tv/s/article/Digital-Services-Act-Information?language=en_US">30.5 million users</a>
997
+ . Work includes feature flags, alarms, unit tests, end-to-end testing, and documentation.</li> <li>Improved observability for upcoming features by setting up new AWS resources to integrate internal data platform tools with existing alarms in our team’s microservice, utilizing
998
+ <span class="qt-aws qt-observability">Cloudwatch</span>,
999
+ <span class="qt-aws qt-observability">Grafana</span>,
1000
+ <span class="qt-aws">Kinesis Data Stream</span>,
1001
+ <span class="qt-aws qt-infra">AWS CDK (infrastructure as code)</span>, and
1002
+ <span class="qt-aws qt-cicd">CodePipeline (CI/CD)</span></li></ul> <br> <h2 data-svelte-h="svelte-wd964g">Software Engineer Intern</h2> <div class="two-column-separated" data-svelte-h="svelte-cx1fi3"><div>May 2022 – Aug 2022</div> <div style="text-align: end">Twitch, San Francisco</div></div> <ul data-svelte-h="svelte-1coh9hk"><li>Built a <span class="qt-infra">load testing service</span> that can be configured to generate different
1003
+ message types at different volumes that can be easily extended to target different chat services</li> <li>Used Twitch’s set of custom tools, including Twitch’s custom RPC protocol, to create a backend
1004
+ service with business logic written in <span class="qt-go">Go</span> and cloud infrastructure utilizing
1005
+ <span class="qt-infra qt-aws">ECS on Fargate, Cloudwatch, and DynamoDB</span>
1006
+ , defined in <span class="qt-ts">Typescript</span>-flavored CDK</li> <li>Wrote a technical specification document for the service’s MVP and possible future features, and
410
1007
  additional documentation on how to use the service and how to extend the load testing service to include
411
- new services to test</li></ul> <br class="svelte-f3i6qg"> ${validate_component(Accordion, "Accordion").$$render($$result, {}, {}, {
1008
+ new services to test</li></ul> <br> ${validate_component(Accordion, "Accordion").$$render($$result, {}, {}, {
412
1009
  default: () => {
413
1010
  return `${validate_component(AccordionItem, "AccordionItem").$$render($$result, {}, {}, {
414
1011
  content: () => {
415
- return `<section class="more-section svelte-f3i6qg">${!letChaos ? `<h2 class="svelte-f3i6qg" data-svelte-h="svelte-wd964g">Software Engineer Intern</h2> <div class="two-column-separated svelte-f3i6qg" data-svelte-h="svelte-b9eewq"><div class="svelte-f3i6qg">May 2021 – Dec 2021</div> <div style="text-align: end" class="svelte-f3i6qg">Twitch / Amazon Web Services Canada, Remote</div></div> <ul class="svelte-f3i6qg" data-svelte-h="svelte-oswc7z"><li class="svelte-f3i6qg">Implemented and wrote tests for a feature in Twitch’s backend authentication
416
- systems and frontend web application that will help suggest security improvements to
417
- over hundreds of thousands of users daily</li> <li class="svelte-f3i6qg">Learned <span class="qt-go svelte-f3i6qg">Go</span>, <span class="qt-ts svelte-f3i6qg">Typescript</span>, <span class="qt-react svelte-f3i6qg">React</span>, and other new technologies on the go to contribute to
418
- the codebase</li></ul>` : `niko baikal seal from toba aquarium`} <br class="svelte-f3i6qg"></section> `;
1012
+ return `<section class="more-section">${!letChaos ? `<h2 data-svelte-h="svelte-wd964g">Software Engineer Intern</h2> <div class="two-column-separated" data-svelte-h="svelte-b9eewq"><div>May 2021 – Dec 2021</div> <div style="text-align: end">Twitch / Amazon Web Services Canada, Remote</div></div> <ul data-svelte-h="svelte-1xnf9zz"><li>Implemented and wrote tests for a feature in Twitch’s
1013
+ <span class="qt-go">Golang</span> backend authentication microservices and
1014
+ <span class="qt-ts">Typescript</span> <span class="qt-react">React</span> frontend web app that will help suggest security improvements to
1015
+ <b>over 100k+ users daily</b></li></ul>` : `niko baikal seal from toba aquarium`} <br></section> `;
419
1016
  },
420
1017
  summary: () => {
421
- return `<div slot="summary" class="svelte-f3i6qg" data-svelte-h="svelte-jx0pzv"><h2 class="accordion-header svelte-f3i6qg">More experience</h2></div>`;
1018
+ return `<div slot="summary" data-svelte-h="svelte-jx0pzv"><h2 class="accordion-header">More experience</h2></div>`;
422
1019
  }
423
1020
  })}`;
424
1021
  }
425
1022
  })}</section>`;
426
1023
  }
427
- })}</div> ${validate_component(Card, "Card").$$render($$result, {}, {}, {
1024
+ })}</div> ${gameSectionFirst ? `${validate_component(GameSection, "GameSection").$$render($$result, { email }, {}, {})} ${validate_component(ProjectSection, "ProjectSection").$$render($$result, { email }, {}, {})}` : `${validate_component(ProjectSection, "ProjectSection").$$render($$result, { email }, {}, {})} ${validate_component(GameSection, "GameSection").$$render($$result, { email }, {}, {})}`} ${!letChaos ? `<div aria-hidden="true" style="height: 25vh"></div> ${validate_component(Card, "Card").$$render($$result, {}, {}, {
428
1025
  content: () => {
429
- return `<div class="section-card title-card svelte-f3i6qg" slot="content" data-svelte-h="svelte-o20xib"><h1 class="text-center svelte-f3i6qg">Games</h1></div>`;
430
- }
431
- })} <section class="games-section svelte-f3i6qg">${validate_component(Card, "Card").$$render($$result, {}, {}, {
432
- content: () => {
433
- return `<section class="game-card svelte-f3i6qg" slot="content"><video playsinline autoplay muted loop preload="none" class="svelte-f3i6qg" data-svelte-h="svelte-18m3p75">video unavailable. original video contains pengi gameplay showing the dynamic dialog
434
- layout and character animation.
435
- <source${add_attribute("src", HeaderPengi, 0)} type="video/mp4" class="svelte-f3i6qg"></video> <section class="game-card-body svelte-f3i6qg"><h1 class="svelte-f3i6qg" data-svelte-h="svelte-kn1e7n">Pengi</h1> <blockquote class="svelte-f3i6qg" data-svelte-h="svelte-l5674o">Well well, quite the dreamer, aren’t you? Might be hard to get in... costs a lot of
436
- money...</blockquote> <p class="svelte-f3i6qg" data-svelte-h="svelte-1wwm72v">Pengi is a text-based adventure made in <span class="qt-unity svelte-f3i6qg">Unity</span>. I acted as the sole
437
- programmer for the team. Most of the work revolves around UI and creating <a href="https://yarnspinner.dev/" target="_blank" class="svelte-f3i6qg">YarnSpinner</a> commands for writers
438
- to use to create expressive stage directions in the script.</p> <section class="game-link-section svelte-f3i6qg"><button type="button" class="game-button turnip-button svelte-f3i6qg" role="link" title="https://github.com/GreenTea-M/ProjectPengi" data-svelte-h="svelte-y5jd5x"><img alt="github icon"${add_attribute("src", GithubIcon, 0)} class="svelte-f3i6qg"></button> <button type="button" class="game-button turnip-button svelte-f3i6qg" role="link" title="https://turnipxenon.itch.io/pengi" data-svelte-h="svelte-18q5lws"><img alt="itch.io icon"${add_attribute("src", ItchLogoHotLink, 0)} class="svelte-f3i6qg"></button></section></section></section>`;
439
- }
440
- })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
441
- content: () => {
442
- return `<section class="game-card svelte-f3i6qg" slot="content"> <video playsinline autoplay muted loop preload="none" id="hepcat-video" class="svelte-f3i6qg" data-svelte-h="svelte-11xid74"><source${add_attribute("src", HeaderHepCat, 0)} type="video/mp4" class="svelte-f3i6qg"></video> <section class="game-card-body svelte-f3i6qg"><h1 class="svelte-f3i6qg" data-svelte-h="svelte-1iabfbj">Hepcat</h1> <blockquote class="svelte-f3i6qg" data-svelte-h="svelte-1sm2zx2">&quot;Cats, Jazz, and a little bit of Death. What more could anyone ask for?&quot;</blockquote> <p class="svelte-f3i6qg" data-svelte-h="svelte-hwmnnf">This is a course project made by a team of six for <a href="https://sites.google.com/ualberta.ca/cmput250/" class="svelte-f3i6qg">CMPUT 250</a>, and it won <a href="https://webdocs.cs.ualberta.ca/~nathanst/certificate/" class="svelte-f3i6qg">Game of the year.</a></p> <p class="svelte-f3i6qg" data-svelte-h="svelte-1k65o8o">Hep Cat is a rhythm game made in <a href="https://www.rpgmakerweb.com/products/programs/rpg-maker-mv" target="_blank" class="qt-rpgmaker svelte-f3i6qg">RPG Maker MV</a> with the help of additional custom-made <span class="qt-js svelte-f3i6qg">Javascript</span> plugins. I
443
- wrote the rhythm game plugin&#39;s framework. For this plugin to work, I
444
- had to write a <span class="qt-python svelte-f3i6qg">Python</span> script that parses osu! files into readable JSON
445
- files.</p> <section class="game-link-section svelte-f3i6qg"><button type="button" class="game-button turnip-button svelte-f3i6qg" role="link" title="https://bitbucket.org/egginchicken/hep-cat/src/master/" data-svelte-h="svelte-kqolxp"><img alt="bitbucket icon"${add_attribute("src", BitbucketIcon, 0)} class="svelte-f3i6qg"></button> <button type="button" class="game-button turnip-button svelte-f3i6qg" role="link" title="https://just-a-phantom.itch.io/hep-cat" data-svelte-h="svelte-85ytls"><img alt="itch.io icon"${add_attribute("src", ItchLogoHotLink, 0)} class="svelte-f3i6qg"></button></section></section></section>`;
446
- }
447
- })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
448
- content: () => {
449
- return `<section class="game-card svelte-f3i6qg" slot="content"><img${add_attribute("src", HeaderChefWings, 0)} alt="todo" loading="lazy" class="svelte-f3i6qg"> <section class="game-card-body svelte-f3i6qg"><h1 class="svelte-f3i6qg" data-svelte-h="svelte-u3x25k">Chef Wings</h1> <p class="svelte-f3i6qg" data-svelte-h="svelte-1gm838l">A “roguelite-lite” where you gather ingredients in a procedurally-generated dungeon and use
450
- them to cook for customers and then critics!</p> <p class="svelte-f3i6qg" data-svelte-h="svelte-1vp4je5">I built and documented several of the game’s systems including the game state management
451
- system that extends <span class="qt-unity svelte-f3i6qg">Unity’s</span> existing Monobehavior lifecycle with new events,
452
- and the dialogue, event, and level systems that coordinate the game flow using the interactive
453
- dialogue tool YarnSpinner</p> <section class="game-link-section svelte-f3i6qg"><button type="button" class="game-button turnip-button svelte-f3i6qg" title="https://selk.io/birb-project/trunk/" data-svelte-h="svelte-1sy1yh1"><img alt="itch.io icon"${add_attribute("src", LinkIcon, 0)} class="svelte-f3i6qg"> <span class="svelte-f3i6qg">selk.io/birb-project/trunk/</span></button></section></section></section>`;
454
- }
455
- })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
456
- content: () => {
457
- return `<section class="game-card svelte-f3i6qg" slot="content"><video playsinline autoplay muted loop preload="none" class="svelte-f3i6qg" data-svelte-h="svelte-1k9edyw"><source${add_attribute("src", HeaderSoulwork, 0)} type="video/mp4" class="svelte-f3i6qg"></video> <section class="game-card-body svelte-f3i6qg"><h1 class="svelte-f3i6qg" data-svelte-h="svelte-2ce69i">Soulwork</h1> <p class="svelte-f3i6qg" data-svelte-h="svelte-v85h17">Soulwork is a 2D platforming game that uses unique physics to solve puzzle-based levels.
458
- This project is a Time to Game Jam entry, restricting game development to be under 48
459
- hours.</p> <p class="svelte-f3i6qg" data-svelte-h="svelte-1ulwzoi">I helped make the level designing tools used by the designers to drag-and-drop objects
460
- on the stage. I also helped program the unique physics-based gameplay mechanic. This was
461
- was made in <span class="qt-unity svelte-f3i6qg">Unity</span> written using <span class="qt-cs svelte-f3i6qg">C#</span>.</p> <section class="game-link-section svelte-f3i6qg"><button type="button" class="game-button turnip-button svelte-f3i6qg" role="link" title="https://github.com/Zeyu-Li/Clockwork" data-svelte-h="svelte-pzpykb"><img alt="github icon"${add_attribute("src", GithubIcon, 0)} class="svelte-f3i6qg"></button> <button type="button" class="game-button turnip-button svelte-f3i6qg" role="link" title="https://itch.io/jam/time-to-game-jam-gadec-fall-game-jam/rate/514331" data-svelte-h="svelte-bvl96c"><img alt="itch.io icon"${add_attribute("src", ItchLogoHotLink, 0)} class="svelte-f3i6qg"></button></section></section></section>`;
462
- }
463
- })} ${validate_component(Card, "Card").$$render($$result, { overrideStyle: "align-self: flex-start;" }, {}, {
464
- content: () => {
465
- return `<section class="game-card itch-promo svelte-f3i6qg" slot="content"><h1 class="mb-12 text-center svelte-f3i6qg" data-svelte-h="svelte-10vk3r5">Check out my itch.io page for more games</h1> <section class="game-link-section svelte-f3i6qg"><button type="button" class="btn variant-filled-primary turnip-button svelte-f3i6qg" role="link" title="https://turnipxenon.itch.io/" data-svelte-h="svelte-mamccr"><img${add_attribute("src", ItchLogoHotLink, 0)} class="long-btn-image svelte-f3i6qg" alt="itch icon"> <span class="svelte-f3i6qg">TurnipXenon</span></button></section></section>`;
466
- }
467
- })}</section> ${validate_component(Card, "Card").$$render($$result, {}, {}, {
468
- content: () => {
469
- return `<section class="section-card title-card svelte-f3i6qg" slot="content" data-svelte-h="svelte-49ylrm"><h1 class="text-center svelte-f3i6qg">Projects</h1></section>`;
470
- }
471
- })} <section class="projects-section svelte-f3i6qg">${validate_component(Card, "Card").$$render($$result, {}, {}, {
472
- content: () => {
473
- return `<section class="project-card svelte-f3i6qg" slot="content"><iframe id="migrante-alberta" width="560" height="315" src="https://www.youtube.com/embed/ZemWwf8jh8E?si=RZwSfYHI-0Ael-RE" title="YouTube video player" style="border: none" allowfullscreen class="svelte-f3i6qg"></iframe> <div class="project-card-body svelte-f3i6qg"> <h2 class="svelte-f3i6qg" data-svelte-h="svelte-1eni4fk">Migrante Alberta</h2> <p class="svelte-f3i6qg" data-svelte-h="svelte-1smwex7">We developed a mobile-first cross-platform application to be used by the Canadian-based
474
- Filipino non-profit advocacy group, Migrante Alberta, to help new immigrants navigate
475
- through local services and events</p> <p class="svelte-f3i6qg">${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
476
- default: () => {
477
- return `Flutter`;
478
- }
479
- })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
480
- default: () => {
481
- return `Dart`;
482
- }
483
- })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
484
- default: () => {
485
- return `Python`;
486
- }
487
- })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
488
- default: () => {
489
- return `Django`;
490
- }
491
- })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
492
- default: () => {
493
- return `Heroku`;
494
- }
495
- })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
496
- default: () => {
497
- return `Android`;
498
- }
499
- })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
500
- default: () => {
501
- return `Postgresql`;
502
- }
503
- })}</p> <section class="game-link-section svelte-f3i6qg"><button type="button" class="btn variant-filled-primary turnip-button svelte-f3i6qg" title="https://selk.io/birb-project/trunk/" data-svelte-h="svelte-121dvtq"><img${add_attribute("src", LinkIcon, 0)} class="long-btn-image svelte-f3i6qg" alt="itch icon"> <span class="svelte-f3i6qg">cmput401.ca</span></button></section></div></section>`;
504
- }
505
- })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
506
- content: () => {
507
- return `<section class="project-card svelte-f3i6qg" slot="content"><div class="project-card-body svelte-f3i6qg"><h2 class="svelte-f3i6qg" data-svelte-h="svelte-1ir48d3">Decentralized social media</h2> <p class="svelte-f3i6qg" data-svelte-h="svelte-bywg41">We made a full stack decentralized social media app made with <span class="qt-react svelte-f3i6qg">React</span> +
508
- <span class="qt-js svelte-f3i6qg">Javascript</span> for the client code, <span class="qt-django svelte-f3i6qg">Django</span> + <span class="qt-python svelte-f3i6qg">Python</span> for the backend code, and <span class="qt-heroku svelte-f3i6qg">Heroku</span> for
509
- deployment. This project was made
510
- for
511
- our Web Applications and Architecture class.</p> <p class="svelte-f3i6qg" data-svelte-h="svelte-1mg86zd">The application can connect with three other decentralized social media app in the same class:</p> <ul class="svelte-f3i6qg" data-svelte-h="svelte-1ltib2n"><li class="svelte-f3i6qg"><a href="https://github.com/hgshah/cmput404-project/blob/main/docs/testing_other_teams.md#team-14" target="_blank" class="svelte-f3i6qg">Also
512
- a social media with the same Django + Python backend server where they act on behalf of
513
- our users interacting with theirs</a></li> <li class="svelte-f3i6qg"><a href="https://github.com/hgshah/cmput404-project/blob/main/docs/testing_other_teams.md#team-7" target="_blank" class="svelte-f3i6qg">A
514
- social media that uses Fast API + Python for their backend server</a></li> <li class="svelte-f3i6qg"><a href="https://github.com/hgshah/cmput404-project/blob/main/docs/testing_other_teams.md#team-12" target="_blank" class="svelte-f3i6qg">Another
515
- social media that has Django + Python for their backend but we have to act on behalf of
516
- our
517
- users interacting with their users</a></li></ul> <section class="game-link-section svelte-f3i6qg"><button type="button" class="game-button turnip-button svelte-f3i6qg" role="link" title="https://github.com/hgshah/cmput404-project" data-svelte-h="svelte-cv2gah"><img${add_attribute("src", GithubIcon, 0)} alt="github icon" class="svelte-f3i6qg"></button></section></div></section>`;
518
- }
519
- })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
520
- content: () => {
521
- return `<section class="project-card svelte-f3i6qg" slot="content"><img alt="Footage of a visual novel-like dynamic dialog interaction happening on the same page we are on"${add_attribute("src", WeaverFootage, 0)} class="svelte-f3i6qg"> <div class="project-card-body svelte-f3i6qg"><h2 class="svelte-f3i6qg" data-svelte-h="svelte-1tprdy5">Customized Yarnspinner interpreter and dialog runner</h2>
522
-
523
- A custom dialog interpreter, written in <span class="qt-ts svelte-f3i6qg" data-svelte-h="svelte-o30c37">Typescript</span>, that tokenizes then
524
- transpiles custom Yarnspinner dialog into a <span class="qt-ts svelte-f3i6qg" data-svelte-h="svelte-o30c37">Typescript</span> file. The said files can
525
- be used on a corresponding runner or library, also implemented alongside it, allowing the ability to play a
526
- custom-flavor of YarnSpinner dialogs on <span class="qt-svelte svelte-f3i6qg" data-svelte-h="svelte-19momqd">Svelte</span>.
527
-
528
- <section class="game-link-section svelte-f3i6qg"><button type="button" class="game-button turnip-button svelte-f3i6qg" role="link" title="https://github.com/TurnipXenon/pineapple/blob/main/docs/PineappleFiberSpec.md" data-svelte-h="svelte-7o1iz5"><img${add_attribute("src", GithubIcon, 0)} alt="github icon" class="svelte-f3i6qg"></button></section></div></section>`;
529
- }
530
- })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
531
- content: () => {
532
- return `<section class="project-card svelte-f3i6qg" slot="content"><div class="project-card-body svelte-f3i6qg"><h2 class="svelte-f3i6qg" data-svelte-h="svelte-1g6x1gh">Full-stack <span class="qt-c svelte-f3i6qg">C</span> app</h2> <p class="svelte-f3i6qg" data-svelte-h="svelte-1m2910f">A terminal-based app consisting of a server observing several terminal apps all concurrently
533
- sending updates to the server, which then broadcasts these information concurrently to all the
534
- other terminal apps connected.</p> <p class="svelte-f3i6qg" data-svelte-h="svelte-2glnqi">The project involves <span class="qt-foundation svelte-f3i6qg">multiprocessing</span> programming featuring pthreads and
535
- mutexes, and <span class="qt-foundation svelte-f3i6qg">networking</span> via sockets.</p> <section class="game-link-section svelte-f3i6qg"><button type="button" class="game-button turnip-button svelte-f3i6qg" role="link" title="https://github.com/TurnipXenon/C380-1Code/blob/main/Assignment02/DESIGN.md" data-svelte-h="svelte-ytnfwd"><img${add_attribute("src", GithubIcon, 0)} class="long-btn-image svelte-f3i6qg" alt="github icon"></button></section></div></section>`;
536
- }
537
- })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
538
- content: () => {
539
- return `<section class="project-card svelte-f3i6qg" slot="content"><img alt="A graph that visualizes the number of memory pages made by Quicksort cached within the window set as
540
- time goes by. The trend appears to look like a damping harmonic motion that does not go below the zero line. More
541
- details include the data size being 200000 entries, each data point skips 1060174 data points, with a
542
- page size of 4096 bytes, and window size of 100000 bytes."${add_attribute("src", WindowSetGraph, 0)} class="svelte-f3i6qg"> <div class="project-card-body svelte-f3i6qg"><h2 class="svelte-f3i6qg" data-svelte-h="svelte-1owlizc">Working set simulation</h2> <p class="svelte-f3i6qg" data-svelte-h="svelte-h0uhw2">A <span class="qt-c svelte-f3i6qg">C</span> program that simulates the working set model based on the output of memory
543
- addresses
544
- <span class="qt-valgrind svelte-f3i6qg">valgrind</span> detects as being accessed by a program being ran. It&#39;s
545
- implemented using a nested hashmap <span class="qt-foundation svelte-f3i6qg">data structure</span> implemented from
546
- scratch. The working set is the collection of memory pages referenced by a program within a certain time
547
- frame. It comes with a report analyzing and benchmarking how memory allocation, between sorting <span class="qt-foundation svelte-f3i6qg">algorithms</span> heapsort, quicksort, and radixsort, is affected by the window set
548
- size, page size, and their input size.</p> <section class="game-link-section svelte-f3i6qg"><button type="button" class="game-button turnip-button svelte-f3i6qg" role="link" title="https://github.com/TurnipXenon/C380-1Code/blob/main/Assignment03/REPORT.pdf" data-svelte-h="svelte-5rpf8h"><img${add_attribute("src", GithubIcon, 0)} class="long-btn-image svelte-f3i6qg" alt="github icon"> <span class="svelte-f3i6qg">Benchmark report</span></button> <button type="button" class="game-button turnip-button svelte-f3i6qg" role="link" title="https://github.com/TurnipXenon/C380-1Code/blob/main/Assignment03/DESIGN.md" data-svelte-h="svelte-1vbe2nk"><img${add_attribute("src", GithubIcon, 0)} class="long-btn-image svelte-f3i6qg" alt="github icon"> <span class="svelte-f3i6qg">Design</span></button></section></div></section>`;
549
- }
550
- })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
551
- content: () => {
552
- return `<section class="project-card svelte-f3i6qg" slot="content"><video playsinline autoplay muted loop preload="none" class="svelte-f3i6qg" data-svelte-h="svelte-m5p9b7"><source${add_attribute("src", ThisWebsiteFootage, 0)} type="video/mp4" class="svelte-f3i6qg">
553
- video unavailable. original video contains clips of this website being resized and light-dark mode being
554
- toggled.</video> <div class="project-card-body svelte-f3i6qg"><h2 class="svelte-f3i6qg" data-svelte-h="svelte-5puumm">This webpage!</h2> <p class="svelte-f3i6qg" data-svelte-h="svelte-1te9sdx">The webpage is made of two parts. The webpage that has the content for everything here, I&#39;ve
555
- lovingly called Seaweed. I kept seaweed as a private package. On the other hand, the base package which I
556
- want to use for all spin offs of my websites is called Pineapple and have kept that codebase public.</p> <p class="svelte-f3i6qg">${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
557
- default: () => {
558
- return `Svelte`;
559
- }
560
- })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
561
- default: () => {
562
- return `Skeleton (Svelte UI library)`;
563
- }
564
- })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
565
- default: () => {
566
- return `Typescript`;
1026
+ return `<div slot="content" class="default-card advanced-setting svelte-1r5yyuh"><h1 data-svelte-h="svelte-gt787v">Advanced settings</h1> <p data-svelte-h="svelte-2s1b5f">This one is for those curious how I customize this page.</p> ${validate_component(SlideToggle, "SlideToggle").$$render(
1027
+ $$result,
1028
+ {
1029
+ name: "advanced-setting-slider",
1030
+ checked: isAdvanceSettingOn
1031
+ },
1032
+ {
1033
+ checked: ($$value) => {
1034
+ isAdvanceSettingOn = $$value;
1035
+ $$settled = false;
1036
+ }
1037
+ },
1038
+ {
1039
+ default: () => {
1040
+ return `Advanced settings: ${escape(isAdvanceSettingOn ? "On" : "Off")}`;
1041
+ }
567
1042
  }
568
- })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
569
- default: () => {
570
- return `Vercel`;
1043
+ )} ${isAdvanceSettingOn ? `${validate_component(SlideToggle, "SlideToggle").$$render(
1044
+ $$result,
1045
+ {
1046
+ name: "game-section-slider",
1047
+ checked: gameSectionFirst
1048
+ },
1049
+ {
1050
+ checked: ($$value) => {
1051
+ gameSectionFirst = $$value;
1052
+ $$settled = false;
1053
+ }
1054
+ },
1055
+ {
1056
+ default: () => {
1057
+ return `Should game section appear first over projects: ${escape(gameSectionFirst ? "On" : "Off")}`;
1058
+ }
571
1059
  }
572
- })} ${validate_component(Chip, "Chip").$$render($$result, {}, {}, {
573
- default: () => {
574
- return `YarnSpinner`;
1060
+ )} ${validate_component(SlideToggle, "SlideToggle").$$render(
1061
+ $$result,
1062
+ {
1063
+ name: "fun-note-slider",
1064
+ checked: shouldAddFunNote
1065
+ },
1066
+ {
1067
+ checked: ($$value) => {
1068
+ shouldAddFunNote = $$value;
1069
+ $$settled = false;
1070
+ }
1071
+ },
1072
+ {
1073
+ default: () => {
1074
+ return `Should add fun note in description: ${escape(shouldAddFunNote ? "On" : "Off")}`;
1075
+ }
575
1076
  }
576
- })}</p> <section class="game-link-section svelte-f3i6qg"><button type="button" class="btn variant-filled-primary turnip-button svelte-f3i6qg" role="link" title="https://github.com/TurnipXenon/pineapple" data-svelte-h="svelte-4dm4xx"><img${add_attribute("src", GithubIcon, 0)} class="long-btn-image svelte-f3i6qg" alt="github icon"></button></section></div></section>`;
577
- }
578
- })} ${validate_component(Card, "Card").$$render($$result, {}, {}, {
579
- content: () => {
580
- return `<section class="project-card svelte-f3i6qg" slot="content"><div class="project-card-body svelte-f3i6qg"><h2 class="svelte-f3i6qg" data-svelte-h="svelte-1vw6xk1">Mock Uber App</h2> <p class="svelte-f3i6qg" data-svelte-h="svelte-1n8bpk7">A course project app meant to emulate how Uber works by playing with <span class="qt-google svelte-f3i6qg">Google Maps API</span>.</p> <p class="svelte-f3i6qg" data-svelte-h="svelte-1ob0wfp">I implemented all interfaces related to the NoSQL cloud database <span class="qt-firebase qt-google qt-infra svelte-f3i6qg">Firebase</span>, making writing code easier for other programmers (<span class="qt-android svelte-f3i6qg">Android</span> / <span class="qt-java svelte-f3i6qg">Java</span>). I also wrote documentation to said
581
- code and added instrumented tests that are tested by the continuous integration tool <span class="qt-infra svelte-f3i6qg">Travis CI</span>, ensuring that our code is tested</p> <section class="game-link-section svelte-f3i6qg"> <button type="button" class="game-button turnip-button svelte-f3i6qg" role="link" title="https://github.com/CMPUT301W20T10/UberApp" data-svelte-h="svelte-9lexjr"><img${add_attribute("src", GithubIcon, 0)} class="long-btn-image svelte-f3i6qg" alt="github icon"></button></section></div></section>`;
1077
+ )} <h3 class="svelte-1r5yyuh" data-svelte-h="svelte-1bh8env">Query terms to bold</h3> <div class="query-term-grid svelte-1r5yyuh">${each(qtMap.entries(), ([term, shouldBold]) => {
1078
+ return ` <button class="${"chip " + escape(
1079
+ shouldBold ? "variant-filled-tertiary" : "variant-soft-tertiary",
1080
+ true
1081
+ )}"> ${shouldBold ? `✓` : ``} ${escape(term)} </button>`;
1082
+ })}</div> <br> <p data-svelte-h="svelte-1e17ji">Copy the url below and open a new page with it</p> ${validate_component(CodeBlock, "CodeBlock").$$render($$result, { language: "url", code: advancedUrl }, {}, {})}` : ``}</div>`;
582
1083
  }
583
- })}</section></main>`;
1084
+ })}` : ``}</main>`;
584
1085
  }
585
1086
  }
586
1087
  )}`;