@prismicio/svelte 0.0.10 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +29 -30
  2. package/dist/PrismicEmbed.svelte +8 -7
  3. package/dist/PrismicEmbed.svelte.d.ts +7 -7
  4. package/dist/PrismicImage.svelte +58 -64
  5. package/dist/PrismicImage.svelte.d.ts +270 -44
  6. package/dist/PrismicLink.svelte +16 -13
  7. package/dist/PrismicLink.svelte.d.ts +242 -35
  8. package/dist/PrismicRichText/DefaultComponent.svelte +1 -8
  9. package/dist/PrismicRichText/DefaultComponent.svelte.d.ts +4 -9
  10. package/dist/PrismicRichText/PrismicRichText.svelte +9 -13
  11. package/dist/PrismicRichText/PrismicRichText.svelte.d.ts +12 -33
  12. package/dist/PrismicRichText/Serialize.svelte +16 -15
  13. package/dist/PrismicRichText/Serialize.svelte.d.ts +7 -8
  14. package/dist/PrismicText.svelte +28 -4
  15. package/dist/PrismicText.svelte.d.ts +7 -10
  16. package/dist/SliceZone/SliceZone.svelte +12 -9
  17. package/dist/SliceZone/SliceZone.svelte.d.ts +41 -13
  18. package/dist/SliceZone/{TodoSliceComponent.svelte → TodoComponent.svelte} +2 -1
  19. package/dist/SliceZone/TodoComponent.svelte.d.ts +20 -0
  20. package/dist/index.d.ts +1 -0
  21. package/dist/lib/devMsg.d.ts +16 -0
  22. package/dist/lib/devMsg.js +19 -0
  23. package/dist/types.d.ts +7 -0
  24. package/dist/types.js +1 -0
  25. package/package.json +52 -112
  26. package/src/PrismicEmbed.svelte +30 -0
  27. package/src/PrismicImage.svelte +168 -0
  28. package/src/PrismicLink.svelte +60 -0
  29. package/{dist/src/lib → src}/PrismicRichText/DefaultComponent.svelte +3 -15
  30. package/src/PrismicRichText/PrismicRichText.svelte +32 -0
  31. package/src/PrismicRichText/Serialize.svelte +36 -0
  32. package/src/PrismicText.svelte +58 -0
  33. package/{dist/src/lib → src}/SliceZone/SliceZone.svelte +29 -21
  34. package/{dist/src/lib/SliceZone/TodoSliceComponent.svelte → src/SliceZone/TodoComponent.svelte} +2 -1
  35. package/{dist/src/lib → src}/index.ts +2 -0
  36. package/src/lib/devMsg.ts +20 -0
  37. package/src/types.ts +15 -0
  38. package/dist/SliceZone/TodoSliceComponent.svelte.d.ts +0 -20
  39. package/dist/src/app.html +0 -12
  40. package/dist/src/global.d.ts +0 -1
  41. package/dist/src/lib/PrismicEmbed.svelte +0 -29
  42. package/dist/src/lib/PrismicImage.svelte +0 -192
  43. package/dist/src/lib/PrismicLink.svelte +0 -64
  44. package/dist/src/lib/PrismicRichText/PrismicRichText.svelte +0 -67
  45. package/dist/src/lib/PrismicRichText/Serialize.svelte +0 -33
  46. package/dist/src/lib/PrismicText.svelte +0 -29
  47. package/dist/src/routes/+page.server.ts +0 -19
  48. package/dist/src/routes/+page.svelte +0 -62
  49. package/dist/src/routes/components/Emphasis.svelte +0 -3
  50. package/dist/src/routes/slices/CodeSnippet.svelte +0 -19
  51. package/dist/src/routes/slices/RichText.svelte +0 -12
  52. package/dist/src/types/CodeSnippetSlice.type.ts +0 -7
  53. package/dist/src/types/ExampleDocument.type.ts +0 -8
  54. package/dist/src/types/PageDocument.type.ts +0 -7
  55. package/dist/src/types/RichTextSlice.type.ts +0 -7
  56. package/dist/src/types/Route.type.ts +0 -14
  57. package/dist/src/types/index.ts +0 -5
