@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
@@ -1,32 +1,35 @@
1
1
  <!-- TODO: Documentation: consider documentation showcase -->
2
2
 
3
3
  <script lang="ts">
4
- import { fly } from "svelte/transition";
5
- import type { ProjectGroup, SeaweedLayoutProps } from "./props";
6
- import ChumBucket from "./ChumBucket.svelte";
7
- import { default as PinyaPageLayout } from "../PinyaPageLayout/PinyaPageLayout.svelte";
4
+ import { browser } from "$app/environment";
5
+ import { page } from "$app/state";
8
6
  import { default as SocialSection } from "../../components/SocialSection.svelte";
9
- import EntryGroup from "./EntryGroup.svelte";
10
- import PineappleSwitch from "../../elements/PineappleSwitch.svelte";
11
7
  import { CodeBlock } from "../../elements/CodeBlock";
12
- import { TextChip } from "../../elements/TextChip";
13
- import { SvelteMap } from "svelte/reactivity";
8
+ import PineappleSwitch from "../../elements/PineappleSwitch.svelte";
9
+ import { default as PinyaPageLayout } from "../PinyaPageLayout/PinyaPageLayout.svelte";
10
+ import ChumBucket from "./ChumBucket.svelte";
11
+ import EntryGroup from "./EntryGroup.svelte";
14
12
  import EntryOrderConfig from "./EntryOrderConfig.svelte";
13
+ import { onDestroy, onMount } from "svelte";
14
+ import { SvelteMap } from "svelte/reactivity";
15
+ import { fly } from "svelte/transition";
16
+ import { TextChip } from "../../elements/TextChip";
15
17
  import CreateUrlForm from "./CreateUrlForm.svelte";
16
- import { onMount } from "svelte";
17
- import { page } from "$app/state";
18
+ import type { ProjectGroup, SeaweedLayoutProps } from "./props";
18
19
 
19
20
  let {
20
- email,
21
- linkedinSlug,
22
- children,
23
- sideSection,
21
+ email = "",
22
+ linkedinSlug = "",
23
+ children = undefined,
24
+ sideSection = undefined,
24
25
  entryList, // todo
25
26
  layout, // todo
26
27
  domain = "http://localhost:5173/seaweed2",
27
28
  queryTerms,
28
29
  showMiniSocial = false,
29
- serverParams = ""
30
+ serverParams = "",
31
+ emailRemoteQuery,
32
+ linkedinRemoteQuery
30
33
  }: SeaweedLayoutProps = $props();
31
34
 
32
35
  let actualLayout = $state(layout);
@@ -64,15 +67,29 @@
64
67
  termList.push(qtTerm);
65
68
  chipList.push(`.text-chip${qtTerm}`);
66
69
  });
70
+ // language=HTML
67
71
  styleStr = `<style>
68
72
  ${termList.join(", ")} {
69
73
  font-weight: bolder;
70
- color: var(--color-secondary-400);
74
+
75
+ &:not(.chip) {
76
+ color: var(--color-secondary-500);
77
+ }
78
+ }
79
+
80
+ html.dark {
81
+ ${termList.join(", ")} {
82
+ font-weight: bolder;
83
+
84
+ &:not(.chip) {
85
+ color: var(--color-secondary-200);
86
+ }
87
+ }
71
88
  }
72
89
 
73
90
  ${chipList.join(", ")} {
74
91
  background-color: var(--color-secondary-500) /* oklch(55.6% 0 0deg) = #737373 */;
75
- color: var(--color-secondary-contrast-500) /* var(--color-secondary-contrast-light) */;
92
+ color: #FFF5EFFF /* var(--color-secondary-contrast-light) */;
76
93
  }
77
94
  </style>`;
78
95
  });
@@ -150,12 +167,57 @@
150
167
  // endregion Bold terms
151
168
  };
152
169
 
