@turnipxenon/pineapple 2.10.0 → 3.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/dist/assets/icons/icon-contrast.svg +1 -0
  2. package/dist/assets/icons/icon-dark-mode.svg +1 -0
  3. package/dist/assets/icons/icon-light-mode.svg +1 -0
  4. package/dist/assets/icons/icon-settings.svg +1 -0
  5. package/dist/components/Card.svelte +43 -41
  6. package/dist/components/Card.svelte.d.ts +11 -24
  7. package/dist/components/CarouselElement.svelte +15 -8
  8. package/dist/components/CarouselElement.svelte.d.ts +7 -18
  9. package/dist/components/ElementVisbilityDetector.svelte +23 -14
  10. package/dist/components/ElementVisbilityDetector.svelte.d.ts +6 -17
  11. package/dist/components/LazyAsset.svelte +93 -65
  12. package/dist/components/LazyAsset.svelte.d.ts +9 -19
  13. package/dist/components/PineappleSlideToggle.svelte +19 -7
  14. package/dist/components/PineappleSlideToggle.svelte.d.ts +8 -19
  15. package/dist/components/RandomizedBackground.svelte +46 -27
  16. package/dist/components/RandomizedBackground.svelte.d.ts +5 -15
  17. package/dist/components/RandomizedImage.svelte +15 -8
  18. package/dist/components/RandomizedImage.svelte.d.ts +6 -16
  19. package/dist/components/StickyElement.svelte +25 -16
  20. package/dist/components/StickyElement.svelte.d.ts +6 -17
  21. package/dist/components/ToggleableContent.svelte +88 -59
  22. package/dist/components/ToggleableContent.svelte.d.ts +6 -17
  23. package/dist/components/blog_template/BlogTemplate.svelte +45 -25
  24. package/dist/components/blog_template/BlogTemplate.svelte.d.ts +9 -20
  25. package/dist/components/blog_template/BlogTemplateInner.svelte +11 -3
  26. package/dist/components/blog_template/BlogTemplateInner.svelte.d.ts +6 -17
  27. package/dist/components/chip/Chip.svelte +33 -57
  28. package/dist/components/chip/Chip.svelte.d.ts +7 -18
  29. package/dist/components/combo_box/ComboBox.svelte +10 -4
  30. package/dist/components/combo_box/ComboBox.svelte.d.ts +6 -16
  31. package/dist/components/combo_box/ComboBoxWithButton.svelte +16 -9
  32. package/dist/components/combo_box/ComboBoxWithButton.svelte.d.ts +7 -17
  33. package/dist/components/combo_box/combo-box.postcss +2 -2
  34. package/dist/components/dialog_manager/DialogManager.d.ts +0 -1
  35. package/dist/components/dialog_manager/DialogManagerStore.d.ts +0 -1
  36. package/dist/components/dialog_manager/DialogManagerStore.js +1 -1
  37. package/dist/components/dialog_overlay/DialogOverlay.svelte +42 -34
  38. package/dist/components/dialog_overlay/DialogOverlay.svelte.d.ts +3 -14
  39. package/dist/components/index.d.ts +1 -1
  40. package/dist/components/index.js +1 -1
  41. package/dist/components/layouts/SeaweedBaseLayout.svelte +80 -43
  42. package/dist/components/layouts/SeaweedBaseLayout.svelte.d.ts +8 -21
  43. package/dist/components/navigation_component/NavigationComponent.svelte +52 -141
  44. package/dist/components/navigation_component/NavigationComponent.svelte.d.ts +17 -26
  45. package/dist/components/navigation_component/NavigationControl.svelte +52 -103
  46. package/dist/components/navigation_component/NavigationControl.svelte.d.ts +7 -17
  47. package/dist/components/overrideable_meta/OverridableMeta.svelte +37 -22
  48. package/dist/components/overrideable_meta/OverridableMeta.svelte.d.ts +9 -19
  49. package/dist/components/pineapple/PineappleBaseLayout.svelte +132 -188
  50. package/dist/components/pineapple/PineappleBaseLayout.svelte.d.ts +6 -17
  51. package/dist/components/pineapple/toast/DefaultToastBody.svelte +14 -16
  52. package/dist/components/pineapple/toast/DefaultToastBody.svelte.d.ts +7 -17
  53. package/dist/components/pineapple/toast/Toast.d.ts +0 -1
  54. package/dist/components/pineapple/toast/Toast.svelte +92 -64
  55. package/dist/components/pineapple/toast/Toast.svelte.d.ts +3 -14
  56. package/dist/components/pineapple/toast/custom-toast/TestCustomToast.svelte.d.ts +22 -19
  57. package/dist/paraglide/messages/_index.d.ts +2 -0
  58. package/dist/paraglide/messages/_index.js +3 -0
  59. package/dist/paraglide/messages/example_message.d.ts +5 -0
  60. package/dist/paraglide/messages/example_message.js +39 -0
  61. package/dist/paraglide/messages/settings.d.ts +3 -0
  62. package/dist/paraglide/messages/settings.js +38 -0
  63. package/dist/paraglide/messages.d.ts +2 -0
  64. package/dist/paraglide/messages.js +4 -0
  65. package/dist/paraglide/registry.d.ts +21 -0
  66. package/dist/paraglide/registry.js +31 -0
  67. package/dist/paraglide/runtime.d.ts +400 -0
  68. package/dist/paraglide/runtime.js +1060 -0
  69. package/dist/paraglide/server.d.ts +64 -0
  70. package/dist/paraglide/server.js +161 -0
  71. package/dist/scripts/util/FileManagement.d.ts +1 -1
  72. package/dist/store.d.ts +0 -1
  73. package/dist/styles/app.css +53 -0
  74. package/dist/styles/turnip-theme.css +323 -0
  75. package/dist/template/seaweed/CreateUrlForm.svelte +50 -38
  76. package/dist/template/seaweed/CreateUrlForm.svelte.d.ts +5 -15
  77. package/dist/template/seaweed/SeaweedTemplate.svelte +244 -195
  78. package/dist/template/seaweed/SeaweedTemplate.svelte.d.ts +28 -25
  79. package/dist/template/seaweed/entries/ChefWings.svelte +37 -39
  80. package/dist/template/seaweed/entries/ChefWings.svelte.d.ts +5 -15
  81. package/dist/template/seaweed/entries/CustomizedYarnspinner.svelte +32 -24
  82. package/dist/template/seaweed/entries/CustomizedYarnspinner.svelte.d.ts +5 -15
  83. package/dist/template/seaweed/entries/Hepcat.svelte +58 -49
  84. package/dist/template/seaweed/entries/Hepcat.svelte.d.ts +5 -15
  85. package/dist/template/seaweed/entries/Pengi.svelte +51 -43
  86. package/dist/template/seaweed/entries/Pengi.svelte.d.ts +5 -15
  87. package/dist/template/seaweed/entries/Soulwork.svelte +44 -36
  88. package/dist/template/seaweed/entries/Soulwork.svelte.d.ts +5 -15
  89. package/dist/template/seaweed/entries/ThisWebpage.svelte +47 -38
  90. package/dist/template/seaweed/entries/ThisWebpage.svelte.d.ts +5 -15
  91. package/dist/template/seaweed/entries/WorkExperience.svelte +109 -92
  92. package/dist/template/seaweed/entries/WorkExperience.svelte.d.ts +6 -16
  93. package/dist/template/seaweed/entries/Workset.svelte +51 -42
  94. package/dist/template/seaweed/entries/Workset.svelte.d.ts +5 -15
  95. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte +136 -259
  96. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte.d.ts +10 -20
  97. package/dist/template/seaweed/seaweed.postcss +1 -9
  98. package/dist/{theme.postcss → theme.css} +1 -4
  99. package/dist/ui/components/FourPartCard.svelte +47 -0
  100. package/dist/ui/components/FourPartCard.svelte.d.ts +10 -0
  101. package/dist/ui/components/ModalBase.svelte +75 -0
  102. package/dist/ui/components/ModalBase.svelte.d.ts +8 -0
  103. package/dist/ui/components/SocialSection.svelte +87 -0
  104. package/dist/ui/components/SocialSection.svelte.d.ts +9 -0
  105. package/dist/ui/components/index.d.ts +3 -0
  106. package/dist/ui/components/index.js +3 -0
  107. package/dist/ui/components/randomized-background/RandomizedBackground.svelte +87 -0
  108. package/dist/ui/components/randomized-background/RandomizedBackground.svelte.d.ts +6 -0
  109. package/dist/ui/components/randomized-background/RandomizedImage.svelte +42 -0
  110. package/dist/ui/components/randomized-background/RandomizedImage.svelte.d.ts +7 -0
  111. package/dist/ui/elements/ColorScheme.d.ts +10 -0
  112. package/dist/ui/elements/ColorScheme.js +11 -0
  113. package/dist/ui/elements/GeneralUIProps.d.ts +12 -0
  114. package/dist/ui/elements/GeneralUIProps.js +1 -0
  115. package/dist/ui/elements/ImageIcon.svelte +54 -0
  116. package/dist/ui/elements/ImageIcon.svelte.d.ts +6 -0
  117. package/dist/ui/elements/OnBackground.d.ts +3 -0
  118. package/dist/ui/elements/OnBackground.js +4 -0
  119. package/dist/ui/elements/TextLink.svelte +17 -0
  120. package/dist/ui/elements/TextLink.svelte.d.ts +8 -0
  121. package/dist/ui/elements/WrapperProps.d.ts +4 -0
  122. package/dist/ui/elements/WrapperProps.js +1 -0
  123. package/dist/ui/elements/index.d.ts +8 -0
  124. package/dist/ui/elements/index.js +8 -0
  125. package/dist/ui/elements/pinya-button/component.svelte +47 -0
  126. package/dist/ui/elements/pinya-button/component.svelte.d.ts +4 -0
  127. package/dist/ui/elements/pinya-button/index.d.ts +2 -0
  128. package/dist/ui/elements/pinya-button/index.js +2 -0
  129. package/dist/ui/elements/pinya-button/props.d.ts +13 -0
  130. package/dist/ui/elements/pinya-button/props.js +6 -0
  131. package/dist/ui/elements/pinya-card/component.svelte +19 -0
  132. package/dist/ui/elements/pinya-card/component.svelte.d.ts +7 -0
  133. package/dist/ui/elements/pinya-card/index.d.ts +2 -0
  134. package/dist/ui/elements/pinya-card/index.js +2 -0
  135. package/dist/ui/elements/pinya-card/props.d.ts +7 -0
  136. package/dist/ui/elements/pinya-card/props.js +1 -0
  137. package/dist/ui/modules/index.d.ts +1 -0
  138. package/dist/ui/modules/index.js +1 -0
  139. package/dist/ui/modules/modals/general-settings/GeneralSettingsModal.svelte +110 -0
  140. package/dist/ui/modules/modals/general-settings/GeneralSettingsModal.svelte.d.ts +4 -0
  141. package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte +48 -0
  142. package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte.d.ts +3 -0
  143. package/dist/{template → ui/modules}/seaweed/ChumBucket.svelte +28 -28
  144. package/dist/ui/modules/seaweed/ChumBucket.svelte.d.ts +3 -0
  145. package/dist/ui/modules/seaweed/index.d.ts +3 -0
  146. package/dist/ui/modules/seaweed/index.js +4 -0
  147. package/dist/ui/templates/PinyaBase.svelte +45 -0
  148. package/dist/ui/templates/PinyaBase.svelte.d.ts +7 -0
  149. package/dist/ui/templates/confirmation-modal/component.svelte +47 -0
  150. package/dist/ui/templates/confirmation-modal/component.svelte.d.ts +4 -0
  151. package/dist/ui/templates/confirmation-modal/index.d.ts +2 -0
  152. package/dist/ui/templates/confirmation-modal/index.js +2 -0
  153. package/dist/ui/templates/confirmation-modal/props.d.ts +10 -0
  154. package/dist/ui/templates/confirmation-modal/props.js +1 -0
  155. package/dist/ui/templates/index.d.ts +3 -0
  156. package/dist/ui/templates/index.js +3 -0
  157. package/dist/ui/templates/pinya-page-layout/component.svelte +113 -0
  158. package/dist/ui/templates/pinya-page-layout/component.svelte.d.ts +8 -0
  159. package/dist/ui/templates/pinya-page-layout/index.d.ts +2 -0
  160. package/dist/ui/templates/pinya-page-layout/index.js +2 -0
  161. package/dist/ui/templates/pinya-page-layout/runes.svelte.d.ts +7 -0
  162. package/dist/ui/templates/pinya-page-layout/runes.svelte.js +3 -0
  163. package/package.json +36 -18
  164. package/src/lib/styles/app.css +53 -0
  165. package/src/lib/theme.css +114 -0
  166. package/dist/app.postcss +0 -212
  167. package/dist/components/SocialSection.svelte +0 -166
  168. package/dist/components/SocialSection.svelte.d.ts +0 -31
  169. package/dist/postcss.d.ts +0 -3
  170. package/dist/styles/DefaultGridContainer.css +0 -61
  171. package/dist/template/seaweed/ChumBucket.svelte.d.ts +0 -14
