File tree 5 files changed +91
-0
lines changed
5 files changed +91
-0
lines changed Original file line number Diff line number Diff line change @@ -21,6 +21,7 @@ import TwitterEmbed from "@/components/twitter-embed";
21
21
import CodePenEmbed from "@/components/codepen-embed" ;
22
22
import CodeSandboxEmbed from "./codesandbox-embed" ;
23
23
import HTMLEmbed from "@/components/html-embed" ;
24
+ import QuoteEmbed from "@/components/quote-embed" ;
24
25
25
26
26
27
export default function CustomPortableText ( {
@@ -39,6 +40,7 @@ export default function CustomPortableText({
39
40
codesandbox : ( { value } ) => < CodeSandboxEmbed { ...value } /> ,
40
41
twitter : ( { value } ) => < TwitterEmbed { ...value } /> ,
41
42
htmlBlock : ( { value } ) => < HTMLEmbed { ...value } /> ,
43
+ quote : ( { value } ) => < QuoteEmbed { ...value } /> ,
42
44
} ,
43
45
block : {
44
46
h5 : ( { children } ) => (
Original file line number Diff line number Diff line change
1
+ import {
2
+ PortableText ,
3
+ type PortableTextComponents ,
4
+ } from "next-sanity" ;
5
+ import Link from "next/link" ;
6
+
7
+ export default function QuoteEmbed ( props : any ) {
8
+ const { content, url } = props ;
9
+ if ( ! content ) {
10
+ return null ;
11
+ }
12
+ const components : PortableTextComponents = {
13
+ marks : {
14
+ link : ( { children, value } ) => {
15
+ return (
16
+ < Link href = { value ?. href || "#" } rel = "noreferrer noopener" target = "_blank" >
17
+ { children }
18
+ </ Link >
19
+ ) ;
20
+ } ,
21
+ internalLink : ( { children, value } ) => {
22
+ return < Link href = { value ?. href || "#" } > { children } </ Link > ;
23
+ } ,
24
+ } ,
25
+ } ;
26
+ return (
27
+ < figure >
28
+ < blockquote cite = { url || '#' } className = "mt-6 border-l-2 pl-6 italic" >
29
+ < PortableText components = { components } value = { content } />
30
+ </ blockquote >
31
+ </ figure >
32
+ )
33
+ }
Original file line number Diff line number Diff line change
1
+ import React from "react" ;
2
+ // TODO: Add stronger typing
3
+ const QuotePreview = ( props : any ) => {
4
+ const { text, url } = props ;
5
+ if ( ! text ) {
6
+ return null ;
7
+ }
8
+ return (
9
+ < figure >
10
+ < blockquote cite = { url } >
11
+ { text }
12
+ </ blockquote >
13
+ </ figure >
14
+ )
15
+ } ;
16
+
17
+ const preview = ( props : any ) => < QuotePreview { ...props } /> ;
18
+
19
+ export default preview ;
Original file line number Diff line number Diff line change
1
+ import { defineArrayMember , defineField , defineType } from "sanity" ;
2
+ import { FaQuoteLeft } from "react-icons/fa6" ;
3
+ import preview from "../../components/QuotePreview" ;
4
+ import externalLink from "./externalLink" ;
5
+ import internalLink from "./internalLink" ;
6
+
7
+ export default defineType ( {
8
+ name : "quote" ,
9
+ type : "object" ,
10
+ icon : FaQuoteLeft ,
11
+ fields : [
12
+ defineField ( {
13
+ name : "content" ,
14
+ title : "Content" ,
15
+ type : "array" ,
16
+ of : [
17
+ defineArrayMember ( {
18
+ type : "block" ,
19
+ marks : {
20
+ annotations : [
21
+ defineArrayMember ( externalLink ) ,
22
+ defineArrayMember ( internalLink ) ,
23
+ ] ,
24
+ } ,
25
+ } ) ,
26
+ ] ,
27
+ } ) ,
28
+ defineField ( {
29
+ name : 'url' ,
30
+ type : 'url' ,
31
+ title : 'URL' ,
32
+ description : 'Source on the web' ,
33
+ } )
34
+ ] ,
35
+ } ) ;
Original file line number Diff line number Diff line change @@ -14,6 +14,7 @@ import codepen from "../custom/codepen";
14
14
import codesandbox from "../custom/codesandbox" ;
15
15
import html from "../custom/html" ;
16
16
import twitter from "../custom/twitter-embed" ;
17
+ import quote from "../custom/quote" ;
17
18
18
19
const baseType = defineType ( {
19
20
name : "base" ,
@@ -96,6 +97,7 @@ const baseType = defineType({
96
97
defineArrayMember ( codesandbox ) ,
97
98
defineArrayMember ( twitter ) ,
98
99
defineArrayMember ( html ) ,
100
+ defineArrayMember ( quote ) ,
99
101
] ,
100
102
} ) ,
101
103
] ,
You can’t perform that action at this time.
0 commit comments