@turnipxenon/pineapple 3.0.0-alpha.1 → 3.0.0-alpha.2

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 (76) hide show
  1. package/dist/assets/icons/icon-check-dark-contrast.svg +1 -0
  2. package/dist/assets/icons/icon-check-light-contrast.svg +1 -0
  3. package/dist/assets/icons/icon-copy-dark-contrast.svg +1 -0
  4. package/dist/assets/icons/icon-copy-light-contrast.svg +1 -0
  5. package/dist/components/PineappleSlideToggle.svelte +12 -6
  6. package/dist/components/PineappleSlideToggle.svelte.d.ts +3 -2
  7. package/dist/styles/app.css +92 -1
  8. package/dist/styles/turnip-theme.css +6 -2
  9. package/dist/template/seaweed/CreateUrlForm.svelte +17 -11
  10. package/dist/template/seaweed/CreateUrlForm.svelte.d.ts +4 -1
  11. package/dist/template/seaweed/ToastSettings.d.ts +15 -0
  12. package/dist/template/seaweed/ToastSettings.js +1 -0
  13. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte +34 -1
  14. package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte.d.ts +0 -1
  15. package/dist/ui/elements/CodeBlock/CodeBlock.svelte +65 -0
  16. package/dist/ui/elements/CodeBlock/CodeBlock.svelte.d.ts +5 -0
  17. package/dist/ui/elements/CodeBlock/CodeBlockProps.d.ts +11 -0
  18. package/dist/ui/elements/CodeBlock/CodeBlockProps.js +1 -0
  19. package/dist/ui/elements/CodeBlock/index.d.ts +2 -0
  20. package/dist/ui/elements/CodeBlock/index.js +2 -0
  21. package/dist/ui/elements/PineappleSwitch.svelte +29 -0
  22. package/dist/ui/elements/PineappleSwitch.svelte.d.ts +10 -0
  23. package/dist/ui/elements/index.d.ts +10 -8
  24. package/dist/ui/elements/index.js +10 -8
  25. package/dist/ui/elements/pinya-card/component.svelte +10 -8
  26. package/dist/ui/elements/pinya-card/component.svelte.d.ts +3 -3
  27. package/dist/ui/elements/pinya-card/props.d.ts +3 -0
  28. package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte +35 -0
  29. package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte.d.ts +18 -0
  30. package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts +18 -0
  31. package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.js +1 -0
  32. package/dist/ui/elements/text-chip/TextChip.svelte +15 -0
  33. package/dist/ui/elements/text-chip/TextChip.svelte.d.ts +4 -0
  34. package/dist/ui/elements/text-chip/TextChipProps.d.ts +4 -0
  35. package/dist/ui/elements/text-chip/TextChipProps.js +1 -0
  36. package/dist/ui/elements/text-chip/index.d.ts +2 -0
  37. package/dist/ui/elements/text-chip/index.js +2 -0
  38. package/dist/ui/modules/index.d.ts +2 -1
  39. package/dist/ui/modules/index.js +2 -1
  40. package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte +10 -20
  41. package/dist/ui/modules/projects/Hepcat.svelte +71 -0
  42. package/dist/ui/modules/projects/Hepcat.svelte.d.ts +22 -0
  43. package/dist/ui/modules/projects/Pengi.svelte +60 -0
  44. package/dist/ui/modules/projects/Pengi.svelte.d.ts +22 -0
  45. package/dist/ui/modules/projects/Soulwork.svelte +55 -0
  46. package/dist/ui/modules/projects/Soulwork.svelte.d.ts +22 -0
  47. package/dist/ui/modules/projects/ThisWebpage.svelte +62 -0
  48. package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts +22 -0
  49. package/dist/ui/modules/projects/index.d.ts +4 -0
  50. package/dist/ui/modules/projects/index.js +4 -0
  51. package/dist/ui/modules/seaweed/ChumBucket.svelte +36 -37
  52. package/dist/ui/templates/PinyaBase.svelte +9 -6
  53. package/dist/ui/templates/PinyaBase.svelte.d.ts +1 -1
  54. package/dist/ui/templates/index.d.ts +3 -2
  55. package/dist/ui/templates/index.js +3 -2
  56. package/dist/ui/templates/pinya-page-layout/component.svelte +17 -10
  57. package/dist/ui/templates/pinya-page-layout/component.svelte.d.ts +2 -1
  58. package/dist/ui/templates/seaweed-layout/EntryGroup.svelte +89 -0
  59. package/dist/ui/templates/seaweed-layout/EntryGroup.svelte.d.ts +4 -0
  60. package/dist/ui/templates/seaweed-layout/EntryOrderConfig2.svelte +45 -0
  61. package/dist/ui/templates/seaweed-layout/EntryOrderConfig2.svelte.d.ts +9 -0
  62. package/dist/ui/templates/seaweed-layout/ProjectComponentProps.d.ts +4 -0
  63. package/dist/ui/templates/seaweed-layout/ProjectComponentProps.js +1 -0
  64. package/dist/ui/templates/seaweed-layout/ProjectGroupConfig.svelte +316 -0
  65. package/dist/ui/templates/seaweed-layout/ProjectGroupConfig.svelte.d.ts +14 -0
  66. package/dist/ui/templates/seaweed-layout/SeaweedLayout.md +4 -0
  67. package/dist/ui/templates/seaweed-layout/SeaweedLayout.svelte +196 -0
  68. package/dist/ui/templates/seaweed-layout/SeaweedLayout.svelte.d.ts +4 -0
  69. package/dist/ui/templates/seaweed-layout/index.d.ts +4 -0
  70. package/dist/ui/templates/seaweed-layout/index.js +4 -0
  71. package/dist/ui/templates/seaweed-layout/props.d.ts +25 -0
  72. package/dist/ui/templates/seaweed-layout/props.js +1 -0
  73. package/dist/util/util.d.ts +1 -0
  74. package/dist/util/util.js +9 -0
  75. package/package.json +3 -1
  76. package/src/lib/styles/app.css +92 -1
