@turnipxenon/pineapple 5.3.0-alpha.5 → 5.3.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 (42) hide show
  1. package/dist/external/paraglide/messages/_index.d.ts +8 -2
  2. package/dist/external/paraglide/messages/_index.d.ts.map +1 -1
  3. package/dist/external/paraglide/messages/_index.js +50 -2
  4. package/dist/external/paraglide/messages/en.d.ts +5 -0
  5. package/dist/external/paraglide/messages/en.d.ts.map +1 -0
  6. package/dist/external/paraglide/messages/en.js +10 -0
  7. package/dist/external/paraglide/messages/fr.d.ts +5 -0
  8. package/dist/external/paraglide/messages/fr.d.ts.map +1 -0
  9. package/dist/external/paraglide/messages/fr.js +10 -0
  10. package/dist/external/paraglide/messages/tl.d.ts +5 -0
  11. package/dist/external/paraglide/messages/tl.d.ts.map +1 -0
  12. package/dist/external/paraglide/messages/tl.js +7 -0
  13. package/dist/modules/parsnip/ParsnipEmbedWikilink.svelte +10 -0
  14. package/dist/modules/parsnip/ParsnipEmbedWikilink.svelte.d.ts.map +1 -1
  15. package/dist/modules/parsnip/ParsnipEntry.d.ts +2 -0
  16. package/dist/modules/parsnip/ParsnipEntry.d.ts.map +1 -1
  17. package/dist/modules/parsnip/ParsnipOverall.d.ts +2 -0
  18. package/dist/modules/parsnip/ParsnipOverall.d.ts.map +1 -1
  19. package/dist/modules/parsnip/external-images/ParsnipImage.svelte +4 -1
  20. package/dist/modules/parsnip/route-util/ParsnipBlog.svelte +10 -2
  21. package/dist/modules/parsnip/route-util/ParsnipBlog.svelte.d.ts.map +1 -1
  22. package/dist/modules/parsnip/route-util/slugPageServerLoad.d.ts.map +1 -1
  23. package/dist/modules/parsnip/route-util/slugPageServerLoad.js +28 -2
  24. package/dist/ui/components/FourPartCard.svelte +11 -3
  25. package/dist/ui/modules/NavigationMenu/NavigationMenu.svelte +114 -35
  26. package/dist/ui/modules/NavigationMenu/NavigationMenu.svelte.d.ts.map +1 -1
  27. package/dist/ui/modules/NavigationMenu/PageMeta.d.ts +11 -0
  28. package/dist/ui/modules/NavigationMenu/PageMeta.d.ts.map +1 -1
  29. package/dist/ui/templates/PinyaPageLayout/PinyaPageLayout.svelte +1 -1
  30. package/dist/ui/templates/blog_template/BlogTemplate.svelte +3 -3
  31. package/dist/ui/templates/blog_template/BlogTemplateInner.svelte +51 -14
  32. package/dist/ui/templates/blog_template/BlogTemplateInner.svelte.d.ts.map +1 -1
  33. package/dist/util/util.d.ts +1 -0
  34. package/dist/util/util.d.ts.map +1 -1
  35. package/dist/util/util.js +18 -0
  36. package/package.json +1 -1
  37. package/dist/external/paraglide/messages/example_message.d.ts +0 -6
  38. package/dist/external/paraglide/messages/example_message.d.ts.map +0 -1
  39. package/dist/external/paraglide/messages/example_message.js +0 -38
  40. package/dist/external/paraglide/messages/settings.d.ts +0 -4
  41. package/dist/external/paraglide/messages/settings.d.ts.map +0 -1
  42. package/dist/external/paraglide/messages/settings.js +0 -37
@@ -1,3 +1,9 @@
1
- export * from "./example_message.js";
2
- export * from "./settings.js";
1
+ export function example_message(inputs: {
2
+ username: NonNullable<unknown>;
3
+ }, options?: {
4
+ locale?: "en" | "fr" | "tl";
5
+ }): string;
6
+ export function settings(inputs?: {}, options?: {
7
+ locale?: "en" | "fr" | "tl";
8
+ }): string;
3
9
  //# sourceMappingURL=_index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_index.d.ts","sourceRoot":"","sources":["../../../../src/lib/external/paraglide/messages/_index.js"],"names":[],"mappings":""}
1
+ {"version":3,"file":"_index.d.ts","sourceRoot":"","sources":["../../../../src/lib/external/paraglide/messages/_index.js"],"names":[],"mappings":"AAkBO,wCALG;IAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;CAAE,YAClC;IAAE,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;CAAE,GAC7B,MAAM,CAYjB;AAcM,kCALG,EAAE,YACF;IAAE,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;CAAE,GAC7B,MAAM,CAYjB"}
@@ -1,3 +1,51 @@
1
1
  /* eslint-disable */
