@turnipxenon/pineapple 5.0.0-alpha.9 → 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 (92) hide show
  1. package/README.md +11 -11
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +1 -0
  5. package/dist/remoteIndex.remote.d.ts +2 -0
  6. package/dist/remoteIndex.remote.d.ts.map +1 -0
  7. package/dist/remoteIndex.remote.js +2 -0
  8. package/dist/styles/app.css +0 -82
  9. package/dist/styles/tailwind.css +0 -12
  10. package/dist/styles/turnip-theme.css +1 -0
  11. package/dist/ui/components/FourPartCard.svelte +9 -0
  12. package/dist/ui/components/MeltToaster/MeltToaster.svelte +4 -1
  13. package/dist/ui/components/MeltToaster/MeltToaster.svelte.d.ts.map +1 -1
  14. package/dist/ui/components/NestedNavigation.svelte +0 -1
  15. package/dist/ui/components/NestedNavigation.svelte.d.ts.map +1 -1
  16. package/dist/ui/components/SortDropdown.svelte +50 -0
  17. package/dist/ui/components/SortDropdown.svelte.d.ts +9 -0
  18. package/dist/ui/components/SortDropdown.svelte.d.ts.map +1 -0
  19. package/dist/ui/components/TagFilter.svelte +32 -0
  20. package/dist/ui/components/TagFilter.svelte.d.ts +9 -0
  21. package/dist/ui/components/TagFilter.svelte.d.ts.map +1 -0
  22. package/dist/ui/components/accordion/PinyaAccordion.svelte +5 -3
  23. package/dist/ui/components/accordion/PinyaAccordion.svelte.d.ts.map +1 -1
  24. package/dist/ui/elements/CodeBlock/CodeBlock.svelte +167 -18
  25. package/dist/ui/elements/CodeBlock/CodeBlock.svelte.d.ts.map +1 -1
  26. package/dist/ui/elements/PineappleSwitch.svelte +2 -2
  27. package/dist/ui/elements/PineappleSwitch.svelte.d.ts +1 -1
  28. package/dist/ui/elements/PineappleSwitch.svelte.d.ts.map +1 -1
  29. package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte +170 -27
  30. package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte.d.ts.map +1 -1
  31. package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts +6 -7
  32. package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts.map +1 -1
  33. package/dist/ui/modules/experience/ExampleJob1.svelte +79 -0
  34. package/dist/ui/modules/experience/ExampleJob1.svelte.d.ts +26 -0
  35. package/dist/ui/modules/experience/ExampleJob1.svelte.d.ts.map +1 -0
  36. package/dist/ui/modules/experience/ExampleJob2.svelte +74 -0
  37. package/dist/ui/modules/experience/ExampleJob2.svelte.d.ts +25 -0
  38. package/dist/ui/modules/experience/ExampleJob2.svelte.d.ts.map +1 -0
  39. package/dist/ui/modules/experience/index.d.ts +3 -0
  40. package/dist/ui/modules/experience/index.d.ts.map +1 -0
  41. package/dist/ui/modules/experience/index.js +2 -0
  42. package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte +7 -9
  43. package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte.d.ts.map +1 -1
  44. package/dist/ui/modules/projects/Hepcat.svelte +5 -1
  45. package/dist/ui/modules/projects/Hepcat.svelte.d.ts +4 -1
  46. package/dist/ui/modules/projects/Hepcat.svelte.d.ts.map +1 -1
  47. package/dist/ui/modules/projects/Pengi.svelte +4 -1
  48. package/dist/ui/modules/projects/Pengi.svelte.d.ts +4 -1
  49. package/dist/ui/modules/projects/Pengi.svelte.d.ts.map +1 -1
  50. package/dist/ui/modules/projects/Soulwork.svelte +4 -1
  51. package/dist/ui/modules/projects/Soulwork.svelte.d.ts +4 -1
  52. package/dist/ui/modules/projects/Soulwork.svelte.d.ts.map +1 -1
  53. package/dist/ui/modules/projects/ThisWebpage.svelte +13 -2
  54. package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts +3 -1
  55. package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts.map +1 -1
  56. package/dist/ui/modules/universal-overlay/SettingsPanel.svelte +29 -24
  57. package/dist/ui/modules/universal-overlay/SettingsPanel.svelte.d.ts.map +1 -1
  58. package/dist/ui/modules/universal-overlay/UniversalOverlay.svelte +6 -2
  59. package/dist/ui/templates/PinyaPageLayout/PinyaPageLayout.svelte +32 -21
  60. package/dist/ui/templates/PinyaPageLayout/PinyaPageLayout.svelte.d.ts +1 -1
  61. package/dist/ui/templates/PinyaPageLayout/PinyaPageLayout.svelte.d.ts.map +1 -1
  62. package/dist/ui/templates/PinyaPageLayout/pinyaPageLayoutRunes.svelte.d.ts.map +1 -1
  63. package/dist/ui/templates/SeaweedLayout/EntryGroup.svelte +177 -29
  64. package/dist/ui/templates/SeaweedLayout/EntryGroup.svelte.d.ts.map +1 -1
  65. package/dist/ui/templates/SeaweedLayout/ProjectGroupConfig.svelte +1 -3
  66. package/dist/ui/templates/SeaweedLayout/SeaweedLayout.svelte +188 -44
  67. package/dist/ui/templates/SeaweedLayout/SeaweedLayout.svelte.d.ts.map +1 -1
  68. package/dist/ui/templates/SeaweedLayout/props.d.ts +18 -2
  69. package/dist/ui/templates/SeaweedLayout/props.d.ts.map +1 -1
  70. package/dist/ui/templates/SeaweedLayout/props.js +8 -1
  71. package/dist/ui/templates/blog_template/BlogTemplate.svelte +5 -2
  72. package/dist/ui/templates/blog_template/BlogTemplate.svelte.d.ts.map +1 -1
  73. package/dist/ui/templates/pinya-base/PinyaBase.svelte +45 -4
  74. package/dist/ui/templates/pinya-base/PinyaBase.svelte.d.ts +15 -3
  75. package/dist/ui/templates/pinya-base/PinyaBase.svelte.d.ts.map +1 -1
  76. package/dist/ui/templates/pinya-base/menuPageServerLoadRemote.remote.svelte +1 -0
  77. package/dist/ui/templates/pinya-base/menuPageServerLoadRemote.remote.svelte.d.ts +27 -0
  78. package/dist/ui/templates/pinya-base/menuPageServerLoadRemote.remote.svelte.d.ts.map +1 -0
  79. package/dist/util/context/PineappleBaseContext.svelte +20 -8
  80. package/dist/util/context/PineappleBaseContext.svelte.d.ts.map +1 -1
  81. package/dist/util/context/pineappleBaseContextDefinitions.svelte.d.ts +21 -13
  82. package/dist/util/context/pineappleBaseContextDefinitions.svelte.d.ts.map +1 -1
  83. package/dist/util/context/pineappleBaseContextDefinitions.svelte.js +21 -19
  84. package/dist/util/getParsnipData.remote.d.ts +12 -0
  85. package/dist/util/getParsnipData.remote.d.ts.map +1 -0
  86. package/dist/util/getParsnipData.remote.js +3 -0
  87. package/dist/util/localStore.svelte.d.ts +10 -3
  88. package/dist/util/localStore.svelte.d.ts.map +1 -1
  89. package/dist/util/localStore.svelte.js +56 -38
  90. package/dist/util/util.js +1 -1
  91. package/package.json +17 -8
  92. package/src/lib/styles/app.css +0 -82
