@prismicio/svelte 1.3.1 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ <script>export let type;
2
+ </script>
3
+
4
+ <svelte:element this={type}><slot /></svelte:element>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { TableComponents } from "../types";
3
+ declare const __propDef: {
4
+ props: {
5
+ type: keyof TableComponents;
6
+ };
7
+ events: {
8
+ [evt: string]: CustomEvent<any>;
9
+ };
10
+ slots: {
11
+ default: {};
12
+ };
13
+ };
14
+ export type DefaultComponentProps = typeof __propDef.props;
15
+ export type DefaultComponentEvents = typeof __propDef.events;
16
+ export type DefaultComponentSlots = typeof __propDef.slots;
17
+ export default class DefaultComponent extends SvelteComponent<DefaultComponentProps, DefaultComponentEvents, DefaultComponentSlots> {
18
+ }
19
+ export {};
@@ -0,0 +1,51 @@
1
+ <script>import { isFilled } from "@prismicio/client";
2
+ import {} from "svelte";
3
+ import PrismicRichText from "../PrismicRichText/PrismicRichText.svelte";
4
+ import DefaultComponent from "./DefaultComponent.svelte";
5
+ export let field;
6
+ export let components = {};
7
+ export let fallback = void 0;
8
+ const createComponent = (type) => {
9
+ const Component = components[type] ?? DefaultComponent;
10
+ return {
11
+ Component,
12
+ props: Component === DefaultComponent ? { type } : {}
13
+ };
14
+ };
15
+ const { Component: Table, props: tableProps } = createComponent("table");
16
+ const { Component: Thead, props: theadProps } = createComponent("thead");
17
+ const { Component: Tbody, props: tbodyProps } = createComponent("tbody");
18
+ const { Component: Tr, props: trProps } = createComponent("tr");
19
+ const { Component: Th, props: thProps } = createComponent("th");
20
+ const { Component: Td, props: tdProps } = createComponent("td");
21
+ </script>
22
+
23
+ <!-- This formatting is intentional to prevent unwanted whitespace between elements. -->
24
+ {#if isFilled.table(field)}
25
+ <Table {...tableProps} table={field}>
26
+ {#if field?.head}
27
+ <Thead {...theadProps} head={field.head}>
28
+ {#each field.head.rows as row}
29
+ <Tr {...trProps} {row}>
30
+ {#each row.cells as cell}
31
+ <Th {...thProps} {cell}>
32
+ <PrismicRichText field={cell.content} {components} /></Th
33
+ >{/each}</Tr
34
+ >{/each}</Thead
35
+ >{/if}<Tbody {...tbodyProps} body={field.body}>
36
+ {#each field.body.rows as row}
37
+ <Tr {...trProps} {row}>
38
+ {#each row.cells as cell}
39
+ {#if cell.type === "header"}
40
+ <Th {...thProps} {cell}>
41
+ <PrismicRichText field={cell.content} {components} /></Th
42
+ >{:else}<Td {...tdProps} {cell}>
43
+ <PrismicRichText field={cell.content} {components} /></Td
44
+ >{/if}{/each}</Tr
45
+ >
46
+ {/each}
47
+ </Tbody>
48
+ </Table>
49
+ {:else if fallback !== undefined}
50
+ <svelte:component this={fallback} />
51
+ {/if}
@@ -0,0 +1,33 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import { type TableField } from "@prismicio/client";
3
+ import { type ComponentType } from "svelte";
4
+ import type { TableComponents } from "../types";
5
+ declare const __propDef: {
6
+ props: {
7
+ /**
8
+ * The Prismic table field to render.
9
+ */ field: TableField;
10
+ /**
11
+ * An object that maps a rich text block type to a Svelte component.
12
+ */ components?: (TableComponents & Partial<Record<"heading1" | "heading2" | "heading3" | "heading4" | "heading5" | "heading6" | "paragraph" | "preformatted" | "strong" | "em" | "listItem" | "oListItem" | "list" | "oList" | "image" | "embed" | "hyperlink" | "label" | "span", new (...args: any[]) => SvelteComponent<Partial<{
13
+ /**
14
+ * An object that maps a rich text block type to a Svelte component.
15
+ */
16
+ node: import("@prismicio/client").RTAnyNode;
17
+ }>, any, any>>>) | undefined;
18
+ /**
19
+ * The component rendered when the field is empty. If a fallback is not given,
20
+ * `null` will be rendered.
21
+ */ fallback?: ComponentType | undefined;
22
+ };
23
+ events: {
24
+ [evt: string]: CustomEvent<any>;
25
+ };
26
+ slots: {};
27
+ };
28
+ export type PrismicTableProps = typeof __propDef.props;
29
+ export type PrismicTableEvents = typeof __propDef.events;
30
+ export type PrismicTableSlots = typeof __propDef.slots;
31
+ export default class PrismicTable extends SvelteComponent<PrismicTableProps, PrismicTableEvents, PrismicTableSlots> {
32
+ }
33
+ export {};
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export { default as PrismicEmbed } from "./PrismicEmbed.svelte";
2
2
  export { default as PrismicImage } from "./PrismicImage.svelte";
3
3
  export { default as PrismicLink } from "./PrismicLink.svelte";
4
4
  export { default as PrismicRichText } from "./PrismicRichText/PrismicRichText.svelte";
5
+ export { default as PrismicTable } from "./PrismicTable/PrismicTable.svelte";
5
6
  export { default as PrismicText } from "./PrismicText.svelte";
6
7
  export { default as SliceZone } from "./SliceZone/SliceZone.svelte";
7
8
  export type { SvelteRichTextSerializer } from "./types";
package/dist/index.js CHANGED
@@ -2,5 +2,6 @@ export { default as PrismicEmbed } from "./PrismicEmbed.svelte";
2
2
  export { default as PrismicImage } from "./PrismicImage.svelte";
3
3
  export { default as PrismicLink } from "./PrismicLink.svelte";
4
4
  export { default as PrismicRichText } from "./PrismicRichText/PrismicRichText.svelte";
5
+ export { default as PrismicTable } from "./PrismicTable/PrismicTable.svelte";
5
6
  export { default as PrismicText } from "./PrismicText.svelte";
6
7
  export { default as SliceZone } from "./SliceZone/SliceZone.svelte";
package/dist/types.d.ts CHANGED
@@ -1,7 +1,27 @@
1
- import type { RTAnyNode, RichTextNodeType } from "@prismicio/client";
2
- import type { SvelteComponent } from "svelte";
1
+ import type { RTAnyNode, RichTextNodeType, TableField, TableFieldBody, TableFieldBodyRow, TableFieldDataCell, TableFieldHead, TableFieldHeadRow, TableFieldHeaderCell } from "@prismicio/client";
2
+ import type { ComponentType, SvelteComponent } from "svelte";
3
3
  export type SvelteRichTextSerializer = Partial<Record<keyof typeof RichTextNodeType, SvelteRichTextComponent>>;
4
4
  type SvelteRichTextComponent = new (...args: any[]) => SvelteComponent<Partial<{
5
5
  node: RTAnyNode;
6
6
  }>>;
7
+ export type TableComponents = {
8
+ table?: ComponentType<SvelteComponent<{
9
+ table: TableField<"filled">;
10
+ }>>;
11
+ thead?: ComponentType<SvelteComponent<{
12
+ head: TableFieldHead;
13
+ }>>;
14
+ tbody?: ComponentType<SvelteComponent<{
15
+ body: TableFieldBody;
16
+ }>>;
17
+ tr?: ComponentType<SvelteComponent<{
18
+ row: TableFieldHeadRow | TableFieldBodyRow;
19
+ }>>;
20
+ th?: ComponentType<SvelteComponent<{
21
+ table: TableFieldHeaderCell;
22
+ }>>;
23
+ td?: ComponentType<SvelteComponent<{
24
+ table: TableFieldDataCell;
25
+ }>>;
26
+ };
7
27
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prismicio/svelte",
3
- "version": "1.3.1",
3
+ "version": "1.4.1",
4
4
  "description": "Svelte components to present Prismic content.",
5
5
  "keywords": [
6
6
  "typescript",
@@ -52,7 +52,7 @@
52
52
  "release": "npm run test && standard-version && git push --follow-tags && npm run build && npm publish",
53
53
  "release:alpha": "npm run test && standard-version --release-as minor --prerelease alpha && git push --follow-tags && npm run build && npm publish --tag alpha",
54
54
  "release:alpha:dry": "standard-version --release-as minor --prerelease alpha --dry-run",
55
- "release:dry": "standard-version --dry-run",
55
+ "release:dry": "standard-version --release-as patch --dry-run",
56
56
  "size": "size-limit",
57
57
  "test": "npm run lint && npm run types && npm run unit && npm run build && npm run size",
58
58
  "types": "vitest --typecheck.only --run && tsc --noEmit",
@@ -65,8 +65,8 @@
65
65
  "esm-env": "^1.0.0"
66
66
  },
67
67
  "devDependencies": {
68
- "@prismicio/client": "^7.11.0",
69
- "@prismicio/mock": "^0.4.0",
68
+ "@prismicio/client": "^7.16.1",
69
+ "@prismicio/mock": "^0.7.1",
70
70
  "@size-limit/preset-small-lib": "^11.0.1",
71
71
  "@sveltejs/kit": "^2.0.0",
72
72
  "@sveltejs/package": "^2.2.3",
@@ -0,0 +1,6 @@
1
+ <script lang="ts">
2
+ import type { TableComponents } from "../types";
3
+ export let type: keyof TableComponents;
4
+ </script>
5
+
6
+ <svelte:element this={type}><slot /></svelte:element>
@@ -0,0 +1,73 @@
1
+ <script lang="ts">
2
+ import { isFilled, type TableField } from "@prismicio/client";
3
+ import { type ComponentType } from "svelte";
4
+
5
+ import PrismicRichText from "../PrismicRichText/PrismicRichText.svelte";
6
+ import type { SvelteRichTextSerializer, TableComponents } from "../types";
7
+ import DefaultComponent from "./DefaultComponent.svelte";
8
+
9
+ /**
10
+ * The Prismic table field to render.
11
+ */
12
+ export let field: TableField;
13
+
14
+ /**
15
+ * An object that maps a rich text block type to a Svelte component.
16
+ */
17
+ export let components: TableComponents & SvelteRichTextSerializer = {};
18
+
19
+ /**
20
+ * The component rendered when the field is empty. If a fallback is not given,
21
+ * `null` will be rendered.
22
+ */
23
+ export let fallback: ComponentType | undefined = undefined;
24
+
25
+ /**
26
+ * This function creates the needed table components, prioritizing any user
27
+ * provided custom components and falling back to the default components.
28
+ */
29
+ const createComponent = (type: keyof TableComponents) => {
30
+ const Component: ComponentType = components[type] ?? DefaultComponent;
31
+ return {
32
+ Component,
33
+ props: Component === DefaultComponent ? { type } : {},
34
+ };
35
+ };
36
+
37
+ const { Component: Table, props: tableProps } = createComponent("table");
38
+ const { Component: Thead, props: theadProps } = createComponent("thead");
39
+ const { Component: Tbody, props: tbodyProps } = createComponent("tbody");
40
+ const { Component: Tr, props: trProps } = createComponent("tr");
41
+ const { Component: Th, props: thProps } = createComponent("th");
42
+ const { Component: Td, props: tdProps } = createComponent("td");
43
+ </script>
44
+
45
+ <!-- This formatting is intentional to prevent unwanted whitespace between elements. -->
46
+ {#if isFilled.table(field)}
47
+ <Table {...tableProps} table={field}>
48
+ {#if field?.head}
49
+ <Thead {...theadProps} head={field.head}>
50
+ {#each field.head.rows as row}
51
+ <Tr {...trProps} {row}>
52
+ {#each row.cells as cell}
53
+ <Th {...thProps} {cell}>
54
+ <PrismicRichText field={cell.content} {components} /></Th
55
+ >{/each}</Tr
56
+ >{/each}</Thead
57
+ >{/if}<Tbody {...tbodyProps} body={field.body}>
58
+ {#each field.body.rows as row}
59
+ <Tr {...trProps} {row}>
60
+ {#each row.cells as cell}
61
+ {#if cell.type === "header"}
62
+ <Th {...thProps} {cell}>
63
+ <PrismicRichText field={cell.content} {components} /></Th
64
+ >{:else}<Td {...tdProps} {cell}>
65
+ <PrismicRichText field={cell.content} {components} /></Td
66
+ >{/if}{/each}</Tr
67
+ >
68
+ {/each}
69
+ </Tbody>
70
+ </Table>
71
+ {:else if fallback !== undefined}
72
+ <svelte:component this={fallback} />
73
+ {/if}
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@ export { default as PrismicEmbed } from "./PrismicEmbed.svelte";
2
2
  export { default as PrismicImage } from "./PrismicImage.svelte";
3
3
  export { default as PrismicLink } from "./PrismicLink.svelte";
4
4
  export { default as PrismicRichText } from "./PrismicRichText/PrismicRichText.svelte";
5
+ export { default as PrismicTable } from "./PrismicTable/PrismicTable.svelte";
5
6
  export { default as PrismicText } from "./PrismicText.svelte";
6
7
  export { default as SliceZone } from "./SliceZone/SliceZone.svelte";
7
8
 
package/src/types.ts CHANGED
@@ -1,5 +1,15 @@
1
- import type { RTAnyNode, RichTextNodeType } from "@prismicio/client";
2
- import type { SvelteComponent } from "svelte";
1
+ import type {
2
+ RTAnyNode,
3
+ RichTextNodeType,
4
+ TableField,
5
+ TableFieldBody,
6
+ TableFieldBodyRow,
7
+ TableFieldDataCell,
8
+ TableFieldHead,
9
+ TableFieldHeadRow,
10
+ TableFieldHeaderCell,
11
+ } from "@prismicio/client";
12
+ import type { ComponentType, SvelteComponent } from "svelte";
3
13
 
4
14
  export type SvelteRichTextSerializer = Partial<
5
15
  Record<keyof typeof RichTextNodeType, SvelteRichTextComponent>
@@ -13,3 +23,15 @@ type SvelteRichTextComponent = new (
13
23
  node: RTAnyNode;
14
24
  }>
15
25
  >;
26
+
27
+ // Define the type for the components prop
28
+ export type TableComponents = {
29
+ table?: ComponentType<SvelteComponent<{ table: TableField<"filled"> }>>;
30
+ thead?: ComponentType<SvelteComponent<{ head: TableFieldHead }>>;
31
+ tbody?: ComponentType<SvelteComponent<{ body: TableFieldBody }>>;
32
+ tr?: ComponentType<
33
+ SvelteComponent<{ row: TableFieldHeadRow | TableFieldBodyRow }>
34
+ >;
35
+ th?: ComponentType<SvelteComponent<{ table: TableFieldHeaderCell }>>;
36
+ td?: ComponentType<SvelteComponent<{ table: TableFieldDataCell }>>;
37
+ };