@prismicio/svelte 1.3.0 → 1.4.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.
@@ -2,22 +2,24 @@
2
2
  import PrismicImage from "../PrismicImage.svelte";
3
3
  import PrismicLink from "../PrismicLink.svelte";
4
4
  export let node;
5
+ $:
6
+ dir = "direction" in node && node.direction === "rtl" ? "rtl" : void 0;
5
7
  </script>
6
8
 
7
9
  {#if node.type === "heading1"}
8
- <h1><slot /></h1>
10
+ <h1 {dir}><slot /></h1>
9
11
  {:else if node.type === "heading2"}
10
- <h2><slot /></h2>
12
+ <h2 {dir}><slot /></h2>
11
13
  {:else if node.type === "heading3"}
12
- <h3><slot /></h3>
14
+ <h3 {dir}><slot /></h3>
13
15
  {:else if node.type === "heading4"}
14
- <h4><slot /></h4>
16
+ <h4 {dir}><slot /></h4>
15
17
  {:else if node.type === "heading5"}
16
- <h5><slot /></h5>
18
+ <h5 {dir}><slot /></h5>
17
19
  {:else if node.type === "heading6"}
18
- <h6><slot /></h6>
20
+ <h6 {dir}><slot /></h6>
19
21
  {:else if node.type === "paragraph"}
20
- <p><slot /></p>
22
+ <p {dir}><slot /></p>
21
23
  {:else if node.type === "preformatted"}
22
24
  <pre><slot /></pre>
23
25
  {:else if node.type === "strong"}
@@ -25,9 +27,9 @@ export let node;
25
27
  {:else if node.type === "em"}
26
28
  <em><slot /></em>
27
29
  {:else if node.type === "list-item"}
28
- <li><slot /></li>
30
+ <li {dir}><slot /></li>
29
31
  {:else if node.type === "o-list-item"}
30
- <li><slot /></li>
32
+ <li {dir}><slot /></li>
31
33
  {:else if node.type === "group-list-item"}
32
34
  <ul><slot /></ul>
33
35
  {:else if node.type === "group-o-list-item"}
@@ -0,0 +1,5 @@
1
+ <script>import { TableComponents } from "../types";
2
+ export let type;
3
+ </script>
4
+
5
+ <svelte:element this={type}><slot /></svelte:element>
@@ -0,0 +1,19 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import { 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,52 @@
1
+ <script>import { isFilled } from "@prismicio/client";
2
+ import {} from "svelte";
3
+ import PrismicRichText from "../PrismicRichText/PrismicRichText.svelte";
4
+ import { SvelteRichTextSerializer } from "../types";
5
+ import DefaultComponent from "./DefaultComponent.svelte";
6
+ export let field;
7
+ export let components = {};
8
+ export let fallback = void 0;
9
+ const createComponent = (type) => {
10
+ const Component = components[type] ?? DefaultComponent;
11
+ return {
12
+ Component,
13
+ props: Component === DefaultComponent ? { type } : {}
14
+ };
15
+ };
16
+ const { Component: Table, props: tableProps } = createComponent("table");
17
+ const { Component: Thead, props: theadProps } = createComponent("thead");
18
+ const { Component: Tbody, props: tbodyProps } = createComponent("tbody");
19
+ const { Component: Tr, props: trProps } = createComponent("tr");
20
+ const { Component: Th, props: thProps } = createComponent("th");
21
+ const { Component: Td, props: tdProps } = createComponent("td");
22
+ </script>
23
+
24
+ <!-- This formatting is intentional to prevent unwanted whitespace between elements. -->
25
+ {#if isFilled.table(field)}
26
+ <Table {...tableProps} table={field}>
27
+ {#if field?.head}
28
+ <Thead {...theadProps} head={field.head}>
29
+ {#each field.head.rows as row}
30
+ <Tr {...trProps} {row}>
31
+ {#each row.cells as cell}
32
+ <Th {...thProps} {cell}>
33
+ <PrismicRichText field={cell.content} {components} /></Th
34
+ >{/each}</Tr
35
+ >{/each}</Thead
36
+ >{/if}<Tbody {...tbodyProps} body={field.body}>
37
+ {#each field.body.rows as row}
38
+ <Tr {...trProps} {row}>
39
+ {#each row.cells as cell}
40
+ {#if cell.type === "header"}
41
+ <Th {...thProps} {cell}>
42
+ <PrismicRichText field={cell.content} {components} /></Th
43
+ >{:else}<Td {...tdProps} {cell}>
44
+ <PrismicRichText field={cell.content} {components} /></Td
45
+ >{/if}{/each}</Tr
46
+ >
47
+ {/each}
48
+ </Tbody>
49
+ </Table>
50
+ {:else if fallback !== undefined}
51
+ <svelte:component this={fallback} />
52
+ {/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.0",
3
+ "version": "1.4.0",
4
4
  "description": "Svelte components to present Prismic content.",
5
5
  "keywords": [
6
6
  "typescript",
@@ -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",
@@ -6,22 +6,24 @@
6
6
  import PrismicLink from "../PrismicLink.svelte";
7
7
 
8
8
  export let node: RTAnyNode;
9
+
10
+ $: dir = "direction" in node && node.direction === "rtl" ? "rtl" : undefined
9
11
  </script>
10
12
 
11
13
  {#if node.type === "heading1"}
12
- <h1><slot /></h1>
14
+ <h1 {dir}><slot /></h1>
13
15
  {:else if node.type === "heading2"}
14
- <h2><slot /></h2>
16
+ <h2 {dir}><slot /></h2>
15
17
  {:else if node.type === "heading3"}
16
- <h3><slot /></h3>
18
+ <h3 {dir}><slot /></h3>
17
19
  {:else if node.type === "heading4"}
18
- <h4><slot /></h4>
20
+ <h4 {dir}><slot /></h4>
19
21
  {:else if node.type === "heading5"}
20
- <h5><slot /></h5>
22
+ <h5 {dir}><slot /></h5>
21
23
  {:else if node.type === "heading6"}
22
- <h6><slot /></h6>
24
+ <h6 {dir}><slot /></h6>
23
25
  {:else if node.type === "paragraph"}
24
- <p><slot /></p>
26
+ <p {dir}><slot /></p>
25
27
  {:else if node.type === "preformatted"}
26
28
  <pre><slot /></pre>
27
29
  {:else if node.type === "strong"}
@@ -29,9 +31,9 @@
29
31
  {:else if node.type === "em"}
30
32
  <em><slot /></em>
31
33
  {:else if node.type === "list-item"}
32
- <li><slot /></li>
34
+ <li {dir}><slot /></li>
33
35
  {:else if node.type === "o-list-item"}
34
- <li><slot /></li>
36
+ <li {dir}><slot /></li>
35
37
  {:else if node.type === "group-list-item"}
36
38
  <ul><slot /></ul>
37
39
  {:else if node.type === "group-o-list-item"}
@@ -0,0 +1,6 @@
1
+ <script lang="ts">
2
+ import { 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 { SvelteRichTextSerializer, type 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
+ };