package/README.md CHANGED
@@ -6,13 +6,13 @@ NPM package: https://www.npmjs.com/package/@turnipxenon/pineapple
6
6
 
7
7
  ## Developing
8
8
 
9
- Once you've created a project and installed dependencies with `yarn`, start a development server:
9
+ Once you've created a project and installed dependencies with `pnpm`, start a development server:
10
10
 
11
11
  ```bash
12
- yarn dev
12
+ pnpm dev
13
13
 
14
14
  # or start the server and open the app in a new browser tab
15
- yarn dev -- --open
15
+ pnpm dev -- --open
16
16
  ```
17
17
 
18
18
  ## Building
@@ -20,10 +20,10 @@ yarn dev -- --open
20
20
  To create a production version of your app:
21
21
 
22
22
  ```bash
23
- yarn build
23
+ pnpm build
24
24
  ```
25
25
 
26
- You can preview the production build with `yarn preview`.
26
+ You can preview the production build with `pnpm preview`.
27
27
 
28
28
  > To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment.
29
29
 
@@ -35,7 +35,7 @@ TODO: If you're curious how to install this on a fresh package or a package not
35
35
  ## Migration from v2 to v3
36
36
 
37
37
  ```bash
38
- yarn add @turnipxenon2/pineapple
38
+ pnpm add @turnipxenon2/pineapple
39
39
  ```
