@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.
- package/dist/assets/icons/icon-check-dark-contrast.svg +1 -0
- package/dist/assets/icons/icon-check-light-contrast.svg +1 -0
- package/dist/assets/icons/icon-copy-dark-contrast.svg +1 -0
- package/dist/assets/icons/icon-copy-light-contrast.svg +1 -0
- package/dist/components/PineappleSlideToggle.svelte +12 -6
- package/dist/components/PineappleSlideToggle.svelte.d.ts +3 -2
- package/dist/styles/app.css +92 -1
- package/dist/styles/turnip-theme.css +6 -2
- package/dist/template/seaweed/CreateUrlForm.svelte +17 -11
- package/dist/template/seaweed/CreateUrlForm.svelte.d.ts +4 -1
- package/dist/template/seaweed/ToastSettings.d.ts +15 -0
- package/dist/template/seaweed/ToastSettings.js +1 -0
- package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte +34 -1
- package/dist/template/seaweed/entry_order_config/EntryOrderConfig.svelte.d.ts +0 -1
- package/dist/ui/elements/CodeBlock/CodeBlock.svelte +65 -0
- package/dist/ui/elements/CodeBlock/CodeBlock.svelte.d.ts +5 -0
- package/dist/ui/elements/CodeBlock/CodeBlockProps.d.ts +11 -0
- package/dist/ui/elements/CodeBlock/CodeBlockProps.js +1 -0
- package/dist/ui/elements/CodeBlock/index.d.ts +2 -0
- package/dist/ui/elements/CodeBlock/index.js +2 -0
- package/dist/ui/elements/PineappleSwitch.svelte +29 -0
- package/dist/ui/elements/PineappleSwitch.svelte.d.ts +10 -0
- package/dist/ui/elements/index.d.ts +10 -8
- package/dist/ui/elements/index.js +10 -8
- package/dist/ui/elements/pinya-card/component.svelte +10 -8
- package/dist/ui/elements/pinya-card/component.svelte.d.ts +3 -3
- package/dist/ui/elements/pinya-card/props.d.ts +3 -0
- package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte +35 -0
- package/dist/ui/elements/pinya-combobox/PinyaCombobox.svelte.d.ts +18 -0
- package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.d.ts +18 -0
- package/dist/ui/elements/pinya-combobox/PinyaComboboxProps.js +1 -0
- package/dist/ui/elements/text-chip/TextChip.svelte +15 -0
- package/dist/ui/elements/text-chip/TextChip.svelte.d.ts +4 -0
- package/dist/ui/elements/text-chip/TextChipProps.d.ts +4 -0
- package/dist/ui/elements/text-chip/TextChipProps.js +1 -0
- package/dist/ui/elements/text-chip/index.d.ts +2 -0
- package/dist/ui/elements/text-chip/index.js +2 -0
- package/dist/ui/modules/index.d.ts +2 -1
- package/dist/ui/modules/index.js +2 -1
- package/dist/ui/modules/modals/general-settings/LanguagePicker.svelte +10 -20
- package/dist/ui/modules/projects/Hepcat.svelte +71 -0
- package/dist/ui/modules/projects/Hepcat.svelte.d.ts +22 -0
- package/dist/ui/modules/projects/Pengi.svelte +60 -0
- package/dist/ui/modules/projects/Pengi.svelte.d.ts +22 -0
- package/dist/ui/modules/projects/Soulwork.svelte +55 -0
- package/dist/ui/modules/projects/Soulwork.svelte.d.ts +22 -0
- package/dist/ui/modules/projects/ThisWebpage.svelte +62 -0
- package/dist/ui/modules/projects/ThisWebpage.svelte.d.ts +22 -0
- package/dist/ui/modules/projects/index.d.ts +4 -0
- package/dist/ui/modules/projects/index.js +4 -0
- package/dist/ui/modules/seaweed/ChumBucket.svelte +36 -37
- package/dist/ui/templates/PinyaBase.svelte +9 -6
- package/dist/ui/templates/PinyaBase.svelte.d.ts +1 -1
- package/dist/ui/templates/index.d.ts +3 -2
- package/dist/ui/templates/index.js +3 -2
- package/dist/ui/templates/pinya-page-layout/component.svelte +17 -10
- package/dist/ui/templates/pinya-page-layout/component.svelte.d.ts +2 -1
- package/dist/ui/templates/seaweed-layout/EntryGroup.svelte +89 -0
- package/dist/ui/templates/seaweed-layout/EntryGroup.svelte.d.ts +4 -0
- package/dist/ui/templates/seaweed-layout/EntryOrderConfig2.svelte +45 -0
- package/dist/ui/templates/seaweed-layout/EntryOrderConfig2.svelte.d.ts +9 -0
- package/dist/ui/templates/seaweed-layout/ProjectComponentProps.d.ts +4 -0
- package/dist/ui/templates/seaweed-layout/ProjectComponentProps.js +1 -0
- package/dist/ui/templates/seaweed-layout/ProjectGroupConfig.svelte +316 -0
- package/dist/ui/templates/seaweed-layout/ProjectGroupConfig.svelte.d.ts +14 -0
- package/dist/ui/templates/seaweed-layout/SeaweedLayout.md +4 -0
- package/dist/ui/templates/seaweed-layout/SeaweedLayout.svelte +196 -0
- package/dist/ui/templates/seaweed-layout/SeaweedLayout.svelte.d.ts +4 -0
- package/dist/ui/templates/seaweed-layout/index.d.ts +4 -0
- package/dist/ui/templates/seaweed-layout/index.js +4 -0
- package/dist/ui/templates/seaweed-layout/props.d.ts +25 -0
- package/dist/ui/templates/seaweed-layout/props.js +1 -0
- package/dist/util/util.d.ts +1 -0
- package/dist/util/util.js +9 -0
- package/package.json +3 -1
- 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,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 {};
|
package/dist/util/util.d.ts
CHANGED
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.
|
|
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",
|
package/src/lib/styles/app.css
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
@import "@skeletonlabs/skeleton/themes/crimson";
|
|
5
5
|
@import "./turnip-theme.css";
|
|
6
6
|
|
|
7
|
-
@source "
|
|
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 */
|