@turnipxenon/pineapple 5.0.0 → 5.1.0

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 (52) hide show
  1. package/README.md +11 -11
  2. package/dist/ui/components/FourPartCard.svelte +4 -0
  3. package/dist/ui/components/SortDropdown.svelte +50 -0
  4. package/dist/ui/components/SortDropdown.svelte.d.ts +9 -0
  5. package/dist/ui/components/SortDropdown.svelte.d.ts.map +1 -0
  6. package/dist/ui/components/TagFilter.svelte +32 -0
  7. package/dist/ui/components/TagFilter.svelte.d.ts +9 -0
  8. package/dist/ui/components/TagFilter.svelte.d.ts.map +1 -0
  9. package/dist/ui/components/accordion/PinyaAccordion.svelte +5 -3
  10. package/dist/ui/components/accordion/PinyaAccordion.svelte.d.ts.map +1 -1
  11. package/dist/ui/elements/CodeBlock/CodeBlock.svelte +12 -6
  12. package/dist/ui/elements/PineappleSwitch.svelte +2 -2
  13. package/dist/ui/elements/PineappleSwitch.svelte.d.ts +1 -1
  14. package/dist/ui/elements/PineappleSwitch.svelte.d.ts.map +1 -1
  15. package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte +169 -26
  16. package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte.d.ts.map +1 -1
  17. package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts +6 -7
  18. package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts.map +1 -1
  19. package/dist/ui/modules/experience/ExampleJob1.svelte +79 -0
  20. package/dist/ui/modules/experience/ExampleJob1.svelte.d.ts +26 -0
  21. package/dist/ui/modules/experience/ExampleJob1.svelte.d.ts.map +1 -0
  22. package/dist/ui/modules/experience/ExampleJob2.svelte +74 -0
  23. package/dist/ui/modules/experience/ExampleJob2.svelte.d.ts +25 -0
  24. package/dist/ui/modules/experience/ExampleJob2.svelte.d.ts.map +1 -0
  25. package/dist/ui/modules/experience/index.d.ts +3 -0
  26. package/dist/ui/modules/experience/index.d.ts.map +1 -0
  27. package/dist/ui/modules/experience/index.js +2 -0
  28. package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte +7 -9
  29. package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte.d.ts.map +1 -1
  30. package/dist/ui/modules/projects/Hepcat.svelte +5 -1
  31. package/dist/ui/modules/projects/Hepcat.svelte.d.ts +4 -1
  32. package/dist/ui/modules/projects/Hepcat.svelte.d.ts.map +1 -1
  33. package/dist/ui/modules/projects/Pengi.svelte +4 -1
  34. package/dist/ui/modules/projects/Pengi.svelte.d.ts +4 -1
  35. package/dist/ui/modules/projects/Pengi.svelte.d.ts.map +1 -1
  36. package/dist/ui/modules/projects/Soulwork.svelte +4 -1
  37. package/dist/ui/modules/projects/Soulwork.svelte.d.ts +4 -1
  38. package/dist/ui/modules/projects/Soulwork.svelte.d.ts.map +1 -1
  39. package/dist/ui/modules/projects/ThisWebpage.svelte +4 -2
  40. package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts +3 -1
  41. package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts.map +1 -1
  42. package/dist/ui/modules/universal-overlay/UniversalOverlay.svelte +0 -1
  43. package/dist/ui/modules/universal-overlay/UniversalOverlay.svelte.d.ts.map +1 -1
  44. package/dist/ui/templates/SeaweedLayout/EntryGroup.svelte +177 -29
  45. package/dist/ui/templates/SeaweedLayout/EntryGroup.svelte.d.ts.map +1 -1
  46. package/dist/ui/templates/SeaweedLayout/ProjectGroupConfig.svelte +1 -3
  47. package/dist/ui/templates/SeaweedLayout/SeaweedLayout.svelte +188 -44
  48. package/dist/ui/templates/SeaweedLayout/SeaweedLayout.svelte.d.ts.map +1 -1
  49. package/dist/ui/templates/SeaweedLayout/props.d.ts +18 -2
  50. package/dist/ui/templates/SeaweedLayout/props.d.ts.map +1 -1
  51. package/dist/ui/templates/SeaweedLayout/props.js +8 -1
  52. package/package.json +2 -2