40
40
 
41
41
  **Manual steps**
@@ -119,13 +119,13 @@ kit: {
119
119
 
120
120
  ## Local linking
121
121
 
122
- 1. In pineapple, run `yarn link`
123
- 2. In seaweed2, run `yarn unlink @turnipxenon/pineapple`
122
+ 1. In pineapple, run `pnpm link`
123
+ 2. In seaweed2, run `pnpm link @turnipxenon/pineapple`
124
124
 
125
125
  **To unlink:**
126
126
 
127
- 1. In seaweed2, run `yarn unlink @turnipxenon/pineapple`
128
- 2. In pineapple, run `yarn unlink`
127
+ 1. In seaweed2, run `pnpm unlink @turnipxenon/pineapple`
128
+ 2. In pineapple, run `pnpm unlink`
129
129
  3. **If unlinking, remember to restart PC cause Windows symlinking is tricky**
130
130
 
131
- To reinstall a single package: `yarn add @turnipxenon/pineapple --no-package-lock --no-save`
131
+ To reinstall a single package: `pnpm add @turnipxenon/pineapple --no-package-lock --no-save`
package/dist/index.d.ts CHANGED
@@ -13,4 +13,5 @@ export { default as BlogTemplate } from "./ui/templates/blog_template/BlogTempla
13
13
  export { default as UniversalOverlay } from "./ui/modules/universal-overlay/UniversalOverlay.svelte";
14
14
  export { dialogManager } from "./components/dialog_manager/DialogManager";
15
15
  export * from "./modules/parsnip/index";
16
+ export * from "./util/context/pineappleBaseContextDefinitions.svelte";
16
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"AAEA,cAAc,sCAAsC,CAAC;AACrD,cAAc,sCAAsC,CAAC;AACrD,cAAc,sBAAsB,CAAC;AACrC,cAAc,gDAAgD,CAAC;AAC/D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC;AACxD,cAAc,sCAAsC,CAAC;AACrD,cAAc,sCAAsC,CAAC;AACrD,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAE5B,YAAY,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qDAAqD,CAAC;AAC9F,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAE7E,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"AAEA,cAAc,sCAAsC,CAAC;AACrD,cAAc,sCAAsC,CAAC;AACrD,cAAc,sBAAsB,CAAC;AACrC,cAAc,gDAAgD,CAAC;AAC/D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,yCAAyC,CAAC;AACxD,cAAc,sCAAsC,CAAC;AACrD,cAAc,sCAAsC,CAAC;AACrD,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAE5B,YAAY,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qDAAqD,CAAC;AAC9F,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAE7E,cAAc,yBAAyB,CAAC;AACxC,cAAc,uDAAuD,CAAA"}
package/dist/index.js CHANGED
@@ -13,3 +13,4 @@ export { default as BlogTemplate } from "./ui/templates/blog_template/BlogTempla
13
13
  export { default as UniversalOverlay } from "./ui/modules/universal-overlay/UniversalOverlay.svelte";
14
14
  export { dialogManager } from "./components/dialog_manager/DialogManager";
15
15
  export * from "./modules/parsnip/index";
16
+ export * from "./util/context/pineappleBaseContextDefinitions.svelte";
@@ -0,0 +1,2 @@
1
+ export * from "./util/getParsnipData.remote";
2
+ //# sourceMappingURL=remoteIndex.remote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remoteIndex.remote.d.ts","sourceRoot":"","sources":["../src/lib/remoteIndex.remote.ts"],"names":[],"mappings":"AAEA,cAAc,8BAA8B,CAAC"}
@@ -0,0 +1,2 @@
1
+ // noinspection JSUnusedGlobalSymbols
2
+ export * from "./util/getParsnipData.remote";
@@ -76,88 +76,6 @@ a.external-link {
76
76
  }
77
77
  }
78
78
 