@@ -0,0 +1,196 @@
1
+ <script lang="ts">
2
+ import type { SeaweedLayoutProps } from "./props";
3
+ import ChumBucket from "../../modules/seaweed/ChumBucket.svelte";
4
+ import { PinyaPageLayout } from "../index";
5
+ import { SocialSection } from "../../components/index";
6
+ import EntryGroup from "./EntryGroup.svelte";
7
+ import PineappleSwitch from "../../elements/PineappleSwitch.svelte";
8
+ import { CodeBlock, TextChip } from "../../elements/index";
9
+ import { SvelteMap } from "svelte/reactivity";
10
+ import EntryOrderConfig2 from "./EntryOrderConfig2.svelte";
11
+ import CreateUrlForm from "../../../template/seaweed/CreateUrlForm.svelte";
12
+
13
+ let {
14
+ children,
15
+ sideSection,
16
+ entryList, // todo
17
+ layout = $bindable(), // todo
18
+ domain = "http://localhost:5173/seaweed2",
19
+ queryTerms
20
+ }: SeaweedLayoutProps = $props();
21
+
22
+ let isAdvanceSettingOn = $state(true);
23
+ let orderUrl = $state("");
24
+
25
+ let queryStates = new SvelteMap<string, boolean>(queryTerms.map(term => [term, true]));
26
+ let styleStr = $state("");
27
+ let queryQt = $derived.by(() => {
28
+ const qtArr = [...queryStates.entries()
29
+ .filter(([, state]) => state)
30
+ .map(([term]) => term)
31
+ ];
32
+
33
+ if (qtArr.length === queryStates.size) {
34
+ return "";
35
+ }
36
+
37
+ const qtStr = qtArr.join(",");
38
+
39
+ if (qtStr) {
40
+ return `qt=${qtStr}`;
41
+ }
42
+
43
+ return "qt=clear";
44
+ });
45
+
46
+ $effect(() => {
47
+ const chipList: string[] = [];
48
+ const termList: string[] = [];
49
+ queryStates.entries()
50
+ .filter(([_, state]) => state)
51
+ .forEach(([term, state], idx) => {
52
+ const qtTerm = `.qt-${term}`;
53
+ termList.push(qtTerm);
54
+ chipList.push(`.text-chip${qtTerm}`);
55
+ });
56
+ styleStr = `<style>
57
+ ${termList.join(", ")} {
58
+ font-weight: bolder;
59
+ color: var(--color-secondary-400);
60
+ }
61
+
62
+ ${chipList.join(", ")} {
63
+ background-color: var(--color-secondary-500) /* oklch(55.6% 0 0deg) = #737373 */;
64
+ color: var(--color-secondary-contrast-500) /* var(--color-secondary-contrast-light) */;
65
+ }
66
+ </style>`;
67
+ });
68
+
69
+ let advancedQuery = $derived.by(() => {
70
+ const query = [orderUrl, queryQt]
71
+ .filter(q => q)
72
+ .join("&");
73
+ if (query) {
74
+ return `${query}`;
75
+ }
76
+
77
+ return "";
78
+ });
79
+
80
+ let advancedUrl = $derived.by(() => `${domain}/?${advancedQuery}`);
81
+ </script>
82
+
83
+ <svelte:head>
84
+ {@html styleStr}
85
+ </svelte:head>
86
+
87
+
88
+ {#snippet socialSection()}
89
+ <SocialSection></SocialSection>
90
+ {/snippet}
91
+ <PinyaPageLayout>
92
+ {#snippet appBarLead()}
93
+ <div></div>
94
+ {/snippet}
95
+
96
+ <div id="upper-section">
97
+
98
+ <div class="upper-section-start">
99
+ {@render sideSection(socialSection)}
100
+ </div>
101
+
102
+ <div class="upper-section-end">
103
+ {@render children()}
104
+ </div>
105
+ </div>
106
+
107
+ <!--todo: render list #migration-->
108
+ {#each layout as group (group.title)}
109
+ <EntryGroup {...group}></EntryGroup>
110
+ {/each}
111
+
112
+ {#snippet footer()}
113
+ <div class="footer">
114
+ <ChumBucket></ChumBucket>
115
+
116
+ <div class="default-card advanced-setting mt-16 mb-32">
117
+ <h1>Advanced settings</h1>
118
+ <p>This one is for those curious how I customize this page.</p>
119
+
120
+ <PineappleSwitch name="advanced-setting-slider"
121
+ bind:checked={isAdvanceSettingOn}>
122
+ </PineappleSwitch>
123
+ Advanced settings: {isAdvanceSettingOn ? "On" : "Off"}
124
+
125
+ {#if (isAdvanceSettingOn)}
126
+
127
+ <h3 class="mt-6">Query terms to bold</h3>
128
+ <div class="query-term-grid max-w-2xl">
129
+ {#each queryStates as [term, shouldBold] (term)}
130
+ <button
131
+ class="bg-transparent hover:brightness-110"
132
+ onclick={() => { queryStates.set(term, !shouldBold); }}
133
+ >
134
+ <TextChip queryClass={shouldBold ? 'highlight-chip' : ''}>
135
+ <!-- todo: change shouldBold -->
136
+ <span style={`font-weight: ${shouldBold ? "bold" : "normal"}`}>
137
+ {#if (shouldBold)}✓{/if}
138
+ {term}
139
+ </span>
140
+ </TextChip>
141
+ </button>
142
+ {/each}
143
+ </div>
144
+
145
+ <EntryOrderConfig2
146
+ {layout}
147
+ bind:orderUrl={orderUrl}
148
+ allEntries={entryList}
149
+ ></EntryOrderConfig2>
150
+
151
+ <br>
152
+ <p>Copy the url below and open a new page with it</p>
153
+ <CodeBlock code={advancedUrl} lang="markdown" classes="max-w-2xl" />
154
+ <CreateUrlForm queryParams={advancedQuery}></CreateUrlForm>
155
+ {/if}
156
+ </div>
157
+ </div>
158
+ {/snippet}
159
+ </PinyaPageLayout>
160
+
161
+ <style>
162
+ :global(html) {
163
+ --color-bg-footer: var(--color-surface-200);
164
+ --color-footer-border: var(--color-primary-500);
165
+ }
166
+
167
+ :global(html.dark) {
168
+ --color-bg-footer: var(--color-surface-900);
169
+ --color-footer-border: var(--color-primary-950);
170
+ }
171
+
172
+ .footer {
173
+ width: 100vw;
174
+ display: flex;
175
+ flex-direction: column;
176
+ align-items: center;
177
+ margin-top: 3lh;
178
+ background-color: var(--color-bg-footer);
179
+ border-top: 2px solid var(--color-footer-border);
180
+ }
181
+
182
+ #upper-section {
183
+ display: flex;
184
+ flex-direction: row;
185
+ flex-wrap: wrap;
186
+ gap: 2rem;
187
+ justify-content: center;
188
+ }
189
+
190
+ .query-term-grid {
191
+ display: flex;
192
+ flex-wrap: wrap;
193
+ gap: 0.25em;
194
+ margin-top: 1lh;
195
+ }
196
+ </style>
@@ -0,0 +1,4 @@
1
+ import type { SeaweedLayoutProps } from "./props";
2
+ declare const SeaweedLayout: import("svelte").Component<SeaweedLayoutProps, {}, "layout">;
3
+ type SeaweedLayout = ReturnType<typeof SeaweedLayout>;
4
+ export default SeaweedLayout;
@@ -0,0 +1,4 @@
1
+ export { default as SeaweedLayout } from "./SeaweedLayout.svelte";
2
+ export { default as EntryGroup } from "./EntryGroup.svelte";
3
+ export * from "./props";
4
+ export * from "./ProjectComponentProps";
@@ -0,0 +1,4 @@
1
+ export { default as SeaweedLayout } from "./SeaweedLayout.svelte";
2
+ export { default as EntryGroup } from "./EntryGroup.svelte";
3
+ export * from "./props";
4
+ export * from "./ProjectComponentProps";
@@ -0,0 +1,25 @@
1
+ import type { Snippet } from "svelte";
2
+ interface ProjectComponentProps {
3
+ }
4
+ type ComponentSnippet = Snippet<[ProjectComponentProps]>;
5
+ export interface SnippetMeta {
6
+ key: string;
7
+ component: ComponentSnippet;
8
+ }
9
+ export interface ProjectGroup {
10
+ key: string;
11
+ title: string;
12
+ entryList: SnippetMeta[];
13
+ }
14
+ export interface SeaweedLayoutProps {
15
+ name: string;
16
+ email: string;
17
+ linkedinSlug: string;
18
+ domain: string;
19
+ sideSection: Snippet<[Snippet]>;
20
+ children: Snippet;
21
+ entryList: SnippetMeta[];
22
+ layout: ProjectGroup[];
23
+ queryTerms: string[];
24
+ }
25
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -8,3 +8,4 @@ export declare const createExternalLinkWarningFunction: (args: ExternalLinkWarni
8
8
  export interface RawGlob {
9
9
  default: string;
10
10
  }
11
+ export declare const getQueryTerms: (modules: Record<string, unknown>) => string[];
package/dist/util/util.js CHANGED
@@ -25,3 +25,12 @@ export const createExternalLinkWarningFunction = (args) => {
25
25
  location.href = args.href;
26
26
  });
27
27
  };
28
+ export const getQueryTerms = (modules) => {
29
+ const re = new RegExp("qt-(\\w+)+", "g");
30
+ const queryTerms = new Set();
31
+ for (const path in modules) {
32
+ const modStr = modules[path];
33
+ [...modStr.matchAll(re).map(i => i[1])].forEach(term => queryTerms.add(term));
34
+ }
35
+ return [...queryTerms].sort();
36
+ };
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": "3.0.0-alpha.1",
4
+ "version": "3.0.0-alpha.2",
5
5
  "scripts": {
6
6
  "dev": "vite dev",
7
7
  "build": "vite build && yarn package",
@@ -32,6 +32,7 @@
32
32
  "prettier": "^3.2.5",
33
33
  "prettier-plugin-svelte": "^3.2.6",
34
34
  "prisma": "^5.12.1",
35
+ "shiki-transformer-copy-button": "0.0.3",
35
36
  "svelte": "^5.0.0",
36
37
  "svelte-check": "^4.0.0",
37
38
  "svelte2tsx": "^0.6.20",
@@ -54,6 +55,7 @@
54
55
  "mode-watcher": "^0.5.1",
55
56
  "node-html-parser": "^6.1.5",
56
57
  "publint": "^0.2.7",
58
+ "shiki": "^3.2.1",
57
59
  "string-width": "^7.1.0",
58
60
  "svelte": "^5.0.0",
59
61
  "svelte-modals": "^2.0.1",
@@ -4,7 +4,7 @@
4
4
  @import "@skeletonlabs/skeleton/themes/crimson";
5
5
  @import "./turnip-theme.css";
6
6
 
7
- @source "../node_modules/@skeletonlabs/skeleton-svelte/dist";
7
+ @source "../../../node_modules/@skeletonlabs/skeleton-svelte/dist";
8
8
 
9
9
  @custom-variant dark (&:where(.dark, .dark *));
10
10
 
@@ -51,3 +51,94 @@ a.external-link {
51
51
  --tw-ring-color: rgb(var(--color-text-400));
52
52
  /*background-color: red;*/
53
53
  }
54
+
55
+ @layer base {
56
+ .game-link-section {
57
+ @apply mt-6 flex gap-2 justify-center;
58
+ }
59
+
60
+ .game-video-cover {
61
+ @apply rounded-t-lg max-h-64 object-cover w-full;
62
+ }
63
+
64
+ .text-chip-container {
65
+ display: flex;
66
+ flex-wrap: wrap;
67
+ gap: 0.5rem;
68
+ }
69
+
70
+ .text-chip {
71
+ background-color: var(--color-secondary-50-950) /* light-dark(var(--color-secondary-50), var(--color-secondary-950)) */;
72
+ color: var(--color-secondary-950-50) /* light-dark(var(--color-secondary-950), var(--color-secondary-50)) */;
73
+ }
74
+ }
75
+
76
+ /*https://shiki.style/guide/dual-themes*/
77
+ html.dark .shiki,
78
+ html.dark .shiki span {
79
+ color: var(--shiki-dark) !important;
80
+ background-color: var(--shiki-dark-bg) !important;
81
+ /* Optional, if you also want font styles */
82
+ font-style: var(--shiki-dark-font-style) !important;
83
+ font-weight: var(--shiki-dark-font-weight) !important;
84
+ text-decoration: var(--shiki-dark-text-decoration) !important;
85
+ }
86
+
87
+ .shiki {
88
+ span {
89
+ white-space: pre-wrap;
90
+ word-wrap: break-word;
91
+ }
92
+ }
93
+
94
+ /* region shiki copy button */
95
+ pre:has(code) {
96
+ position: relative;
97
+ }
98
+
99
+ pre button.copy {
100
+ position: absolute;
101
+ right: 16px;
102
+ top: 16px;
103
+ height: 28px;
104
+ width: 28px;
105
+ padding: 0;
106
+ display: flex;
107
+
108
+ & span {
109
+ width: 100%;
110
+ aspect-ratio: 1 / 1;
111
+ background-repeat: no-repeat;
112
+ background-position: center;
113
+ background-size: cover;
114
+ }
115
+
116
+ & .ready {
117
+ background-image: url("$pkg/assets/icons/icon-copy-light-contrast.svg");
118
+
119
+ @variant dark {
120
+ background-image: url("$pkg/assets/icons/icon-copy-dark-contrast.svg");
121
+ }
122
+ }
123
+
124
+ & .success {
125
+ display: none;
126
+ background-image: url("$pkg/assets/icons/icon-check-light-contrast.svg");
127
+
128
+ @variant dark {
129
+ background-image: url("$pkg/assets/icons/icon-check-dark-contrast.svg");
130
+ }
131
+ }
132
+
133
+ &.copied {
134
+ & .success {
135
+ display: block;
136
+ }
137
+
138
+ & .ready {
139
+ display: none;
140
+ }
141
+ }
142
+ }
143
+
144
+ /* endregion shiki copy button */