@@ -0,0 +1,26 @@
1
+ import type { ProjectComponentProps } from "../../templates/SeaweedLayout/ProjectComponentProps";
2
+ declare const key = "Software Engineer at Old Company";
3
+ declare const dateStarted = "2022-01-01";
4
+ declare const dateFinished = "2024-12-31";
5
+ declare const tags: string[];
6
+ export { component, key, dateStarted, dateFinished, tags };
7
+ declare const component: (props: ProjectComponentProps) => ReturnType<import("svelte").Snippet>;
8
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
9
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
10
+ $$bindings?: Bindings;
11
+ } & Exports;
12
+ (internal: unknown, props: {
13
+ $$events?: Events;
14
+ $$slots?: Slots;
15
+ }): Exports & {
16
+ $set?: any;
17
+ $on?: any;
18
+ };
19
+ z_$$bindings?: Bindings;
20
+ }
21
+ declare const ExampleJob1: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
22
+ [evt: string]: CustomEvent<any>;
23
+ }, {}, {}, string>;
24
+ type ExampleJob1 = InstanceType<typeof ExampleJob1>;
25
+ export default ExampleJob1;
26
+ //# sourceMappingURL=ExampleJob1.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExampleJob1.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/experience/ExampleJob1.svelte.ts"],"names":[],"mappings":"AAKC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAEnG,QAAA,MAAM,GAAG,qCAAqC,CAAC;AAC/C,QAAA,MAAM,WAAW,eAAe,CAAC;AACjC,QAAA,MAAM,YAAY,eAAe,CAAC;AAClC,QAAA,MAAM,IAAI,UAAkC,CAAC;AAI7C,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AACzD,QAAA,MAAM,SAAS,GAAyB,OAAO,qBAAqB,KAAqB,UAAU,CAAC,OAAO,QAAQ,EAAE,OAAO,CAyBlG,CAAC;AAe9B,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,WAAW;;kBAA+E,CAAC;AAC/E,KAAK,WAAW,GAAG,YAAY,CAAC,OAAO,WAAW,CAAC,CAAC;AACtD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,74 @@
1
+ <!-- TODO: Documentation: consider documentation showcase -->
2
+
3
+ <script module lang="ts">
4
+ import type { ProjectComponentProps } from "../../templates/SeaweedLayout/ProjectComponentProps";
5
+ import { default as FourPartCard } from "../../components/FourPartCard.svelte";
6
+ import { TextChip } from "../../elements/TextChip";
7
+
8
+ const key = "Senior Developer at Current Company";
9
+ const dateStarted = "2024-01-01";
10
+ // No dateFinished export - indicates ongoing position
11
+ // qt-ongoing, qt-systems, qt-performance, qt-infrastructure
12
+ const tags = ["ongoing", "rust", "systems", "performance", "infrastructure"];
13
+ export { component, key, dateStarted, tags };
14
+ </script>
15
+
16
+ {#snippet component(props: ProjectComponentProps)}
17
+ <FourPartCard>
18
+ {#snippet headerCover()}
19
+ <div class="company-logo-placeholder">
20
+ <h1>CC</h1>
21
+ </div>
22
+ {/snippet}
23
+
24
+ {#snippet header()}
25
+ <h3>Senior Developer</h3>
26
+ <h4>Current Company</h4>
27
+ <p class="date-range">Jan 2024 - Present</p>
28
+ {/snippet}
29
+
30
+ <p>
31
+ Currently working on high-performance systems using
32
+ <span class="qt-rust">Rust</span>.
33
+ Leading development of critical infrastructure components and mentoring junior developers to preach our love of
34
+ <span class="qt-rust">Rust</span>. Did I forget to mention <span class="qt-rust">RUST</span>?!?!
35
+ </p>
36
+
37
+ <div class="text-chip-container">
38
+ {#each tags as t (t)}
39
+ <TextChip queryClass="qt-{t}">{t}</TextChip>
40
+ {/each}
41
+ </div>
42
+ </FourPartCard>
43
+ {/snippet}
44
+
45
+ <style>
46
+ .company-logo-placeholder {
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ width: 100%;
51
+ height: 100%;
52
+ min-height: 150px;
53
+ background: linear-gradient(135deg, var(--color-secondary-500), var(--color-tertiary-500));
54
+ color: white;
55
+ font-size: 2rem;
56
+ font-weight: bold;
57
+ }
58
+
59
+ .date-range {
60
+ font-size: 0.875rem;
61
+ color: var(--color-text-secondary);
62
+ margin-bottom: 0.5rem;
63
+ }
64
+
65
+ h4 {
66
+ margin-top: 0.25rem;
67
+ margin-bottom: 0.5rem;
68
+ color: var(--color-text-secondary);
69
+ }
70
+
71
+ .ongoing-badge {
72
+ margin-top: 0.5rem;
73
+ }
74
+ </style>
@@ -0,0 +1,25 @@
1
+ import type { ProjectComponentProps } from "../../templates/SeaweedLayout/ProjectComponentProps";
2
+ declare const component: (props: ProjectComponentProps) => ReturnType<import("svelte").Snippet>;
3
+ declare const key = "Senior Developer at Current Company";
4
+ declare const dateStarted = "2024-01-01";
5
+ declare const tags: string[];
6
+ export { component, key, dateStarted, tags };
7
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
8
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
9
+ $$bindings?: Bindings;
10
+ } & Exports;
11
+ (internal: unknown, props: {
12
+ $$events?: Events;
13
+ $$slots?: Slots;
14
+ }): Exports & {
15
+ $set?: any;
16
+ $on?: any;
17
+ };
18
+ z_$$bindings?: Bindings;
19
+ }
20
+ declare const ExampleJob2: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
21
+ [evt: string]: CustomEvent<any>;
22
+ }, {}, {}, string>;
23
+ type ExampleJob2 = InstanceType<typeof ExampleJob2>;
24
+ export default ExampleJob2;
25
+ //# sourceMappingURL=ExampleJob2.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExampleJob2.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/experience/ExampleJob2.svelte.ts"],"names":[],"mappings":"AAGC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAGnG,QAAA,MAAM,SAAS,GAAyB,OAAO,qBAAqB,KAAqB,UAAU,CAAC,OAAO,QAAQ,EAAE,OAAO,CA2BhG,CAAC;AAE7B,QAAA,MAAM,GAAG,wCAAwC,CAAC;AAClD,QAAA,MAAM,WAAW,eAAe,CAAC;AAGjC,QAAA,MAAM,IAAI,UAAkE,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAW9C,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,WAAW;;kBAA+E,CAAC;AAC/E,KAAK,WAAW,GAAG,YAAY,CAAC,OAAO,WAAW,CAAC,CAAC;AACtD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * as ExampleJob1 from './ExampleJob1.svelte';
2
+ export * as ExampleJob2 from './ExampleJob2.svelte';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/experience/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,WAAW,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * as ExampleJob1 from './ExampleJob1.svelte';
2
+ export * as ExampleJob2 from './ExampleJob2.svelte';
@@ -16,16 +16,15 @@
16
16
  { label: "Tagalog", value: "tl" }
17
17
  ];