170
+ let upperSectionWrapper: HTMLDivElement | undefined = $state();
171
+ let resizeObserver: ResizeObserver | undefined = $state();
172
+ let isMobile = $state(false);
173
+ let isVeryNarrow = $state(false);
174
+
153
175
  onMount(() => {
154
176
  if (serverParams) {
155
177
  filterSearchParams(new URLSearchParams(serverParams));
156
178
  } else if (page.url.searchParams.size) {
157
179
  filterSearchParams(page.url.searchParams);
158
180
  }
181
+
182
+ /**
183
+ * Get the computed font size of an element in pixels.
184
+ * @param {HTMLElement} element The DOM element to check.
185
+ * @returns {number} The font size in pixels as a number.
186
+ */
187
+ function getElementFontSize(element) {
188
+ // Use window.getComputedStyle() to get all resolved CSS properties.
189
+ const computedStyle = window.getComputedStyle(element);
190
+ // Get the 'font-size' property value (which will be in 'px').
191
+ const fontSizeInPx = computedStyle.getPropertyValue("font-size");
192
+ // Parse the pixel value string (e.g., "16px") to a floating-point number.
193
+ return parseFloat(fontSizeInPx);
194
+ }
195
+
196
+ // code has to be below filterSearchParams!
197
+ if (browser && document.body) {
198
+ // Create a new ResizeObserver instance
199
+ resizeObserver = new ResizeObserver(entries => {
200
+ for (const entry of entries) {
201
+ // Log the new dimensions or perform other actions
202
+ const { width } = entry.contentRect; // or entry.borderBoxSize
203
+ const emWidth = width / getElementFontSize(document.body);
204
+
205
+ // 26em (about) + 50em (experience) + 2em (margin)
206
+ isMobile = emWidth < 79;
207
+ // magic number
208
+ isVeryNarrow = emWidth < 44;
209
+ }
210
+ });
211
+
212
+ // Start observing the target element
213
+ resizeObserver.observe(document.body);
214
+ }
215
+ });
216
+
217
+ onDestroy(() => {
218
+ if (browser && resizeObserver) {
219
+ resizeObserver.disconnect();
220
+ }
159
221
  });
160
222
  </script>
161
223
 
@@ -165,10 +227,7 @@
165
227
 
166
228
 