79
- /*https://shiki.style/guide/dual-themes*/
80
- html.dark .shiki,
81
- html.dark .shiki span {
82
- color: var(--shiki-dark) !important;
83
- background-color: var(--shiki-dark-bg) !important;
84
- /* Optional, if you also want font styles */
85
- font-style: var(--shiki-dark-font-style) !important;
86
- font-weight: var(--shiki-dark-font-weight) !important;
87
- text-decoration: var(--shiki-dark-text-decoration) !important;
88
- }
89
-
90
- .inline-code {
91
- background-color: aliceblue;
92
- padding: 0.2rem;
93
- border-radius: 0.2rem;
94
- }
95
-
96
- html.dark .inline-code {
97
- background-color: #303446;
98
- }
99
-
100
- .shiki {
101
- span {
102
- white-space: pre-wrap;
103
- word-wrap: break-word;
104
- }
105
- }
106
-
107
- /* region shiki copy button */
108
- pre:has(code) {
109
- position: relative;
110
- }
111
-
112
- pre button.copy {
113
- position: absolute;
114
- right: 16px;
115
- top: 16px;
116
- height: 28px;
117
- width: 28px;
118
- padding: 0;
119
- display: flex;
120
-
121
- & span {
122
- width: 100%;
123
- aspect-ratio: 1 / 1;
124
- background-repeat: no-repeat;
125
- background-position: center;
126
- background-size: cover;
127
- }
128
-
129
- & .ready {
130
- background-image: url("$pkg/assets/icons/icon-copy-light-contrast.svg");
131
- /*todo*/
132
- /*@variant dark {*/
133
- /* background-image: url("$pkg/assets/icons/icon-copy-dark-contrast.svg");*/
134
- /*}*/
135
- }
136
-
137
- & .success {
138
- display: none;
139
- background-image: url("$pkg/assets/icons/icon-check-light-contrast.svg");
140
-
141
- /*todo: migration*/
142
- /*@variant dark {*/
143
- /* background-image: url("$pkg/assets/icons/icon-check-dark-contrast.svg");*/
144
- /*}*/
145
- }
146
-
147
- &.copied {
148
- & .success {
149
- display: block;
150
- }
151
-
152
- & .ready {
153
- display: none;
154
- }
155
- }
156
- }
157
-
158
- /* endregion shiki copy button */
159
-
160
-
161
79
  ul + h2, ol + h2 {
162
80
  margin-top: 1rlh;
163
81
  }
@@ -536,9 +536,6 @@
536
536
  .ig-textarea::placeholder {
537
537
  color:var(--color-surface-700-300)
538
538
  }
539
- ::selection {
540
- background-color:#73737380
541
- }
542
539
  :disabled,