2
- export * from './example_message.js'
3
- export * from './settings.js'
2
+ import { getLocale, trackMessageCall, experimentalMiddlewareLocaleSplitting, isServer } from "../runtime.js"
3
+ import * as en from "./en.js"
4
+ import * as fr from "./fr.js"
5
+ import * as tl from "./tl.js"
6
+ /**
7
+ * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
8
+ *
9
+ * - Changing this function will be over-written by the next build.
10
+ *
11
+ * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
12
+ * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
13
+ *
14
+ * @param {{ username: NonNullable<unknown> }} inputs
15
+ * @param {{ locale?: "en" | "fr" | "tl" }} options
16
+ * @returns {string}
17
+ */
18
+ /* @__NO_SIDE_EFFECTS__ */
19
+ export const example_message = (inputs, options = {}) => {
20
+ if (experimentalMiddlewareLocaleSplitting && isServer === false) {
21
+ return /** @type {any} */ (globalThis).__paraglide_ssr.example_message(inputs)
22
+ }
23
+ const locale = options.locale ?? getLocale()
24
+ trackMessageCall("example_message", locale)
25
+ if (locale === "en") return en.example_message(inputs)
26
+ if (locale === "fr") return fr.example_message(inputs)
27
+ return tl.example_message(inputs)
28
+ };
29
+ /**
30
+ * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
31
+ *
32
+ * - Changing this function will be over-written by the next build.
33
+ *
34
+ * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
35
+ * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
36
+ *
37
+ * @param {{}} inputs
38
+ * @param {{ locale?: "en" | "fr" | "tl" }} options
39
+ * @returns {string}
40
+ */
41
+ /* @__NO_SIDE_EFFECTS__ */
42
+ export const settings = (inputs = {}, options = {}) => {
43
+ if (experimentalMiddlewareLocaleSplitting && isServer === false) {
44
+ return /** @type {any} */ (globalThis).__paraglide_ssr.settings(inputs)
45
+ }
46
+ const locale = options.locale ?? getLocale()
47
+ trackMessageCall("settings", locale)
48
+ if (locale === "en") return en.settings(inputs)
49
+ if (locale === "fr") return fr.settings(inputs)
50
+ return tl.settings(inputs)
51
+ };
@@ -0,0 +1,5 @@
1
+ export const example_message: (inputs: {
2
+ username: NonNullable<unknown>;
3
+ }) => string;
4
+ export const settings: (inputs: {}) => string;
5
+ //# sourceMappingURL=en.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../../src/lib/external/paraglide/messages/en.js"],"names":[],"mappings":"AAGA,8BAA0C,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;CAAE,KAAK,MAAM,CAE9F;AAEF,uBAAmC,CAAC,MAAM,EAAE,EAAE,KAAK,MAAM,CAEvD"}
@@ -0,0 +1,10 @@
1
+ /* eslint-disable */
2
+
3
+
4
+ export const example_message = /** @type {(inputs: { username: NonNullable<unknown> }) => string} */ (i) => {
5
+ return `Hello world ${i.username}`
6
+ };
7
+
8
+ export const settings = /** @type {(inputs: {}) => string} */ () => {
9
+ return `Settings`
10
+ };
@@ -0,0 +1,5 @@
1
+ export const example_message: (inputs: {
2
+ username: NonNullable<unknown>;
3
+ }) => string;
4
+ export const settings: (inputs: {}) => string;
5
+ //# sourceMappingURL=fr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fr.d.ts","sourceRoot":"","sources":["../../../../src/lib/external/paraglide/messages/fr.js"],"names":[],"mappings":"AAGA,8BAA0C,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;CAAE,KAAK,MAAM,CAE9F;AAEF,uBAAmC,CAAC,MAAM,EAAE,EAAE,KAAK,MAAM,CAEvD"}
@@ -0,0 +1,10 @@
1
+ /* eslint-disable */
2
+
3
+
4
+ export const example_message = /** @type {(inputs: { username: NonNullable<unknown> }) => string} */ (i) => {
5
+ return `Bonjour ${i.username}`
6
+ };
7
+
8
+ export const settings = /** @type {(inputs: {}) => string} */ () => {
9
+ return `Paramètres`
10
+ };
@@ -0,0 +1,5 @@
1
+ export const example_message: (inputs: {
2
+ username: NonNullable<unknown>;
3
+ }) => string;
4
+ export { settings } from "./en.js";
5
+ //# sourceMappingURL=tl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tl.d.ts","sourceRoot":"","sources":["../../../../src/lib/external/paraglide/messages/tl.js"],"names":[],"mappings":"AAGA,8BAA0C,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;CAAE,KAAK,MAAM,CAE9F"}
@@ -0,0 +1,7 @@
1
+ /* eslint-disable */
2
+
3
+
4
+ export const example_message = /** @type {(inputs: { username: NonNullable<unknown> }) => string} */ (i) => {
5
+ return `Kamusta ${i.username}`
6
+ };
7
+ export { settings } from "./en.js"
@@ -17,3 +17,13 @@
17
17
  <!-- todo(turnip): determine appropriate media -->
18
18
  <!-- todo(turnip): add alt text -->
19
19
  <img src={`${getCmsBaseUrl()}/${wikilink.fileAccessor.basePath}`} alt=""/>
20
+
21
+ <style>
22
+ img {
23
+ display: block;
24
+ width: auto;
25
+ max-height: min(50vh, 24lh);
26
+ margin: auto;
27
+ object-fit: contain;
28
+ }
29
+ </style>
@@ -1 +1 @@
1
- {"version":3,"file":"ParsnipEmbedWikilink.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/modules/parsnip/ParsnipEmbedWikilink.svelte.ts"],"names":[],"mappings":"AAMC,UAAU,aAAa;IACtB,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE;QACb,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KACjB,CAAA;CACD;AACD,KAAK,gBAAgB,GAAI;IAAE,QAAQ,EAAE,aAAa,CAAA;CAAE,CAAC;AActD,QAAA,MAAM,oBAAoB,sDAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"ParsnipEmbedWikilink.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/modules/parsnip/ParsnipEmbedWikilink.svelte.ts"],"names":[],"mappings":"AAMC,UAAU,aAAa;IACtB,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE;QACb,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,KAAK,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KACjB,CAAA;CACD;AACD,KAAK,gBAAgB,GAAI;IAAE,QAAQ,EAAE,aAAa,CAAA;CAAE,CAAC;AAgBtD,QAAA,MAAM,oBAAoB,sDAAwC,CAAC;AACnE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
@@ -1,8 +1,10 @@
1
+ import type { FoodReviewJson } from "../../ui/modules/index";
1
2
  import type { ParsnipEntrySummary } from "./ParsnipOverall";
2
3
  import type { Root } from "mdast";
3
4
  export interface ParsnipEntry extends ParsnipEntrySummary {
4
5
  ast: {
5
6
  ast: Root;
6
7
  };
8
+ foodReviewJson: FoodReviewJson;
7
9
  }