167
229
  {#snippet socialSection()}
168
- <SocialSection
169
- email={email}
170
- linkedinSlug={linkedinSlug}
171
- />
230
+ <SocialSection {emailRemoteQuery} {linkedinRemoteQuery} />
172
231
  {/snippet}
173
232
  <PinyaPageLayout appBardEndStyle="classic">
174
233
  {#snippet appBarLead()}
@@ -179,29 +238,46 @@
179
238
  >
180
239
  <SocialSection
181
240
  isSmallVersion={true}
182
- email={email}
183
- linkedinSlug={linkedinSlug}
241
+ {emailRemoteQuery}
242
+ {linkedinRemoteQuery}
184
243
  />
185
244
  </div>
186
245
  {/if}
187
246
  {/snippet}
188
247
 
189
- <div id="upper-section">
190
-
191
- <div class="upper-section-start">
192
- {@render sideSection(socialSection)}
248
+ {#if sideSection || children}
249
+ <div
250
+ id="upper-section"
251
+ bind:this={upperSectionWrapper}
252
+ class="upper-section-style"
253
+ class:is-mobile={isMobile}
254
+ class:is-very-narrow={isVeryNarrow}
255
+ >
256
+ {#if sideSection}
257
+ <div class="upper-section-start">
258
+ {@render sideSection(socialSection)}
259
+ </div>
260
+ {/if}
261
+
262
+ {#if children}
263
+ <div class="upper-section-end">
264
+ {@render children()}
265
+ </div>
266
+ {/if}
267
+
268
+ {#if actualLayout.length > 0}
269
+ <EntryGroup {...actualLayout[0]} />
270
+ {/if}
193
271
  </div>
194
-
195
- <div class="upper-section-end">
196
- {@render children()}
197
- </div>
198
- </div>
272
+ {/if}
199
273
 
200
274
  <!--todo: render list #migration-->
201
- {#each actualLayout as group (group.title)}
202
- <EntryGroup
203
- {...group}
204
- />
275
+ {#each actualLayout as group, idx (group.title)}
276
+ {#if idx !== 0}
277
+ <EntryGroup
278
+ {...group}
279
+ />
280
+ {/if}
205
281
  {/each}
206
282
 
207
283
  {#snippet footer()}
@@ -274,12 +350,80 @@
274
350
  border-top: 2px solid var(--color-footer-border);
275
351
  }
276
352
 
277
- #upper-section {
278
- display: flex;
279
- flex-direction: row;
280
- flex-wrap: wrap;
281
- gap: 2rem;
282
- justify-content: center;
353
+ :global {
354
+ #upper-section {
355
+ display: flex;
356
+ flex-direction: row;
357
+ flex-wrap: wrap;
358
+ gap: 2rem;
359
+ justify-content: center;
360
+
361
+ &.is-mobile {
362
+ justify-content: stretch;
363
+
364
+ .upper-section-start, .entry-group-wrapper {
365
+ width: 100%;
366
+ max-width: 64em;
367
+ margin: auto;
368
+ flex: unset;
369
+ }
370
+
371
+ .normal-project-container {
372
+ justify-content: stretch;
373
+
374
+ > .pinya-card {
375
+ max-width: calc(60em);
376
+ }
377
+ }
378
+ }
379
+
380
+ .upper-section-start {
381
+ flex-basis: 26em;
382
+ }
383
+
384
+ .entry-group-wrapper {
385
+ width: unset;
386
+ max-width: 64em;
387
+ flex: 1;
388
+
389
+ .group-header {
390
+ max-width: 64em;
391
+ }
392
+
393
+ .normal-project-container {
394
+ justify-content: stretch;
395
+ flex-direction: column;
396
+
397
+ > .pinya-card {
398
+ max-width: 64em;
399
+ }
400
+
401
+ > .pinya-four-part-card > section {
402
+ .card-header-cover {
403
+ flex: 1 1 12em;
404
+
405
+ & > * {
406
+ border-radius: var(--radius-xl);
407
+ border-bottom-left-radius: var(--radius-xl);
408
+ border-top-left-radius: var(--radius-xl);
409
+ }
410
+ }
411
+
412
+ .card-content {
413
+ padding-bottom: 1lh;
414
+ flex: 9999 1 26em;
415
+ }
416
+
417
+ display: flex;
418
+ flex-direction: row;
419
+ flex-wrap: wrap;
420
+ justify-content: stretch;
421
+ align-items: stretch;
422
+ margin: 0;
423
+ }
424
+ }
425
+ }
426
+ }
283
427
  }
284
428
 
285
429
  .query-term-grid {
@@ -290,7 +434,7 @@
290
434
  }
291
435
 
292
436
  .advanced-setting {
293
- margin-left: 1em;
294
- margin-right: 1em;
437
+ margin-left: 1em;
438
+ margin-right: 1em;
295
439
  }
296
440
  </style>
@@ -1 +1 @@
1
- {"version":3,"file":"SeaweedLayout.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/templates/SeaweedLayout/SeaweedLayout.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAgB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AA6PhE,QAAA,MAAM,aAAa,wDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"SeaweedLayout.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/templates/SeaweedLayout/SeaweedLayout.svelte.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAgB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AA0ThE,QAAA,MAAM,aAAa,wDAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -1,28 +1,44 @@
1
+ import type { RevealInfoRecord } from "../../../components/reveal-info/RevealInfoCollection";
1
2
  import type { Snippet } from "svelte";
2
3
  import type { ProjectComponentProps } from "./";
4
+ import type { SvelteSet } from "svelte/reactivity";
3
5
  type ComponentSnippet = Snippet<[ProjectComponentProps]>;
6
+ export declare enum SectionType {
7
+ Experience = "experience",
8
+ Projects = "projects"
9
+ }
4
10
  export interface SnippetMeta {
5
11
  key: string;
6
12
  component: ComponentSnippet;
13
+ dateStarted?: Date | string;
14
+ dateFinished?: Date | string;
15
+ tags?: string[];
7
16
  }
8
17
  export interface ProjectGroup {
9
18
  key: string;
10
19
  title: string;
11
20
  entryList: SnippetMeta[];
12
21
  projectComponentProps?: ProjectComponentProps;
22
+ sectionType?: SectionType;
23
+ showFilter?: boolean;
24
+ showSort?: boolean;
25
+ showMoreLimit?: number;
13
26
  }
14
27
  export interface SeaweedLayoutProps {
15
28
  name: string;
16
29
  email: string;
17
30
  linkedinSlug: string;
18
31
  domain: string;
19
- sideSection: Snippet<[Snippet]>;
20
- children: Snippet;
32
+ sideSection?: Snippet<[Snippet]>;
33
+ children?: Snippet;
21
34
  entryList: SnippetMeta[];
22
35
  layout: ProjectGroup[];
23
36
  queryTerms: string[];
24
37
  showMiniSocial?: boolean;
25
38
  serverParams?: string;
39
+ emailRemoteQuery?: RevealInfoRecord;
40
+ linkedinRemoteQuery?: RevealInfoRecord;
26
41
  }
42
+ export declare const getQueryTermContext: () => SvelteSet<string>, setQueryTermContext: (context: SvelteSet<string>) => SvelteSet<string>;
27
43
  export {};
28
44
  //# sourceMappingURL=props.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/templates/SeaweedLayout/props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E,KAAK,gBAAgB,GAAG,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,gBAAgB,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;CAC9C;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAChC,QAAQ,EAAE,OAAO,CAAC;IAElB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB"}
1
+ {"version":3,"file":"props.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/templates/SeaweedLayout/props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kDAAkD,CAAC;AACzF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,KAAK,gBAAgB,GAAG,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;AAEzD,oBAAY,WAAW;IACtB,UAAU,eAAe;IACzB,QAAQ,aAAa;CACrB;AAED,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,gBAAgB,CAAC;IAE5B,WAAW,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAE9C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,mBAAmB,CAAC,EAAE,gBAAgB,CAAC;CACvC;AAGD,eAAO,MAAO,mBAAmB,2BAAE,mBAAmB,mDAAsC,CAAC"}
@@ -1 +1,8 @@
1
- export {};
1
+ import { createContext } from 'svelte';
2
+ export var SectionType;
3
+ (function (SectionType) {
4
+ SectionType["Experience"] = "experience";
5
+ SectionType["Projects"] = "projects";
6
+ })(SectionType || (SectionType = {}));
7
+ /* A list of terms to be prepended with qt- later */
8
+ export const [getQueryTermContext, setQueryTermContext] = createContext();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@turnipxenon/pineapple",
3
3
  "description": "personal package for base styling for other personal projects",
4
- "version": "5.0.0",
4
+ "version": "5.1.0",
5
5
  "devDependencies": {
6
6
  "@commitlint/cli": "^19.8.1",
7
7
  "@commitlint/config-conventional": "^19.8.1",
@@ -44,11 +44,11 @@
44
44
  "wrangler": "4.59.1"
45
45
  },
46
46
  "dependencies": {
47
+ "@shikijs/transformers": "^3.22.0",
47
48
  "melt": "^0.44.0",
48
49
  "mode-watcher": "^0.5.1",
49
50
  "shiki": "^3.22.0",
50
51
  "shiki-transformer-copy-button": "0.0.3",
51
- "@shikijs/transformers": "^3.22.0",
52
52
  "svelte-modals": "^2.0.1"
53
53
  },
54
54
  "peerDependencies": {