@@ -1,4 +1,4 @@
1
- <script>import TodoSliceComponent from "./TodoSliceComponent.svelte";
1
+ <script>import TodoComponent from "./TodoComponent.svelte";
2
2
  export let slices = [];
3
3
  export let components = {};
4
4
  export let context = {};
@@ -7,15 +7,18 @@ export let defaultComponent = void 0;
7
7
 
8
8
  <!--
9
9
  @component
10
- Component to render an array of Prismic Slices.
10
+ Component to render an array of Prismic slices.
11
11
 
12
- @example Rendering a Rich Text field:
12
+ @example Rendering a Slice Zone:
13
13
  ```svelte
14
- <SliceZone slices={document.data.slices} components={{
15
- block_quote: BlockQuote,
16
- hero_image: HeroImage
17
- }} />
18
- ```
14
+ <SliceZone
15
+ slices={document.data.slices}
16
+ components={{
17
+ block_quote: BlockQuote,
18
+ hero_image: HeroImage
19
+ }}
20
+ />
21
+ ```
19
22
  -->
20
23
 
21
24
  {#each slices as slice, index}
@@ -24,6 +27,6 @@ export let defaultComponent = void 0;
24
27
  {#if Component}
25
28
  <svelte:component this={Component} {slice} {slices} {context} {index} />
26
29
  {:else}
27
- <TodoSliceComponent {slice} />
30
+ <TodoComponent {slice} />
28
31
  {/if}
29
32
  {/each}
@@ -1,5 +1,4 @@
1
- import { SvelteComponentTyped } from "svelte";
2
- import type { SvelteComponent } from "svelte";
1
+ import { SvelteComponent } from "svelte";
3
2
  declare const __propDef: {
4
3
  props: {
5
4
  /**
@@ -11,7 +10,7 @@ declare const __propDef: {
11
10
  type: string;
12
11
  })[] | undefined;
13
12
  /**
14
- * An object that maps Slice components to their corresponding API IDs
13
+ * An object that maps Slice components to their corresponding API IDs.
15
14
  *
16
15
  * @example An example map:
17
16
  *
@@ -24,14 +23,40 @@ declare const __propDef: {
24
23
  * hero_image: HeroImage,
25
24
  * };
26
25
  * ```
27
- */ components?: Record<string, new (...args: any[]) => SvelteComponent> | undefined;
26
+ */ components?: Record<string, new (...args: any[]) => SvelteComponent<{
27
+ slice: {
28
+ slice_type: string;
29
+ } | {
30
+ type: string;
31
+ };
32
+ slices: ({
33
+ slice_type: string;
34
+ } | {
35
+ type: string;
36
+ })[];
37
+ context: unknown;
38
+ index: number;
39
+ }, any, any>> | undefined;
28
40
  /**
29
41
  * Arbitrary data passed to all Slice components as a `context` prop.
30
42
  */ context?: any;
31
43
  /**
32
44
  * The Svelte component rendered if a component mapping from the `components`
33
45
  * prop cannot be found.
34
- */ defaultComponent?: SvelteComponent | (new (...args: any[]) => SvelteComponent) | undefined;
46
+ */ defaultComponent?: (new (...args: any[]) => SvelteComponent<{
47
+ slice: {
48
+ slice_type: string;
49
+ } | {
50
+ type: string;
51
+ };
52
+ slices: ({
53
+ slice_type: string;
54
+ } | {
55
+ type: string;
56
+ })[];
57
+ context: unknown;
58
+ index: number;
59
+ }, any, any>) | undefined;
35
60
  };