@@ -0,0 +1,110 @@
1
+ <script lang="ts">
2
+ import type { ModalProps } from 'svelte-modals';
3
+ import { setMode, userPrefersMode } from 'mode-watcher';
4
+
5
+ import { m } from '../../../../paraglide/messages';
6
+ import ModalBase from '../../../components/ModalBase.svelte';
7
+ import DarkIcon from '../../../../assets/icons/icon-dark-mode.svg';
8
+ import LightIcon from '../../../../assets/icons/icon-light-mode.svg';
9
+ import ConstrastIcon from '../../../../assets/icons/icon-contrast.svg';
10
+ import LanguagePicker from './LanguagePicker.svelte';
11
+
12
+ let props: ModalProps = $props();
13
+
14
+
15
+ interface ToggleItem {
16
+ key: 'light' | 'dark' | 'system'
17
+ imageSrc: string,
18
+ label: string,
19
+ }
20
+
21
+ const modes: ToggleItem[] = [
22
+ { key: 'light', imageSrc: LightIcon, label: 'Light' },
23
+ { key: 'dark', imageSrc: DarkIcon, label: 'Dark' },
24
+ { key: 'system', imageSrc: ConstrastIcon, label: 'System' }
25
+ ];
26
+
27
+ let selectedItem: ToggleItem = $state(modes[0]);
28
+
29
+ // when mode is edited outside, adjust toggle button
30
+ // do not use runes here because we only want explicit changes outside
31
+ // our control here!
32
+ userPrefersMode.subscribe((value) => {
33
+ const si = modes.find(m => m.key === value);
34
+ if (selectedItem !== si && si) {
35
+ selectedItem = si;
36
+ }
37
+ });
38
+
39
+ // when mode is changed inside the button, adjust the mode
40
+ $effect(() => {
41
+ switch (selectedItem?.key) {
42
+ case 'dark':
43
+ setMode('dark');
44
+ break;
45
+ case 'light':
46
+ setMode('light');
47
+ break;
48
+ case 'system':
49
+ setMode('system');
50
+ break;
51
+ default:
52
+ break;
53
+ }
54
+ });
55
+ </script>
56
+
57
+ <ModalBase {...props}>
58
+ <div class="wrapper">
59
+ <h2>{m.settings()}</h2>
60
+
61
+ <fieldset class="btn-group border-primary-500 border-2 flex-col p-2 md:flex-row">
62
+ <legend class="bg-surface-100-900 pl-4 pr-4">Mode</legend>
63
+ {#each modes as mode (mode)}
64
+ <button
65
+ type="button"
66
+ title={mode.label}
67
+ class={`btn pt-3 pb-3 hover:brightness-125
68
+ ${mode.key === selectedItem.key ? 'bg-secondary-400 dark:bg-secondary-800' : 'preset-outlined-primary-300-700'}
69
+ `}
70
+ onclick={() => { setMode(mode.key) }}
71
+ >
72
+ <img
73
+ src={mode.imageSrc}
74
+ aria-hidden="true"
75
+ alt=""
76
+ class={`icon
77
+ ${mode.key === selectedItem.key ? 'reverse' : ''}
78
+ `}
79
+ >
80
+ {mode.label}
81
+ </button>
82
+ {/each}
83
+ </fieldset>
84
+
85
+ <LanguagePicker />
86
+
87
+ <div class="actions">
88
+ <button class="btn preset-filled-primary-400-600 text-surface-100" onclick={() => props.close()}
89
+ title="Close modal">
90
+ Close
91
+ </button>
92
+ </div>
93
+ </div>
94
+ </ModalBase>
95
+
96
+ <style>
97
+ .actions {
98
+ display: flex;
99
+ flex-direction: row-reverse;
100
+ margin-top: 1.4lh;
101
+ }
102
+
103
+ .wrapper {
104
+ display: flex;
105
+ flex-direction: column;
106
+ justify-content: start;
107
+ text-align: start;
108
+ gap: 1lh;
109
+ }
110
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { ModalProps } from 'svelte-modals';
2
+ declare const GeneralSettingsModal: import("svelte").Component<ModalProps<any>, {}, "">;
3
+ type GeneralSettingsModal = ReturnType<typeof GeneralSettingsModal>;
4
+ export default GeneralSettingsModal;
@@ -0,0 +1,48 @@
1
+ <script lang="ts">
2
+ import { Combobox } from '@skeletonlabs/skeleton-svelte';
3
+ import { getLocale, localizeHref } from '../../../../paraglide/runtime';
4
+
5
+ interface ComboxData {
6
+ label: string;
7
+ value: 'en' | 'fr' | 'tl';
8
+ }
9
+
10
+ const comboboxData: ComboxData[] = [
11
+ { label: 'English', value: 'en' },
12
+ { label: 'French', value: 'fr' },
13
+ { label: 'Tagalog', value: 'tl' }
14
+ ];
15
+
16
+ let selectedCountry = $state([getLocale()]);
17
+
18
+ interface ValueDetail {
19
+ value: string[];
20
+ }
21
+
22
+ const onValueChange = (e: ValueDetail) => {
23
+ const data = comboboxData.find((d) => d.value === e.value[0]);
24
+ if (data) {
25
+ selectedCountry = [data.value];
26
+ location.href = localizeHref('./', { locale: data.value });
27
+ }
28
+ };
29
+ </script>
30
+
31
+ <Combobox
32
+ width="w-full"
33
+ labelText="text-md"
34
+ inputGroupBase="w-full flex items-center border-primary-500 border-2 rounded-xl"
35
+ inputGroupInput="grow bg-transparent border-0 dark:placeholder-surface-50 pl-4"
36
+ inputGroupButton="size-[3rem]"
37
+ inputGroupArrow="size-[2rem] m-auto"
38
+ contentBackground="bg-surface-100-900 border-primary-500 border-2"
39
+ optionActive="bg-secondary-400-600"
40
+ optionHover="hover:brightness-75 dark:hover:brightness-125"
41
+ optionClasses='aria-selected:brightness-75 aria-selected:dark:brightness-125'
42
+ data={comboboxData}
43
+ defaultValue={selectedCountry}
44
+ value={selectedCountry}
45
+ onValueChange={onValueChange}
46
+ label="Select Language"
47
+ placeholder="Select Language"
48
+ />
@@ -0,0 +1,3 @@
1
+ declare const LanguagePicker: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type LanguagePicker = ReturnType<typeof LanguagePicker>;
3
+ export default LanguagePicker;
@@ -1,33 +1,33 @@
1
- <script>import Card from "../../components/Card.svelte";
2
- import {} from "../..";
3
- import { onMount } from "svelte";
4
- let hasTriedGettingChumBucket = false;
5
- let pageMetaList = [];
6
- const loadPageMeta = async () => {
7
- fetch("/api/get-latest-blogs").then((resp) => resp.json()).then((json) => {
8
- pageMetaList = json;
9
- hasTriedGettingChumBucket = true;
10
- }).catch((_) => {
11
- hasTriedGettingChumBucket = true;
12
- });
13
- };
14
- onMount(() => {
15
- loadPageMeta();
16
- });
1
+ <script lang="ts">
2
+ import { type PageMeta } from "../../..";
3
+ import { onMount } from "svelte";
4
+ import { PinyaCard } from "../../elements/index";
5
+
6
+ let hasTriedGettingChumBucket = $state(false);
7
+ let pageMetaList: PageMeta[] = $state([]);
8
+ const loadPageMeta = async () => {
9
+ fetch("/api/get-latest-blogs").then(resp => resp.json()).then(json => {
10
+ pageMetaList = json as PageMeta[];
11
+ hasTriedGettingChumBucket = true;
12
+ }).catch(_ => {
13
+ hasTriedGettingChumBucket = true;
14
+ });
15
+ };
16
+
17
+ onMount(() => {
18
+ loadPageMeta();
19
+ });
17
20
  </script>
18
21
 
19
- <Card>
20
- <div slot="content" class="chum-bucket">
21
- <h2>More about me...</h2>
22
+ <PinyaCard
23
+ widthClass='max-w-3xl'>
24
+ <div class="chum-bucket">
25
+ <h2 class="text-start">More about me...</h2>
22
26
  <p>Check out the latest things I've been rambling about at
23
27
  <a href="https://turnipxenon.com" target="_blank">turnipxenon.com</a> or at
24
28
  <a href="https://turnipxenon.com/blogs/coding-chagrin" target="_blank">turnipxenon.com/blogs/coding-chagrin.</a>
25
29
  </p>
26
30
 
27
- {#if pageMetaList.length > 0}
28
- <h3><b>My latest blogs (sounds too fancy)</b></h3>
29
- {/if}
30
-
31
31
  <div class="chum-bucket-grid">
32
32
  {#if hasTriedGettingChumBucket}
33
33
  {#each pageMetaList as pageMeta}
@@ -38,7 +38,7 @@ onMount(() => {
38
38
  alt={pageMeta.imageAlt}>
39
39
  {/if}
40
40
  <div>
41
- <h3><a href={`https://turnipxenon.com/${pageMeta.relativeLink}`}>{pageMeta.title}</a></h3>
41
+ <h3 class="text-start"><a href={`https://turnipxenon.com/${pageMeta.relativeLink}`}>{pageMeta.title}</a></h3>
42
42
  <p>Published: {pageMeta.datePublished}
43
43
  {#if pageMeta.lastUpdated}
44
44
  | Last updated: {pageMeta.lastUpdated}
@@ -50,12 +50,12 @@ onMount(() => {
50
50
  {/each}
51
51
  {:else}
52
52
  {#each { length: 10 } as _}
53
- <div class="placeholder" />
53
+ <div class="placeholder"></div>
54
54
  {/each}
55
55
  {/if}
56
56
  </div>
57
57
  </div>
58
- </Card>
58
+ </PinyaCard>
59
59
 
60
60
  <style>
61
61
  .chum-bucket-item {
@@ -74,8 +74,8 @@ onMount(() => {
74
74
 
75
75
 
76
76
  .chum-bucket {
77
- padding: 1.5lh 2em;
78
- max-width: 600px;
77
+ padding: 1.5lh 0;
78
+ width: 100%;
79
79
  }
80
80
 
81
81
  .chum-bucket-grid {
@@ -0,0 +1,3 @@
1
+ declare const ChumBucket: import("svelte").Component<Record<string, never>, {}, "">;
2
+ type ChumBucket = ReturnType<typeof ChumBucket>;
3
+ export default ChumBucket;
@@ -0,0 +1,3 @@
1
+ export declare const Seaweed: {
2
+ ChumBucket: import("svelte").Component<Record<string, never>, {}, "">;
3
+ };
@@ -0,0 +1,4 @@
1
+ import { default as ChumBucket } from "./ChumBucket.svelte";
2
+ export const Seaweed = {
3
+ ChumBucket
4
+ };
@@ -0,0 +1,45 @@
1
+ <script lang="ts">
2
+ import { ModeWatcher } from 'mode-watcher';
3
+ import { Modals } from 'svelte-modals';
4
+ import { page } from '$app/state';
5
+ import { locales, localizeHref } from '../../paraglide/runtime';
6
+ import "../../styles/global.css";
7
+
8
+ import '../../styles/app.css';
9
+
10
+ let { children } = $props();
11
+ </script>
12
+
13
+ <Modals>
14
+ <!-- shown when any modal is opened -->
15
+ {#snippet backdrop({ close })}
16
+ <div
17
+ aria-hidden="true"
18
+ class="backdrop"
19
+ onclick={() => close()}
20
+ ></div>
21
+ {/snippet}
22
+ </Modals>
23
+ <ModeWatcher defaultTheme="turnip" />
24
+
25
+ {@render children()}
26
+
27
+ <!--invisible ink-->
28
+ <div style="display:none">
29
+ {#each locales as locale (locale)}
30
+ <a href={localizeHref(page.url.pathname, { locale })}>{locale}</a>
31
+ {/each}
32
+ </div>
33
+
34
+ <style>
35
+ .backdrop {
36
+ position: fixed;
37
+ z-index: 19;
38
+ top: 0;
39
+ bottom: 0;
40
+ right: 0;
41
+ left: 0;
42
+ background: rgba(0, 0, 0, 0.50);
43
+ backdrop-filter: blur(4px);
44
+ }
45
+ </style>
@@ -0,0 +1,7 @@
1
+ import "../../styles/global.css";
2
+ import '../../styles/app.css';
3
+ declare const PinyaBase: import("svelte").Component<{
4
+ children: any;
5
+ }, {}, "">;
6
+ type PinyaBase = ReturnType<typeof PinyaBase>;
7
+ export default PinyaBase;
@@ -0,0 +1,47 @@
1
+ <script lang="ts">
2
+ import type { ConfirmationModalProps } from './props';
3
+ import { ModalBase } from '../../components';
4
+ import { ColorScheme, PinyaButton } from '../../elements';
5
+
6
+ let {
7
+ children,
8
+ confirm,
9
+ ...props
10
+ }: ConfirmationModalProps = $props();
11
+ </script>
12
+
13
+ <ModalBase {...props}>
14
+ <div class="prose-h2:mt-4 max-w-xl">
15
+
16
+ {@render children()}
17
+
18
+ <div class="actions">
19
+ <PinyaButton
20
+ onclick={() => {
21
+ confirm.onclick();
22
+ props.close();
23
+ }}
24
+ title={confirm.hoverOver ?? 'Ok'}
25
+ colorScheme={ColorScheme.Warning}
26
+ >
27
+ {confirm.text ?? 'Ok'}
28
+ </PinyaButton>
29
+ <PinyaButton
30
+ onclick={() => props.close()}
31
+ title="Close modal"
32
+ colorScheme={ColorScheme.Surface}
33
+ >
34
+ Close
35
+ </PinyaButton>
36
+ </div>
37
+ </div>
38
+ </ModalBase>
39
+
40
+ <style>
41
+ .actions {
42
+ display: flex;
43
+ flex-direction: row-reverse;
44
+ margin-top: 1.4lh;
45
+ gap: 1rem;
46
+ }
47
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { ConfirmationModalProps } from './props';
2
+ declare const Component: import("svelte").Component<ConfirmationModalProps, {}, "">;
3
+ type Component = ReturnType<typeof Component>;
4
+ export default Component;
@@ -0,0 +1,2 @@
1
+ export { default as ConfirmationModal } from "./component.svelte";
2
+ export * from "./props";
@@ -0,0 +1,2 @@
1
+ export { default as ConfirmationModal } from "./component.svelte";
2
+ export * from "./props";
@@ -0,0 +1,10 @@
1
+ import type { ModalProps } from 'svelte-modals';
2
+ import type { Snippet } from 'svelte';
3
+ export interface ConfirmationModalProps extends ModalProps {
4
+ children: Snippet;
5
+ confirm: {
6
+ onclick: () => void;
7
+ hoverOver?: string;
8
+ text?: string;
9
+ };
10
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export { default as PinyaBase } from "./PinyaBase.svelte";
2
+ export * from "./pinya-page-layout/index";
3
+ export * from "./confirmation-modal/index";
@@ -0,0 +1,3 @@
1
+ export { default as PinyaBase } from "./PinyaBase.svelte";
2
+ export * from "./pinya-page-layout/index";
3
+ export * from "./confirmation-modal/index";
@@ -0,0 +1,113 @@
1
+ <script lang="ts">
2
+ import type { Snippet } from 'svelte';
3
+ import { m } from '../../../paraglide/messages';
4
+
5
+ import AresLogo from "../../../assets/characters/ares/ares_logo.webp";
6
+ import SettingsLogo from '../../../assets/icons/icon-settings.svg';
7
+ import RandomizedBackground from '../../components/randomized-background/RandomizedBackground.svelte';
8
+ import { modals } from 'svelte-modals';
9
+ import GeneralSettingsModal from '../../modules/modals/general-settings/GeneralSettingsModal.svelte';
10
+ import { localizeHref } from '../../../paraglide/runtime';
11
+ import { appState } from '..';
12
+
13
+ let {
14
+ children,
15
+ appBarLead = $bindable()
16
+ }: {
17
+ children: Snippet
18
+ appBarLead?: Snippet
19
+ } = $props();
20
+
21
+
22
+ const onSettingsClick = () => {
23
+ modals.open(GeneralSettingsModal);
24
+ };
25
+ </script>
26
+
27
+ {#snippet header(extraClass: string)}
28
+ <header class={`bg-surface-100-900 shadow-md ${extraClass}`}>
29
+
30
+ {#if appState.lead}
31
+ <div class="title-space">
32
+ {@render appState.lead()}
33
+ </div>
34
+ {:else if appBarLead}
35
+ <div class="title-space">
36
+ {@render appBarLead()}
37
+ </div>
38
+ {:else }
39
+ <button onclick={() => { location.href = localizeHref('/'); }} title="Home">
40
+ <img
41
+ aria-hidden="true"
42
+ alt=""
43
+ class="ares-logo"
44
+ src={AresLogo}
45
+ />
46
+ </button>
47
+ <div class="title-space text-primary-900-100 font-bold">
48
+ {#if appState.title}
49
+ <span class="fake-h3">{appState.title}</span>
50
+ {/if}
51
+ </div>
52
+ {/if}
53
+
54
+
55
+ <button
56
+ title={m.settings()}
57
+ aria-label={m.settings()}
58
+ class="btn-icon preset-outlined-primary-500 hover:brightness-125"
59
+ onclick={onSettingsClick}
60
+ >
61
+ <img class="icon" src={SettingsLogo} aria-hidden="true" alt="">
62
+ </button>
63
+ </header>
64
+ {/snippet}
65
+
66
+ {@render header('hidden shadow-none w-full')}
67
+ {@render header('fixed z-15 w-[105vw]')}
68
+
69
+ <RandomizedBackground enabled={true} />
70
+
71
+ <div class="default-page-container">
72
+ {@render children?.()}
73
+ </div>
74
+ <div aria-hidden="true" class="footer-space"></div>
75
+
76
+
77
+ <style>
78
+ header {
79
+ top: 0;
80
+ display: flex;
81
+ padding: 1rem 1rem 1rem calc(1rem + 5vw);
82
+ align-items: center;
83
+ transform: translateX(-5vw);
84
+ }
85
+
86
+ .default-page-container {
87
+ display: flex;
88
+ justify-content: center;
89
+ align-items: center;
90
+ margin: 4rem 1rem 0 1rem;
91
+ flex-direction: column;
92
+ }
93
+
94
+ .ares-logo {
95
+ object-fit: contain;
96
+ height: 2rem;
97
+ margin: 0 1rem 0 0;
98
+ filter: var(--filter-ares-logo);
99
+ }
100
+
101
+ .title-space {
102
+ flex-grow: 1;
103
+ white-space: nowrap;
104
+ overflow: hidden;
105
+ text-overflow: ellipsis;
106
+ padding-inline: 1em;
107
+ }
108
+
109
+ .footer-space {
110
+ width: 100%;
111
+ height: calc(var(--dialog-box-height) + 3.5lh);
112
+ }
113
+ </style>
@@ -0,0 +1,8 @@
1
+ import type { Snippet } from 'svelte';
2
+ type $$ComponentProps = {
3
+ children: Snippet;
4
+ appBarLead?: Snippet;
5
+ };
6
+ declare const Component: import("svelte").Component<$$ComponentProps, {}, "appBarLead">;
7
+ type Component = ReturnType<typeof Component>;
8
+ export default Component;
@@ -0,0 +1,2 @@
1
+ export { default as PinyaPageLayout } from "./component.svelte";
2
+ export * from "./runes.svelte";
@@ -0,0 +1,2 @@
1
+ export { default as PinyaPageLayout } from "./component.svelte";
2
+ export * from "./runes.svelte";
@@ -0,0 +1,7 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface AppStore {
3
+ title: string;
4
+ lead?: Snippet;
5
+ }
6
+ export declare const appState: AppStore;
7
+ export {};
@@ -0,0 +1,3 @@
1
+ export const appState = $state({
2
+ title: ''
3
+ });
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": "2.10.0",
4
+ "version": "3.0.0-alpha.1",
5
5
  "scripts": {
6
6
  "dev": "vite dev",
7
7
  "build": "vite build && yarn package",
@@ -18,43 +18,45 @@
18
18
  "to-dev": "git checkout main && git pull origin main && git branch -d turnip/dev && git checkout -b turnip/dev"
19
19
  },
20
20
  "devDependencies": {
21
+ "@inlang/paraglide-js": "2.0.0-beta.30",
21
22
  "@sveltejs/adapter-auto": "^3.1.1",
22
- "@sveltejs/kit": "^2.5.2",
23
- "@sveltejs/package": "^2.2.1",
23
+ "@sveltejs/kit": "^2.5.27",
24
+ "@sveltejs/package": "^2.3.7",
24
25
  "@tailwindcss/forms": "^0.5.3",
25
26
  "@tailwindcss/typography": "^0.5.9",
26
27
  "@typescript-eslint/eslint-plugin": "^5.45.0",
27
28
  "@typescript-eslint/parser": "^5.45.0",
28
- "autoprefixer": "^10.4.14",
29
29
  "eslint": "^8.28.0",
30
30
  "eslint-config-prettier": "^8.5.0",
31
31
  "eslint-plugin-svelte3": "^4.0.0",
32
- "postcss": "8.4.35",
33
32
  "prettier": "^3.2.5",
34
- "prettier-plugin-svelte": "^3.2.2",
33
+ "prettier-plugin-svelte": "^3.2.6",
35
34
  "prisma": "^5.12.1",
36
- "svelte": "^4.2.12",
37
- "svelte-check": "^3.6.6",
35
+ "svelte": "^5.0.0",
36
+ "svelte-check": "^4.0.0",
38
37
  "svelte2tsx": "^0.6.20",
39
- "tailwindcss": "^3.3.2",
38
+ "tailwindcss": "^4.0.14",
40
39
  "tslib": "^2.4.1",
41
- "typescript": "^5.1.6",
42
- "vite": "^5.1.5"
40
+ "typescript": "^5.5.0",
41
+ "vite": "^5.4.4"
43
42
  },
44
43
  "dependencies": {
45
44
  "@prisma/client": "^5.12.1",
46
- "@skeletonlabs/skeleton": "^2.9.0",
47
- "@skeletonlabs/tw-plugin": "^0.3.1",
48
- "@sveltejs/kit": "^2.5.2",
49
- "@sveltejs/vite-plugin-svelte": "^3.0.2",
45
+ "@skeletonlabs/skeleton": "^3.1.0",
46
+ "@skeletonlabs/skeleton-svelte": "^1.0.0",
47
+ "@sveltejs/kit": "^2.5.27",
48
+ "@sveltejs/vite-plugin-svelte": "^4.0.0",
49
+ "@tailwindcss/vite": "^4.0.14",
50
50
  "@types/htmlparser2": "^3.10.7",
51
51
  "@types/node": "^20.11.25",
52
52
  "highlight.js": "^11.8.0",
53
53
  "htmlparser2": "^9.1.0",
54
+ "mode-watcher": "^0.5.1",
54
55
  "node-html-parser": "^6.1.5",
55
56
  "publint": "^0.2.7",
56
57
  "string-width": "^7.1.0",
57
- "svelte": "^4.2.12",
58
+ "svelte": "^5.0.0",
59
+ "svelte-modals": "^2.0.1",
58
60
  "ts-node": "^10.9.1"
59
61
  },
60
62
  "exports": {
@@ -62,13 +64,29 @@
62
64
  "types": "./dist/index.d.ts",
63
65
  "svelte": "./dist/index.js"
64
66
  },
67
+ "./components": {
68
+ "types": "./dist/ui/components/index.d.ts",
69
+ "svelte": "./dist/ui/components/index.js"
70
+ },
71
+ "./elements": {
72
+ "types": "./dist/ui/elements/index.d.ts",
73
+ "svelte": "./dist/ui/elements/index.js"
74
+ },
75
+ "./modules": {
76
+ "types": "./dist/ui/modules/index.d.ts",
77
+ "svelte": "./dist/ui/modules/index.js"
78
+ },
79
+ "./templates": {
80
+ "types": "./dist/ui/templates/index.d.ts",
81
+ "svelte": "./dist/ui/templates/index.js"
82
+ },
65
83
  "./app.postcss": "./src/lib/app.postcss",
66
84
  "./theme.postcss": "./src/lib/theme.postcss"
67
85
  },
68
86
  "files": [
69
87
  "dist",
70
- "./src/lib/app.postcss",
71
- "./src/lib/theme.postcss"
88
+ "src/lib/styles/app.css",
89
+ "src/lib/theme.css"
72
90
  ],
73
91
  "repository": "https://github.com/TurnipXenon/pineapple",
74
92
  "author": "turnipxenon <turnipxenon@gmail.com>",