8
10
  //# sourceMappingURL=ParsnipEntry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ParsnipEntry.d.ts","sourceRoot":"","sources":["../../../src/lib/modules/parsnip/ParsnipEntry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAElC,MAAM,WAAW,YAAa,SAAQ,mBAAmB;IACxD,GAAG,EAAE;QAAE,GAAG,EAAE,IAAI,CAAA;KAAE,CAAC;CACnB"}
1
+ {"version":3,"file":"ParsnipEntry.d.ts","sourceRoot":"","sources":["../../../src/lib/modules/parsnip/ParsnipEntry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAElC,MAAM,WAAW,YAAa,SAAQ,mBAAmB;IACxD,GAAG,EAAE;QAAE,GAAG,EAAE,IAAI,CAAA;KAAE,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;CAC/B"}
@@ -22,6 +22,8 @@ export interface ParsnipEntrySummary extends SimplifiedEntry {
22
22
  basename: string;
23
23
  name: string;
24
24
  tags: string[];
25
+ datePublished?: string;
26
+ lastUpdated?: string;
25
27
  stat: {
26
28
  /**
27
29
  * unix time
@@ -1 +1 @@
1
- {"version":3,"file":"ParsnipOverall.d.ts","sourceRoot":"","sources":["../../../src/lib/modules/parsnip/ParsnipOverall.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC/B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC3D;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE;QACL;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;QACd;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;KACd,CAAA;CACD;AAED,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"ParsnipOverall.d.ts","sourceRoot":"","sources":["../../../src/lib/modules/parsnip/ParsnipOverall.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC/B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC3D;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE;QACL;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;QACd;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;KACd,CAAA;CACD;AAED,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB"}
@@ -56,8 +56,11 @@
56
56
  img {
57
57
  aspect-ratio: auto;
58
58
  display: block;
59
- width: 100%;
59
+ width: unset;
60
60
  border-radius: var(--radius-sm);
61
+ max-height: min(50vh, 24lh);
62
+ margin: auto;
63
+ object-fit: contain;
61
64
  }
62
65
 
63
66
  .parsnip-image-described {
@@ -13,10 +13,18 @@
13
13
  title: parsnipEntry.basename,
14
14
  datePublished: new Date(parsnipEntry.stat.ctime).toLocaleString(),
15
15
  lastUpdated: new Date(parsnipEntry.stat.mtime).toLocaleString(),
16
- priority: 0
16
+ priority: 0,
17
+ foodReviewJson: parsnipEntry.foodReviewJson,
17
18
  });
19
+
18
20
  </script>
19
21
 
20
- <BlogTemplate pageMeta={pageMeta}>
22
+ <svelte:head>
23
+ {#if parsnipEntry.foodReviewJson}
24
+ {@html `<script type="application/ld+json">${JSON.stringify(parsnipEntry.foodReviewJson)}</script>`}
25
+ {/if}
26
+ </svelte:head>
27
+
28
+ <BlogTemplate {pageMeta}>
21
29
  <ParsnipBlockChildren blockChildren={parsnipEntry.ast.ast.children} />
22
30
  </BlogTemplate>
@@ -1 +1 @@
1
- {"version":3,"file":"ParsnipBlog.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/modules/parsnip/route-util/ParsnipBlog.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEnD,KAAK,gBAAgB,GAAI;IAAE,YAAY,EAAE,YAAY,CAAA;CAAE,CAAC;AA0BzD,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ParsnipBlog.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/modules/parsnip/route-util/ParsnipBlog.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEnD,KAAK,gBAAgB,GAAI;IAAE,YAAY,EAAE,YAAY,CAAA;CAAE,CAAC;AAkCzD,QAAA,MAAM,WAAW,sDAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"slugPageServerLoad.d.ts","sourceRoot":"","sources":["../../../../src/lib/modules/parsnip/route-util/slugPageServerLoad.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uDAAuD,CAAC;AAKvF,eAAO,MAAM,kBAAkB,GAAU,YAAY;IAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;;;EA4DhF,CAAC"}
1
+ {"version":3,"file":"slugPageServerLoad.d.ts","sourceRoot":"","sources":["../../../../src/lib/modules/parsnip/route-util/slugPageServerLoad.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uDAAuD,CAAC;AAKvF,eAAO,MAAM,kBAAkB,GAAU,YAAY;IAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE;;;EA2FhF,CAAC"}
@@ -10,6 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  import { getCmsBaseUrl } from "../../../util/env-getter";
11
11
  import { error } from "@sveltejs/kit";
12
12
  export const slugPageServerLoad = (_a) => __awaiter(void 0, [_a], void 0, function* ({ params }) {
13
+ var _b;
13
14
  const baseUrl = getCmsBaseUrl();
14
15
  const mainMeta = yield fetch(`${baseUrl}/main.meta.json`);
15
16
  if (!mainMeta.ok) {
@@ -30,7 +31,10 @@ export const slugPageServerLoad = (_a) => __awaiter(void 0, [_a], void 0, functi
30
31
  parsnipEntry.ast.ast.children.forEach(child => {
31
32
  if (child.type === "paragraph"
32
33
  && child.children.length === 1
33
- && child.children[0].type === "image") {
34
+ && (child.children[0].type === "image"
35
+ || (child.children[0].type === "link" &&
36
+ (child.children[0].url.startsWith("https://photos.")
37
+ || child.children[0].url.startsWith("https://rabiole."))))) {
34
38
  imageCollection.push(child.children[0]);
35
39
  }
36
40
  else if (imageCollection.length > 0) {
@@ -45,13 +49,35 @@ export const slugPageServerLoad = (_a) => __awaiter(void 0, [_a], void 0, functi
45
49
  newChildren.push(child);
46
50
  }
47
51
  });
52
+ if (imageCollection.length > 0) {
53
+ newChildren.push({
54
+ "type": "imageCollection",
55
+ children: imageCollection
56
+ });
57
+ }
48
58
  parsnipEntry.ast.ast.children = newChildren;
59
+ let imageUrl = parsnipEntry.preview ? parsnipEntry.preview : undefined;
60
+ if (imageUrl && !imageUrl.includes("https://")) {
61
+ imageUrl = `${parsnipOverall.baseUrl}/${parsnipEntry.preview}`;
62
+ }
49
63
  const meta = {
50
64
  title: parsnipEntry.basename,
51
65
  ogTitle: parsnipEntry.basename,
52
66
  ogDescription: parsnipEntry.tagline,
53
- ogImage: parsnipEntry.preview ? [`${baseUrl}/${parsnipEntry.preview}`] : undefined
67
+ ogImage: imageUrl ? [imageUrl] : undefined
54
68
  };
69
+ // process review metadata
70
+ if ((_b = parsnipEntry.tags) === null || _b === void 0 ? void 0 : _b.includes('food-review')) {
71
+ // parsnipEntry.foodReviewJson =
72
+ try {
73
+ const foodReviewResp = yield fetch(`${baseUrl}/${entryMeta.path.replace('.ast.', '.ld.')}`);
74
+ parsnipEntry.foodReviewJson = yield foodReviewResp.json();
75
+ parsnipEntry.datePublished = parsnipEntry.foodReviewJson.datePublished;
76
+ }
77
+ catch (err) {
78
+ console.error(`Failed to fetch review data for ${entryMeta.path}: ${err}`);
79
+ }
80
+ }
55
81
  return {
56
82
  parsnipEntry,
57
83
  meta
@@ -21,7 +21,7 @@
21
21
  </script>
22
22
 
23
23
  <PinyaCard {...props} class={`pinya-four-part-card ${props.class}`}>
24
- <section class="mb-6">
24
+ <section class="mb-6 flex-wrapper">
25
25
 
26
26
  {#if headerCover}
27
27
  <section class="card-header-cover w-full">
@@ -53,13 +53,21 @@
53
53
  padding: 0;
54
54
 
55
55
  .card-header-cover > img {
56
- border-top-right-radius: var(--radius-xl);
57
- border-top-left-radius: var(--radius-xl);
56
+ border-radius: calc(var(--radius-xl) - 2px);
58
57
  }
58
+
59
+ word-wrap: break-word;
60
+ -webkit-hyphens: auto;
61
+ -moz-hyphens: auto;
62
+ -ms-hyphens: auto;
63
+ hyphens: auto;
59
64
  }
60
65
 
61
66
  html.dark .pinya-four-part-card {
62
67
  border: 0;
68
+ .card-header-cover > img {
69
+ border-radius: var(--radius-xl);
70
+ }
63
71
  }
64
72
  }
65
73
  </style>
@@ -3,17 +3,21 @@
3
3
  <script lang="ts">
4
4
  import { browser } from "$app/environment";
5
5
  import { page } from "$app/state";
6
+ import { localizeHref } from "../../../external/paraglide/runtime.js";
6
7
  import type { ParsnipOverall } from "../../../modules/parsnip/ParsnipOverall";
8
+ import { FourPartCard } from "../../components/index";
9
+ import { PinyaCard } from "../../elements/index";
10
+ import Placeholder from "../../elements/Placeholder.svelte";
7
11
  import NavigationControl from "./NavigationControl.svelte";
8
12
  import {
9
13
  DefaultPageMetaSorter,
14
+ type FoodReviewJson,
10
15
  type PageMeta,
11
16
  parsePageMeta,
12
17
  type ParsePageMetaCompareFn
13
18
  } from "./PageMeta";
14
- import { PinyaCard } from "../../elements/index";
15
- import Placeholder from "../../elements/Placeholder.svelte";
16
- import { localizeHref } from "../../../external/paraglide/runtime.js";
19
+ import { renderStar } from "../../../util/util";
20
+ import { SvelteMap } from "svelte/reactivity";
17
21
 
18
22
  interface Props {
19
23
  fileList: Record<string, unknown>;
@@ -73,7 +77,7 @@
73
77
  const fileBasedList = parsePageMeta(fileList, jsonList, imageMap, compareFn);
74
78
  const parsnipBasedList = parsnipOverall?.files.map(pf => {
75
79
  let imageUrl = pf.preview;
76
- if (imageUrl && !imageUrl.includes('https://')) {
80
+ if (imageUrl && !imageUrl.includes("https://")) {
77
81
  imageUrl = `${parsnipOverall.baseUrl}/${pf.preview}`;
78
82
  }
79
83
  const meta: PageMeta = {
@@ -83,8 +87,8 @@
83
87
  tags: pf.tags,
84
88
  imageUrl,
85
89
  imageAlt: pf.previewAlt,
86
- datePublished: pf.stat.ctime ? new Date(pf.stat.ctime).toISOString().split("T")[0] : undefined,
87
- lastUpdated: pf.stat.mtime ? new Date(pf.stat.mtime).toISOString().split("T")[0] : undefined,
90
+ datePublished: pf.datePublished ?? pf.stat.ctime ? new Date(pf.stat.ctime).toISOString().split("T")[0] : undefined,
91
+ lastUpdated: pf.lastUpdated ?? pf.stat.mtime ? new Date(pf.stat.mtime).toISOString().split("T")[0] : undefined,
88
92
  description: pf.tagline,
89
93
  priority: 0
90
94
  };
@@ -125,6 +129,33 @@
125
129
  }
126
130
  });
127
131
  let visiblePages = $derived(filteredPageFlatList.slice(currentIndex * pageSize, (currentIndex * pageSize) + pageSize));
132
+
133
+ let ratingCache = new SvelteMap<string, string>();
134
+
135
+ $effect(() => {
136
+ if (!browser || !parsnipOverall) {
137
+ return;
138
+ }
139
+
140
+ visiblePages.forEach(vp => {
141
+ if (vp.tags.includes("food-review") && !ratingCache.has(vp.relativeLink)) {
142
+ ratingCache.set(vp.relativeLink, "");
143
+ const parsnipMetadata = parsnipOverall.files.find(f => f.basename == vp.title);
144
+
145
+ if (parsnipMetadata) {
146
+ fetch(`${parsnipOverall.baseUrl}/${parsnipMetadata.path}`.replaceAll(".ast.", ".ld."))
147
+ .then(data => data.json())
148
+ .then((data: FoodReviewJson) => {
149
+ ratingCache.set(vp.relativeLink, `${renderStar(data.reviewRating.ratingValue)}`);
150
+ }).catch(err => {
151
+ console.warn(err);
152
+ }).finally(() => {
153
+ console.log(`Rating fetched for ${vp.relativeLink}: ${ratingCache.get(vp.relativeLink)}`);
154
+ });
155
+ }
156
+ }
157
+ });
158
+ });
128
159
  </script>
129
160
 
130
161
  <div class="navigation-wrapper">
@@ -158,7 +189,7 @@
158
189
  <Placeholder classes="h-4 w-5/6 mb-2" />
159
190
  </div>
160
191
  </PinyaCard>
161
- <PinyaCard widthClass="w-full" className="navigation-element" paddingClass="" flexClass="" >
192
+ <PinyaCard widthClass="w-full" className="navigation-element" paddingClass="" flexClass="">
162
193
  <div class="blurb-text">
163
194
  <Placeholder classes="h-8 w-2/3 mb-4" />
164
195
  <Placeholder classes="h-4 w-1/2 mb-2" />
@@ -170,33 +201,43 @@
170
201
  <!-- all the misc routes-->
171
202
  {#each visiblePages as pageMeta (pageMeta.title)}
172
203
  {@const fullPath = `${parentSubpath}${pageMeta.relativeLink}`}
204
+
205
+ <!-- https://github.com/sveltejs/svelte/issues/11115#issuecomment-2048556800 -->
206
+ {#snippet headerCover()}
207
+ <img src={pageMeta.imageUrl}
208
+ class="pinya-card-image"
209
+ alt={pageMeta.imageAlt ?? "placeholder alt text please replace me or report me!"} />
210
+ {/snippet}
211
+
173
212
  <!-- thank you so much to https://www.reddit.com/r/sveltejs/comments/yoe6in/comment/jvaj1ez -->
174
213
  <a href={localizeHref(fullPath)} class="card-anchor a-as-btn" data-sveltekit-reload>
175
- <PinyaCard
214
+ <FourPartCard
176
215
  widthClass="w-full"
177
216
  className="navigation-element"
178
217
  flexClass=""
179
218
  paddingClass=""
219
+ headerCover={pageMeta.imageUrl ? headerCover : undefined}
180
220
  >
181
- {#if pageMeta.imageUrl}
182
- <img src={pageMeta.imageUrl}
183
- class="pinya-card-image"
184
- alt={pageMeta.imageAlt ?? "placeholder alt text please replace me or report me!"} />
185
- {/if}
186
221
  <section class="blurb-text">
187
222
  <h2>{pageMeta.title}</h2>
188
223
  <p>Published: {pageMeta.datePublished ?? "N/A"} | Last updated: {pageMeta.lastUpdated ?? "N/A"}</p>
189
- <p>{pageMeta.description ?? ""}</p>
190
- Tags:
191
- {#if (pageMeta.tags && pageMeta.tags.length !== 0)}
192
- {#each pageMeta.tags as tagValue, idx (idx)}
193
- &nbsp;<span class="badge tag-container">{tagValue}</span>
194
- {/each}
195
- {:else}
196
- None
224
+
225
+ {#if pageMeta.tags.includes('food-review')}
226
+ <p>{ratingCache.get(pageMeta.relativeLink)}</p>
197
227
  {/if}
228
+ <p class="blurb-description">{pageMeta.description ?? ""}</p>
229
+ <div>
230
+ Tags:
231
+ {#if (pageMeta.tags && pageMeta.tags.length !== 0)}
232
+ {#each pageMeta.tags as tagValue, idx (idx)}
233
+ &nbsp;<span class="badge tag-container">{tagValue}</span>
234
+ {/each}
235
+ {:else}
236
+ None
237
+ {/if}
238
+ </div>
198
239
  </section>
199
- </PinyaCard>
240
+ </FourPartCard>
200
241
  </a>
201
242
  {/each}
202
243
 
@@ -224,7 +265,6 @@
224
265
  max-height: 20rem;
225
266
  width: 100%;
226
267
  flex-basis: 100%;
227
- border-radius: var(--theme-rounded-container) var(--theme-rounded-container) 0 0;
228
268
  }
229
269
 
230
270
  :global(.navigation-element.pinya-card) {
@@ -242,21 +282,51 @@
242
282
  }
243
283
  }
244
284
 
245
- :global(.navigation-element.pinya-card) {
246
- /* todo: migration */
247
- /*@apply btn card card-hover bg-surface-100 dark:bg-surface-900;*/
248
- container-type: inline-size;
249
- display: flex;
250
- text-align: start;
251
- align-items: flex-start;
252
- padding: 0;
285
+ :global {
286
+ .navigation-element.pinya-card:not(.pinya-four-part-card), .navigation-element .flex-wrapper {
287
+ /* todo: migration */
288
+ /*@apply btn card card-hover bg-surface-100 dark:bg-surface-900;*/
289
+ container-type: inline-size;
290
+ display: flex;
291
+ justify-content: stretch;
292
+ align-items: stretch;
293
+ padding: 0;
294
+ flex-wrap: wrap;
295
+ }
296
+
297
+ .navigation-element.pinya-four-part-card {
298
+ .w-full {
299
+ width: unset;
300
+ }
301
+
302
+ .mb-6 {
303
+ margin-bottom: unset;
304
+ }
305
+
306
+ .flex-wrapper > .card-content {
307
+ flex: 99 1 32em;
308
+ }
309
+
310
+ .flex-wrapper > .card-header-cover {
311
+ flex: 1 1 12lh;
312
+ max-height: 12lh;
313
+ }
314
+
315
+ .pinya-card-image {
316
+ border-radius: var(--radius-xl);
317
+ max-height: unset;
318
+ max-width: unset;
319
+ height: 100%;
320
+ width: 100%;
321
+ object-fit: cover;
322
+ }
323
+ }
253
324
  }
254
325
 
255
326
  img {
256
327
  height: 20em;
257
328
  object-fit: cover;
258
329
  padding: var(--theme-border-base);
259
- border-radius: var(--theme-rounded-container) 0 0 var(--theme-rounded-container);
260
330
  }
261
331
 
262
332
  .navigation-component {
@@ -272,10 +342,13 @@
272
342
  }
273
343
 
274
344
  .blurb-text {
275
- padding: 2em;
345
+ padding-top: 1lh;
346
+ padding-bottom: 1lh;
276
347
  grow: 1;
277
348
  white-space: initial;
278
349
  min-width: 0;
350
+ display: flex;
351
+ flex-direction: column;
279
352
  }
280
353
 
281
354
  .navigation-wrapper {
@@ -323,7 +396,13 @@
323
396
  text-align: start;
324
397
  }
325
398
 
326
- .navigation-wrapper .pinya-card-image {
327
- border-radius: var(--radius-xl);
399
+ .blurb-description {
400
+ flex-shrink: 1;
401
+ display: -webkit-box;
402
+ -webkit-box-orient: vertical;
403
+ -webkit-line-clamp: 3; /* Number of lines to show */
404
+ line-clamp: 3; /* Number of lines to show */
405
+ overflow: hidden;
406
+ text-overflow: ellipsis; /* Optional, but good practice */
328
407
  }
329
408
  </style>
@@ -1 +1 @@
1
- {"version":3,"file":"NavigationMenu.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/NavigationMenu/NavigationMenu.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAE1E,OAAO,EAIL,KAAK,sBAAsB,EAC3B,MAAM,yCAAyC,CAAC;AAMjD,UAAU,KAAK;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,SAAS,GAAG,sBAAsB,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAqLF,QAAA,MAAM,cAAc,oGAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"NavigationMenu.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/NavigationMenu/NavigationMenu.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAK1E,OAAO,EAKL,KAAK,sBAAsB,EAC3B,MAAM,yCAAyC,CAAC;AAKjD,UAAU,KAAK;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,SAAS,GAAG,sBAAsB,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AA4NF,QAAA,MAAM,cAAc,oGAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -1,4 +1,13 @@
1
1
  import type { ParsnipOverall } from "../../../modules/parsnip/ParsnipOverall";
2
+ export interface FoodReviewJson {
3
+ datePublished: string;
4
+ reviewRating: {
5
+ ratingValue: number;
6
+ };
7
+ itemReviewed: {
8
+ url: string;
9
+ };
10
+ }
2
11
  export interface PageMeta {
3
12
  datePublished?: string;
4
13
  description?: string;
@@ -46,6 +55,7 @@ export interface PageMeta {
46
55
  * all pages with the same priority will be sorted based on date, description, title, then relative link
47
56
  */
48
57
  priority: number;
58
+ foodReviewJson: FoodReviewJson;
49
59
  }
50
60
  export interface SimplePageMeta {
51
61
  datePublished?: string;
@@ -83,6 +93,7 @@ export interface SimplePageMeta {
83
93
  * title defaults to the directory name if it's an empty string.
84
94
  */
85
95
  title: string;
96
+ foodReviewJson?: FoodReviewJson;
86
97
  }
87
98
  /**
88
99
  * todo: doc
@@ -1 +1 @@
1
- {"version":3,"file":"PageMeta.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/NavigationMenu/PageMeta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAG1E,MAAM,WAAW,QAAQ;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,QAAQ,EAAE,CAAC;IAExB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,YAAY,QAAQ,EAAE,EAAE,OAAO,QAAQ,KAAG,OAiB5E,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC;AAE5E,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChD,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,YAAY,sBAAsB,KAAG,QAAQ,EAoG3D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,MAAM;IACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,cAAc,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB,KAAG,QAAQ,EA8CX,CAAC;AAKF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,sBA6BnC,CAAC"}
1
+ {"version":3,"file":"PageMeta.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/modules/NavigationMenu/PageMeta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAG1E,MAAM,WAAW,cAAc;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE;QACb,WAAW,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,YAAY,EAAE;QACb,GAAG,EAAE,MAAM,CAAA;KACX,CAAC;CACF;AAED,MAAM,WAAW,QAAQ;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,QAAQ,EAAE,CAAC;IAExB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,cAAc,CAAC;CAChC;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,YAAY,QAAQ,EAAE,EAAE,OAAO,QAAQ,KAAG,OAiB5E,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC;AAE5E,eAAO,MAAM,aAAa,GAAI,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChD,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC7B,YAAY,sBAAsB,KAAG,QAAQ,EAoG3D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,MAAM;IACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,cAAc,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB,KAAG,QAAQ,EA8CX,CAAC;AAKF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,sBA6BnC,CAAC"}
@@ -163,7 +163,7 @@
163
163
  }
164
164
 
165
165
  :root {
166
- --default-page-container-margin: 4rem 1rem 0 1rem;
166
+ --default-page-container-margin: 4rem min(1rem, 1vw) 0 min(1rem, 1vw);
167
167
  }
168
168
  }
169
169
 
@@ -30,7 +30,7 @@
30
30
 
31
31
  let initialDialogState = false;
32
32
 
33
- setIgnoreOverlayOverride(true);
33
+ setIgnoreOverlayOverride({ value: true });
34
34
 
35
35
  onMount(() => {
36
36
  initialDialogState = $enableUniversalOverlaySvelte4;
@@ -49,13 +49,13 @@
49
49
 
50
50
  {#if shouldFillWholePage}
51
51
  <div class="whole-page">
52
- <BlogTemplateInner pageMeta={pageMeta}>
52
+ <BlogTemplateInner {pageMeta}>
53
53
  {@render children?.()}
54
54
  </BlogTemplateInner>
55
55
  </div>
56
56
  {:else}
57
57
  <PinyaCard {includeDataNoSnippet} widthClass="blog-template">
58
- <BlogTemplateInner pageMeta={pageMeta}>
58
+ <BlogTemplateInner {pageMeta}>
59
59
  {@render children?.()}
60
60
  </BlogTemplateInner>
61
61
  </PinyaCard>
@@ -4,6 +4,7 @@
4
4
  import { localizeHref } from "../../../external/paraglide/runtime.js";
5
5
  import type { SimplePageMeta } from "../../modules/NavigationMenu/index";
6
6
  import { getWebBaseUrl } from "../../../util/env-getter";
7
+ import { renderStar } from "../../../util/util";
7
8
  import { SvelteURLSearchParams } from "svelte/reactivity";
8
9
 
9
10
  interface Props {
@@ -19,6 +20,9 @@
19
20
  query.append("tags", tag);
20
21
  return `${localizeHref(getWebBaseUrl())}?${query.toString()}`;
21
22
  });
23
+
24
+ // todo: improve graphics lol
25
+ let ratingsRenderer = $derived(renderStar(pageMeta.foodReviewJson?.reviewRating.ratingValue ?? 1));
22
26
  </script>
23
27
 
24
28
  <article>
@@ -26,20 +30,34 @@
26
30
  {#if pageMeta.title}
27
31
  <h1>{pageMeta.title}</h1>
28
32
  {/if}
29
- {#if pageMeta.datePublished}
30
- <p>Published: {pageMeta.datePublished}</p>
31
- {/if}
32
- {#if pageMeta.lastUpdated}
33
- <p>Last updated: {pageMeta.lastUpdated}</p>
34
- {/if}
35
- {#if pageMeta.tags.length > 0}
36
- <section id="article-tags">
37
- Tags:
38
- {#each pageMeta.tags as tag, index (index)}
39
- <a class="badge tag-link" href={getTagQueryHref(tag)}>{tag}</a>
40
- {/each}
41
- </section>
42
- {/if}
33
+ <div id="hgroup-wrapper">
34
+ {#if pageMeta.datePublished}
35
+ <p>Published: {pageMeta.datePublished}</p>
36
+ {/if}
37
+ {#if pageMeta.lastUpdated}
38
+ <p>Last updated: {pageMeta.lastUpdated}</p>
39
+ {/if}
40
+ {#if pageMeta.foodReviewJson}
41
+ <p>
42
+ Ratings: {ratingsRenderer}
43
+ </p>
44
+ {/if}
45
+ {#if pageMeta.foodReviewJson?.itemReviewed.url}
46
+ <p>
47
+ <a href={pageMeta.foodReviewJson.itemReviewed.url}
48
+ rel="external"
49
+ target="_blank">{pageMeta.foodReviewJson?.itemReviewed.url}</a>
50
+ </p>
51
+ {/if}
52
+ {#if pageMeta.tags.length > 0}
53
+ <section id="article-tags" class="w-full">
54
+ Tags:
55
+ {#each pageMeta.tags as tag, index (index)}
56
+ <a class="badge tag-link" href={getTagQueryHref(tag)}>{tag}</a>
57
+ {/each}
58
+ </section>
59
+ {/if}
60
+ </div>
43
61
  </hgroup>
44
62
 
45
63
  <div class="article-content">
@@ -56,6 +74,14 @@
56
74
  margin-inline-end: 0.5em;
57
75
  }
58
76
 
77
+ #article-tags {
78
+ flex-grow: 1;
79
+ width: 100%;
80
+ flex-basis: 100%;
81
+
82
+ line-height: 1.3lh;
83
+ }
84
+
59
85
  #article-tags a.badge {
60
86
  text-decoration: none;
61
87
  }
@@ -79,4 +105,15 @@
79
105
  outline: none;
80
106
  filter: brightness(110%);
81
107
  }
108
+
109
+ #hgroup-wrapper {
110
+ margin-top: 0.5lh;
111
+ display: flex;
112
+ flex-wrap: wrap;
113
+ justify-content: space-between;
114
+
115
+ & > *:not(.w-full) {
116
+ flex-basis: max(16em, 40%);
117
+ }
118
+ }
82
119
  </style>
@@ -1 +1 @@
1
- {"version":3,"file":"BlogTemplateInner.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/templates/blog_template/BlogTemplateInner.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAK1E,UAAU,KAAK;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;CACpC;AAkDF,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"BlogTemplateInner.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/ui/templates/blog_template/BlogTemplateInner.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAM1E,UAAU,KAAK;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;CACpC;AAkEF,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -9,4 +9,5 @@ export interface RawGlob {
9
9
  default: string;
10
10
  }
11
11
  export declare const getQueryTerms: (modules: Record<string, unknown>) => string[];
12
+ export declare const renderStar: (rating: number) => string;
12
13
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/lib/util/util.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,QAAO,MAIrC,CAAC;AAIF,eAAO,MAAM,mBAAmB,GAAI,GAAG,MAAM,KAAG,CAAC,MAAM,MAAM,CAO5D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,CAAC,MAAM,IAAI,CAI5D,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,iCAAiC,GAAI,MAAM,uBAAuB,KAAG,CAAC,MAAM,IAAI,CAM5F,CAAC;AAEF,MAAM,WAAW,OAAO;IACvB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,EAQtE,CAAA"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/lib/util/util.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,QAAO,MAIrC,CAAC;AAIF,eAAO,MAAM,mBAAmB,GAAI,GAAG,MAAM,KAAG,CAAC,MAAM,MAAM,CAO5D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,CAAC,MAAM,IAAI,CAI5D,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACvC,IAAI,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,iCAAiC,GAAI,MAAM,uBAAuB,KAAG,CAAC,MAAM,IAAI,CAM5F,CAAC;AAEF,MAAM,WAAW,OAAO;IACvB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,aAAa,GAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,EAQtE,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,WAgBxC,CAAA"}
package/dist/util/util.js CHANGED
@@ -34,3 +34,21 @@ export const getQueryTerms = (modules) => {
34
34
  }
35
35
  return [...queryTerms].sort();
36
36
  };
37
+ export const renderStar = (rating) => {
38
+ let stars = "";
39
+ for (let i = 1; i <= 10; i++) {
40
+ if (rating >= i) {
41
+ stars += "★";
42
+ }
43
+ else if (Math.abs(i - rating) < 1) {
44
+ stars += "O";
45
+ }
46
+ else {
47
+ stars += "☆";
48
+ }
49
+ if (i === 5) {
50
+ stars += `| ${rating}/10 |`;
51
+ }
52
+ }
53
+ return stars;
54
+ };
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.3.0-alpha.5",
4
+ "version": "5.3.0",
5
5
  "devDependencies": {
6
6
  "@commitlint/cli": "^19.8.1",
7
7
  "@commitlint/config-conventional": "^19.8.1",
@@ -1,6 +0,0 @@
1
- export function example_message(inputs: {
2
- username: NonNullable<unknown>;
3
- }, options?: {
4
- locale?: "en" | "fr" | "tl";
5
- }): string;
6
- //# sourceMappingURL=example_message.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"example_message.d.ts","sourceRoot":"","sources":["../../../../src/lib/external/paraglide/messages/example_message.js"],"names":[],"mappings":"AA4BO,wCALG;IAAE,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;CAAE,YAClC;IAAE,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;CAAE,GAC7B,MAAM,CAYjB"}
@@ -1,38 +0,0 @@
1
- /* eslint-disable */
2
- import { getLocale, trackMessageCall, experimentalMiddlewareLocaleSplitting, isServer } from '../runtime.js';
3
-
4
- const en_example_message = /** @type {(inputs: { username: NonNullable<unknown> }) => string} */ (i) => {
5
- return `Hello world ${i.username}`
6
- };
7
-
8
- const fr_example_message = /** @type {(inputs: { username: NonNullable<unknown> }) => string} */ (i) => {
9
- return `Bonjour ${i.username}`
10
- };
11
-
12
- const tl_example_message = /** @type {(inputs: { username: NonNullable<unknown> }) => string} */ (i) => {
13
- return `Kamusta ${i.username}`
14
- };
15
-
16
- /**
17
- * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
18
- *
19
- * - Changing this function will be over-written by the next build.
20
- *
21
- * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
22
- * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
23
- *
24
- * @param {{ username: NonNullable<unknown> }} inputs
25
- * @param {{ locale?: "en" | "fr" | "tl" }} options
26
- * @returns {string}
27
- */
28
- /* @__NO_SIDE_EFFECTS__ */
29
- export const example_message = (inputs, options = {}) => {
30
- if (experimentalMiddlewareLocaleSplitting && isServer === false) {
31
- return /** @type {any} */ (globalThis).__paraglide_ssr.example_message(inputs)
32
- }
33
- const locale = options.locale ?? getLocale()
34
- trackMessageCall("example_message", locale)
35
- if (locale === "en") return en_example_message(inputs)
36
- if (locale === "fr") return fr_example_message(inputs)
37
- return tl_example_message(inputs)
38
- };
@@ -1,4 +0,0 @@
1
- export function settings(inputs?: {}, options?: {
2
- locale?: "en" | "fr" | "tl";
3
- }): string;
4
- //# sourceMappingURL=settings.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../../src/lib/external/paraglide/messages/settings.js"],"names":[],"mappings":"AA2BO,kCALG,EAAE,YACF;IAAE,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;CAAE,GAC7B,MAAM,CAYjB"}
@@ -1,37 +0,0 @@
1
- /* eslint-disable */
2
- import { getLocale, trackMessageCall, experimentalMiddlewareLocaleSplitting, isServer } from '../runtime.js';
3
-
4
- const en_settings = /** @type {(inputs: {}) => string} */ () => {
5
- return `Settings`
6
- };
7
-
8
- const fr_settings = /** @type {(inputs: {}) => string} */ () => {
9
- return `Paramètres`
10
- };
11
-
12
- /** @type {(inputs: {}) => string} */
13
- const tl_settings = en_settings;
14
-
15
- /**
16
- * This function has been compiled by [Paraglide JS](https://inlang.com/m/gerre34r).
17
- *
18
- * - Changing this function will be over-written by the next build.
19
- *
20
- * - If you want to change the translations, you can either edit the source files e.g. `en.json`, or
21
- * use another inlang app like [Fink](https://inlang.com/m/tdozzpar) or the [VSCode extension Sherlock](https://inlang.com/m/r7kp499g).
22
- *
23
- * @param {{}} inputs
24
- * @param {{ locale?: "en" | "fr" | "tl" }} options
25
- * @returns {string}
26
- */
27
- /* @__NO_SIDE_EFFECTS__ */
28
- export const settings = (inputs = {}, options = {}) => {
29
- if (experimentalMiddlewareLocaleSplitting && isServer === false) {
30
- return /** @type {any} */ (globalThis).__paraglide_ssr.settings(inputs)
31
- }
32
- const locale = options.locale ?? getLocale()
33
- trackMessageCall("settings", locale)
34
- if (locale === "en") return en_settings(inputs)
35
- if (locale === "fr") return fr_settings(inputs)
36
- return tl_settings(inputs)
37
- };