36
61
  events: {
37
62
  [evt: string]: CustomEvent<any>;
@@ -42,16 +67,19 @@ export type SliceZoneProps = typeof __propDef.props;
42
67
  export type SliceZoneEvents = typeof __propDef.events;
43
68
  export type SliceZoneSlots = typeof __propDef.slots;
44
69
  /**
45
- * Component to render an array of Prismic Slices.
70
+ * Component to render an array of Prismic slices.
46
71
  *
47
- * @example Rendering a Rich Text field:
72
+ * @example Rendering a Slice Zone:
48
73
  * ```svelte
49
- * <SliceZone slices={document.data.slices} components={{
50
- * block_quote: BlockQuote,
51
- * hero_image: HeroImage
52
- * }} />
53
- * ```
74
+ * <SliceZone
75
+ * slices={document.data.slices}
76
+ * components={{
77
+ * block_quote: BlockQuote,
78
+ * hero_image: HeroImage
79
+ * }}
80
+ * />
81
+ * ```
54
82
  */
55
- export default class SliceZone extends SvelteComponentTyped<SliceZoneProps, SliceZoneEvents, SliceZoneSlots> {
83
+ export default class SliceZone extends SvelteComponent<SliceZoneProps, SliceZoneEvents, SliceZoneSlots> {
56
84
  }
57
85
  export {};
@@ -1,11 +1,12 @@
1
1
  <script>import { DEV } from "esm-env";
2
2
  export let slice;
3
3
  const type = "slice_type" in slice ? slice.slice_type : slice.type;
4
- if (DEV)
4
+ if (DEV) {
5
5
  console.warn(
6
6
  `[SliceZone] Could not find a component for Slice type "${type}"`,
7
7
  slice
8
8
  );
9
+ }
9
10
  </script>
10
11
 
11
12
  {#if DEV}
@@ -0,0 +1,20 @@
1
+ import { SvelteComponent } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ slice: {
5
+ slice_type: string;
6
+ } | {
7
+ type: string;
8
+ };
9
+ };
10
+ events: {
11
+ [evt: string]: CustomEvent<any>;
12
+ };
13
+ slots: {};
14
+ };
15
+ export type TodoComponentProps = typeof __propDef.props;
16
+ export type TodoComponentEvents = typeof __propDef.events;
17
+ export type TodoComponentSlots = typeof __propDef.slots;
18
+ export default class TodoComponent extends SvelteComponent<TodoComponentProps, TodoComponentEvents, TodoComponentSlots> {
19
+ }
20
+ export {};
package/dist/index.d.ts CHANGED
@@ -4,3 +4,4 @@ export { default as PrismicLink } from "./PrismicLink.svelte";
4
4
  export { default as PrismicRichText } from "./PrismicRichText/PrismicRichText.svelte";
5
5
  export { default as PrismicText } from "./PrismicText.svelte";
6
6
  export { default as SliceZone } from "./SliceZone/SliceZone.svelte";
7
+ export type { SvelteRichTextSerializer } from "./types";
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Returns a `prismic.dev/msg` URL for a given message slug.
3
+ *
4
+ * @example
5
+ *
6
+ * ```ts
7
+ * devMsg("missing-param");
8
+ * // => "https://prismic.dev/msg/svelte/v1.2.3/missing-param.md"
9
+ * ```
10
+ *
11
+ * @param slug - Slug for the message. This corresponds to a Markdown file in
12
+ * the Git repository's `/messages` directory.
13
+ *
14
+ * @returns The `prismic.dev/msg` URL for the given slug.
15
+ */
16
+ export declare const devMsg: (slug: string) => string;
@@ -0,0 +1,19 @@
1
+ import { version } from "../../package.json";
2
+ /**
3
+ * Returns a `prismic.dev/msg` URL for a given message slug.
4
+ *
5
+ * @example
6
+ *
7
+ * ```ts
8
+ * devMsg("missing-param");
9
+ * // => "https://prismic.dev/msg/svelte/v1.2.3/missing-param.md"
10
+ * ```
11
+ *
12
+ * @param slug - Slug for the message. This corresponds to a Markdown file in
13
+ * the Git repository's `/messages` directory.
14
+ *
15
+ * @returns The `prismic.dev/msg` URL for the given slug.
16
+ */
17
+ export const devMsg = (slug) => {
18
+ return `https://prismic.dev/msg/react/v${version}/${slug}`;
19
+ };
@@ -0,0 +1,7 @@
1
+ import type { RTAnyNode, RichTextNodeType } from "@prismicio/client";
2
+ import type { SvelteComponent } from "svelte";
3
+ export type SvelteRichTextSerializer = Partial<Record<keyof typeof RichTextNodeType, SvelteRichTextComponent>>;
4
+ type SvelteRichTextComponent = new (...args: any[]) => SvelteComponent<Partial<{
5
+ node: RTAnyNode;
6
+ }>>;
7
+ export {};
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,11 +1,10 @@
1
1
  {
2
2
  "name": "@prismicio/svelte",
3
- "version": "0.0.10",
4
- "description": "Svelte plugin, components, and composables to fetch and present Prismic content",
3
+ "version": "0.1.0",
4
+ "description": "Svelte components to present Prismic content.",
5
5
  "keywords": [
6
6
  "typescript",
7
- "prismic",
8
- "svelte"
7
+ "prismic"
9
8
  ],
10
9
  "repository": {
11
10
  "type": "git",
@@ -15,134 +14,75 @@
15
14
  "author": "Prismic <contact@prismic.io> (https://prismic.io)",
16
15
  "type": "module",
17
16
  "exports": {
18
- "./package.json": "./package.json",
19
17
  ".": {
20
18
  "types": "./dist/index.d.ts",
21
19
  "svelte": "./dist/index.js",
22
20
  "default": "./dist/index.js"
23
21
  },
24
- "./index.d.ts": "./dist/index.d.ts"
22
+ "./package.json": "./package.json"
25
23
  },
26
24
  "main": "./dist/index.js",
27
25
  "module": "./dist/index.js",
28
26
  "types": "./dist/index.d.ts",
29
- "svelte": "./dist/index.js",
27
+ "files": [
28
+ "./dist",
29
+ "./src"
30
+ ],
30
31
  "scripts": {
31
- "build": "svelte-package -o dist package && shx cp -r src dist/src",
32
- "dev": "vite dev",
33
- "format": "prettier --write .",
34
- "prepare": "npm run build && svelte-kit sync",
35
- "release": "npm run build && npm run test && standard-version && git push --follow-tags && npm run build && npm publish",
36
- "release:dry": "standard-version --dry-run",
37
- "release:alpha": "npm run build && npm run test && standard-version --release-as major --prerelease alpha && git push --follow-tags && npm run build && npm publish --tag alpha",
38
- "release:alpha:dry": "standard-version --release-as major --prerelease alpha --dry-run",
39
- "release:dev": "npm run build && npm run test && standard-version --prerelease dev && git push --follow-tags && npm run build && npm publish --tag dev",
40
- "release:dev:dry": "standard-version --prerelease dev --dry-run",
32
+ "build": "svelte-package --input ./src",
33
+ "dev": "svelte-package --input ./src --watch",
34
+ "format": "prettier --write --plugin prettier-plugin-svelte .",
41
35
  "lint": "eslint --ext .js,.ts .",
36
+ "prepare": "npm run build",
37
+ "release": "npm run test && standard-version && git push --follow-tags && npm run build && npm publish",
38
+ "release:alpha": "npm run test && standard-version --release-as major --prerelease alpha && git push --follow-tags && npm run build && npm publish --tag alpha",
39
+ "release:alpha:dry": "standard-version --release-as major --prerelease alpha --dry-run",
40
+ "release:dry": "standard-version --dry-run",
41
+ "size": "size-limit",
42
+ "test": "npm run lint && npm run types && npm run unit && npm run build && npm run size",
43
+ "types": "vitest typecheck --run && tsc --noEmit",
44
+ "types:watch": "vitest typecheck",
42
45
  "unit": "vitest run --coverage",
43
- "unit:watch": "vitest watch",
44
- "test": "npm run lint && npm run unit",
45
- "preview": "svelte-kit preview",
46
- "package": "svelte-package -o dist package",
47
- "check": "svelte-check --tsconfig ./tsconfig.json",
48
- "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch"
46
+ "unit:watch": "vitest watch"
49
47
  },
50
48
  "dependencies": {
51
- "@prismicio/client": "^6.7.3",
52
- "@prismicio/helpers": "^2.3.9",
53
- "@prismicio/richtext": "^2.2.0-alpha.0",
54
- "@sveltejs/kit": "^1.8.3",
55
- "svelte": "^3.55.1"
49
+ "@prismicio/richtext": "^2.1.5",
50
+ "esm-env": "^1.0.0"
56
51
  },
57
52
  "devDependencies": {
58
- "@prismicio/mock": "^0.2.0",
59
- "@prismicio/types": "^0.2.7",
60
- "@rollup/plugin-inject": "^5.0.3",
61
- "@sveltejs/adapter-auto": "^2.0.0",
62
- "@sveltejs/package": "^2.0.0",
63
- "@typescript-eslint/eslint-plugin": "^5.53.0",
64
- "@typescript-eslint/parser": "^5.53.0",
65
- "@vitest/coverage-c8": "^0.28.5",
66
- "c8": "^7.13.0",
67
- "eslint": "^8.15.0",
68
- "eslint-config-prettier": "^8.5.0",
69
- "eslint-plugin-prettier": "^4.2.0",
70
- "eslint-plugin-svelte3": "^4.0.0",
71
- "eslint-plugin-tsdoc": "^0.2.16",
72
- "prettier": "^2.8.4",
73
- "prettier-plugin-jsdoc": "^0.3.38",
74
- "prettier-plugin-svelte": "^2.9.0",
75
- "shx": "^0.3.4",
76
- "standard-version": "^9.3.2",
77
- "svelte-check": "^3.0.3",
78
- "svelte-preprocess": "^5.0.1",
79
- "svelte2tsx": "^0.6.1",
80
- "tslib": "^2.5.0",
81
- "typescript": "^4.9.5",
82
- "vitest": "^0.28.5"
53
+ "@prismicio/client": "^7.1.1",
54
+ "@prismicio/mock": "^0.3.1",
55
+ "@size-limit/preset-small-lib": "^8.2.6",
56
+ "@sveltejs/package": "^2.2.1",
57
+ "@sveltejs/vite-plugin-svelte": "^2.4.5",
58
+ "@testing-library/svelte": "^4.0.3",
59
+ "@trivago/prettier-plugin-sort-imports": "^4.2.0",
60
+ "@typescript-eslint/eslint-plugin": "^6.4.1",
61
+ "@typescript-eslint/parser": "^6.4.1",
62
+ "@vitest/coverage-v8": "^0.34.2",
63
+ "eslint": "^8.47.0",
64
+ "eslint-config-prettier": "^9.0.0",
65
+ "eslint-plugin-prettier": "^5.0.0",
66
+ "eslint-plugin-svelte": "^2.33.0",
67
+ "eslint-plugin-tsdoc": "^0.2.17",
68
+ "happy-dom": "^10.11.0",
69
+ "prettier": "^3.0.2",
70
+ "prettier-plugin-jsdoc": "^1.0.1",
71
+ "prettier-plugin-svelte": "^3.0.3",
72
+ "size-limit": "^8.2.6",
73
+ "standard-version": "^9.5.0",
74
+ "svelte": "^4.2.0",
75
+ "typescript": "^5.1.6",
76
+ "vitest": "^0.34.2"
77
+ },
78
+ "peerDependencies": {
79
+ "@prismicio/client": ">=7",
80
+ "svelte": ">=4"
83
81
  },
84
82
  "engines": {
85
- "node": ">=16.14.2"
83
+ "node": ">=14.15.0"
86
84
  },
87
85
  "publishConfig": {
88
86
  "access": "public"
89
- },
90
- "optionalDependencies": {
91
- "@esbuild/android-arm": "^0.17.10"
92
- },
93
- "files": [
94
- "dist"
95
- ],
96
- "typesVersions": {
97
- ">4.0": {
98
- "PrismicProvider.svelte": [
99
- "./dist/PrismicProvider.svelte.d.ts"
100
- ],
101
- "components/PrismicEmbed.svelte": [
102
- "./dist/components/PrismicEmbed.svelte.d.ts"
103
- ],
104
- "components/PrismicImage.svelte": [
105
- "./dist/components/PrismicImage.svelte.d.ts"
106
- ],
107
- "components/PrismicLink.svelte": [
108
- "./dist/components/PrismicLink.svelte.d.ts"
109
- ],
110
- "components/PrismicPreview.svelte": [
111
- "./dist/components/PrismicPreview.svelte.d.ts"
112
- ],
113
- "components/PrismicRichText/DefaultComponent.svelte": [
114
- "./dist/components/PrismicRichText/DefaultComponent.svelte.d.ts"
115
- ],
116
- "components/PrismicRichText/PrismicRichText.svelte": [
117
- "./dist/components/PrismicRichText/PrismicRichText.svelte.d.ts"
118
- ],
119
- "components/PrismicRichText/Serialize.svelte": [
120
- "./dist/components/PrismicRichText/Serialize.svelte.d.ts"
121
- ],
122
- "components/PrismicText.svelte": [
123
- "./dist/components/PrismicText.svelte.d.ts"
124
- ],
125
- "components/SliceZone.svelte": [
126
- "./dist/components/SliceZone.svelte.d.ts"
127
- ],
128
- "components/TodoSliceComponent.svelte": [
129
- "./dist/components/TodoSliceComponent.svelte.d.ts"
130
- ],
131
- "components": [
132
- "./dist/components/index.d.ts"
133
- ],
134
- "configurePrismic": [
135
- "./dist/configurePrismic.d.ts"
136
- ],
137
- "index": [
138
- "./dist/index.d.ts"
139
- ],
140
- "injectionSymbols": [
141
- "./dist/injectionSymbols.d.ts"
142
- ],
143
- "usePrismic": [
144
- "./dist/usePrismic.d.ts"
145
- ]
146
- }
147
87
  }
148
88
  }
@@ -0,0 +1,30 @@
1
+ <script lang="ts">
2
+ import type { EmbedField } from "@prismicio/client";
3
+ import { isFilled } from "@prismicio/client";
4
+
5
+ /**
6
+ * An Embed field from Prismic.
7
+ */
8
+ export let field: EmbedField;
9
+ </script>
10
+
11
+ <!--
12
+ @component
13
+ Component to render a Prismic embed field.
14
+
15
+ @example Rendering an embed field:
16
+ ```svelte
17
+ <PrismicEmbed field={document.data.example_embed} />
18
+ ```
19
+ -->
20
+
21
+ {#if isFilled.embed(field)}
22
+ <div
23
+ data-oembed={field.embed_url}
24
+ data-oembed-type={field.type}
25
+ data-oembed-provider={field.provider_name}
26
+ >
27
+ <!-- eslint-disable-next-line svelte/no-at-html-tags -->
28
+ {@html field.html}
29
+ </div>
30
+ {/if}
@@ -0,0 +1,168 @@
1
+ <script lang="ts">
2
+ import {
3
+ asImageWidthSrcSet,
4
+ asImagePixelDensitySrcSet,
5
+ isFilled,
6
+ type ImageFieldImage,
7
+ } from "@prismicio/client";
8
+ import type { ImgixURLParams } from "imgix-url-builder";
9
+ import type { HTMLImgAttributes } from "svelte/elements";
10
+
11
+ type $$Props = Omit<HTMLImgAttributes, "src" | "srcset" | "alt"> & {
12
+ /**
13
+ * The Prismic image field or thumbnail to render.
14
+ */
15
+ field: ImageFieldImage | null | undefined;
16
+
17
+ /**
18
+ * An object of Imgix URL API parameters to transform the image.
19
+ *
20
+ * See: https://docs.imgix.com/apis/rendering
21
+ */
22
+ imgixParams?: ImgixURLParams;
23
+
24
+ /**
25
+ * Declare an image as decorative by providing `alt=""`.
26
+ *
27
+ * See:
28
+ * https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/alt#decorative_images
29
+ */
30
+ alt?: "";
31
+
32
+ /**
33
+ * Declare an image as decorative only if the Image field does not have
34
+ * alternative text by providing `fallbackAlt=""`.
35
+ *
36
+ * See:
37
+ * https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/alt#decorative_images
38
+ */
39
+ fallbackAlt?: "";
40
+ } & (
41
+ | {
42
+ /**
43
+ * Widths used to build a `srcset` value for the Image field.
44
+ *
45
+ * If a `widths` prop is not given or `"defaults"` is passed, the
46
+ * following widths will be used: 640, 750, 828, 1080, 1200, 1920,
47
+ * 2048, 3840.
48
+ *
49
+ * If the Image field contains responsive views, each responsive view
50
+ * can be used as a width in the resulting `srcset` by passing
51
+ * `"thumbnails"` as the `widths` prop.
52
+ */
53
+ widths?:
54
+ | NonNullable<Parameters<typeof asImageWidthSrcSet>[1]>["widths"]
55
+ | "defaults";
56
+ pixelDensities?: never;
57
+ }
58
+ | {
59
+ /**
60
+ * Pixel densities used to build a `srcset` value for the Image field.
61
+ *
62
+ * If a `pixelDensities` prop is passed `"defaults"`, the following
63
+ * pixel densities will be used: 1, 2, 3.
64
+ */
65
+ pixelDensities:
66
+ | NonNullable<
67
+ Parameters<typeof asImagePixelDensitySrcSet>[1]
68
+ >["pixelDensities"]
69
+ | "defaults";
70
+ widths?: never;
71
+ }
72
+ );
73
+
74
+ export let field: $$Props["field"];
75
+ export let imgixParams: $$Props["imgixParams"] = {};
76
+ export let alt: $$Props["alt"] = undefined;
77
+ export let fallbackAlt: $$Props["fallbackAlt"] = undefined;
78
+ export let width: $$Props["width"] = undefined;
79
+ export let height: $$Props["width"] = undefined;
80
+ export let widths: $$Props["widths"] = undefined;
81
+ export let pixelDensities: $$Props["pixelDensities"] = undefined;
82
+
83
+ let src: string | undefined = undefined;
84
+ let srcset: string | undefined = undefined;
85
+ let resolvedWidth: $$Props["width"] = undefined;
86
+ let resolvedHeight: $$Props["height"] = undefined;
87
+
88
+ $: {
89
+ if (isFilled.imageThumbnail(field)) {
90
+ const castInt = (
91
+ input: string | number | null | undefined,
92
+ ): number | null | undefined => {
93
+ if (
94
+ typeof input === "number" ||
95
+ typeof input === "undefined" ||
96
+ input === null
97
+ ) {
98
+ return input;
99
+ } else {
100
+ const parsed = Number.parseInt(input);
101
+
102
+ if (Number.isNaN(parsed)) {
103
+ return undefined;
104
+ } else {
105
+ return parsed;
106
+ }
107
+ }
108
+ };
109
+
110
+ const ar = field.dimensions.width / field.dimensions.height;
111
+
112
+ const castedWidth = castInt(width);
113
+ const castedHeight = castInt(height);
114
+
115
+ resolvedWidth = castedWidth ?? field.dimensions.width;
116
+ resolvedHeight = castedHeight ?? field.dimensions.height;
117
+
118
+ if (castedWidth != null && castedHeight == null) {
119
+ resolvedHeight = castedWidth / ar;
120
+ } else if (castedWidth == null && castedHeight != null) {
121
+ resolvedWidth = castedHeight * ar;
122
+ }
123
+
124
+ if (widths || !pixelDensities) {
125
+ const res = asImageWidthSrcSet(field, {
126
+ ...imgixParams,
127
+ widths: widths === "defaults" ? undefined : widths,
128
+ });
129
+
130
+ src = res.src;
131
+ srcset = res.srcset;
132
+ } else if (pixelDensities) {
133
+ const res = asImagePixelDensitySrcSet(field, {
134
+ ...imgixParams,
135
+ pixelDensities:
136
+ pixelDensities === "defaults" ? undefined : pixelDensities,
137
+ } as ImgixURLParams);
138
+
139
+ src = res.src;
140
+ srcset = res.srcset;
141
+ }
142
+ }
143
+ }
144
+ </script>
145
+
146
+ <!--
147
+ @component
148
+ Component to render a Prismic image field as an `img` element with `width`, `height`, `alt`, `src`, and `srcset` attributes.
149
+
150
+ @example Rendering an image field:
151
+ ```svelte
152
+ <PrismicImage
153
+ field={document.data.example_image}
154
+ imgixParams={{ sat: -100 }}
155
+ />
156
+ ```
157
+ -->
158
+
159
+ {#if isFilled.imageThumbnail(field)}
160
+ <img
161
+ {src}
162
+ {srcset}
163
+ alt={alt ?? (field.alt || fallbackAlt)}
164
+ width={resolvedWidth}
165
+ height={resolvedHeight}
166
+ {...$$restProps}
167
+ />
168
+ {/if}
@@ -0,0 +1,60 @@
1
+ <script lang="ts">
2
+ import {
3
+ asLinkAttrs,
4
+ type AsLinkAttrsConfig,
5
+ type LinkField,
6
+ type PrismicDocument,
7
+ } from "@prismicio/client";
8
+ import type { HTMLAnchorAttributes } from "svelte/elements";
9
+
10
+ type $$Props = Omit<HTMLAnchorAttributes, "rel" | "href"> & {
11
+ /**
12
+ * The `rel` attribute for the link. By default, `"noreferrer"` is provided
13
+ * if the link's URL is external. This prop can be provided a function to
14
+ * use the link's metadata to determine the `rel` value.
15
+ */
16
+ rel?: string | AsLinkAttrsConfig["rel"];
17
+ } & (
18
+ | {
19
+ /**
20
+ * A Prismic link field, content relationship field, or link to media
21
+ * field.
22
+ */
23
+ field: LinkField;
24
+ document?: never;
25
+ }
26
+ | {
27
+ /**
28
+ * A Prismic document.
29
+ */
30
+ document: PrismicDocument;
31
+ field?: never;
32
+ }
33
+ );
34
+
35
+ export let field: $$Props["field"] = undefined;
36
+ export let document: $$Props["document"] = undefined;
37
+ export let rel: $$Props["rel"] = undefined;
38
+
39
+ $: linkAttrs = asLinkAttrs(field ?? document, {
40
+ rel: typeof rel === "function" ? rel : undefined,
41
+ });
42
+
43
+ $: resolvedRel = typeof rel === "string" ? rel : linkAttrs.rel;
44
+ </script>
45
+
46
+ <!--
47
+ @component
48
+ Component to render a Prismic link, link to media, content relationship, or whole document as an `a` tag.
49
+
50
+ @example Rendering a Link field:
51
+ ```svelte
52
+ <PrismicLink field={document.data.example_link}>
53
+ Example anchor text.
54
+ </PrismicLink>
55
+ ```
56
+ -->
57
+
58
+ <a {...linkAttrs} rel={resolvedRel} href={linkAttrs.href} {...$$restProps}>
59
+ <slot />
60
+ </a>