18
18
 
19
- let selectedCountry = $state(getLocale());
19
+ let selectedCountry = $state([getLocale()]);
20
20
 
21
- const onValueChange = (e: { value: ComboxData["value"] | undefined }) => {
22
- if (!e.value) return;
21
+ const onValueChange = (e: ComboxData["value"][] | undefined) => {
22
+ if (!e || e.length === 0) return;
23
23
 
24
- const data = comboboxData.find((d) => d.value === e.value);
25
- if (data) {
26
- selectedCountry = data.value;
24
+ const data = comboboxData.filter(v => e.includes(v.value));
25
+ if (data && data.length > 0) {
27
26
  const pathname = deLocalizeHref(location.href);
28
- location.href = localizeHref(pathname, { locale: data.value });
27
+ location.href = localizeHref(pathname, { locale: data[0].value });
29
28
  }
30
29
  };
31
30
 
@@ -34,8 +33,7 @@
34
33
 
35
34
  <PinyaCombobox
36
35
  data={comboboxData}
37
- value={selectedCountry}
38
- defaultValue={selectedCountry}
36
+ bind:value={selectedCountry}
39
37
  label="Select Language"
40
38
  placeholder="Select Language"
41
39
  {onValueChange}
@@ -1 +1 @@
1
- {"version":3,"file":"LanguagePicker.svelte.d.ts","sourceRoot":"","sources":["../../../../../src/lib/ui/modules/modals/general-settings/LanguagePicker.svelte.ts"],"names":[],"mappings":"AA6CA,QAAA,MAAM,cAAc,2DAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"LanguagePicker.svelte.d.ts","sourceRoot":"","sources":["../../../../../src/lib/ui/modules/modals/general-settings/LanguagePicker.svelte.ts"],"names":[],"mappings":"AA4CA,QAAA,MAAM,cAAc,2DAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -11,7 +11,11 @@
11
11
  import { ButtonVariant } from "../../elements/PinyaButtonCommon/ButtonVariant";
12
12
 
13
13
  const key = "Hepcat";
14
- export { component, key };
14
+ const dateStarted = "2020-01-01";
15
+ const dateFinished = "2020-04-15";
16
+ const tags = ["unity", "csharp", "game", "rhythm", "rpgmaker"];
17
+ // type SnippetMeta at src/lib/ui/templates/SeaweedLayout/props.ts:6
18
+ export { component, key, dateStarted, dateFinished, tags };
15
19
  </script>
16
20
 
17
21
  {#snippet component(props: ProjectComponentProps)}
@@ -1,7 +1,10 @@
1
1
  import type { ProjectComponentProps } from "../../templates/SeaweedLayout/ProjectComponentProps";
2
2
  declare const component: (props: ProjectComponentProps) => ReturnType<import("svelte").Snippet>;
3
3
  declare const key = "Hepcat";
4
- export { component, key };
4
+ declare const dateStarted = "2020-01-01";
5
+ declare const dateFinished = "2020-04-15";
6
+ declare const tags: string[];
7
+ export { component, key, dateStarted, dateFinished, tags };
5
8
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
6
9
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
7
10
  $$bindings?: Bindings;
@@ -1 +1 @@
1
- {"version":3,"file":"Hepcat.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/projects/Hepcat.svelte.ts"],"names":[],"mappings":"AAKC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAMnG,QAAA,MAAM,SAAS,GAAyB,OAAO,qBAAqB,KAAqB,UAAU,CAAC,OAAO,QAAQ,EAAE,OAAO,CAwChG,CAAC;AAE7B,QAAA,MAAM,GAAG,WAAW,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAY3B,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,MAAM;;kBAA+E,CAAC;AAC1E,KAAK,MAAM,GAAG,YAAY,CAAC,OAAO,MAAM,CAAC,CAAC;AAC5C,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"Hepcat.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/projects/Hepcat.svelte.ts"],"names":[],"mappings":"AAKC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAMnG,QAAA,MAAM,SAAS,GAAyB,OAAO,qBAAqB,KAAqB,UAAU,CAAC,OAAO,QAAQ,EAAE,OAAO,CAwChG,CAAC;AAE7B,QAAA,MAAM,GAAG,WAAW,CAAC;AACrB,QAAA,MAAM,WAAW,eAAe,CAAC;AACjC,QAAA,MAAM,YAAY,eAAe,CAAC;AAClC,QAAA,MAAM,IAAI,UAAoD,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAY5D,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,MAAM;;kBAA+E,CAAC;AAC1E,KAAK,MAAM,GAAG,YAAY,CAAC,OAAO,MAAM,CAAC,CAAC;AAC5C,eAAe,MAAM,CAAC"}
@@ -11,7 +11,10 @@
11
11
  import { ButtonVariant } from "../../elements/PinyaButtonCommon/ButtonVariant";
12
12
 
13
13
  const key = "Pengi";
14
- export { component, key };
14
+ const dateStarted = "2020-08-01";
15
+ const dateFinished = "2020-12-15";
16
+ const tags = ["unity", "csharp", "game", "narrative", "yarnspinner"];
17
+ export { component, key, dateStarted, dateFinished, tags };
15
18
  </script>
16
19
 
17
20
  {#snippet component(props: ProjectComponentProps)}
@@ -1,7 +1,10 @@
1
1
  import type { ProjectComponentProps } from "../../templates/SeaweedLayout/ProjectComponentProps";
2
2
  declare const component: (props: ProjectComponentProps) => ReturnType<import("svelte").Snippet>;
3
3
  declare const key = "Pengi";
4
- export { component, key };
4
+ declare const dateStarted = "2020-08-01";
5
+ declare const dateFinished = "2020-12-15";
6
+ declare const tags: string[];
7
+ export { component, key, dateStarted, dateFinished, tags };
5
8
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
6
9
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
7
10
  $$bindings?: Bindings;
@@ -1 +1 @@
1
- {"version":3,"file":"Pengi.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/projects/Pengi.svelte.ts"],"names":[],"mappings":"AAKC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAMnG,QAAA,MAAM,SAAS,GAAyB,OAAO,qBAAqB,KAAqB,UAAU,CAAC,OAAO,QAAQ,EAAE,OAAO,CAoChG,CAAC;AAE7B,QAAA,MAAM,GAAG,UAAU,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAS3B,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,KAAK;;kBAA+E,CAAC;AACzE,KAAK,KAAK,GAAG,YAAY,CAAC,OAAO,KAAK,CAAC,CAAC;AAC1C,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Pengi.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/projects/Pengi.svelte.ts"],"names":[],"mappings":"AAKC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAMnG,QAAA,MAAM,SAAS,GAAyB,OAAO,qBAAqB,KAAqB,UAAU,CAAC,OAAO,QAAQ,EAAE,OAAO,CAoChG,CAAC;AAE7B,QAAA,MAAM,GAAG,UAAU,CAAC;AACpB,QAAA,MAAM,WAAW,eAAe,CAAC;AACjC,QAAA,MAAM,YAAY,eAAe,CAAC;AAClC,QAAA,MAAM,IAAI,UAA0D,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAS5D,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,KAAK;;kBAA+E,CAAC;AACzE,KAAK,KAAK,GAAG,YAAY,CAAC,OAAO,KAAK,CAAC,CAAC;AAC1C,eAAe,KAAK,CAAC"}
@@ -11,7 +11,10 @@
11
11
  import { ButtonVariant } from "../../elements/PinyaButtonCommon/ButtonVariant";
12
12
 
13
13
  const key = "Soulwork";
14
- export { component, key };
14
+ const dateStarted = "2019-11-09";
15
+ const dateFinished = "2019-11-10";
16
+ const tags = ["unity", "csharp", "game", "gamejam", "physics"];
17
+ export { component, key, dateStarted, dateFinished, tags };
15
18
  </script>
16
19
 
17
20
  {#snippet component(props: ProjectComponentProps)}
@@ -1,7 +1,10 @@
1
1
  import type { ProjectComponentProps } from "../../templates/SeaweedLayout";
2
2
  declare const component: (props: ProjectComponentProps) => ReturnType<import("svelte").Snippet>;
3
3
  declare const key = "Soulwork";
4
- export { component, key };
4
+ declare const dateStarted = "2019-11-09";
5
+ declare const dateFinished = "2019-11-10";
6
+ declare const tags: string[];
7
+ export { component, key, dateStarted, dateFinished, tags };
5
8
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
6
9
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
7
10
  $$bindings?: Bindings;
@@ -1 +1 @@
1
- {"version":3,"file":"Soulwork.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/projects/Soulwork.svelte.ts"],"names":[],"mappings":"AAKC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAM7E,QAAA,MAAM,SAAS,GAAyB,OAAO,qBAAqB,KAAqB,UAAU,CAAC,OAAO,QAAQ,EAAE,OAAO,CAiChG,CAAC;AAE7B,QAAA,MAAM,GAAG,aAAa,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAS3B,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,QAAQ;;kBAA+E,CAAC;AAC5E,KAAK,QAAQ,GAAG,YAAY,CAAC,OAAO,QAAQ,CAAC,CAAC;AAChD,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"Soulwork.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/projects/Soulwork.svelte.ts"],"names":[],"mappings":"AAKC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAM7E,QAAA,MAAM,SAAS,GAAyB,OAAO,qBAAqB,KAAqB,UAAU,CAAC,OAAO,QAAQ,EAAE,OAAO,CAiChG,CAAC;AAE7B,QAAA,MAAM,GAAG,aAAa,CAAC;AACvB,QAAA,MAAM,WAAW,eAAe,CAAC;AACjC,QAAA,MAAM,YAAY,eAAe,CAAC;AAClC,QAAA,MAAM,IAAI,UAAoD,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAS5D,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,QAAQ;;kBAA+E,CAAC;AAC5E,KAAK,QAAQ,GAAG,YAAY,CAAC,OAAO,QAAQ,CAAC,CAAC;AAChD,eAAe,QAAQ,CAAC"}
@@ -12,7 +12,9 @@
12
12
  import { ButtonVariant } from "../../elements/PinyaButtonCommon/ButtonVariant";
13
13
 
14
14
  const key = "This Webpage";
15
- export { component, key };
15
+ const dateStarted = "2023-06-01";
16
+ const tags = ["svelte", "typescript", "web", "tailwind", "postgres", "prisma", "ongoing", "database"];
17
+ export { component, key, dateStarted, tags };
16
18
  </script>
17
19
 
18
20
  {#snippet component(props: ProjectComponentProps)}
@@ -48,7 +50,7 @@
48
50
  <TextChip queryClass="qt-svelte">Svelte 5</TextChip>
49
51
  <TextChip queryClass="qt-tailwind">Tailwind 4</TextChip>
50
52
  <TextChip queryClass="qt-skeleton">Skeleton (Svelte UI library)</TextChip>
51
- <TextChip queryClass="qt-ts">Typescript</TextChip>
53
+ <TextChip queryClass="qt-typescript">Typescript</TextChip>
52
54
  <TextChip queryClass="qt-vercel qt-cicd">Vercel</TextChip>
53
55
  <TextChip queryClass="qt-gamedev">YarnSpinner</TextChip>
54
56
  <TextChip queryClass="qt-postgres qt-db">Postgres (SQL database)</TextChip>
@@ -1,7 +1,9 @@
1
1
  import type { ProjectComponentProps } from "../../templates/SeaweedLayout/ProjectComponentProps";
2
2
  declare const component: (props: ProjectComponentProps) => ReturnType<import("svelte").Snippet>;
3
3
  declare const key = "This Webpage";
4
- export { component, key };
4
+ declare const dateStarted = "2023-06-01";
5
+ declare const tags: string[];
6
+ export { component, key, dateStarted, tags };
5
7
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
6
8
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
7
9
  $$bindings?: Bindings;
@@ -1 +1 @@
1
- {"version":3,"file":"ThisWebpage.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/projects/ThisWebpage.svelte.ts"],"names":[],"mappings":"AAMC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAMnG,QAAA,MAAM,SAAS,GAAyB,OAAO,qBAAqB,KAAqB,UAAU,CAAC,OAAO,QAAQ,EAAE,OAAO,CAgDhG,CAAC;AAE7B,QAAA,MAAM,GAAG,iBAAiB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;AAS3B,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,WAAW;;kBAA+E,CAAC;AAC/E,KAAK,WAAW,GAAG,YAAY,CAAC,OAAO,WAAW,CAAC,CAAC;AACtD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ThisWebpage.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/projects/ThisWebpage.svelte.ts"],"names":[],"mappings":"AAMC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AAMnG,QAAA,MAAM,SAAS,GAAyB,OAAO,qBAAqB,KAAqB,UAAU,CAAC,OAAO,QAAQ,EAAE,OAAO,CAgDhG,CAAC;AAE7B,QAAA,MAAM,GAAG,iBAAiB,CAAC;AAC3B,QAAA,MAAM,WAAW,eAAe,CAAC;AACjC,QAAA,MAAM,IAAI,UAA2F,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAS9C,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,WAAW;;kBAA+E,CAAC;AAC/E,KAAK,WAAW,GAAG,YAAY,CAAC,OAAO,WAAW,CAAC,CAAC;AACtD,eAAe,WAAW,CAAC"}
@@ -50,7 +50,6 @@ See panels:
50
50
 
51
51
  dialogManager.currentReadableState.subscribe((value) => {
52
52
  isHidden = value === DialogState.Invisible;
53
- console.log(value, DialogState.Invisible, isHidden)
54
53
  });
55
54
 
56
55
  dialogManager.update(0);
@@ -1 +1 @@
1
- {"version":3,"file":"UniversalOverlay.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/universal-overlay/UniversalOverlay.svelte.ts"],"names":[],"mappings":"AAmHA;;;;;;;GAOG;AACH,QAAA,MAAM,gBAAgB,2DAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"UniversalOverlay.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/universal-overlay/UniversalOverlay.svelte.ts"],"names":[],"mappings":"AAkHA;;;;;;;GAOG;AACH,QAAA,MAAM,gBAAgB,2DAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -1,42 +1,161 @@
1
1
  <!-- TODO: Documentation: consider documentation showcase -->
2
2
 
3
3
  <script lang="ts">
4
+ import SortDropdown from "../../components/SortDropdown.svelte";
5
+ import TagFilter from "../../components/TagFilter.svelte";
4
6
  import { PinyaCard } from "../../elements/PinyaCard";
5
7
  import type { ProjectGroup, SnippetMeta } from "./";
8
+ import { SectionType } from "./props";
6
9
 
7
10
  let {
8
11
  title,
9
12
  entryList,
10
- projectComponentProps
13
+ projectComponentProps,
14
+ // New props for Seaweed 3
15
+ sectionType = SectionType.Projects,
16
+ showFilter = false,
17
+ showSort = false,
18
+ showMoreLimit = 0
11
19
  }: ProjectGroup = $props();
12
20
 
13
- const isSpecial = $derived(entryList.length % 3 === 1);
21
+ // State
22
+ let selectedTags = $state<string[]>([]);
23
+ let sortBy = $state<string[]>(["default"]);
24
+ let isExpanded = $state(false);
14
25
 
15
- let normalUiList: SnippetMeta[] = $derived(isSpecial
16
- ? [...entryList.slice(0, -4)]
17
- : [...entryList]);
18
- let overflowUiList: SnippetMeta[] = $derived(isSpecial
19
- ? [...entryList.slice(-4)]
20
- : []);
26
+ // Derived values
27
+ const allTags = $derived([...new Set(entryList.flatMap(e => e.tags ?? []))]);
28
+
29
+ const filteredList = $derived(
30
+ selectedTags.length === 0
31
+ ? entryList
32
+ : entryList.filter(e => e.tags?.some(t => selectedTags.includes(t)))
33
+ );
34
+
35
+ function sortEntries(list: SnippetMeta[], sort: string): SnippetMeta[] {
36
+ const sorted = [...list];
37
+ switch (sort) {
38
+ case "date-desc":
39
+ return sorted.sort((a, b) => {
40
+ // Entries without dateFinished go to the bottom
41
+ if (!a.dateFinished) return 1;
42
+ if (!b.dateFinished) return -1;
43
+ return new Date(b.dateFinished).getTime() - new Date(a.dateFinished).getTime();
44
+ });
45
+ case "date-asc":
46
+ return sorted.sort((a, b) => {
47
+ // Entries without dateFinished go to the bottom
48
+ if (!a.dateFinished) return 1;
49
+ if (!b.dateFinished) return -1;
50
+ return new Date(a.dateFinished).getTime() - new Date(b.dateFinished).getTime();
51
+ });
52
+ case "duration-desc":
53
+ return sorted.sort((a, b) => {
54
+ const durationA = getDuration(a);
55
+ const durationB = getDuration(b);
56
+ // Entries without valid dates go to the bottom
57
+ if (durationA === 0) return 1;
58
+ if (durationB === 0) return -1;
59
+ return durationB - durationA;
60
+ });
61
+ case "duration-asc":
62
+ return sorted.sort((a, b) => {
63
+ const durationA = getDuration(a);
64
+ const durationB = getDuration(b);
65
+ // Entries without valid dates go to the bottom
66
+ if (durationA === 0) return 1;
67
+ if (durationB === 0) return -1;
68
+ return durationA - durationB;
69
+ });
70
+ default:
71
+ return sorted;
72
+ }
73
+ }
74
+
75
+ function getDuration(entry: SnippetMeta): number {
76
+ if (!entry.dateStarted) return 0;
77
+
78
+ if (!entry.dateFinished) {
79
+ return new Date().getTime() - new Date(entry.dateStarted).getTime();
80
+ }
81
+
82
+ return new Date(entry.dateFinished).getTime() - new Date(entry.dateStarted).getTime();
83
+ }
84
+
85
+ const sortedList = $derived(sortEntries(filteredList, sortBy.length > 0 ? sortBy[0] : "default"));
86
+
87
+ const visibleList = $derived(
88
+ showMoreLimit > 0 && !isExpanded
89
+ ? sortedList.slice(0, showMoreLimit)
90
+ : sortedList
91
+ );
92
+
93
+ const hasMore = $derived(showMoreLimit > 0 && sortedList.length > showMoreLimit);
21
94
  </script>
22
95
 
23
- <div class="mt-8 flex flex-col items-center">
96
+ <div class="flex flex-col items-center entry-group-wrapper">
24
97
  <PinyaCard class="group-header">
25
- <h2 class="m-auto">{title}</h2>
98
+ <div class="header-content">
99
+ <h2>{title}</h2>
100
+ <div class="header-controls">
101
+ {#if showFilter && allTags.length > 0}
102
+ <TagFilter bind:selectedTags {allTags} />
103
+ {/if}
104
+ {#if showSort}
105
+ <SortDropdown bind:sortBy={sortBy} {sectionType} />
106
+ {/if}
107
+ </div>
108
+ </div>
26
109
  </PinyaCard>
27
- <div class="normal-project-container">
28
- {#each normalUiList as ui (ui.key)}
29
- {@render ui.component(projectComponentProps ?? {})}
30
- {/each}
31
- </div>
32
- <div class="overflow-project-container">
33
- {#each overflowUiList as ui (ui.key)}
34
- {@render ui.component(projectComponentProps ?? {})}
35
- {/each}
36
- </div>
110
+
111
+ {#if sortedList.length === 0}
112
+ <div class="no-results">
113
+ <p>No items match your filter</p>
114
+ </div>
115
+ {:else}
116
+ <div class="normal-project-container">
117
+ {#each visibleList as ui (ui.key)}
118
+ {@render ui.component(projectComponentProps ?? {})}
119
+ {/each}
120
+ </div>
121
+
122
+ {#if hasMore}
123
+ <button class="show-more-btn" onclick={() => isExpanded = !isExpanded}>
124
+ {isExpanded ? "Show less" : `Click to see ${sortedList.length - visibleList.length} more...`}
125
+ </button>
126
+ {/if}
127
+ {/if}
37
128
  </div>
38
129
 
39
130
  <style>
131
+ .header-content {
132
+ display: flex;
133
+ flex-direction: column;
134
+ gap: 1rem;
135
+ width: 100%;
136
+ }
137
+
138
+ @media (min-width: 768px) {
139
+ .header-content {
140
+ flex-direction: row;
141
+ justify-content: space-between;
142
+ align-items: center;
143
+ }
144
+ }
145
+
146
+ .header-controls {
147
+ display: flex;
148
+ flex-direction: column;
149
+ gap: 0.5rem;
150
+ }
151
+
152
+ @media (min-width: 768px) {
153
+ .header-controls {
154
+ flex-direction: row;
155
+ gap: 1rem;
156
+ }
157
+ }
158
+
40
159
  .normal-project-container {
41
160
  display: flex;
42
161
  flex-wrap: wrap;
@@ -49,21 +168,50 @@
49
168
  align-items: start;
50
169
  }
51
170
 
52
- .overflow-project-container {
53
- display: flex;
54
- flex-wrap: wrap;
55
- gap: 2rem;
56
- margin: auto;
57
- /* 2 containers + 1 gap + extra rem */
58
- max-width: calc((28rem * 2) + 3rem);
59
- justify-content: center;
60
- align-items: start;
171
+ :global {
172
+ .upper-section-style .normal-project-container > .pinya-four-part-card {
173
+ max-width: revert;
174
+ flex-grow: revert;
175
+ flex-basis: revert;
176
+ }
177
+
178
+ .normal-project-container > .pinya-four-part-card {
179
+ max-width: 30em;
180
+ flex-grow: 1;
181
+ flex-basis: 25em;
182
+ }
183
+ }
184
+
185
+ .show-more-btn {
186
+ margin-bottom: 1.5lh;
187
+ padding: 0.5rem 1rem;
188
+ border-radius: var(--radius-lg);
189
+ border: 2px solid var(--color-primary-500);
190
+ background: transparent;
191
+ cursor: pointer;
192
+ transition: background-color 0.2s;
193
+ }
194
+
195
+ .show-more-btn:hover {
196
+ background: var(--color-primary-100);
197
+ }
198
+
199
+ .no-results {
200
+ padding: 2rem;
201
+ text-align: center;
202
+ color: var(--color-text-secondary);
61
203
  }
62
204
 
63
205
  :global {
64
206
  .group-header.pinya-card {
65
207
  margin-bottom: calc(var(--spacing) * 8);
66
208
  max-width: unset;
209
+ width: 100%;
67
210
  }
68
211
  }
212
+
213
+ .entry-group-wrapper {
214
+ max-width: calc((28rem * 3) + 5rem);
215
+ width: 100%;
216
+ }
69
217
  </style>
@@ -1 +1 @@
1
- {"version":3,"file":"EntryGroup.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/templates/SeaweedLayout/EntryGroup.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,iCAAiC,CAAC;AA4CjF,QAAA,MAAM,UAAU,kDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"EntryGroup.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/templates/SeaweedLayout/EntryGroup.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,iCAAiC,CAAC;AAwIjF,QAAA,MAAM,UAAU,kDAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -102,7 +102,7 @@
102
102
  };
103
103
  });
104
104
 
105
- let comboboxValue = $state(comboboxData[0].value);
105
+ let comboboxValue = $state([comboboxData[0].value]);
106
106
 
107
107
  const addEntry = () => {
108
108
  const c = allEntries.find(e => e.key === comboboxValue[0]);
@@ -205,11 +205,9 @@
205
205
  <PinyaCombobox
206
206
  class="project-group-config"
207
207
  data={comboboxData}
208
- defaultValue={comboboxValue}
209
208
  bind:value={comboboxValue}
210
209
  label="New entry"
211
210
  placeholder="Add new entry"
212
- contentZIndex="10"
213
211
  />
214
212
  </td>
215
213
  </tr>