543
540
  .disabled {
544
541
  opacity:.5
@@ -2715,15 +2712,6 @@ a.external-link {
2715
2712
  #toast-progress::-moz-progress-bar {
2716
2713
  background:rgba(var(--color-secondary-500))
2717
2714
  }
2718
- html.dark .shiki,
2719
- html.dark .shiki span {
2720
- color:var(--shiki-dark)!important;
2721
- background-color:var(--shiki-dark-bg)!important;
2722
- font-style:var(--shiki-dark-font-style)!important;
2723
- font-weight:var(--shiki-dark-font-weight)!important;
2724
- -webkit-text-decoration:var(--shiki-dark-text-decoration)!important;
2725
- text-decoration:var(--shiki-dark-text-decoration)!important
2726
- }
2727
2715
  .inline-code {
2728
2716
  background-color:#f0f8ff;
2729
2717
  border-radius:.2rem;
@@ -217,6 +217,7 @@
217
217
 
218
218
  html.dark {
219
219
  --header-color: var(--color-primary-100);
220
+ --body-background-color: var(--body-background-color-dark);
220
221
  /*todo: migration*/
221
222
  /*@variant turnip {*/
222
223
  /* --border-card: 0;*/
@@ -51,6 +51,15 @@
51
51
  :global {
52
52
  .pinya-four-part-card.pinya-card {
53
53
  padding: 0;
54
+
55
+ .card-header-cover > img {
56
+ border-top-right-radius: var(--radius-xl);
57
+ border-top-left-radius: var(--radius-xl);
58
+ }
54
59
  }
60
+
61
+ html.dark .pinya-four-part-card {
62
+ border: 0;
63
+ }
55
64
  }
56
65
  </style>
@@ -11,6 +11,7 @@
11
11
  </script>
12
12
 
13
13
  <script lang="ts">
14
+ import { browser } from "$app/environment";
14
15
  import { onDestroy, onMount } from "svelte";
15
16
 
16
17
  let toasterRoot: HTMLDivElement;
@@ -39,7 +40,9 @@
39
40
  });
40
41
 
41
42
  onDestroy(() => {
42
- if (observer) observer.disconnect();
43
+ if (browser) {
44
+ if (observer) observer.disconnect();
45
+ }
43
46
  });
44
47
  </script>
45
48
 
@@ -1 +1 @@
1
- {"version":3,"file":"MeltToaster.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/components/MeltToaster/MeltToaster.svelte.ts"],"names":[],"mappings":"AAGC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAKxC,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAmB,CAAC;AA4D1C;;;;GAIG;AACH,QAAA,MAAM,WAAW,2DAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"MeltToaster.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/components/MeltToaster/MeltToaster.svelte.ts"],"names":[],"mappings":"AAGC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8CAA8C,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAKxC,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAmB,CAAC;AAgE1C;;;;GAIG;AACH,QAAA,MAAM,WAAW,2DAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -48,7 +48,6 @@
48
48
  let bestMatch: string | null = null;
49
49
 
50
50
  layout.forEach(site => {
51
- console.log(`Current path (${currentPath}) vs layout path (${site.relativeLink})`);
52
51
  const link = site.relativeLink;
53
52
  if (!link) {
54
53
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"NestedNavigation.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/ui/components/NestedNavigation.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAKrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGrD,KAAK,gBAAgB,GAAI;IACxB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,CAAC,EAAE,UAAU,GAAG,aAAa,GAAG,WAAW,CAAA;CAEvD,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;AAqGhD,QAAA,MAAM,gBAAgB,sDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"NestedNavigation.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/ui/components/NestedNavigation.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAKrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGrD,KAAK,gBAAgB,GAAI;IACxB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,YAAY,CAAC,EAAE,UAAU,GAAG,aAAa,GAAG,WAAW,CAAA;CAEvD,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;AAoGhD,QAAA,MAAM,gBAAgB,sDAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,50 @@
1
+ <script lang="ts">
2
+ import PinyaCombobox from "../elements/pinya-combobox/PinyaCombobox.svelte";
3
+ import type { GenericComboboxItem } from "../elements/pinya-combobox/PinyaComboboxProps";
4
+ import { SectionType } from "../templates/SeaweedLayout/props";
5
+
6
+ interface SortDropdownProps {
7
+ sortBy: string[]; // Current sort value (bindable)
8
+ sectionType: SectionType; // Determines available sort options
9
+ }
10
+
11
+ let {
12
+ sortBy = $bindable(["default"]),
13
+ sectionType = SectionType.Projects
14
+ }: SortDropdownProps = $props();
15
+
16
+ const projectSortOptions: GenericComboboxItem<string>[] = [
17
+ { label: "Default order", value: "default" },
18
+ { label: "Most recently finished", value: "date-desc" },
19
+ { label: "Oldest finished", value: "date-asc" },
20
+ { label: "Longest projects", value: "duration-desc" },
21
+ { label: "Shortest projects", value: "duration-asc" }
22
+ ];
23
+
24
+ const experienceSortOptions: GenericComboboxItem<string>[] = [
25
+ { label: "Default order", value: "default" },
26
+ { label: "Most recent first", value: "date-desc" },
27
+ { label: "Oldest first", value: "date-asc" }
28
+ ];
29
+
30
+ const sortOptions = $derived(
31
+ sectionType === SectionType.Experience
32
+ ? experienceSortOptions
33
+ : projectSortOptions
34
+ );
35
+ </script>
36
+
37
+ <div class="sort-dropdown">
38
+ <PinyaCombobox
39
+ data={sortOptions}
40
+ bind:value={sortBy}
41
+ label="Sort by"
42
+ placeholder="Select sort order"
43
+ />
44
+ </div>
45
+
46
+ <style>
47
+ .sort-dropdown {
48
+ min-width: 200px;
49
+ }
50
+ </style>
@@ -0,0 +1,9 @@
1
+ import { SectionType } from "../templates/SeaweedLayout/props";
2
+ interface SortDropdownProps {
3
+ sortBy: string[];
4
+ sectionType: SectionType;
5
+ }
6
+ declare const SortDropdown: import("svelte").Component<SortDropdownProps, {}, "sortBy">;
7
+ type SortDropdown = ReturnType<typeof SortDropdown>;
8
+ export default SortDropdown;
9
+ //# sourceMappingURL=SortDropdown.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SortDropdown.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/ui/components/SortDropdown.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AAGnE,UAAU,iBAAiB;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;CACzB;AAyCF,QAAA,MAAM,YAAY,6DAAwC,CAAC;AAC3D,KAAK,YAAY,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACpD,eAAe,YAAY,CAAC"}
@@ -0,0 +1,32 @@
1
+ <script lang="ts">
2
+ import PinyaCombobox from "../elements/pinya-combobox/PinyaCombobox.svelte";
3
+
4
+ interface TagFilterProps {
5
+ allTags: string[]; // All available tags
6
+ selectedTags: string[]; // Currently selected tags (bindable)
7
+ label?: string; // Optional label
8
+ }
9
+
10
+ let {
11
+ allTags,
12
+ selectedTags = $bindable([]),
13
+ label = "Filter by tags"
14
+ }: TagFilterProps = $props();
15
+ </script>
16
+
17
+ <div class="tag-filter">
18
+ <PinyaCombobox
19
+ bind:value={selectedTags}
20
+ data={allTags.map(t => ({value: t, label: t}))}
21
+ multiple={true}
22
+ {label}
23
+ />
24
+ </div>
25
+
26
+ <style>
27
+ .tag-filter {
28
+ display: flex;
29
+ flex-direction: column;
30
+ gap: 0.5rem;
31
+ }
32
+ </style>
@@ -0,0 +1,9 @@
1
+ interface TagFilterProps {
2
+ allTags: string[];
3
+ selectedTags: string[];
4
+ label?: string;
5
+ }
6
+ declare const TagFilter: import("svelte").Component<TagFilterProps, {}, "selectedTags">;
7
+ type TagFilter = ReturnType<typeof TagFilter>;
8
+ export default TagFilter;
9
+ //# sourceMappingURL=TagFilter.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TagFilter.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/ui/components/TagFilter.svelte.ts"],"names":[],"mappings":"AAMC,UAAU,cAAc;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAoBF,QAAA,MAAM,SAAS,gEAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -4,7 +4,7 @@
4
4
  import { Accordion } from "melt/builders";
5
5
  import { setContext } from "svelte";
6
6
  import type { SvelteSet } from "svelte/reactivity";
7
- import { accordionContextKey, type AccordionContext } from "./accordionContext";
7
+ import { type AccordionContext, accordionContextKey } from "./accordionContext";
8
8
  import type { PinyaAccordionProps } from "./PinyaAccordionProps";
9
9
 
10
10
  let {
@@ -13,6 +13,7 @@
13
13
  multiple = true,
14
14
  ...props
15
15
  }: PinyaAccordionProps = $props();
16
+
16
17
  let accordion = $derived(new Accordion({
17
18
  value: (() => {
18
19
  if (openItems) {
@@ -33,10 +34,11 @@
33
34
  } else {
34
35
  openItems = [];
35
36
  }
36
- }, multiple
37
+ },
38
+ multiple,
37
39
  }));
38
40
  setContext<AccordionContext>(accordionContextKey, (key) => accordion.getItem(key));
39
- setContext<string[]>('accordionOpenItems', openItems);
41
+ setContext<string[]>("accordionOpenItems", openItems);
40
42
  </script>
41
43
 
42
44
  <div {...props} class={`pinya-accordion-root ${props.class ?? ''}`} {...accordion.root}>
@@ -1 +1 @@
1
- {"version":3,"file":"PinyaAccordion.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/components/accordion/PinyaAccordion.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAmDjE,QAAA,MAAM,cAAc,kEAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"PinyaAccordion.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/components/accordion/PinyaAccordion.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAqDjE,QAAA,MAAM,cAAc,kEAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -1,23 +1,25 @@
1
1
  <!-- @component Code Block based on: https://shiki.style/ and https://www.skeleton.dev/docs/integrations/code-block/svelte/ -->
2
2
 
3
3
  <script module lang="ts">
4
+ import { transformerNotationDiff } from "@shikijs/transformers";
4
5
  import { addCopyButton } from "shiki-transformer-copy-button";
5
6
  import { createHighlighterCoreSync } from "shiki/core";
6
7
  import { createJavaScriptRegexEngine } from "shiki/engine/javascript";
7
- // Themes
8
- // https://shiki.style/themes
9
- import themeLight from "shiki/themes/catppuccin-latte.mjs";
10
- import themeDark from "shiki/themes/catppuccin-frappe.mjs";
11
8
  // Languages
12
9
  // https://shiki.style/languages
13
- import console from "shiki/langs/console.mjs";
14
- import html from "shiki/langs/html.mjs";
10
+ import shikiConsole from "shiki/langs/console.mjs";
15
11
  import css from "shiki/langs/css.mjs";
12
+ import html from "shiki/langs/html.mjs";
16
13
  import js from "shiki/langs/javascript.mjs";
17
- import ts from "shiki/langs/typescript.mjs";
14
+ import json from "shiki/langs/json.mjs";
18
15
  import markdown from "shiki/langs/markdown.mjs";
19
- import xml from "shiki/langs/xml.mjs";
20
16
  import svelte from "shiki/langs/svelte.mjs";
17
+ import ts from "shiki/langs/typescript.mjs";
18
+ import xml from "shiki/langs/xml.mjs";
19
+ // Themes
20
+ // https://shiki.style/themes
21
+ import themeDark from "shiki/themes/catppuccin-frappe.mjs";
22
+ import themeLight from "shiki/themes/catppuccin-latte.mjs";
21
23
 
22
24
  // https://shiki.style/guide/sync-usage
23
25
  const shiki = createHighlighterCoreSync({
@@ -25,11 +27,12 @@
25
27
  // Implement your import theme.
26
28
  themes: [themeLight, themeDark],
27
29
  // Implement your imported and supported languages.
28
- langs: [console, html, css, js, ts, markdown, xml, svelte]
30
+ langs: [shikiConsole, html, css, js, ts, markdown, xml, svelte, json]
29
31
  });
30
32
  </script>
31
33
 
32
34
  <script lang="ts">
35
+ import { onMount } from "svelte";
33
36
  import type { CodeBlockProps } from "./CodeBlockProps";
34
37
 
35
38
  let {
@@ -54,6 +57,7 @@
54
57
  dark: "catppuccin-frappe"
55
58
  },
56
59
  transformers: [
60
+ transformerNotationDiff(),
57
61
  addCopyButton({ toggle: 2000 })
58
62
  ]
59
63
  }));
@@ -67,13 +71,158 @@
67
71
  </div>
68
72
 
69
73
  <style>
70
- :global {
71
- .pinya-code-block {
72
- margin-bottom: 1rlh;
73
- }
74
-
75
- h2 + .pinya-code-block {
76
- margin-top: 0.5rlh;
77
- }
78
- }
74
+ :global {
75
+ .pinya-code-block {
76
+ margin-bottom: 1rlh;
77
+ }
78
+
79
+ /*https://shiki.style/guide/dual-themes*/
80
+
81
+ html.dark .shiki,
82
+ html.dark .shiki > span {
83
+ color: var(--shiki-dark);
84
+ background-color: var(--shiki-dark-bg);
85
+ /* Optional, if you also want font styles */
86
+ font-style: var(--shiki-dark-font-style);
87
+ font-weight: var(--shiki-dark-font-weight);
88
+ text-decoration: var(--shiki-dark-text-decoration);
89
+ }
90
+
91
+
92
+ html.dark .shiki {
93
+ color: var(--shiki-dark) !important;
94
+ background-color: var(--shiki-dark-bg) !important;
95
+ font-style: var(--shiki-dark-font-style) !important;
96
+ font-weight: var(--shiki-dark-font-weight) !important;
97
+ -webkit-text-decoration: var(--shiki-dark-text-decoration) !important;
98
+ text-decoration: var(--shiki-dark-text-decoration) !important;
99
+
100
+ span[style*="color:#4C4F69"] {
101
+ color: oklch(0.835 0.043 279.325) !important;
102
+ }
103
+ }
104
+
105
+ html.dark .shiki.has-diff span.diff.add {
106
+ background-color: rgba(0, 255, 0, 0.05);
107
+ }
108
+
109
+ .inline-code {
110
+ background-color: aliceblue;
111
+ padding: 0.2rem;
112
+ border-radius: 0.2rem;
113
+ }
114
+
115
+ .shiki {
116
+ span {
117
+ white-space: pre-wrap;
118
+ word-wrap: break-word;
119
+ }
120
+
121
+ &.has-diff {
122
+ padding-inline-start: 0;
123
+ padding-inline-end: 0;
124
+
125
+ code {
126
+ display: block;
127
+
128
+ & > span {
129
+ display: block;
130
+ padding-inline-start: 2em;
131
+ padding-inline-end: 1em;
132
+ margin-block-end: -1lh;
133
+
134
+ &:last-child {
135
+ margin-block-end: 0;
136
+ }
137
+ }
138
+ }
139
+
140
+ span.diff.remove {
141
+ background-color: rgba(255, 0, 0, 0.15);
142
+
143
+ &::before {
144
+ display: block;
145
+ position: absolute;
146
+ content: "-";
147
+ margin-inline-start: calc((var(--spacing) * -4) - 2em);
148
+ padding-inline-start: 1.75em;
149
+ font-weight: bold;
150
+ pointer-events: none;
151
+ }
152
+ }
153
+
154
+ span.diff.add {
155
+ background-color: rgba(0, 255, 0, 0.15);
156
+
157
+ &::before {
158
+ display: block;
159
+ position: absolute;
160
+ content: "+";
161
+ margin-inline-start: calc((var(--spacing) * -4) - 2em);
162
+ padding-inline-start: 1.75em;
163
+ font-weight: bold;
164
+ pointer-events: none;
165
+ }
166
+ }
167
+ }
168
+ }
169
+
170
+ /* region shiki copy button */
171
+
172
+ pre:has(code) {
173
+ position: relative;
174
+ }
175
+
176
+ pre button.copy {
177
+ position: absolute;
178
+ right: 16px;
179
+ top: 16px;
180
+ height: 28px;
181
+ width: 28px;
182
+ padding: 0;
183
+ display: flex;
184
+
185
+ & span {
186
+ width: 100%;
187
+ aspect-ratio: 1 / 1;
188
+ background-repeat: no-repeat;
189
+ background-position: center;
190
+ background-size: cover;
191
+ }
192
+
193
+ & .ready {
194
+ background-image: url("$pkg/assets/icons/icon-copy-light-contrast.svg");
195
+ /*todo*/
196
+ /*@variant dark {*/
197
+ /* background-image: url("$pkg/assets/icons/icon-copy-dark-contrast.svg");*/
198
+ /*}*/
199
+ }
200
+
201
+ & .success {
202
+ display: none;
203
+ background-image: url("$pkg/assets/icons/icon-check-light-contrast.svg");
204
+
205
+ /*todo: migration*/
206
+ /*@variant dark {*/
207
+ /* background-image: url("$pkg/assets/icons/icon-check-dark-contrast.svg");*/
208
+ /*}*/
209
+ }
210
+
211
+ &.copied {
212
+ & .success {
213
+ display: block;
214
+ }
215
+
216
+ & .ready {
217
+ display: none;
218
+ }
219
+ }
220
+ }
221
+
222
+ /* endregion shiki copy button */
223
+
224
+ h2 + .pinya-code-block {
225
+ margin-top: 0.5rlh;
226
+ }
227
+ }
79
228
  </style>
@@ -1 +1 @@
1
- {"version":3,"file":"CodeBlock.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/elements/CodeBlock/CodeBlock.svelte.ts"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA6CvD,kHAAkH;AAClH,QAAA,MAAM,SAAS,oDAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"CodeBlock.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/elements/CodeBlock/CodeBlock.svelte.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA+CvD,kHAAkH;AAClH,QAAA,MAAM,SAAS,oDAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -5,14 +5,14 @@
5
5
 
6
6
  interface Props {
7
7
  checked?: boolean;
8
- name: string;
8
+ name?: string;
9
9
  onChange?: ((val: boolean) => void);
10
10
  children?: Snippet;
11
11
  }
12
12
 
13
13
  let {
14
14
  checked = $bindable(false),
15
- name,
15
+ name = undefined,
16
16
  onChange = undefined,
17
17
  children = undefined
18
18
  }: Props = $props();