@automattic/social-previews 3.0.2 → 3.0.4
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.
- package/CHANGELOG.md +10 -0
- package/dist/index.css +0 -1
- package/dist/index.css.map +1 -1
- package/dist/index.js +47 -145
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +576 -674
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/jetpack/jetpack/projects/js-packages/social-previews/dist/index.js","../src/helpers.tsx","../src/google-search-preview/index.tsx","../src/twitter-preview/card.tsx","../src/twitter-preview/footer.tsx","../src/twitter-preview/header.tsx","../src/twitter-preview/media.tsx","../src/twitter-preview/quote-tweet.tsx","../src/twitter-preview/sidebar.tsx","../src/twitter-preview/icons/default-avatar.tsx","../src/twitter-preview/text.tsx","../src/twitter-preview/post-preview.tsx","../src/twitter-preview/link-preview.tsx","../src/twitter-preview/previews.tsx","../src/shared/section-heading/index.tsx","../src/linkedin-preview/post-preview.tsx","../src/linkedin-preview/constants.ts","../src/linkedin-preview/icons/default-avatar.tsx","../src/linkedin-preview/link-preview.tsx","../src/linkedin-preview/previews.tsx","../src/tumblr-preview/link-preview.tsx","../src/tumblr-preview/helpers.ts","../src/tumblr-preview/post/actions/index.tsx","../src/tumblr-preview/post/icons/index.tsx","../src/tumblr-preview/post/header/index.tsx","../src/tumblr-preview/post-preview.tsx","../src/tumblr-preview/previews.tsx","../src/facebook-preview/previews.tsx","../src/facebook-preview/link-preview.tsx","../src/constants.ts","../src/facebook-preview/helpers.ts","../src/facebook-preview/custom-text.tsx","../src/facebook-preview/hooks/use-image-hook.ts","../src/facebook-preview/post/actions/index.tsx","../src/facebook-preview/post/icons/index.tsx","../src/facebook-preview/post/header/index.tsx","../src/facebook-preview/link-preview-details.tsx","../src/facebook-preview/post-preview.tsx","../src/mastodon-preview/post/actions/index.tsx","../src/mastodon-preview/constants.ts","../src/mastodon-preview/helpers.ts","../src/mastodon-preview/post/body/index.tsx","../src/mastodon-preview/post/card/index.tsx","../src/mastodon-preview/post/header/index.tsx","../src/mastodon-preview/post/icons/index.tsx","../src/mastodon-preview/link-preview.tsx","../src/mastodon-preview/post-preview.tsx","../src/mastodon-preview/previews.tsx","../src/nextdoor-preview/post-preview.tsx","../src/nextdoor-preview/constants.ts","../src/nextdoor-preview/footer-actions.tsx","../src/nextdoor-preview/icons/comment-icon.tsx","../src/nextdoor-preview/icons/like-icon.tsx","../src/nextdoor-preview/icons/share-icon.tsx","../src/nextdoor-preview/icons/chevron-icon.tsx","../src/nextdoor-preview/icons/default-avatar.tsx","../src/nextdoor-preview/icons/default-image.tsx","../src/nextdoor-preview/icons/globe-icon.tsx","../src/nextdoor-preview/link-preview.tsx","../src/nextdoor-preview/previews.tsx","../src/bluesky-preview/post-preview.tsx","../src/bluesky-preview/post/actions/index.tsx","../src/bluesky-preview/helpers.ts","../src/bluesky-preview/post/body/index.tsx","../src/bluesky-preview/post/card/index.tsx","../src/bluesky-preview/post/header/index.tsx","../src/bluesky-preview/post/sidebar/index.tsx","../src/bluesky-preview/link-preview.tsx","../src/bluesky-preview/previews.tsx","../src/threads-preview/card.tsx","../src/threads-preview/helpers.ts","../src/threads-preview/footer.tsx","../src/threads-preview/header.tsx","../src/threads-preview/media.tsx","../src/threads-preview/sidebar.tsx","../src/threads-preview/icons/default-avatar.tsx","../src/threads-preview/post-preview.tsx","../src/threads-preview/link-preview.tsx","../src/threads-preview/previews.tsx","../src/instagram-preview/post-preview.tsx","../src/instagram-preview/constants.tsx","../src/instagram-preview/icons/bookmark.tsx","../src/instagram-preview/icons/comment.tsx","../src/instagram-preview/icons/default-avatar.tsx","../src/instagram-preview/icons/heart.tsx","../src/instagram-preview/icons/menu.tsx","../src/instagram-preview/icons/share.tsx","../src/instagram-preview/previews.tsx"],"names":["jsx","jsxs","DESCRIPTION_LENGTH","sprintf","icons_default","useCallback","header_default","actions_default","URL_LENGTH","GlobeIcon","FEED_TEXT_MAX_LENGTH","_x","body_default","Fragment","Sidebar","Header","Footer"],"mappings":"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","file":"/home/runner/work/jetpack/jetpack/projects/js-packages/social-previews/dist/index.js","sourcesContent":[null,"import { createInterpolateElement } from '@wordpress/element';\nimport { sprintf } from '@wordpress/i18n';\n\nexport type Formatter< Options = unknown > = ( text: string, options?: Options ) => string;\ntype AugmentFormatterReturnType< T extends Formatter, TNewReturn > = (\n\t...a: Parameters< T >\n) => ReturnType< T > | TNewReturn;\ntype ConditionalFormatter = AugmentFormatterReturnType< Formatter, boolean >;\ntype NullableFormatter = AugmentFormatterReturnType< Formatter, undefined >;\n\nexport const baseDomain: Formatter = url => {\n\t// Strip leading protocol\n\tconst withoutProtocol = url.replace( /^[^/]+:\\/\\//, '' );\n\t// Strip everything after the domain using indexOf to avoid ReDoS\n\tconst slashIndex = withoutProtocol.indexOf( '/' );\n\treturn slashIndex === -1 ? withoutProtocol : withoutProtocol.substring( 0, slashIndex );\n};\n\nexport const shortEnough: ( n: number ) => ConditionalFormatter = limit => title =>\n\ttitle.length <= limit ? title : false;\n\nexport const truncatedAtSpace: ( a: number, b: number ) => ConditionalFormatter =\n\t( lower, upper ) => fullTitle => {\n\t\tconst title = fullTitle.slice( 0, upper );\n\t\tconst lastSpace = title.lastIndexOf( ' ' );\n\n\t\treturn lastSpace > lower && lastSpace < upper\n\t\t\t? title.slice( 0, lastSpace ).concat( '…' )\n\t\t\t: false;\n\t};\n\nexport const hardTruncation: ( n: number ) => Formatter = limit => title =>\n\ttitle.slice( 0, limit ).concat( '…' );\n\nexport const firstValid: ( ...args: ConditionalFormatter[] ) => NullableFormatter =\n\t( ...predicates ) =>\n\ta =>\n\t\t( predicates.find( p => false !== p( a ) ) as Formatter )?.( a );\n\nexport const stripHtmlTags: Formatter< Array< string > > = ( description, allowedTags = [] ) => {\n\tconst pattern = new RegExp( `(<([^${ allowedTags.join( '' ) }>]+)>)`, 'gi' );\n\n\treturn description ? description.replace( pattern, '' ) : '';\n};\n\n/**\n * For social note posts we use the first 50 characters of the description.\n * @param description - The post description.\n * @return The first 50 characters of the description.\n */\nexport const getTitleFromDescription = ( description: string ): string => {\n\treturn stripHtmlTags( description ).substring( 0, 50 );\n};\n\nexport const hasTag = ( text: string, tag: string ): boolean => {\n\tconst pattern = new RegExp( `<${ tag }[^>]*>`, 'gi' );\n\n\treturn pattern.test( text );\n};\n\nexport const formatNextdoorDate = new Intl.DateTimeFormat( 'en-GB', {\n\t// Result: \"7 Oct\", \"31 Dec\"\n\tday: 'numeric',\n\tmonth: 'short',\n} ).format;\n\nexport const formatThreadsDate = new Intl.DateTimeFormat( 'en-US', {\n\t// Result: \"'06/21/2024\"\n\tday: '2-digit',\n\tmonth: '2-digit',\n\tyear: 'numeric',\n} ).format;\n\nexport const formatTweetDate = new Intl.DateTimeFormat( 'en-US', {\n\t// Result: \"Apr 7\", \"Dec 31\"\n\tmonth: 'short',\n\tday: 'numeric',\n} ).format;\n\nexport const formatMastodonDate = new Intl.DateTimeFormat( 'en-US', {\n\t// Result: \"Apr 7, 2024\", \"Dec 31, 2023\"\n\tmonth: 'short',\n\tday: 'numeric',\n\tyear: 'numeric',\n} ).format;\n\nexport type Platform =\n\t| 'bluesky'\n\t| 'facebook'\n\t| 'instagram'\n\t| 'linkedin'\n\t| 'mastodon'\n\t| 'nextdoor'\n\t| 'threads'\n\t| 'tumblr'\n\t| 'twitter';\n\ntype PreviewTextOptions = {\n\tplatform: Platform;\n\tmaxChars?: number;\n\tmaxLines?: number;\n\thyperlinkUrls?: boolean;\n\thyperlinkHashtags?: boolean;\n\thashtagDomain?: string;\n};\n\nexport const hashtagUrlMap = {\n\ttwitter: 'https://twitter.com/hashtag/%1$s',\n\tfacebook: 'https://www.facebook.com/hashtag/%1$s',\n\tlinkedin: 'https://www.linkedin.com/feed/hashtag/?keywords=%1$s',\n\tinstagram: 'https://www.instagram.com/explore/tags/%1$s',\n\tmastodon: 'https://%2$s/tags/%1$s',\n\tnextdoor: 'https://nextdoor.com/hashtag/%1$s',\n\tthreads: 'https://www.threads.net/search?q=%1$s&serp_type=tags',\n\ttumblr: 'https://www.tumblr.com/tagged/%1$s',\n\tbluesky: 'https://bsky.app/hashtag/%1$s',\n} as const;\n\n/**\n * Prepares the text for the preview.\n * @param {string} text - The text to prepare.\n * @param {PreviewTextOptions} options - The options for preparing the text.\n * @return The prepared text as React nodes.\n */\nexport function preparePreviewText( text: string, options: PreviewTextOptions ): React.ReactNode {\n\tconst {\n\t\tplatform,\n\t\tmaxChars,\n\t\tmaxLines,\n\t\thyperlinkHashtags = true,\n\t\t// Instagram doesn't support hyperlink URLs at the moment.\n\t\thyperlinkUrls = 'instagram' !== platform,\n\t} = options;\n\n\tlet result = stripHtmlTags( text );\n\n\t// Replace multiple new lines (2+) with 2 new lines\n\t// There can be any whitespace characters in empty lines\n\t// That is why \"\\s*\"\n\tresult = result.replaceAll( /(?:\\s*[\\n\\r]){2,}/g, '\\n\\n' );\n\n\tif ( maxChars && result.length > maxChars ) {\n\t\tresult = hardTruncation( maxChars )( result );\n\t}\n\n\tif ( maxLines ) {\n\t\tconst lines = result.split( '\\n' );\n\n\t\tif ( lines.length > maxLines ) {\n\t\t\tresult = lines.slice( 0, maxLines ).join( '\\n' );\n\t\t}\n\t}\n\n\tconst componentMap: Record< string, React.ReactElement > = {};\n\n\tif ( hyperlinkUrls ) {\n\t\t// Convert URLs to hyperlinks.\n\t\t// TODO: Use a better regex here to match the URLs without protocol.\n\t\tconst urls = result.match( /(https?:\\/\\/\\S+)/g ) || [];\n\n\t\t/**\n\t\t * BEFORE:\n\t\t * result = 'Check out this cool site: https://wordpress.org and this one: https://wordpress.com'\n\t\t */\n\t\turls.forEach( ( url, index ) => {\n\t\t\t// Add the element to the component map.\n\t\t\tcomponentMap[ `Link${ index }` ] = (\n\t\t\t\t<a href={ url } rel=\"noopener noreferrer\" target=\"_blank\">\n\t\t\t\t\t{ url }\n\t\t\t\t</a>\n\t\t\t);\n\t\t\t// Replace the URL with the component placeholder.\n\t\t\tresult = result.replace( url, `<Link${ index } />` );\n\t\t} );\n\t\t/**\n\t\t * AFTER:\n\t\t * result = 'Check out this cool site: <Link0 /> and this one: <Link1 />'\n\t\t * componentMap = {\n\t\t * Link0: <a href=\"https://wordpress.org\" ...>https://wordpress.org</a>,\n\t\t * Link1: <a href=\"https://wordpress.com\" ...>https://wordpress.com</a>\n\t\t * }\n\t\t */\n\t}\n\n\t// Convert hashtags to hyperlinks.\n\tif ( hyperlinkHashtags && hashtagUrlMap[ platform ] ) {\n\t\t/**\n\t\t * We need to ensure that only the standalone hashtags are matched.\n\t\t * For example, we don't want to match the hash in the URL.\n\t\t * Thus we need to match the whitespace character before the hashtag or the beginning of the string.\n\t\t */\n\t\tconst hashtags = result.matchAll( /(^|\\s)#(\\w+)/g );\n\n\t\tconst hashtagUrl = hashtagUrlMap[ platform ];\n\n\t\t/**\n\t\t * BEFORE:\n\t\t * result = `#breaking text with a #hashtag on the #web\n\t\t * with a url https://github.com/Automattic/wp-calypso#security that has a hash in it`\n\t\t */\n\t\t[ ...hashtags ].forEach( ( [ fullMatch, whitespace, hashtag ], index ) => {\n\t\t\tconst url = sprintf( hashtagUrl, hashtag, options.hashtagDomain );\n\n\t\t\t// Add the element to the component map.\n\t\t\tcomponentMap[ `Hashtag${ index }` ] = (\n\t\t\t\t<a href={ url } rel=\"noopener noreferrer\" target=\"_blank\">\n\t\t\t\t\t{ `#${ hashtag }` }\n\t\t\t\t</a>\n\t\t\t);\n\n\t\t\t// Replace the hashtag with the component placeholder.\n\t\t\tresult = result.replace( fullMatch, `${ whitespace }<Hashtag${ index } />` );\n\t\t} );\n\t\t/**\n\t\t * AFTER:\n\t\t * result = `<Hashtag0 /> text with a <Hashtag1 /> on the <Hashtag2 />\n\t\t * with a url https://github.com/Automattic/wp-calypso#security that has a hash in it`\n\t\t *\n\t\t * componentMap = {\n\t\t * Hashtag0: <a href=\"https://twitter.com/hashtag/breaking\" ...>#breaking</a>,\n\t\t * Hashtag1: <a href=\"https://twitter.com/hashtag/hashtag\" ...>#hashtag</a>,\n\t\t * Hashtag2: <a href=\"https://twitter.com/hashtag/web\" ...>#web</a>\n\t\t * }\n\t\t */\n\t}\n\n\t// Convert newlines to <br> tags.\n\t/**\n\t * BEFORE:\n\t * result = 'This is a text\\nwith a newline\\nin it'\n\t */\n\tresult = result.replace( /\\n/g, '<br />' );\n\tcomponentMap.br = <br />;\n\t/**\n\t * AFTER:\n\t * result = 'This is a text<br />with a newline<br />in it'\n\t * componentMap = { br: <br /> }\n\t */\n\n\treturn createInterpolateElement( result, componentMap );\n}\n","import {\n\tfirstValid,\n\thardTruncation,\n\tshortEnough,\n\ttruncatedAtSpace,\n\tstripHtmlTags,\n\tbaseDomain,\n} from '../helpers';\nimport { SocialPreviewBaseProps } from '../types';\n\nimport './style.scss';\n\nconst URL_LENGTH = 68;\nconst TITLE_LENGTH = 63;\nconst DESCRIPTION_LENGTH = 160;\n\nconst googleUrl = ( url: string ) => {\n\tconst protocol = url.startsWith( 'https://' ) ? 'https://' : 'http://';\n\n\tconst breadcrumb = protocol + url.replace( protocol, '' ).split( '/' ).join( ' › ' );\n\n\tconst truncateBreadcrumb = firstValid( shortEnough( URL_LENGTH ), hardTruncation( URL_LENGTH ) );\n\n\treturn truncateBreadcrumb( breadcrumb );\n};\n\nconst googleTitle = firstValid(\n\tshortEnough( TITLE_LENGTH ),\n\ttruncatedAtSpace( TITLE_LENGTH - 40, TITLE_LENGTH + 10 ),\n\thardTruncation( TITLE_LENGTH )\n);\n\nconst googleDescription = firstValid(\n\tshortEnough( DESCRIPTION_LENGTH ),\n\ttruncatedAtSpace( DESCRIPTION_LENGTH - 80, DESCRIPTION_LENGTH + 10 ),\n\thardTruncation( DESCRIPTION_LENGTH )\n);\n\nexport type GoogleSearchPreviewProps = Omit< SocialPreviewBaseProps, 'image' > & {\n\tsiteTitle?: string;\n};\n\nexport const GoogleSearchPreview: React.FC< Partial< GoogleSearchPreviewProps > > = ( {\n\tdescription = '',\n\tsiteTitle,\n\ttitle = '',\n\turl = '',\n} ) => {\n\tconst domain = baseDomain( url );\n\n\treturn (\n\t\t<div className=\"search-preview\">\n\t\t\t<div className=\"search-preview__display\">\n\t\t\t\t<div className=\"search-preview__header\">\n\t\t\t\t\t<div className=\"search-preview__branding\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tclassName=\"search-preview__icon\"\n\t\t\t\t\t\t\tsrc={ `https://www.google.com/s2/favicons?sz=128&domain_url=${ domain }` }\n\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"search-preview__site\">\n\t\t\t\t\t\t\t<div className=\"search-preview__site--title\">{ siteTitle || domain }</div>\n\t\t\t\t\t\t\t<div className=\"search-preview__url\">{ googleUrl( url ) }</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"search-preview__menu\">\n\t\t\t\t\t\t<svg focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t<path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"search-preview__title\">{ googleTitle( title ) }</div>\n\t\t\t\t<div className=\"search-preview__description\">\n\t\t\t\t\t{ googleDescription( stripHtmlTags( description ) ) }\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import clsx from 'clsx';\nimport { baseDomain, firstValid, hardTruncation, shortEnough, stripHtmlTags } from '../helpers';\nimport { TwitterCardProps } from './types';\n\nconst DESCRIPTION_LENGTH = 200;\n\nconst twitterDescription = firstValid(\n\tshortEnough( DESCRIPTION_LENGTH ),\n\thardTruncation( DESCRIPTION_LENGTH )\n);\n\nexport const Card: React.FC< TwitterCardProps > = ( {\n\tdescription,\n\timage,\n\ttitle,\n\tcardType,\n\turl,\n} ) => {\n\tconst cardClassNames = clsx( `twitter-preview__card-${ cardType }`, {\n\t\t'twitter-preview__card-has-image': !! image,\n\t} );\n\n\treturn (\n\t\t<div className=\"twitter-preview__card\">\n\t\t\t<div className={ cardClassNames }>\n\t\t\t\t{ image && <img className=\"twitter-preview__card-image\" src={ image } alt=\"\" /> }\n\t\t\t\t<div className=\"twitter-preview__card-body\">\n\t\t\t\t\t<div className=\"twitter-preview__card-url\">{ baseDomain( url || '' ) }</div>\n\t\t\t\t\t<div className=\"twitter-preview__card-title\">{ title }</div>\n\t\t\t\t\t<div className=\"twitter-preview__card-description\">\n\t\t\t\t\t\t{ twitterDescription( stripHtmlTags( description ) ) }\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","export const Footer: React.FC = () => {\n\treturn (\n\t\t<div className=\"twitter-preview__footer\">\n\t\t\t<span className=\"twitter-preview__icon-replies\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M1.751 10c0-4.42 3.584-8 8.005-8h4.366c4.49 0 8.129 3.64 8.129 8.13 0 2.96-1.607 5.68-4.196 7.11l-8.054 4.46v-3.69h-.067c-4.49.1-8.183-3.51-8.183-8.01zm8.005-6c-3.317 0-6.005 2.69-6.005 6 0 3.37 2.77 6.08 6.138 6.01l.351-.01h1.761v2.3l5.087-2.81c1.951-1.08 3.163-3.13 3.163-5.36 0-3.39-2.744-6.13-6.129-6.13H9.756z\"></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"twitter-preview__icon-retweets\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M4.5 3.88l4.432 4.14-1.364 1.46L5.5 7.55V16c0 1.1.896 2 2 2H13v2H7.5c-2.209 0-4-1.79-4-4V7.55L1.432 9.48.068 8.02 4.5 3.88zM16.5 6H11V4h5.5c2.209 0 4 1.79 4 4v8.45l2.068-1.93 1.364 1.46-4.432 4.14-4.432-4.14 1.364-1.46 2.068 1.93V8c0-1.1-.896-2-2-2z\"></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"twitter-preview__icon-likes\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M16.697 5.5c-1.222-.06-2.679.51-3.89 2.16l-.805 1.09-.806-1.09C9.984 6.01 8.526 5.44 7.304 5.5c-1.243.07-2.349.78-2.91 1.91-.552 1.12-.633 2.78.479 4.82 1.074 1.97 3.257 4.27 7.129 6.61 3.87-2.34 6.052-4.64 7.126-6.61 1.111-2.04 1.03-3.7.477-4.82-.561-1.13-1.666-1.84-2.908-1.91zm4.187 7.69c-1.351 2.48-4.001 5.12-8.379 7.67l-.503.3-.504-.3c-4.379-2.55-7.029-5.19-8.382-7.67-1.36-2.5-1.41-4.86-.514-6.67.887-1.79 2.647-2.91 4.601-3.01 1.651-.09 3.368.56 4.798 2.01 1.429-1.45 3.146-2.1 4.796-2.01 1.954.1 3.714 1.22 4.601 3.01.896 1.81.846 4.17-.514 6.67z\"></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"twitter-preview__icon-analytics\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M8.75 21V3h2v18h-2zM18 21V8.5h2V21h-2zM4 21l.004-10h2L6 21H4zm9.248 0v-7h2v7h-2z\"></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"twitter-preview__icon-share\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M12 2.59l5.7 5.7-1.41 1.42L13 6.41V16h-2V6.41l-3.3 3.3-1.41-1.42L12 2.59zM21 15l-.02 3.51c0 1.38-1.12 2.49-2.5 2.49H5.5C4.11 21 3 19.88 3 18.5V15h2v3.5c0 .28.22.5.5.5h12.98c.28 0 .5-.22.5-.5L19 15h2z\"></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { formatTweetDate } from '../helpers';\nimport { HeaderProps } from './types';\n\nexport const Header: React.FC< HeaderProps > = ( { name, screenName, date } ) => {\n\treturn (\n\t\t<div className=\"twitter-preview__header\">\n\t\t\t<span className=\"twitter-preview__name\">\n\t\t\t\t{ name || __( 'Account Name', 'social-previews' ) }\n\t\t\t</span>\n\t\t\t<span className=\"twitter-preview__screen-name\">{ screenName || '@account' }</span>\n\t\t\t<span>·</span>\n\t\t\t<span className=\"twitter-preview__date\">{ formatTweetDate( date || Date.now() ) }</span>\n\t\t</div>\n\t);\n};\n","import clsx from 'clsx';\nimport { Fragment } from 'react';\nimport { MediaProps } from './types';\n\nexport const Media: React.FC< MediaProps > = ( { media } ) => {\n\t// Ensure we're only trying to show valid media, and the correct quantity.\n\tconst filteredMedia = media\n\t\t// Only image/ and video/ mime types are supported.\n\t\t.filter(\n\t\t\tmediaItem => mediaItem.type.startsWith( 'image/' ) || mediaItem.type.startsWith( 'video/' )\n\t\t)\n\t\t.filter( ( mediaItem, idx, array ) => {\n\t\t\t// We'll always keep the first item.\n\t\t\tif ( 0 === idx ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// If the first item was a video or GIF, discard all subsequent items.\n\t\t\tif ( array[ 0 ].type.startsWith( 'video/' ) || 'image/gif' === array[ 0 ].type ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// The first item wasn't a video or GIF, so discard all subsequent videos and GIFs.\n\t\t\tif ( mediaItem.type.startsWith( 'video/' ) || 'image/gif' === mediaItem.type ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} )\n\t\t// We only want the first four items of the array, at most.\n\t\t.slice( 0, 4 );\n\n\tif ( 0 === filteredMedia.length ) {\n\t\treturn null;\n\t}\n\n\tconst isVideo = filteredMedia[ 0 ].type.startsWith( 'video/' );\n\n\tconst mediaClasses = clsx( [\n\t\t'twitter-preview__media',\n\t\t'twitter-preview__media-children-' + filteredMedia.length,\n\t] );\n\n\treturn (\n\t\t<div className={ mediaClasses }>\n\t\t\t{ filteredMedia.map( ( mediaItem, index ) => (\n\t\t\t\t<Fragment key={ `twitter-preview__media-item-${ index }` }>\n\t\t\t\t\t{ isVideo ? (\n\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t</video>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t) }\n\t\t\t\t</Fragment>\n\t\t\t) ) }\n\t\t</div>\n\t);\n};\n","import { SandBox } from '@wordpress/components';\nimport { QuoteTweetProps } from './types';\n\nexport const QuoteTweet: React.FC< QuoteTweetProps > = ( { tweetUrl } ) => {\n\tif ( ! tweetUrl ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"twitter-preview__quote-tweet\">\n\t\t\t<SandBox\n\t\t\t\thtml={ `<blockquote class=\"twitter-tweet\" data-conversation=\"none\" data-dnt=\"true\"><a href=\"${ tweetUrl }\"></a></blockquote>` }\n\t\t\t\tscripts={ [ 'https://platform.twitter.com/widgets.js' ] }\n\t\t\t\ttitle=\"Embedded tweet\"\n\t\t\t/>\n\t\t\t<div className=\"twitter-preview__quote-tweet-overlay\" />\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { DefaultAvatar } from './icons/default-avatar';\nimport { SidebarProps } from './types';\n\nexport const Sidebar: React.FC< SidebarProps > = ( { profileImage, showThreadConnector } ) => {\n\treturn (\n\t\t<div className=\"twitter-preview__sidebar\">\n\t\t\t<div className=\"twitter-preview__profile-image\">\n\t\t\t\t{ profileImage ? (\n\t\t\t\t\t<img alt={ __( 'Twitter profile image', 'social-previews' ) } src={ profileImage } />\n\t\t\t\t) : (\n\t\t\t\t\t<DefaultAvatar />\n\t\t\t\t) }\n\t\t\t</div>\n\t\t\t{ showThreadConnector && <div className=\"twitter-preview__connector\" /> }\n\t\t</div>\n\t);\n};\n","export const DefaultAvatar: React.FC = () => {\n\treturn (\n\t\t<svg\n\t\t\tversion=\"1.0\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"271pt\"\n\t\t\theight=\"270pt\"\n\t\t\tviewBox=\"0 0 271 270\"\n\t\t>\n\t\t\t<rect width=\"100%\" height=\"100%\" fill=\"#ccd5de\" />\n\t\t\t<g transform=\"translate(0,270) scale(0.1,-0.1)\" fill=\"#647785\" stroke=\"none\">\n\t\t\t\t<path d=\"M1251 2089 c-81 -14 -178 -65 -239 -125 -64 -65 -124 -185 -149 -299 -24 -111 -24 -339 -1 -415 38 -121 108 -193 227 -231 83 -27 339 -38 449 -19 139 23 236 91 286 200 59 130 52 395 -15 577 -88 235 -301 354 -558 312z\" />\n\t\t\t\t<path d=\"M1197 795 c-358 -68 -643 -357 -721 -732 l-14 -63 890 0 890 0 -7 42 c-11 70 -64 218 -102 288 -121 224 -336 394 -573 454 -92 24 -267 29 -363 11z\" />\n\t\t\t</g>\n\t\t</svg>\n\t);\n};\n","import { preparePreviewText } from '../helpers';\nimport { TextProps } from './types';\n\nexport const Text: React.FC< TextProps > = ( { text, url, retainUrl } ) => {\n\tif ( ! text ) {\n\t\treturn null;\n\t}\n\t// If the text ends with the card URL, remove it.\n\tconst tweetText =\n\t\turl && ! retainUrl && text.endsWith( url )\n\t\t\t? text.substring( 0, text.lastIndexOf( url ) )\n\t\t\t: text;\n\n\treturn (\n\t\t<div className=\"twitter-preview__text\">\n\t\t\t{ preparePreviewText( tweetText, { platform: 'twitter' } ) }\n\t\t</div>\n\t);\n};\n","import { Card } from './card';\nimport { Footer } from './footer';\nimport { Header } from './header';\nimport { Media } from './media';\nimport { QuoteTweet } from './quote-tweet';\nimport { Sidebar } from './sidebar';\nimport { Text } from './text';\nimport { TwitterPreviewProps } from './types';\n\nimport './style.scss';\n\nexport const TwitterPostPreview: React.FC< TwitterPreviewProps > = ( {\n\tdate,\n\tdescription,\n\timage,\n\tmedia,\n\tname,\n\tprofileImage,\n\tscreenName,\n\tshowThreadConnector,\n\ttext,\n\ttitle,\n\ttweetUrl,\n\tcardType,\n\turl,\n} ) => {\n\tconst hasMedia = !! media?.length;\n\n\treturn (\n\t\t<div className=\"twitter-preview__wrapper\">\n\t\t\t<div className=\"twitter-preview__container\">\n\t\t\t\t<Sidebar profileImage={ profileImage } showThreadConnector={ showThreadConnector } />\n\t\t\t\t<div className=\"twitter-preview__main\">\n\t\t\t\t\t<Header name={ name } screenName={ screenName } date={ date } />\n\t\t\t\t\t<div className=\"twitter-preview__content\">\n\t\t\t\t\t\t{ text ? <Text text={ text } url={ url || '' } retainUrl={ hasMedia } /> : null }\n\t\t\t\t\t\t{ hasMedia ? <Media media={ media } /> : null }\n\t\t\t\t\t\t{ tweetUrl ? <QuoteTweet tweetUrl={ tweetUrl } /> : null }\n\t\t\t\t\t\t{ ! hasMedia && url && (\n\t\t\t\t\t\t\t<Card\n\t\t\t\t\t\t\t\tdescription={ description || '' }\n\t\t\t\t\t\t\t\timage={ image }\n\t\t\t\t\t\t\t\ttitle={ title || '' }\n\t\t\t\t\t\t\t\tcardType={ cardType || '' }\n\t\t\t\t\t\t\t\turl={ url }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</div>\n\t\t\t\t\t<Footer />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { TwitterPostPreview } from './post-preview';\nimport { TwitterPreviewProps } from './types';\n\nexport const TwitterLinkPreview: React.FC< TwitterPreviewProps > = props => {\n\treturn (\n\t\t<TwitterPostPreview\n\t\t\t{ ...props }\n\t\t\t// Override the props that are irrelevant to link preview\n\t\t\ttext=\"\"\n\t\t\tmedia={ undefined }\n\t\t/>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport SectionHeading from '../shared/section-heading';\nimport { TwitterLinkPreview } from './link-preview';\nimport { TwitterPostPreview } from './post-preview';\nimport type { TwitterPreviewsProps } from './types';\n\nexport const TwitterPreviews: React.FC< TwitterPreviewsProps > = ( {\n\theadingLevel,\n\thideLinkPreview,\n\thidePostPreview,\n\ttweets,\n} ) => {\n\tif ( ! tweets?.length ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"social-preview twitter-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section twitter-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Twitter\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on X:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t{ tweets.map( ( tweet, index ) => {\n\t\t\t\t\t\tconst isLast = index + 1 === tweets.length;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<TwitterPostPreview\n\t\t\t\t\t\t\t\tkey={ `twitter-preview__tweet-${ index }` }\n\t\t\t\t\t\t\t\t{ ...tweet }\n\t\t\t\t\t\t\t\tshowThreadConnector={ ! isLast }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section twitter-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a Twitter post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on X.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<TwitterLinkPreview { ...tweets[ 0 ] } name=\"\" profileImage=\"\" screenName=\"\" />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","const HEADING_LEVELS = [ 2, 3, 4, 5, 6 ] as const;\n\nexport type SectionHeadingProps = {\n\tclassName?: string;\n\tlevel?: ( typeof HEADING_LEVELS )[ number ];\n\tchildren?: React.ReactNode;\n};\n\nexport const SectionHeading: React.FC< SectionHeadingProps > = ( {\n\tclassName,\n\tlevel,\n\tchildren,\n} ) => {\n\tconst Tag = `h${ level && HEADING_LEVELS.includes( level ) ? level : 3 }` as const;\n\n\treturn (\n\t\t<Tag className={ `social-preview__section-heading ${ className ?? '' }` }>{ children }</Tag>\n\t);\n};\n\nexport default SectionHeading;\n","import { __, sprintf } from '@wordpress/i18n';\nimport { baseDomain, getTitleFromDescription, preparePreviewText } from '../helpers';\nimport { FEED_TEXT_MAX_LENGTH } from './constants';\nimport { DefaultAvatar } from './icons/default-avatar';\nimport { LinkedInPreviewProps } from './types';\n\nimport './style.scss';\n\n/**\n * LinkedIn Post Preview Component\n *\n * @param {LinkedInPreviewProps} props - The props for the LinkedIn post preview.\n *\n * @return The LinkedIn post preview component.\n */\nexport function LinkedInPostPreview( {\n\tarticleReadTime = 5,\n\timage,\n\tjobTitle,\n\tname,\n\tprofileImage,\n\tdescription,\n\tmedia,\n\ttitle,\n\turl,\n}: LinkedInPreviewProps ) {\n\tconst hasMedia = !! media?.length;\n\n\treturn (\n\t\t<div className=\"linkedin-preview__wrapper\">\n\t\t\t<section className={ `linkedin-preview__container ${ hasMedia ? 'has-media' : '' }` }>\n\t\t\t\t<div className=\"linkedin-preview__header\">\n\t\t\t\t\t<div className=\"linkedin-preview__header--avatar\">\n\t\t\t\t\t\t{ profileImage ? <img src={ profileImage } alt=\"\" /> : <DefaultAvatar /> }\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"linkedin-preview__header--profile\">\n\t\t\t\t\t\t<div className=\"linkedin-preview__header--profile-info\">\n\t\t\t\t\t\t\t<div className=\"linkedin-preview__header--profile-name\">\n\t\t\t\t\t\t\t\t{ name || __( 'Account Name', 'social-previews' ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span>•</span>\n\t\t\t\t\t\t\t<div className=\"linkedin-preview__header--profile-actor\">\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t// translators: refers to the actor level of the post being shared, e.g. \"1st\", \"2nd\", \"3rd\", etc.\n\t\t\t\t\t\t\t\t\t__( '1st', 'social-previews' )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{ jobTitle ? (\n\t\t\t\t\t\t\t<div className=\"linkedin-preview__header--profile-title\">{ jobTitle }</div>\n\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t<div className=\"linkedin-preview__header--profile-meta\">\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t// translators: refers to the time since the post was published, e.g. \"1h\"\n\t\t\t\t\t\t\t\t\t__( '1h', 'social-previews' )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span>•</span>\n\t\t\t\t\t\t\t{ /* This is the Globe SVG that represents visibility to be \"public\" */ }\n\t\t\t\t\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" width=\"16\" height=\"16\" focusable=\"false\">\n\t\t\t\t\t\t\t\t<path d=\"M8 1a7 7 0 107 7 7 7 0 00-7-7zM3 8a5 5 0 011-3l.55.55A1.5 1.5 0 015 6.62v1.07a.75.75 0 00.22.53l.56.56a.75.75 0 00.53.22H7v.69a.75.75 0 00.22.53l.56.56a.75.75 0 01.22.53V13a5 5 0 01-5-5zm6.24 4.83l2-2.46a.75.75 0 00.09-.8l-.58-1.16A.76.76 0 0010 8H7v-.19a.51.51 0 01.28-.45l.38-.19a.74.74 0 01.68 0L9 7.5l.38-.7a1 1 0 00.12-.48v-.85a.78.78 0 01.21-.53l1.07-1.09a5 5 0 01-1.54 9z\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"linkedin-preview__content\">\n\t\t\t\t\t{ description ? (\n\t\t\t\t\t\t<div className=\"linkedin-preview__caption\">\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{ preparePreviewText( description, {\n\t\t\t\t\t\t\t\t\tplatform: 'linkedin',\n\t\t\t\t\t\t\t\t\tmaxChars: FEED_TEXT_MAX_LENGTH,\n\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{ hasMedia && url && (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t{ ' - ' }\n\t\t\t\t\t\t\t\t\t<a href={ url } rel=\"nofollow noopener noreferrer\" target=\"_blank\">\n\t\t\t\t\t\t\t\t\t\t{ url }\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null }\n\t\t\t\t\t{ hasMedia ? (\n\t\t\t\t\t\t<div className=\"linkedin-preview__media\">\n\t\t\t\t\t\t\t{ media.map( ( mediaItem, index ) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={ `linkedin-preview__media-item-${ index }` }\n\t\t\t\t\t\t\t\t\tclassName=\"linkedin-preview__media-item\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ mediaItem.type.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<article>\n\t\t\t\t\t\t\t{ image ? <img className=\"linkedin-preview__image\" src={ image } alt=\"\" /> : null }\n\t\t\t\t\t\t\t{ url ? (\n\t\t\t\t\t\t\t\t<div className=\"linkedin-preview__description\">\n\t\t\t\t\t\t\t\t\t<h2 className=\"linkedin-preview__description--title\">\n\t\t\t\t\t\t\t\t\t\t{ title || getTitleFromDescription( description ) }\n\t\t\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t\t\t<div className=\"linkedin-preview__description--meta\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"linkedin-preview__description--url\">\n\t\t\t\t\t\t\t\t\t\t\t{ baseDomain( url ) }\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span>•</span>\n\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t{ sprintf(\n\t\t\t\t\t\t\t\t\t\t\t\t// translators: %d is the number of minutes it takes to read the article\n\t\t\t\t\t\t\t\t\t\t\t\t__( '%d min read', 'social-previews' ),\n\t\t\t\t\t\t\t\t\t\t\t\tarticleReadTime\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t</article>\n\t\t\t\t\t) }\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</div>\n\t);\n}\n","export const FEED_TEXT_MAX_LENGTH = 550;\n","export const DefaultAvatar: React.FC = () => {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 128 128\" width=\"128\" height=\"128\">\n\t\t\t<path fill=\"#e7e2dc\" d=\"M0 0h128v128H0z\" />\n\t\t\t<path d=\"M88.41 84.67a32 32 0 10-48.82 0 66.13 66.13 0 0148.82 0z\" fill=\"#788fa5\" />\n\t\t\t<path\n\t\t\t\td=\"M88.41 84.67a32 32 0 01-48.82 0A66.79 66.79 0 000 128h128a66.79 66.79 0 00-39.59-43.33z\"\n\t\t\t\tfill=\"#9db3c8\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M64 96a31.93 31.93 0 0024.41-11.33 66.13 66.13 0 00-48.82 0A31.93 31.93 0 0064 96z\"\n\t\t\t\tfill=\"#56687a\"\n\t\t\t/>\n\t\t</svg>\n\t);\n};\n","import { getTitleFromDescription } from '../helpers';\nimport { LinkedInPostPreview } from './post-preview';\nimport { LinkedInPreviewProps } from './types';\n\ntype OptionalProps = Partial< Pick< LinkedInPreviewProps, 'name' | 'profileImage' > >;\n\nexport type LinkedInLinkPreviewProps = Omit< LinkedInPreviewProps, keyof OptionalProps > &\n\tOptionalProps;\n\n/**\n * LinkedIn Link Preview Component\n * @param {LinkedInLinkPreviewProps} props - The props for the LinkedIn link preview.\n * @return The LinkedIn link preview component.\n */\nexport function LinkedInLinkPreview( props: LinkedInLinkPreviewProps ) {\n\treturn (\n\t\t<LinkedInPostPreview\n\t\t\tname=\"\"\n\t\t\tprofileImage=\"\"\n\t\t\t{ ...props }\n\t\t\t// Override the props that are irrelevant to link preview\n\t\t\tdescription=\"\"\n\t\t\tmedia={ undefined }\n\t\t\ttitle={ props.title || getTitleFromDescription( props.description ) }\n\t\t/>\n\t);\n}\n","import { __ } from '@wordpress/i18n';\nimport SectionHeading from '../shared/section-heading';\nimport { LinkedInLinkPreview } from './link-preview';\nimport { LinkedInPostPreview } from './post-preview';\nimport type { LinkedInPreviewsProps } from './types';\n\nexport const LinkedInPreviews: React.FC< LinkedInPreviewsProps > = ( {\n\theadingLevel,\n\thideLinkPreview,\n\thidePostPreview,\n\t...props\n} ) => {\n\treturn (\n\t\t<div className=\"social-preview linkedin-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section linkedin-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on LinkedIn\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on LinkedIn:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<LinkedInPostPreview { ...props } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section linkedin-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a LinkedIn post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on LinkedIn.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<LinkedInLinkPreview { ...props } name=\"\" profileImage=\"\" />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { baseDomain } from '../helpers';\nimport { tumblrTitle, tumblrDescription } from './helpers';\nimport TumblrPostActions from './post/actions';\nimport TumblrPostHeader from './post/header';\nimport type { TumblrPreviewProps } from './types';\n\nimport './styles.scss';\n\nexport const TumblrLinkPreview: React.FC< TumblrPreviewProps > = ( {\n\ttitle,\n\tdescription,\n\timage,\n\tuser,\n\turl,\n} ) => {\n\tconst avatarUrl = user?.avatarUrl;\n\n\treturn (\n\t\t<div className=\"tumblr-preview__post\">\n\t\t\t{ avatarUrl && <img className=\"tumblr-preview__avatar\" src={ avatarUrl } alt=\"\" /> }\n\t\t\t<div className=\"tumblr-preview__card\">\n\t\t\t\t<TumblrPostHeader user={ user } />\n\t\t\t\t<div className=\"tumblr-preview__window\">\n\t\t\t\t\t{ image && (\n\t\t\t\t\t\t<div className=\"tumblr-preview__window-top\">\n\t\t\t\t\t\t\t<div className=\"tumblr-preview__overlay\">\n\t\t\t\t\t\t\t\t<div className=\"tumblr-preview__title\">{ tumblrTitle( title ) }</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tclassName=\"tumblr-preview__image\"\n\t\t\t\t\t\t\t\tsrc={ image }\n\t\t\t\t\t\t\t\talt={ __( 'Tumblr preview thumbnail', 'social-previews' ) }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) }\n\t\t\t\t\t<div className={ `tumblr-preview__window-bottom ${ ! image ? 'is-full' : '' }` }>\n\t\t\t\t\t\t{ ! image && <div className=\"tumblr-preview__title\">{ tumblrTitle( title ) }</div> }\n\t\t\t\t\t\t{ description && image && (\n\t\t\t\t\t\t\t<div className=\"tumblr-preview__description\">\n\t\t\t\t\t\t\t\t{ tumblrDescription( description ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) }\n\t\t\t\t\t\t{ url && <div className=\"tumblr-preview__site-name\">{ baseDomain( url ) }</div> }\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<TumblrPostActions />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { firstValid, hardTruncation, shortEnough, stripHtmlTags, Formatter } from '../helpers';\n\nconst TITLE_LENGTH = 1000;\nconst DESCRIPTION_LENGTH = 400;\n\nexport const tumblrTitle: Formatter = text =>\n\tfirstValid(\n\t\tshortEnough( TITLE_LENGTH ),\n\t\thardTruncation( TITLE_LENGTH )\n\t)( stripHtmlTags( text ) ) || '';\n\nexport const tumblrDescription: Formatter = text => {\n\t// Remove Gutenberg block comments using a safer approach to avoid ReDoS\n\tlet processedText = text;\n\tlet startIndex = processedText.indexOf( '<!--' );\n\twhile ( startIndex !== -1 ) {\n\t\tconst endIndex = processedText.indexOf( '-->', startIndex );\n\t\tif ( endIndex === -1 ) {\n\t\t\t// Incomplete comment, remove from startIndex to end\n\t\t\tprocessedText = processedText.substring( 0, startIndex );\n\t\t\tbreak;\n\t\t}\n\t\t// Remove the comment\n\t\tprocessedText =\n\t\t\tprocessedText.substring( 0, startIndex ) + processedText.substring( endIndex + 3 );\n\t\tstartIndex = processedText.indexOf( '<!--' );\n\t}\n\n\t// Convert closing paragraph tags to line breaks to preserve paragraph structure\n\tprocessedText = processedText.replace( /<\\/p>/g, '</p>\\n\\n' );\n\n\treturn (\n\t\tfirstValid(\n\t\t\tshortEnough( DESCRIPTION_LENGTH ),\n\t\t\thardTruncation( DESCRIPTION_LENGTH )\n\t\t)( stripHtmlTags( processedText ) ) || ''\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport TumblrPostIcon from '../icons';\n\nimport './styles.scss';\n\nconst TumblrPostActions: React.FC = () => (\n\t<div className=\"tumblr-preview__post-actions\">\n\t\t<div className=\"tumblr-preview__post-manage-actions\">\n\t\t\t<div className=\"tumblr-preview__post-actions-blaze\">\n\t\t\t\t<TumblrPostIcon name=\"blaze\" />\n\t\t\t\t Blaze\n\t\t\t</div>\n\t\t\t<ul>\n\t\t\t\t{ [\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: 'delete',\n\t\t\t\t\t\t// translators: \"Delete\" action on a Tumblr post\n\t\t\t\t\t\tlabel: __( 'Delete', 'social-previews' ),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: 'edit',\n\t\t\t\t\t\t// translators: \"Edit\" action on a Tumblr post\n\t\t\t\t\t\tlabel: __( 'Edit', 'social-previews' ),\n\t\t\t\t\t},\n\t\t\t\t].map( ( { icon, label } ) => (\n\t\t\t\t\t<li key={ icon } aria-label={ label }>\n\t\t\t\t\t\t<TumblrPostIcon name={ icon } />\n\t\t\t\t\t</li>\n\t\t\t\t) ) }\n\t\t\t</ul>\n\t\t</div>\n\t\t<div className=\"tumblr-preview__post-social-actions\">\n\t\t\t<div>\n\t\t\t\t{\n\t\t\t\t\t// translators: count of notes on a Tumblr post\n\t\t\t\t\t__( '0 notes', 'social-previews' )\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<ul>\n\t\t\t\t{ [\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: 'share',\n\t\t\t\t\t\t// translators: \"Share\" action on a Tumblr post\n\t\t\t\t\t\tlabel: __( 'Share', 'social-previews' ),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: 'reply',\n\t\t\t\t\t\t// translators: \"Reply\" action on a Tumblr post\n\t\t\t\t\t\tlabel: __( 'Reply', 'social-previews' ),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: 'reblog',\n\t\t\t\t\t\t// translators: \"Reblog\" action on a Tumblr post\n\t\t\t\t\t\tlabel: __( 'Reblog', 'social-previews' ),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: 'like',\n\t\t\t\t\t\t// translators: \"Like\" action on a Tumblr post\n\t\t\t\t\t\tlabel: __( 'Like', 'social-previews' ),\n\t\t\t\t\t},\n\t\t\t\t].map( ( { icon, label } ) => (\n\t\t\t\t\t<li key={ icon } aria-label={ label }>\n\t\t\t\t\t\t<TumblrPostIcon name={ icon } />\n\t\t\t\t\t</li>\n\t\t\t\t) ) }\n\t\t\t</ul>\n\t\t</div>\n\t</div>\n);\n\nexport default TumblrPostActions;\n","import './styles.scss';\n\nconst TumblrPostIcon: React.FC< { name: string } > = ( { name } ) => {\n\tlet svg;\n\n\tswitch ( name ) {\n\t\tcase 'blaze':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 25 22\">\n\t\t\t\t\t<path d=\"m7.5059-0.24414c-0.79843 0.057223-1.2169 0.88587-1.1635 1.6128-0.2266 2.0449-1.4898 3.8696-3.1975 4.9778-3.0182 2.414-4.2201 6.8066-2.8033 10.411 0.92417 2.4679 2.9589 4.5674 5.4768 5.3928 0.95914 0.16102 1.7233-0.94358 1.3074-1.8059-0.11578-0.51062-0.17482-0.96516-0.17845-1.487 1.0413 1.5607 2.5484 2.8986 4.341 3.4975 1.0396-0.0154 1.98-0.64458 2.8516-1.1608 3.3821-2.1786 4.9604-6.7097 3.6597-10.518-0.49144-1.4599-1.2948-2.8935-2.5028-3.8698-0.7512-0.45498-1.661 0.09677-1.9202 0.86038-0.12274 0.16822-0.70352 1.1955-0.6191 0.61976 0.25488-3.4397-1.6789-7.0066-4.8123-8.4958-0.14322-0.037843-0.292-0.049464-0.43945-0.035156zm1.0586 3.5605c1.8947 2.0016 2.2326 5.1984 0.89062 7.5879-0.38498 0.96148 0.71762 2.0063 1.6567 1.5681 1.4159-0.4624 2.6998-1.3259 3.6577-2.4665 1.6442 2.5888 1.1465 6.2819-1.0629 8.3379-0.62378 0.60782-1.3666 1.0945-2.1754 1.4179-1.9543-0.989-3.3534-3.0966-3.5625-5.3125-0.25636-1.0253-1.81-1.2013-2.2852-0.25781-0.75058 1.3054-1.1846 2.7948-1.2305 4.3008-2.2396-1.9852-2.8468-5.4435-1.4609-8.0527 0.58926-1.239 1.651-2.13 2.724-2.9329 1.2958-1.1271 2.2791-2.62 2.7682-4.2683l0.071578 0.069832z\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'delete':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 14 17\">\n\t\t\t\t\t<path d=\"M12 5v9c.1.7-.3 1-1 1H3c-.5 0-.9-.3-1-1V5c0-.6-.4-1-1-1-.5 0-1 .4-1 1v9.5C0 16.1 1.4 17 3 17h8c1.8 0 3-.8 3-2.5V5c0-.6-.5-1-1-1-.6 0-1 .5-1 1z\"></path>\n\t\t\t\t\t<path d=\"M4 12s0 1 1 1 1-1 1-1V5c0-.5-.4-1-1-1-.5 0-1 .5-1 1v7zm4 0s0 1 1 1 1-1 1-1V5c0-.5-.4-1-1-1-.5 0-1 .5-1 1v7zm5-10c.5 0 1-.4 1-1 0-.5-.4-.9-1-1H1C.5.1 0 .5 0 1c0 .6.6 1 1.1 1H13z\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'edit':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 17.6 17.6\">\n\t\t\t\t\t<path d=\"M5.3 13.8l-2.1.7.7-2.1L10.3 6l1.4 1.4-6.4 6.4zm6.4-9.3l-1.4-1.4-1.4 1.4-6.7 6.7-.2.5-2 5.9 3.8-1.3 2.1-.7.4-.1.3-.3 7.8-7.8c.1 0-2.7-2.9-2.7-2.9zm5.6-1.4L14.5.3c-.4-.4-1-.4-1.4 0l-1.4 1.4L15.9 6l1.4-1.4c.4-.5.4-1.1 0-1.5\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'share':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M12.6173 1.07612C12.991 0.921338 13.4211 1.00689 13.7071 1.29289L22.7071 10.2929C23.0832 10.669 23.0991 11.2736 22.7433 11.669L13.7433 21.669C13.4663 21.9767 13.0283 22.082 12.6417 21.9336C12.2552 21.7853 12 21.414 12 21V16H11.5C7.31775 16 3.92896 18.2486 2.95256 21.3044C2.80256 21.7738 2.33292 22.064 1.84598 21.9881C1.35904 21.9122 1 21.4928 1 21V18.5C1 12.3162 5.88069 7.27245 12 7.01067V2C12 1.59554 12.2436 1.2309 12.6173 1.07612ZM14 4.41421V8C14 8.55228 13.5523 9 13 9H12.5C7.64534 9 3.64117 12.6414 3.06988 17.3419C5.09636 15.2366 8.18218 14 11.5 14H13C13.5523 14 14 14.4477 14 15V18.394L20.622 11.0362L14 4.41421Z\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'reply':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 17 17\">\n\t\t\t\t\t<path d=\"M8.7 0C4.1 0 .4 3.7.4 8.3c0 1.2.2 2.3.7 3.4-.2.6-.4 1.5-.7 2.5L0 15.8c-.2.7.5 1.4 1.2 1.2l1.6-.4 2.4-.7c1.1.5 2.2.7 3.4.7 4.6 0 8.3-3.7 8.3-8.3C17 3.7 13.3 0 8.7 0zM15 8.3c0 3.5-2.8 6.3-6.4 6.3-1.2 0-2.3-.3-3.2-.9l-3.2.9.9-3.2c-.5-.9-.9-2-.9-3.2.1-3.4 3-6.2 6.5-6.2S15 4.8 15 8.3z\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'reblog':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 17 18.1\">\n\t\t\t\t\t<path d=\"M12.8.2c-.4-.4-.8-.2-.8.4v2H2c-2 0-2 2-2 2v5s0 1 1 1 1-1 1-1v-4c0-1 .5-1 1-1h9v2c0 .6.3.7.8.4L17 3.6 12.8.2zM4.2 17.9c.5.4.8.2.8-.3v-2h10c2 0 2-2 2-2v-5s0-1-1-1-1 1-1 1v4c0 1-.5 1-1 1H5v-2c0-.6-.3-.7-.8-.4L0 14.6l4.2 3.3z\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'like':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 20 18\">\n\t\t\t\t\t<path d=\"M14.658 0c-1.625 0-3.21.767-4.463 2.156-.06.064-.127.138-.197.225-.074-.085-.137-.159-.196-.225C8.547.766 6.966 0 5.35 0 4.215 0 3.114.387 2.162 1.117c-2.773 2.13-2.611 5.89-1.017 8.5 2.158 3.535 6.556 7.18 7.416 7.875A2.3 2.3 0 0 0 9.998 18c.519 0 1.028-.18 1.436-.508.859-.695 5.257-4.34 7.416-7.875 1.595-2.616 1.765-6.376-1-8.5C16.895.387 15.792 0 14.657 0h.001zm0 2.124c.645 0 1.298.208 1.916.683 1.903 1.461 1.457 4.099.484 5.695-1.973 3.23-6.16 6.7-6.94 7.331a.191.191 0 0 1-.241 0c-.779-.631-4.966-4.101-6.94-7.332-.972-1.595-1.4-4.233.5-5.694.619-.475 1.27-.683 1.911-.683 1.064 0 2.095.574 2.898 1.461.495.549 1.658 2.082 1.753 2.203.095-.12 1.259-1.654 1.752-2.203.8-.887 1.842-1.461 2.908-1.461h-.001z\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'ellipsis':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 17.5 3.9\">\n\t\t\t\t\t<path d=\"M17.5 1.9c0 1.1-.9 1.9-1.9 1.9-1.1 0-1.9-.9-1.9-1.9S14.5 0 15.6 0c1 0 1.9.9 1.9 1.9m-6.8 0c0 1.1-.9 1.9-1.9 1.9-1.1.1-2-.8-2-1.9 0-1 .9-1.9 2-1.9s1.9.9 1.9 1.9m-6.8 0c0 1.1-.9 2-2 2-1 0-1.9-.9-1.9-2S.9 0 1.9 0c1.1 0 2 .9 2 1.9\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t}\n\n\treturn (\n\t\t<span className={ `tumblr-preview__post-icon tumblr-preview__post-icon-${ name }` }>\n\t\t\t{ svg }\n\t\t</span>\n\t);\n};\n\nexport default TumblrPostIcon;\n","import { __ } from '@wordpress/i18n';\nimport TumblrPostIcon from '../icons';\nimport type { TumblrPreviewProps } from '../../types';\n\nimport './styles.scss';\n\ntype Props = Pick< TumblrPreviewProps, 'user' >;\n\nconst TumblrPostHeader: React.FC< Props > = ( { user } ) => (\n\t<div className=\"tumblr-preview__post-header\">\n\t\t<div className=\"tumblr-preview__post-header-username\">\n\t\t\t{ user?.displayName ||\n\t\t\t\t// translators: username of a fictional Tumblr User\n\t\t\t\t__( 'anonymous-user', 'social-previews' ) }\n\t\t</div>\n\t\t<TumblrPostIcon name=\"ellipsis\" />\n\t</div>\n);\n\nexport default TumblrPostHeader;\n","import { __ } from '@wordpress/i18n';\nimport { preparePreviewText } from '../helpers';\nimport { tumblrTitle, tumblrDescription } from './helpers';\nimport TumblrPostActions from './post/actions';\nimport TumblrPostHeader from './post/header';\nimport type { TumblrPreviewProps } from './types';\n\nimport './styles.scss';\n\nexport const TumblrPostPreview: React.FC< TumblrPreviewProps > = ( {\n\ttitle,\n\tdescription,\n\timage,\n\tuser,\n\turl,\n\tcustomText,\n\tmedia,\n} ) => {\n\tconst avatarUrl = user?.avatarUrl;\n\n\tconst mediaItem = media?.[ 0 ];\n\n\treturn (\n\t\t<div className=\"tumblr-preview__post\">\n\t\t\t{ avatarUrl && <img className=\"tumblr-preview__avatar\" src={ avatarUrl } alt=\"\" /> }\n\t\t\t<div className=\"tumblr-preview__card\">\n\t\t\t\t<TumblrPostHeader user={ user } />\n\t\t\t\t<div className=\"tumblr-preview__body\">\n\t\t\t\t\t<div className=\"tumblr-preview__title\">{ tumblrTitle( title ) }</div>\n\t\t\t\t\t{ customText && <div className=\"tumblr-preview__custom-text\">{ customText }</div> }\n\t\t\t\t\t{ description && (\n\t\t\t\t\t\t<div className=\"tumblr-preview__description\">\n\t\t\t\t\t\t\t{ preparePreviewText( tumblrDescription( description ), {\n\t\t\t\t\t\t\t\tplatform: 'tumblr',\n\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) }\n\t\t\t\t\t{ mediaItem ? (\n\t\t\t\t\t\t<div className=\"tumblr-preview__media-item\">\n\t\t\t\t\t\t\t{ mediaItem.type.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t<video controls className=\"tumblr-preview__media--video\">\n\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<img className=\"tumblr-preview__image\" src={ mediaItem.url } alt=\"\" />\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\timage && (\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tclassName=\"tumblr-preview__image\"\n\t\t\t\t\t\t\t\tsrc={ image }\n\t\t\t\t\t\t\t\talt={ __( 'Tumblr preview thumbnail', 'social-previews' ) }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t) }\n\t\t\t\t\t<a className=\"tumblr-preview__url\" href={ url } target=\"_blank\" rel=\"noreferrer\">\n\t\t\t\t\t\t{ __( 'View On WordPress', 'social-previews' ) }\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t\t<TumblrPostActions />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { SectionHeading } from '../shared/section-heading';\nimport { SocialPreviewsBaseProps } from '../types';\nimport { TumblrLinkPreview } from './link-preview';\nimport { TumblrPostPreview } from './post-preview';\nimport { TumblrPreviewProps } from './types';\n\nexport type TumblrPreviewsProps = TumblrPreviewProps & SocialPreviewsBaseProps;\n\nexport const TumblrPreviews: React.FC< TumblrPreviewsProps > = ( {\n\theadingLevel,\n\thideLinkPreview,\n\thidePostPreview,\n\t...props\n} ) => {\n\tconst hasMedia = !! props.media?.length;\n\n\treturn (\n\t\t<div className=\"social-preview tumblr-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section tumblr-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Tumblr\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on Tumblr:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t{ hasMedia ? <TumblrPostPreview { ...props } /> : <TumblrLinkPreview { ...props } /> }\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section tumblr-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link on Tumblr\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on Tumblr.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<TumblrLinkPreview { ...props } user={ undefined } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport SectionHeading from '../shared/section-heading';\nimport { SocialPreviewsBaseProps } from '../types';\nimport { FacebookLinkPreview } from './link-preview';\nimport { LinkPreviewDetails } from './link-preview-details';\nimport { FacebookPostPreview } from './post-preview';\nimport type { FacebookPreviewProps } from './types';\n\nexport type FacebookPreviewsProps = FacebookPreviewProps & SocialPreviewsBaseProps;\n\nexport const FacebookPreviews: React.FC< FacebookPreviewsProps > = ( {\n\theadingLevel,\n\thideLinkPreview,\n\thidePostPreview,\n\t...props\n} ) => {\n\tconst hasMedia = !! props.media?.length;\n\tconst hasCustomImage = !! props.customImage;\n\n\treturn (\n\t\t<div className=\"social-preview facebook-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section facebook-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Facebook\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on Facebook:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t{ hasMedia ? <FacebookPostPreview { ...props } /> : <FacebookLinkPreview { ...props } /> }\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section facebook-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a Facebook post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on Facebook.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t{ hasCustomImage ? (\n\t\t\t\t\t\t<LinkPreviewDetails { ...props } />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<FacebookLinkPreview { ...props } compactDescription customText=\"\" user={ undefined } />\n\t\t\t\t\t) }\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { TYPE_ARTICLE, PORTRAIT_MODE } from '../constants';\nimport { baseDomain } from '../helpers';\nimport CustomText from './custom-text';\nimport { facebookTitle, facebookDescription } from './helpers';\nimport useImage from './hooks/use-image-hook';\nimport FacebookPostActions from './post/actions';\nimport FacebookPostHeader from './post/header';\nimport FacebookPostIcon from './post/icons';\nimport type { FacebookPreviewProps } from './types';\n\nimport './style.scss';\n\nexport type FacebookLinkPreviewProps = FacebookPreviewProps & {\n\tcompactDescription?: boolean;\n};\n\nexport const FacebookLinkPreview: React.FC< FacebookLinkPreviewProps > = ( {\n\turl,\n\ttitle,\n\tdescription,\n\timage,\n\tuser,\n\tcustomText,\n\ttype,\n\timageMode,\n\tcompactDescription,\n} ) => {\n\tconst [ mode, isLoadingImage, imgProps ] = useImage( { mode: imageMode } );\n\tconst isArticle = type === TYPE_ARTICLE;\n\tconst portraitMode = ( isArticle && ! image ) || mode === PORTRAIT_MODE;\n\tconst modeClass = `is-${ portraitMode ? 'portrait' : 'landscape' }`;\n\n\treturn (\n\t\t<div className=\"facebook-preview__post\">\n\t\t\t<FacebookPostHeader user={ user } />\n\t\t\t<div className=\"facebook-preview__content\">\n\t\t\t\t{ customText && <CustomText text={ customText } url={ url } /> }\n\t\t\t\t<div\n\t\t\t\t\tclassName={ `facebook-preview__body ${ modeClass } ${\n\t\t\t\t\t\timage && isLoadingImage ? 'is-loading' : ''\n\t\t\t\t\t}` }\n\t\t\t\t>\n\t\t\t\t\t{ ( image || isArticle ) && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={ `facebook-preview__image ${ image ? '' : 'is-empty' } ${ modeClass }` }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ /* eslint-disable jsx-a11y/alt-text */ }\n\t\t\t\t\t\t\t{ image && <img src={ image } { ...imgProps } /> }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) }\n\t\t\t\t\t<div className=\"facebook-preview__text\">\n\t\t\t\t\t\t<div className=\"facebook-preview__text-wrapper\">\n\t\t\t\t\t\t\t<div className=\"facebook-preview__url\">{ baseDomain( url ) }</div>\n\t\t\t\t\t\t\t<div className=\"facebook-preview__title\">\n\t\t\t\t\t\t\t\t{ facebookTitle( title ) || baseDomain( url ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={ `facebook-preview__description ${\n\t\t\t\t\t\t\t\t\tcompactDescription ? 'is-compact' : ''\n\t\t\t\t\t\t\t\t}` }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ description && facebookDescription( description ) }\n\t\t\t\t\t\t\t\t{ isArticle &&\n\t\t\t\t\t\t\t\t\t! description &&\n\t\t\t\t\t\t\t\t\t// translators: Default description for a Facebook post\n\t\t\t\t\t\t\t\t\t__( 'Visit the post for more.', 'social-previews' ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"facebook-preview__info\">\n\t\t\t\t\t\t\t\t<FacebookPostIcon name=\"info\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<FacebookPostActions />\n\t\t</div>\n\t);\n};\n","export const AUTO_SHARED_SOCIAL_POST_PREVIEW = 'AUTO_SHARED_SOCIAL_POST_PREVIEW';\nexport const AUTO_SHARED_LINK_PREVIEW = 'AUTO_SHARED_LINK_PREVIEW';\nexport const DEFAULT_LINK_PREVIEW = 'DEFAULT_LINK_PREVIEW';\n\nexport const TYPE_WEBSITE = 'website';\nexport const TYPE_ARTICLE = 'article';\n\nexport const LANDSCAPE_MODE = 'landscape';\nexport const PORTRAIT_MODE = 'portrait';\n","import { firstValid, hardTruncation, shortEnough, stripHtmlTags, Formatter } from '../helpers';\n\nconst TITLE_LENGTH = 110;\nconst DESCRIPTION_LENGTH = 200;\nexport const CUSTOM_TEXT_LENGTH = 440;\n\nexport const facebookTitle: Formatter = text =>\n\tfirstValid(\n\t\tshortEnough( TITLE_LENGTH ),\n\t\thardTruncation( TITLE_LENGTH )\n\t)( stripHtmlTags( text ) ) || '';\n\nexport const facebookDescription: Formatter = text =>\n\tfirstValid(\n\t\tshortEnough( DESCRIPTION_LENGTH ),\n\t\thardTruncation( DESCRIPTION_LENGTH )\n\t)( stripHtmlTags( text ) ) || '';\n","import { hasTag, preparePreviewText } from '../helpers';\nimport { CUSTOM_TEXT_LENGTH } from './helpers';\n\ntype Props = {\n\ttext: string;\n\turl: string;\n\tforceUrlDisplay?: boolean;\n};\n\nconst CustomText: React.FC< Props > = ( { text, url, forceUrlDisplay } ) => {\n\tlet postLink;\n\n\tif ( forceUrlDisplay || hasTag( text, 'a' ) ) {\n\t\tpostLink = (\n\t\t\t<a\n\t\t\t\tclassName=\"facebook-preview__custom-text-post-url\"\n\t\t\t\thref={ url }\n\t\t\t\trel=\"nofollow noopener noreferrer\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t>\n\t\t\t\t{ url }\n\t\t\t</a>\n\t\t);\n\t}\n\n\treturn (\n\t\t<p className=\"facebook-preview__custom-text\">\n\t\t\t<span>\n\t\t\t\t{ preparePreviewText( text, {\n\t\t\t\t\tplatform: 'facebook',\n\t\t\t\t\tmaxChars: CUSTOM_TEXT_LENGTH,\n\t\t\t\t} ) }\n\t\t\t</span>\n\t\t\t{ postLink }\n\t\t</p>\n\t);\n};\n\nexport default CustomText;\n","import { __ } from '@wordpress/i18n';\nimport { useCallback, useState } from 'react';\nimport { LANDSCAPE_MODE, PORTRAIT_MODE } from '../../constants';\nimport type { ImageMode } from '../types';\n\ntype ImageEventHandler = ( event: React.SyntheticEvent< HTMLImageElement > ) => void;\ntype ImgProps = {\n\talt: string;\n\tonLoad: ImageEventHandler;\n\tonError: ImageEventHandler;\n};\ntype UseImage = ( arg0: { mode?: ImageMode } ) => [ ImageMode | undefined, boolean, ImgProps ];\n\nconst useImage: UseImage = ( { mode: initialMode } ) => {\n\tconst [ mode, setMode ] = useState< ImageMode | undefined >( initialMode );\n\tconst [ isLoadingImage, setLoadingImage ] = useState< boolean >( true );\n\n\tconst onLoad = useCallback< ImageEventHandler >(\n\t\t( { target } ) => {\n\t\t\tif ( ! mode ) {\n\t\t\t\tconst image = target as HTMLImageElement;\n\t\t\t\tsetMode( image.naturalWidth > image.naturalHeight ? LANDSCAPE_MODE : PORTRAIT_MODE );\n\t\t\t}\n\t\t\tsetLoadingImage( false );\n\t\t},\n\t\t[ mode ]\n\t);\n\tconst onError = useCallback( () => setLoadingImage( false ), [] );\n\n\treturn [\n\t\tmode,\n\t\tisLoadingImage,\n\t\t{\n\t\t\talt: __( 'Facebook Preview Thumbnail', 'social-previews' ),\n\t\t\tonLoad,\n\t\t\tonError,\n\t\t},\n\t];\n};\n\nexport default useImage;\n","import { __ } from '@wordpress/i18n';\nimport FacebookPostIcon from '../icons';\n\nimport './styles.scss';\n\nconst FacebookPostActions: React.FC = () => (\n\t<ul className=\"facebook-preview__post-actions\">\n\t\t{ [\n\t\t\t{\n\t\t\t\ticon: 'like',\n\t\t\t\t// translators: Facebook \"Like\" action\n\t\t\t\tlabel: __( 'Like', 'social-previews' ),\n\t\t\t},\n\t\t\t{\n\t\t\t\ticon: 'comment',\n\t\t\t\t// translators: Facebook \"Comment\" action\n\t\t\t\tlabel: __( 'Comment', 'social-previews' ),\n\t\t\t},\n\t\t\t{\n\t\t\t\ticon: 'share',\n\t\t\t\t// translators: Facebook \"Share\" action\n\t\t\t\tlabel: __( 'Share', 'social-previews' ),\n\t\t\t},\n\t\t].map( ( { icon, label } ) => (\n\t\t\t<li key={ icon }>\n\t\t\t\t<FacebookPostIcon name={ icon } />\n\t\t\t\t<span>{ label }</span>\n\t\t\t</li>\n\t\t) ) }\n\t</ul>\n);\n\nexport default FacebookPostActions;\n","import './styles.scss';\n\nconst FacebookPostIcon: React.FC< { name: string } > = ( { name } ) => (\n\t<i className={ `facebook-preview__post-icon facebook-preview__post-icon-${ name }` } />\n);\n\nexport default FacebookPostIcon;\n","import { __, _x } from '@wordpress/i18n';\nimport { useCallback, useState } from 'react';\nimport FacebookPostIcon from '../icons';\nimport type { FacebookUser } from '../../types';\n\nimport './styles.scss';\n\nconst defaultAvatar =\n\t'data:image/png;base64,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';\n\ntype Props = {\n\tuser?: FacebookUser;\n\ttimeElapsed?: boolean;\n\thideOptions?: boolean;\n};\n\nconst FacebookPostHeader: React.FC< Props > = ( { user, timeElapsed, hideOptions } ) => {\n\tconst [ avatarSrc, setAvatarSrc ] = useState< string >( user?.avatarUrl || defaultAvatar );\n\tconst onImageError = useCallback( () => {\n\t\tif ( avatarSrc !== defaultAvatar ) {\n\t\t\tsetAvatarSrc( defaultAvatar );\n\t\t}\n\t}, [ avatarSrc ] );\n\n\treturn (\n\t\t<div className=\"facebook-preview__post-header\">\n\t\t\t<div className=\"facebook-preview__post-header-content\">\n\t\t\t\t<img\n\t\t\t\t\tclassName=\"facebook-preview__post-header-avatar\"\n\t\t\t\t\tsrc={ avatarSrc }\n\t\t\t\t\talt=\"\"\n\t\t\t\t\tonError={ onImageError }\n\t\t\t\t/>\n\t\t\t\t<div>\n\t\t\t\t\t<div className=\"facebook-preview__post-header-name\">\n\t\t\t\t\t\t{ user?.displayName ||\n\t\t\t\t\t\t\t// translators: name of a fictional Facebook User\n\t\t\t\t\t\t\t__( 'Anonymous User', 'social-previews' ) }\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"facebook-preview__post-header-share\">\n\t\t\t\t\t\t<span className=\"facebook-preview__post-header-time\">\n\t\t\t\t\t\t\t{ timeElapsed\n\t\t\t\t\t\t\t\t? __(\n\t\t\t\t\t\t\t\t\t\t// translators: short version of `1 hour`\n\t\t\t\t\t\t\t\t\t\t'1h',\n\t\t\t\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t\t: _x(\n\t\t\t\t\t\t\t\t\t\t// translators: temporal indication of when a post was published\n\t\t\t\t\t\t\t\t\t\t'Just now',\n\t\t\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t\t\t ) }\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"facebook-preview__post-header-dot\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t·\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<FacebookPostIcon name=\"public\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{ ! hideOptions && <div className=\"facebook-preview__post-header-more\"></div> }\n\t\t</div>\n\t);\n};\n\nexport default FacebookPostHeader;\n","import { PORTRAIT_MODE } from '../constants';\nimport CustomText from './custom-text';\nimport useImage from './hooks/use-image-hook';\nimport FacebookPostActions from './post/actions';\nimport FacebookPostHeader from './post/header';\nimport type { FacebookPreviewProps } from './types';\n\nexport const LinkPreviewDetails: React.FC< FacebookPreviewProps > = ( {\n\turl,\n\tcustomImage,\n\tuser,\n\tcustomText,\n\timageMode,\n} ) => {\n\tconst [ mode, isLoadingImage, imgProps ] = useImage( { mode: imageMode } );\n\tconst modeClass = `is-${ mode === PORTRAIT_MODE ? 'portrait' : 'landscape' }`;\n\n\treturn (\n\t\t<div className=\"facebook-preview__post\">\n\t\t\t<FacebookPostHeader user={ undefined } />\n\t\t\t<div className=\"facebook-preview__content\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={ `facebook-preview__window ${ modeClass } ${\n\t\t\t\t\t\tcustomImage && isLoadingImage ? 'is-loading' : ''\n\t\t\t\t\t}` }\n\t\t\t\t>\n\t\t\t\t\t<div className={ `facebook-preview__custom-image ${ modeClass }` }>\n\t\t\t\t\t\t{ /* eslint-disable jsx-a11y/alt-text */ }\n\t\t\t\t\t\t<img src={ customImage } { ...imgProps } />\n\t\t\t\t\t</div>\n\t\t\t\t\t<FacebookPostHeader user={ user } timeElapsed hideOptions />\n\t\t\t\t\t{ customText && <CustomText text={ customText } url={ url } forceUrlDisplay /> }\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<FacebookPostActions />\n\t\t</div>\n\t);\n};\n","import { PORTRAIT_MODE } from '../constants';\nimport CustomText from './custom-text';\nimport useImage from './hooks/use-image-hook';\nimport FacebookPostActions from './post/actions';\nimport FacebookPostHeader from './post/header';\nimport type { FacebookPreviewProps } from './types';\n\nimport './style.scss';\n\nexport const FacebookPostPreview: React.FC< FacebookPreviewProps > = ( {\n\turl,\n\tuser,\n\tcustomText,\n\tmedia,\n\timageMode,\n} ) => {\n\tconst [ mode ] = useImage( { mode: imageMode } );\n\tconst modeClass = `is-${ mode === PORTRAIT_MODE ? 'portrait' : 'landscape' }`;\n\n\treturn (\n\t\t<div className=\"facebook-preview__post\">\n\t\t\t<FacebookPostHeader user={ user } />\n\t\t\t<div className=\"facebook-preview__content\">\n\t\t\t\t{ customText && <CustomText text={ customText } url={ url } forceUrlDisplay /> }\n\t\t\t\t<div className=\"facebook-preview__body\">\n\t\t\t\t\t{ media ? (\n\t\t\t\t\t\t<div className={ `facebook-preview__media ${ modeClass }` }>\n\t\t\t\t\t\t\t{ media.map( ( mediaItem, index ) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={ `facebook-preview__media-item-${ index }` }\n\t\t\t\t\t\t\t\t\tclassName={ `facebook-preview__media-item ${ modeClass }` }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ mediaItem.type.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null }\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<FacebookPostActions />\n\t\t</div>\n\t);\n};\n","import './styles.scss';\n\nconst MastodonPostActions: React.FC = () => (\n\t<div className=\"mastodon-preview__post-actions\">\n\t\t<div>\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\theight=\"24\"\n\t\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\t\twidth=\"24\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path d=\"M760-200v-160q0-50-35-85t-85-35H273l144 144-57 56-240-240 240-240 57 56-144 144h367q83 0 141.5 58.5T840-360v160h-80Z\"></path>\n\t\t\t</svg>\n\t\t\t \n\t\t\t<span>{ 0 }</span>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\theight=\"24\"\n\t\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\t\twidth=\"24\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path d=\"M280-80 120-240l160-160 56 58-62 62h406v-160h80v240H274l62 62-56 58Zm-80-440v-240h486l-62-62 56-58 160 160-160 160-56-58 62-62H280v160h-80Z\"></path>\n\t\t\t</svg>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\theight=\"24\"\n\t\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\t\twidth=\"24\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path d=\"m354-287 126-76 126 77-33-144 111-96-146-13-58-136-58 135-146 13 111 97-33 143ZM233-120l65-281L80-590l288-25 112-265 112 265 288 25-218 189 65 281-247-149-247 149Zm247-350Z\"></path>\n\t\t\t</svg>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\theight=\"24\"\n\t\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\t\twidth=\"24\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path d=\"M200-120v-640q0-33 23.5-56.5T280-840h400q33 0 56.5 23.5T760-760v640L480-240 200-120Zm80-122 200-86 200 86v-518H280v518Zm0-518h400-400Z\"></path>\n\t\t\t</svg>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\theight=\"24\"\n\t\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\t\twidth=\"24\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path d=\"M240-400q-33 0-56.5-23.5T160-480q0-33 23.5-56.5T240-560q33 0 56.5 23.5T320-480q0 33-23.5 56.5T240-400Zm240 0q-33 0-56.5-23.5T400-480q0-33 23.5-56.5T480-560q33 0 56.5 23.5T560-480q0 33-23.5 56.5T480-400Zm240 0q-33 0-56.5-23.5T640-480q0-33 23.5-56.5T720-560q33 0 56.5 23.5T800-480q0 33-23.5 56.5T720-400Z\"></path>\n\t\t\t</svg>\n\t\t</div>\n\t</div>\n);\n\nexport default MastodonPostActions;\n","export const DEFAULT_MASTODON_INSTANCE = 'mastodon.social';\n\nexport const DEFAULT_AVATAR =\n\t'data:image/png;base64,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';\n","import {\n\tfirstValid,\n\thardTruncation,\n\tshortEnough,\n\tstripHtmlTags,\n\tpreparePreviewText,\n\tFormatter,\n} from '../helpers';\nimport { DEFAULT_MASTODON_INSTANCE } from './constants';\nimport { MastodonAddressDetails } from './types';\n\nconst TITLE_LENGTH = 200;\nconst BODY_LENGTH = 500;\nconst URL_LENGTH = 30;\n\nconst ADDRESS_PATTERN = /^@([^@]*)@([^@]*)$/i;\n\nexport const mastodonTitle: Formatter = text =>\n\tfirstValid(\n\t\tshortEnough( TITLE_LENGTH ),\n\t\thardTruncation( TITLE_LENGTH )\n\t)( stripHtmlTags( text ) ) || '';\n\nexport const mastodonBody = ( text: string, options: { offset: number; instance: string } ) => {\n\tconst { instance, offset } = options;\n\n\treturn preparePreviewText( text, {\n\t\tplatform: 'mastodon',\n\t\tmaxChars: BODY_LENGTH - URL_LENGTH - offset,\n\t\thashtagDomain: instance,\n\t} );\n};\n\nexport const mastodonUrl: Formatter = text =>\n\tfirstValid( shortEnough( URL_LENGTH ), hardTruncation( URL_LENGTH ) )( stripHtmlTags( text ) ) ||\n\t'';\n\nexport const getMastodonAddressDetails = ( address: string ): MastodonAddressDetails => {\n\tconst matches = address.match( ADDRESS_PATTERN );\n\n\treturn {\n\t\tusername: matches?.[ 1 ] || '',\n\t\tinstance: matches?.[ 2 ] || DEFAULT_MASTODON_INSTANCE,\n\t};\n};\n","import { stripHtmlTags } from '../../../helpers';\nimport { getMastodonAddressDetails, mastodonBody, mastodonUrl } from '../../helpers';\nimport type { MastodonPreviewProps } from '../../types';\n\nimport './styles.scss';\n\ntype Props = MastodonPreviewProps & { children?: React.ReactNode };\n\nconst MastonPostBody: React.FC< Props > = props => {\n\tconst { title, description, customText, url, user, children } = props;\n\tconst instance = user?.address ? getMastodonAddressDetails( user.address ).instance : '';\n\tconst options = {\n\t\tinstance,\n\t\toffset: 0,\n\t};\n\n\tlet bodyTxt;\n\n\tif ( customText ) {\n\t\tbodyTxt = <p>{ mastodonBody( customText, options ) }</p>;\n\t} else if ( description ) {\n\t\tif ( title ) {\n\t\t\tconst renderedTitle = stripHtmlTags( title );\n\n\t\t\toptions.offset = renderedTitle.length;\n\n\t\t\tbodyTxt = (\n\t\t\t\t<>\n\t\t\t\t\t<p>{ renderedTitle }</p>\n\t\t\t\t\t<p>{ mastodonBody( description, options ) }</p>\n\t\t\t\t</>\n\t\t\t);\n\t\t} else {\n\t\t\tbodyTxt = <p>{ mastodonBody( description, options ) }</p>;\n\t\t}\n\t} else {\n\t\tbodyTxt = <p>{ mastodonBody( title, options ) }</p>;\n\t}\n\n\treturn (\n\t\t<div className=\"mastodon-preview__body\">\n\t\t\t{ bodyTxt }\n\t\t\t<a href={ url } target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t{ mastodonUrl( url.replace( /^https?:\\/\\//, '' ) ) }\n\t\t\t</a>\n\t\t\t{ children }\n\t\t</div>\n\t);\n};\n\nexport default MastonPostBody;\n","import { __ } from '@wordpress/i18n';\nimport clsx from 'clsx';\nimport { baseDomain, getTitleFromDescription, stripHtmlTags } from '../../../helpers';\nimport { mastodonTitle } from '../../helpers';\nimport { MastodonPreviewProps } from '../../types';\n\nimport './styles.scss';\n\nconst MastodonPostCard: React.FC< MastodonPreviewProps > = ( {\n\tsiteName,\n\ttitle,\n\tdescription,\n\turl,\n\timage,\n\tcustomImage,\n} ) => {\n\treturn (\n\t\t<div className={ clsx( 'mastodon-preview__card', { 'has-image': image } ) }>\n\t\t\t<div className=\"mastodon-preview__card-img\">\n\t\t\t\t{ image || customImage ? (\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={ image || customImage }\n\t\t\t\t\t\talt={ __( 'Mastodon preview thumbnail', 'social-previews' ) }\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"mastodon-preview__card-img--fallback\">\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\theight=\"24\"\n\t\t\t\t\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\t\t\t\t\twidth=\"24\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M320-240h320v-80H320v80Zm0-160h320v-80H320v80ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520h200L520-800v200Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t) }\n\t\t\t</div>\n\t\t\t<div className=\"mastodon-preview__card-text\">\n\t\t\t\t<span className=\"mastodon-preview__card-site\">{ siteName || baseDomain( url ) }</span>\n\t\t\t\t<span className=\"mastodon-preview__card-title\">\n\t\t\t\t\t{ mastodonTitle( title ) || getTitleFromDescription( description ) }\n\t\t\t\t</span>\n\t\t\t\t<span className=\"mastodon-preview__card-description\">{ stripHtmlTags( description ) }</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default MastodonPostCard;\n","import { __ } from '@wordpress/i18n';\nimport { formatMastodonDate } from '../../../helpers';\nimport { DEFAULT_AVATAR, DEFAULT_MASTODON_INSTANCE } from '../../constants';\nimport { GlobeIcon } from '../icons';\nimport type { MastodonPreviewProps } from '../../types';\n\nimport './styles.scss';\n\ntype Props = Pick< MastodonPreviewProps, 'user' >;\n\nconst MastodonPostHeader: React.FC< Props > = ( { user } ) => {\n\tconst { displayName, address, avatarUrl } = user || {};\n\n\treturn (\n\t\t<div className=\"mastodon-preview__post-header\">\n\t\t\t<div className=\"mastodon-preview__post-header-user\">\n\t\t\t\t<img className=\"mastodon-preview__post-avatar\" src={ avatarUrl || DEFAULT_AVATAR } alt=\"\" />\n\t\t\t\t<div>\n\t\t\t\t\t<div className=\"mastodon-preview__post-header-displayname\">\n\t\t\t\t\t\t{ displayName ||\n\t\t\t\t\t\t\t// translators: username of a fictional Mastodon User\n\t\t\t\t\t\t\t__( 'anonymous-user', 'social-previews' ) }\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"mastodon-preview__post-header-username\">\n\t\t\t\t\t\t{ address?.replace( `@${ DEFAULT_MASTODON_INSTANCE }`, '' ) || '@username' }\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"mastodon-preview__post-header-audience\">\n\t\t\t\t<GlobeIcon />\n\t\t\t\t{ formatMastodonDate( new Date() ) }\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default MastodonPostHeader;\n","/**\n * Globe Icon Component\n *\n * @return The Globe SVG icon component.\n */\nexport function GlobeIcon() {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\theight=\"15\"\n\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\twidth=\"15\"\n\t\t\trole=\"img\"\n\t\t>\n\t\t\t<path d=\"M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm-40-82v-78q-33 0-56.5-23.5T360-320v-40L168-552q-3 18-5.5 36t-2.5 36q0 121 79.5 212T440-162Zm276-102q20-22 36-47.5t26.5-53q10.5-27.5 16-56.5t5.5-59q0-98-54.5-179T600-776v16q0 33-23.5 56.5T520-680h-80v80q0 17-11.5 28.5T400-560h-80v80h240q17 0 28.5 11.5T600-440v120h40q26 0 47 15.5t29 40.5Z\"></path>\n\t\t</svg>\n\t);\n}\n","import MastodonPostActions from './post/actions';\nimport MastonPostBody from './post/body';\nimport MastodonPostCard from './post/card';\nimport MastodonPostHeader from './post/header';\nimport type { MastodonPreviewProps } from './types';\n\nimport './styles.scss';\n\nexport const MastodonLinkPreview: React.FC< MastodonPreviewProps > = props => {\n\tconst { user } = props;\n\n\treturn (\n\t\t<div className=\"mastodon-preview__post\">\n\t\t\t<MastodonPostHeader user={ user } />\n\t\t\t<MastonPostBody { ...props } />\n\t\t\t<MastodonPostCard { ...props } customImage=\"\" />\n\t\t\t<MastodonPostActions />\n\t\t</div>\n\t);\n};\n","import clsx from 'clsx';\nimport MastodonPostActions from './post/actions';\nimport MastonPostBody from './post/body';\nimport MastodonPostCard from './post/card';\nimport MastodonPostHeader from './post/header';\nimport type { MastodonPreviewProps } from './types';\n\nimport './styles.scss';\n\nexport const MastodonPostPreview: React.FC< MastodonPreviewProps > = props => {\n\tconst { user, media } = props;\n\n\treturn (\n\t\t<div className=\"mastodon-preview__post\">\n\t\t\t<MastodonPostHeader user={ user } />\n\t\t\t<MastonPostBody { ...props }>\n\t\t\t\t{ media?.length ? (\n\t\t\t\t\t<div className={ clsx( 'mastodon-preview__media', { 'as-grid': media.length > 1 } ) }>\n\t\t\t\t\t\t{ media.map( ( mediaItem, index ) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={ `mastodon-preview__media-item-${ index }` }\n\t\t\t\t\t\t\t\tclassName=\"mastodon-preview__media-item\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ mediaItem.type.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) ) }\n\t\t\t\t\t</div>\n\t\t\t\t) : null }\n\t\t\t</MastonPostBody>\n\t\t\t{ ! media?.length ? <MastodonPostCard { ...props } /> : null }\n\t\t\t<MastodonPostActions />\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { SectionHeading } from '../shared/section-heading';\nimport { SocialPreviewsBaseProps } from '../types';\nimport { MastodonLinkPreview } from './link-preview';\nimport { MastodonPostPreview } from './post-preview';\nimport { MastodonPreviewProps } from './types';\n\nexport type MastodonPreviewsProps = MastodonPreviewProps & SocialPreviewsBaseProps;\n\nexport const MastodonPreviews: React.FC< MastodonPreviewsProps > = ( {\n\theadingLevel,\n\thidePostPreview,\n\thideLinkPreview,\n\t...props\n} ) => {\n\treturn (\n\t\t<div className=\"social-preview mastodon-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section mastodon-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Mastodon\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on Mastodon:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<MastodonPostPreview { ...props } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section mastodon-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a Mastodon post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on Mastodon.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<MastodonLinkPreview { ...props } user={ undefined } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport clsx from 'clsx';\nimport {\n\tbaseDomain,\n\tformatNextdoorDate,\n\tgetTitleFromDescription,\n\tpreparePreviewText,\n} from '../helpers';\nimport { FEED_TEXT_MAX_LENGTH } from './constants';\nimport { FooterActions } from './footer-actions';\nimport { ChevronIcon } from './icons/chevron-icon';\nimport { DefaultAvatar } from './icons/default-avatar';\nimport { DefaultImage } from './icons/default-image';\nimport { GlobeIcon } from './icons/globe-icon';\nimport { NextdoorPreviewProps } from './types';\n\nimport './style.scss';\n\n/**\n * Nextdoor Post Preview Component.\n *\n * @param {NextdoorPreviewProps} props - The preview properties.\n * @return The Nextdoor post preview component.\n */\nexport function NextdoorPostPreview( {\n\timage,\n\tname,\n\tprofileImage,\n\tdescription,\n\tneighborhood,\n\tmedia,\n\ttitle,\n\turl,\n}: NextdoorPreviewProps ) {\n\tconst hasMedia = !! media?.length;\n\n\treturn (\n\t\t<div className=\"nextdoor-preview__wrapper\">\n\t\t\t<section className={ `nextdoor-preview__container ${ hasMedia ? 'has-media' : '' }` }>\n\t\t\t\t<div className=\"nextdoor-preview__content\">\n\t\t\t\t\t<div className=\"nextdoor-preview__header\">\n\t\t\t\t\t\t<div className=\"nextdoor-preview__header--avatar\">\n\t\t\t\t\t\t\t{ profileImage ? <img src={ profileImage } alt=\"\" /> : <DefaultAvatar /> }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"nextdoor-preview__header--details\">\n\t\t\t\t\t\t\t<div className=\"nextdoor-preview__header--name\">\n\t\t\t\t\t\t\t\t{ name || __( 'Account Name', 'social-previews' ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"nextdoor-preview__header--meta\">\n\t\t\t\t\t\t\t\t<span>{ neighborhood || __( 'Neighborhood', 'social-previews' ) }</span>\n\t\t\t\t\t\t\t\t<span>•</span>\n\t\t\t\t\t\t\t\t<span>{ formatNextdoorDate( Date.now() ) }</span>\n\t\t\t\t\t\t\t\t<span>•</span>\n\t\t\t\t\t\t\t\t{ /* This is the Globe SVG that represents visibility to be \"public\" */ }\n\t\t\t\t\t\t\t\t<GlobeIcon />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"nextdoor-preview__body\">\n\t\t\t\t\t\t{ description ? (\n\t\t\t\t\t\t\t<div className=\"nextdoor-preview__caption\">\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t{ preparePreviewText( description, {\n\t\t\t\t\t\t\t\t\t\tplatform: 'nextdoor',\n\t\t\t\t\t\t\t\t\t\tmaxChars: FEED_TEXT_MAX_LENGTH,\n\t\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{ ! hasMedia && url && (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t<a href={ url } rel=\"nofollow noopener noreferrer\" target=\"_blank\">\n\t\t\t\t\t\t\t\t\t\t\t{ url }\n\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t{ hasMedia ? (\n\t\t\t\t\t\t\t<div className=\"nextdoor-preview__media\">\n\t\t\t\t\t\t\t\t{ media.map( ( mediaItem, index ) => {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={ `nextdoor-preview__media-item-${ index }` }\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"nextdoor-preview__media-item\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ mediaItem?.type?.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null }\n\n\t\t\t\t\t\t<article\n\t\t\t\t\t\t\tclassName={ clsx( 'nextdoor-preview__card', {\n\t\t\t\t\t\t\t\t'small-preview': ! image || hasMedia,\n\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ image ? (\n\t\t\t\t\t\t\t\t<img className=\"nextdoor-preview__image\" src={ image } alt=\"\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<DefaultImage />\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t{ url ? (\n\t\t\t\t\t\t\t\t<div className=\"nextdoor-preview__description\">\n\t\t\t\t\t\t\t\t\t<h2 className=\"nextdoor-preview__description--title\">\n\t\t\t\t\t\t\t\t\t\t{ title || getTitleFromDescription( description ) }\n\t\t\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t\t\t<span className=\"nextdoor-preview__description--url\">{ baseDomain( url ) }</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t\t{ hasMedia ? (\n\t\t\t\t\t\t\t\t<div className=\"nextdoor-preview__card--chevron-wrapper\">\n\t\t\t\t\t\t\t\t\t<ChevronIcon />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t</article>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"nextdoor-preview__footer\">\n\t\t\t\t\t\t<FooterActions />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</div>\n\t);\n}\n","export const FEED_TEXT_MAX_LENGTH = 500;\n","import { __ } from '@wordpress/i18n';\nimport { CommentIcon } from './icons/comment-icon';\nimport { LikeIcon } from './icons/like-icon';\nimport { ShareIcon } from './icons/share-icon';\n\n/**\n * Footer Actions Component\n *\n * @return The Nextdoor footer actions component.\n */\nexport function FooterActions() {\n\treturn (\n\t\t<div className=\"nextdoor-preview__footer--actions\">\n\t\t\t<div className=\"nextdoor-preview__footer--actions-item\">\n\t\t\t\t<LikeIcon />\n\t\t\t\t<span>{ __( 'Like', 'social-previews' ) }</span>\n\t\t\t</div>\n\t\t\t<div className=\"nextdoor-preview__footer--actions-item\">\n\t\t\t\t<CommentIcon />\n\t\t\t\t<span>{ __( 'Comment', 'social-previews' ) }</span>\n\t\t\t</div>\n\t\t\t<div className=\"nextdoor-preview__footer--actions-item\">\n\t\t\t\t<ShareIcon />\n\t\t\t\t<span>{ __( 'Share', 'social-previews' ) }</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * Comment Icon Component\n *\n * @return The Comment SVG icon component.\n */\nexport function CommentIcon() {\n\treturn (\n\t\t<svg width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n\t\t\t<path\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M2 10.031C2 5.596 5.574 2 10 2h4c4.427 0 8 3.596 8 8.031 0 4.435-3.573 8.031-8 8.031h-1.52a17.033 17.033 0 0 1-1.377 1.467c-.991.938-2.456 2.079-4.086 2.437a1.403 1.403 0 0 1-1.458-.565 1.55 1.55 0 0 1-.195-1.394c.28-.823.395-1.734.434-2.464.014-.257.018-.485.018-.672A8.017 8.017 0 0 1 2 10.031Zm5.798 6.178a7.02 7.02 0 0 1 .016.418c.005.252.004.606-.019 1.023-.03.573-.103 1.285-.266 2.024.775-.377 1.54-.974 2.202-1.598a15.066 15.066 0 0 0 1.448-1.586l.017-.022.003-.004a1 1 0 0 1 .801-.402h2c3.314 0 6-2.692 6-6.03C20 6.691 17.314 4 14 4h-4c-3.314 0-6 2.692-6 6.031 0 2.336 1.32 4.36 3.258 5.359.308.159.515.474.54.82Z\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t></path>\n\t\t</svg>\n\t);\n}\n","/**\n * Like Icon component.\n *\n * @return Like Icon component.\n */\nexport function LikeIcon() {\n\treturn (\n\t\t<svg width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n\t\t\t<path\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M13.275 8.752a1.5 1.5 0 0 1-2.55 0C9.75 7.18 8.719 5.617 6.565 6.074 5.248 6.352 4 7.433 4 9.644c0 2.153 1.348 4.592 4.259 7.236A28.475 28.475 0 0 0 12 19.74a28.475 28.475 0 0 0 3.741-2.86C18.651 14.236 20 11.797 20 9.643c0-2.21-1.25-3.29-2.564-3.57-2.155-.456-3.187 1.106-4.16 2.68Zm-2.581-3.48C7.634 2.58 2 4.217 2 9.643c0 2.996 1.85 5.934 4.914 8.717 1.478 1.343 3.1 2.585 4.839 3.575a.5.5 0 0 0 .494 0c1.739-.99 3.361-2.232 4.84-3.575C20.148 15.577 22 12.64 22 9.643c0-5.426-5.634-7.062-8.694-4.371A5.287 5.287 0 0 0 12 7.04a5.287 5.287 0 0 0-1.306-1.77Z\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t></path>\n\t\t</svg>\n\t);\n}\n","/**\n * Share Icon Component\n *\n * @return The Share SVG icon component.\n */\nexport function ShareIcon() {\n\treturn (\n\t\t<svg width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n\t\t\t<path\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M11.617 2.076a1 1 0 0 1 1.09.217l9 9a1 1 0 0 1 0 1.414l-9 9A1 1 0 0 1 11 21v-4.436c-2.849.366-5.261 2.271-6.384 4.837a1 1 0 0 1-1.856-.06C2.338 20.182 2 18.86 2 17.5a9.959 9.959 0 0 1 9-9.951V3a1 1 0 0 1 .617-.924ZM13 5.414V8.5a1 1 0 0 1-1 1c-4.448 0-8 3.552-8 8 0 .31.023.625.066.94C5.905 16.067 8.776 14.5 12 14.5a1 1 0 0 1 1 1v3.086L19.586 12 13 5.414Z\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t></path>\n\t\t</svg>\n\t);\n}\n","/**\n * Chevron Icon Component\n *\n * @return The Chevron SVG icon component.\n */\nexport function ChevronIcon() {\n\treturn (\n\t\t<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n\t\t\t<path\n\t\t\t\tfill=\"#dfe1e4\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M7.127 13.876a.732.732 0 1 0 1.035 1.035l4.75-4.749a.732.732 0 0 0 0-1.035L8.123 4.34A.732.732 0 0 0 7.09 5.375l4.27 4.27-4.232 4.23Z\"\n\t\t\t></path>\n\t\t</svg>\n\t);\n}\n","export const DefaultAvatar: React.FC = () => {\n\treturn <div className=\"nextdoor-preview__default-avatar\">A</div>;\n};\n","/**\n * Default Image Icon Component\n *\n * @return The Default Image SVG icon component.\n */\nexport function DefaultImage() {\n\treturn (\n\t\t<div className=\"nextdoor-preview__default-image\">\n\t\t\t<svg\n\t\t\t\twidth=\"24\"\n\t\t\t\theight=\"24\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tcolor=\"#055c00\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\td=\"M13.207 5.207c1.51-1.51 4.076-1.51 5.586 0 1.51 1.51 1.51 4.076 0 5.586l-2.1 2.1c-1.51 1.51-4.077 1.51-5.586 0a1 1 0 1 0-1.414 1.414c2.29 2.29 6.123 2.29 8.414 0l2.1-2.1c2.29-2.29 2.29-6.124 0-8.414s-6.124-2.29-8.414 0l-.7.7a1 1 0 0 0 1.414 1.414l.7-.7Z\"\n\t\t\t\t></path>\n\t\t\t\t<path\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\td=\"M7.307 11.107c1.51-1.51 4.076-1.51 5.586 0a1 1 0 0 0 1.414-1.414c-2.29-2.29-6.124-2.29-8.414 0l-2.1 2.1c-2.29 2.29-2.29 6.123 0 8.414 2.29 2.29 6.124 2.29 8.414 0l.7-.7a1 1 0 0 0-1.414-1.414l-.7.7c-1.51 1.51-4.076 1.51-5.586 0-1.51-1.51-1.51-4.076 0-5.586l2.1-2.1Z\"\n\t\t\t\t></path>\n\t\t\t</svg>\n\t\t</div>\n\t);\n}\n","/**\n * Globe Icon Component\n *\n * @return The Globe SVG icon component.\n */\nexport function GlobeIcon() {\n\treturn (\n\t\t<svg width=\"14\" height=\"14\" fill=\"none\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n\t\t\t<path\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm9.495-7.643c.286-.335.46-.357.505-.357.045 0 .219.022.505.357.282.33.581.868.852 1.619.464 1.283.79 3.034.872 5.024H9.771c.082-1.99.408-3.741.871-5.024.272-.751.571-1.289.854-1.62ZM7.77 11c.084-2.181.439-4.171.992-5.704.093-.255.192-.502.298-.738A8.009 8.009 0 0 0 4.062 11h3.707Zm-3.707 2h3.707c.084 2.181.439 4.171.992 5.704.093.255.192.502.298.738A8.009 8.009 0 0 1 4.062 13Zm15.876-2a8.009 8.009 0 0 0-4.997-6.442c.106.236.205.483.298.738.553 1.533.908 3.523.992 5.704h3.707Zm-3.707 2h3.707a8.009 8.009 0 0 1-4.997 6.442c.106-.236.205-.483.298-.738.553-1.533.908-3.523.992-5.704Zm-2.002 0c-.082 1.99-.408 3.741-.871 5.024-.272.751-.571 1.289-.854 1.62-.285.334-.46.356-.504.356-.045 0-.219-.022-.505-.357-.282-.33-.581-.868-.852-1.619-.464-1.283-.79-3.034-.872-5.024h4.458Z\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t></path>\n\t\t</svg>\n\t);\n}\n","import { getTitleFromDescription } from '../helpers';\nimport { NextdoorPostPreview } from './post-preview';\nimport { NextdoorPreviewProps } from './types';\n\ntype OptionalProps = Partial< Pick< NextdoorPreviewProps, 'name' | 'profileImage' > >;\n\nexport type NextdoorLinkPreviewProps = Omit< NextdoorPreviewProps, keyof OptionalProps > &\n\tOptionalProps;\n\n/**\n * Nextdoor Link Preview Component\n *\n * @param {NextdoorLinkPreviewProps} props - The props for the Nextdoor link preview.\n *\n * @return The Nextdoor link preview component.\n */\nexport function NextdoorLinkPreview( props: NextdoorLinkPreviewProps ) {\n\treturn (\n\t\t<NextdoorPostPreview\n\t\t\tname=\"\"\n\t\t\tprofileImage=\"\"\n\t\t\t{ ...props }\n\t\t\t// Override the props that are irrelevant to link preview\n\t\t\tdescription=\"\"\n\t\t\tmedia={ undefined }\n\t\t\ttitle={ props.title || getTitleFromDescription( props.description ) }\n\t\t/>\n\t);\n}\n","import { __ } from '@wordpress/i18n';\nimport SectionHeading from '../shared/section-heading';\nimport { NextdoorLinkPreview } from './link-preview';\nimport { NextdoorPostPreview } from './post-preview';\nimport type { NextdoorPreviewsProps } from './types';\n\nexport const NextdoorPreviews: React.FC< NextdoorPreviewsProps > = ( {\n\theadingLevel,\n\thideLinkPreview,\n\thidePostPreview,\n\t...props\n} ) => {\n\treturn (\n\t\t<div className=\"social-preview nextdoor-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section nextdoor-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Nextdoor\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on Nextdoor:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<NextdoorPostPreview { ...props } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section nextdoor-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a Nextdoor post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on Nextdoor.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<NextdoorLinkPreview { ...props } name=\"\" profileImage=\"\" />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","import clsx from 'clsx';\nimport BlueskyPostActions from './post/actions';\nimport BlueskyPostBody from './post/body';\nimport BlueskyPostCard from './post/card';\nimport BlueskyPostHeader from './post/header';\nimport { BlueskyPostSidebar } from './post/sidebar';\nimport type { BlueskyPreviewProps } from './types';\n\nimport './styles.scss';\n\nexport const BlueskyPostPreview: React.FC< BlueskyPreviewProps > = props => {\n\tconst { user, media, appendUrl } = props;\n\n\treturn (\n\t\t<div className=\"bluesky-preview__post\">\n\t\t\t<BlueskyPostSidebar user={ user } />\n\t\t\t<div>\n\t\t\t\t<BlueskyPostHeader user={ user } />\n\t\t\t\t<BlueskyPostBody { ...props } appendUrl={ appendUrl ?? Boolean( media?.length ) }>\n\t\t\t\t\t{ media?.length ? (\n\t\t\t\t\t\t<div className={ clsx( 'bluesky-preview__media', { 'as-grid': media.length > 1 } ) }>\n\t\t\t\t\t\t\t{ media.map( ( mediaItem, index ) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={ `bluesky-preview__media-item-${ index }` }\n\t\t\t\t\t\t\t\t\tclassName=\"bluesky-preview__media-item\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ mediaItem.type.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null }\n\t\t\t\t</BlueskyPostBody>\n\t\t\t\t{ ! media?.length ? <BlueskyPostCard { ...props } /> : null }\n\t\t\t\t<BlueskyPostActions />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import './styles.scss';\n\nconst BlueskyPostActions: React.FC = () => (\n\t<div className=\"bluesky-preview__post-actions\">\n\t\t<div>\n\t\t\t<svg\n\t\t\t\tfill=\"none\"\n\t\t\t\twidth=\"18\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\theight=\"18\"\n\t\t\t\tstyle={ { color: 'rgb(111, 134, 159)' } }\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\tfill=\"hsl(211, 20%, 53%)\"\n\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\t\td=\"M2.002 6a3 3 0 0 1 3-3h14a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H12.28l-4.762 2.858A1 1 0 0 1 6.002 21v-2h-1a3 3 0 0 1-3-3V6Zm3-1a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h2a1 1 0 0 1 1 1v1.234l3.486-2.092a1 1 0 0 1 .514-.142h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-14Z\"\n\t\t\t\t></path>\n\t\t\t</svg>\n\t\t\t<span>{ 0 }</span>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg\n\t\t\t\tfill=\"none\"\n\t\t\t\twidth=\"18\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\theight=\"18\"\n\t\t\t\tstyle={ { color: 'rgb(111, 134, 159)' } }\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\tfill=\"hsl(211, 20%, 53%)\"\n\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\t\td=\"M17.957 2.293a1 1 0 1 0-1.414 1.414L17.836 5H6a3 3 0 0 0-3 3v3a1 1 0 1 0 2 0V8a1 1 0 0 1 1-1h11.836l-1.293 1.293a1 1 0 0 0 1.414 1.414l2.47-2.47a1.75 1.75 0 0 0 0-2.474l-2.47-2.47ZM20 12a1 1 0 0 1 1 1v3a3 3 0 0 1-3 3H6.164l1.293 1.293a1 1 0 1 1-1.414 1.414l-2.47-2.47a1.75 1.75 0 0 1 0-2.474l2.47-2.47a1 1 0 0 1 1.414 1.414L6.164 17H18a1 1 0 0 0 1-1v-3a1 1 0 0 1 1-1Z\"\n\t\t\t\t></path>\n\t\t\t</svg>\n\t\t\t<span>{ 0 }</span>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg\n\t\t\t\tfill=\"none\"\n\t\t\t\twidth=\"18\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\theight=\"18\"\n\t\t\t\tstyle={ { color: 'rgb(111, 134, 159)' } }\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\tfill=\"hsl(211, 20%, 53%)\"\n\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\t\td=\"M16.734 5.091c-1.238-.276-2.708.047-4.022 1.38a1 1 0 0 1-1.424 0C9.974 5.137 8.504 4.814 7.266 5.09c-1.263.282-2.379 1.206-2.92 2.556C3.33 10.18 4.252 14.84 12 19.348c7.747-4.508 8.67-9.168 7.654-11.7-.541-1.351-1.657-2.275-2.92-2.557Zm4.777 1.812c1.604 4-.494 9.69-9.022 14.47a1 1 0 0 1-.978 0C2.983 16.592.885 10.902 2.49 6.902c.779-1.942 2.414-3.334 4.342-3.764 1.697-.378 3.552.003 5.169 1.286 1.617-1.283 3.472-1.664 5.17-1.286 1.927.43 3.562 1.822 4.34 3.764Z\"\n\t\t\t\t></path>\n\t\t\t</svg>\n\t\t\t<span>{ 0 }</span>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg fill=\"none\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" aria-hidden=\"true\">\n\t\t\t\t<path\n\t\t\t\t\tfill=\"hsl(211, 20%, 53%)\"\n\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\t\td=\"M2 12a2 2 0 1 1 4 0 2 2 0 0 1-4 0Zm16 0a2 2 0 1 1 4 0 2 2 0 0 1-4 0Zm-6-2a2 2 0 1 0 0 4 2 2 0 0 0 0-4Z\"\n\t\t\t\t></path>\n\t\t\t</svg>\n\t\t</div>\n\t</div>\n);\n\nexport default BlueskyPostActions;\n","import {\n\tfirstValid,\n\thardTruncation,\n\tshortEnough,\n\tstripHtmlTags,\n\tpreparePreviewText,\n\tFormatter,\n} from '../helpers';\n\nconst TITLE_LENGTH = 200;\nconst BODY_LENGTH = 300;\nconst URL_LENGTH = 40;\n\nexport const blueskyTitle: Formatter = text =>\n\tfirstValid(\n\t\tshortEnough( TITLE_LENGTH ),\n\t\thardTruncation( TITLE_LENGTH )\n\t)( stripHtmlTags( text ) ) || '';\n\nexport const blueskyBody = ( text: string, options: { offset?: number } = {} ) => {\n\tconst { offset = 0 } = options;\n\n\treturn preparePreviewText( text, {\n\t\tplatform: 'bluesky',\n\t\tmaxChars: BODY_LENGTH - URL_LENGTH - offset,\n\t} );\n};\n\nexport const blueskyUrl: Formatter = text =>\n\tfirstValid( shortEnough( URL_LENGTH ), hardTruncation( URL_LENGTH ) )( stripHtmlTags( text ) ) ||\n\t'';\n","import { blueskyBody, blueskyUrl } from '../../helpers';\nimport type { BlueskyPreviewProps } from '../../types';\n\nimport './styles.scss';\n\ntype Props = BlueskyPreviewProps & { children?: React.ReactNode };\n\nconst BlueskyPostBody: React.FC< Props > = ( { customText, url, children, appendUrl } ) => {\n\treturn (\n\t\t<div className=\"bluesky-preview__body\">\n\t\t\t{ customText ? (\n\t\t\t\t<>\n\t\t\t\t\t<div>{ blueskyBody( customText ) }</div>\n\t\t\t\t\t{ appendUrl && url ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t<a href={ url } target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t\t{ blueskyUrl( url.replace( /^https?:\\/\\//, '' ) ) }\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null }\n\t\t\t\t</>\n\t\t\t) : null }\n\t\t\t{ children }\n\t\t</div>\n\t);\n};\n\nexport default BlueskyPostBody;\n","import { baseDomain, getTitleFromDescription, stripHtmlTags } from '../../../helpers';\nimport { blueskyTitle } from '../../helpers';\nimport { BlueskyPreviewProps } from '../../types';\n\nimport './styles.scss';\n\nconst BlueskyPostCard: React.FC< BlueskyPreviewProps > = ( { title, description, url, image } ) => {\n\treturn (\n\t\t<div className=\"bluesky-preview__card\">\n\t\t\t{ image ? (\n\t\t\t\t<div className=\"bluesky-preview__card-image\">\n\t\t\t\t\t<img src={ image } alt=\"\" />\n\t\t\t\t</div>\n\t\t\t) : null }\n\t\t\t<div className=\"bluesky-preview__card-text\">\n\t\t\t\t<div className=\"bluesky-preview__card-site\">{ baseDomain( url ) }</div>\n\t\t\t\t<div className=\"bluesky-preview__card-title\">\n\t\t\t\t\t{ blueskyTitle( title ) || getTitleFromDescription( description ) }\n\t\t\t\t</div>\n\t\t\t\t<div className=\"bluesky-preview__card-description\">{ stripHtmlTags( description ) }</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default BlueskyPostCard;\n","import { __, _x } from '@wordpress/i18n';\nimport type { BlueskyPreviewProps } from '../../types';\n\nimport './styles.scss';\n\ntype Props = Pick< BlueskyPreviewProps, 'user' >;\n\nconst BlueskyPostHeader: React.FC< Props > = ( { user } ) => {\n\tconst { displayName, address } = user || {};\n\n\tlet handle = address || 'username.bsky.social';\n\t// Ensure that the handle starts with the '@' symbol.\n\tif ( ! handle.startsWith( '@' ) ) {\n\t\thandle = '@' + handle;\n\t}\n\n\treturn (\n\t\t<div className=\"bluesky-preview__post-header\">\n\t\t\t<div className=\"bluesky-preview__post-header-user\">\n\t\t\t\t<span className=\"bluesky-preview__post-header--displayname\">\n\t\t\t\t\t{ displayName || __( 'Account name', 'social-previews' ) }\n\t\t\t\t</span>\n\t\t\t\t<span className=\"bluesky-preview__post-header--username\">{ handle }</span>\n\t\t\t</div>\n\t\t\t<div className=\"bluesky-preview__post-header--separator\">·</div>\n\t\t\t<div className=\"bluesky-preview__post-header--date\">\n\t\t\t\t{ _x(\n\t\t\t\t\t'1h',\n\t\t\t\t\t'refers to the time since the post was published, e.g. \"1h\"',\n\t\t\t\t\t'social-previews'\n\t\t\t\t) }\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default BlueskyPostHeader;\n","import type { BlueskyPreviewProps } from '../../types';\n\nimport './styles.scss';\n\ntype Props = Pick< BlueskyPreviewProps, 'user' >;\n\nexport const BlueskyPostSidebar: React.FC< Props > = ( { user } ) => {\n\tconst { avatarUrl } = user || {};\n\n\treturn (\n\t\t<div className=\"bluesky-preview__post-sidebar\">\n\t\t\t<div className=\"bluesky-preview__post-sidebar-user\">\n\t\t\t\t{ avatarUrl ? (\n\t\t\t\t\t<img className=\"bluesky-preview__post-avatar\" src={ avatarUrl } alt=\"\" />\n\t\t\t\t) : (\n\t\t\t\t\t<svg\n\t\t\t\t\t\tclassName=\"bluesky-preview__post-avatar\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tstroke=\"none\"\n\t\t\t\t\t\trole=\"presentation\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<circle cx=\"12\" cy=\"12\" r=\"12\" fill=\"#0070ff\"></circle>\n\t\t\t\t\t\t<circle cx=\"12\" cy=\"9.5\" r=\"3.5\" fill=\"#fff\"></circle>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\t\tfill=\"#fff\"\n\t\t\t\t\t\t\td=\"M 12.058 22.784 C 9.422 22.784 7.007 21.836 5.137 20.262 C 5.667 17.988 8.534 16.25 11.99 16.25 C 15.494 16.25 18.391 18.036 18.864 20.357 C 17.01 21.874 14.64 22.784 12.058 22.784 Z\"\n\t\t\t\t\t\t></path>\n\t\t\t\t\t</svg>\n\t\t\t\t) }\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { BlueskyPostPreview } from './post-preview';\nimport type { BlueskyPreviewProps } from './types';\n\nexport const BlueskyLinkPreview: React.FC< BlueskyPreviewProps > = props => {\n\treturn <BlueskyPostPreview { ...props } user={ undefined } media={ undefined } customText=\"\" />;\n};\n","import { __ } from '@wordpress/i18n';\nimport { SectionHeading } from '../shared/section-heading';\nimport { SocialPreviewsBaseProps } from '../types';\nimport { BlueskyLinkPreview } from './link-preview';\nimport { BlueskyPostPreview } from './post-preview';\nimport { BlueskyPreviewProps } from './types';\n\nexport type BlueskyPreviewsProps = BlueskyPreviewProps & SocialPreviewsBaseProps;\n\nexport const BlueskyPreviews: React.FC< BlueskyPreviewsProps > = ( {\n\theadingLevel,\n\thidePostPreview,\n\thideLinkPreview,\n\t...props\n} ) => {\n\treturn (\n\t\t<div className=\"social-preview bluesky-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section bluesky-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Bluesky\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on Bluesky:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<BlueskyPostPreview { ...props } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section bluesky-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a Bluesky post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on Bluesky.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<BlueskyLinkPreview { ...props } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","import clsx from 'clsx';\nimport { baseDomain } from '../helpers';\nimport { threadsTitle } from './helpers';\nimport { ThreadsCardProps } from './types';\n\nexport const Card: React.FC< ThreadsCardProps > = ( { image, title, url } ) => {\n\tconst cardClassNames = clsx( {\n\t\t'threads-preview__card-has-image': !! image,\n\t} );\n\n\treturn (\n\t\t<div className=\"threads-preview__card\">\n\t\t\t<div className={ cardClassNames }>\n\t\t\t\t{ image && <img className=\"threads-preview__card-image\" src={ image } alt=\"\" /> }\n\t\t\t\t<div className=\"threads-preview__card-body\">\n\t\t\t\t\t<div className=\"threads-preview__card-url\">{ baseDomain( url || '' ) }</div>\n\t\t\t\t\t<div className=\"threads-preview__card-title\">{ threadsTitle( title ) }</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { firstValid, hardTruncation, shortEnough, stripHtmlTags, Formatter } from '../helpers';\n\nconst TITLE_LENGTH = 120;\n\nexport const CAPTION_MAX_CHARS = 500;\n\nexport const threadsTitle: Formatter = text =>\n\tfirstValid(\n\t\tshortEnough( TITLE_LENGTH ),\n\t\thardTruncation( TITLE_LENGTH )\n\t)( stripHtmlTags( text ) ) || '';\n","export const Footer: React.FC = () => {\n\treturn (\n\t\t<div className=\"threads-preview__footer\">\n\t\t\t<span className=\"threads-preview__icon--like\">\n\t\t\t\t<svg role=\"img\" viewBox=\"0 0 18 18\">\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M1.34375 7.53125L1.34375 7.54043C1.34374 8.04211 1.34372 8.76295 1.6611 9.65585C1.9795 10.5516 2.60026 11.5779 3.77681 12.7544C5.59273 14.5704 7.58105 16.0215 8.33387 16.5497C8.73525 16.8313 9.26573 16.8313 9.66705 16.5496C10.4197 16.0213 12.4074 14.5703 14.2232 12.7544C15.3997 11.5779 16.0205 10.5516 16.3389 9.65585C16.6563 8.76296 16.6563 8.04211 16.6562 7.54043V7.53125C16.6562 5.23466 15.0849 3.25 12.6562 3.25C11.5214 3.25 10.6433 3.78244 9.99228 4.45476C9.59009 4.87012 9.26356 5.3491 9 5.81533C8.73645 5.3491 8.40991 4.87012 8.00772 4.45476C7.35672 3.78244 6.47861 3.25 5.34375 3.25C2.9151 3.25 1.34375 5.23466 1.34375 7.53125Z\"\n\t\t\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t\t\t></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"threads-preview__icon--reply\">\n\t\t\t\t<svg role=\"img\" viewBox=\"0 0 18 18\">\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M15.376 13.2177L16.2861 16.7955L12.7106 15.8848C12.6781 15.8848 12.6131 15.8848 12.5806 15.8848C11.3779 16.5678 9.94767 16.8931 8.41995 16.7955C4.94194 16.5353 2.08152 13.7381 1.72397 10.2578C1.2689 5.63919 5.13697 1.76863 9.75264 2.22399C13.2307 2.58177 16.0261 5.41151 16.2861 8.92429C16.4161 10.453 16.0586 11.8841 15.376 13.0876C15.376 13.1526 15.376 13.1852 15.376 13.2177Z\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t\t\t></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"threads-preview__icon--repost\">\n\t\t\t\t<svg role=\"img\" viewBox=\"0 0 18 18\">\n\t\t\t\t\t<path d=\"M6.41256 1.23531C6.6349 0.971277 7.02918 0.937481 7.29321 1.15982L9.96509 3.40982C10.1022 3.52528 10.1831 3.69404 10.1873 3.87324C10.1915 4.05243 10.1186 4.2248 9.98706 4.34656L7.31518 6.81971C7.06186 7.05419 6.66643 7.03892 6.43196 6.7856C6.19748 6.53228 6.21275 6.13685 6.46607 5.90237L7.9672 4.51289H5.20312C3.68434 4.51289 2.45312 5.74411 2.45312 7.26289V9.51289V11.7629C2.45312 13.2817 3.68434 14.5129 5.20312 14.5129C5.5483 14.5129 5.82812 14.7927 5.82812 15.1379C5.82812 15.4831 5.5483 15.7629 5.20312 15.7629C2.99399 15.7629 1.20312 13.972 1.20312 11.7629V9.51289V7.26289C1.20312 5.05375 2.99399 3.26289 5.20312 3.26289H7.85002L6.48804 2.11596C6.22401 1.89362 6.19021 1.49934 6.41256 1.23531Z\"></path>\n\t\t\t\t\t<path d=\"M11.5874 17.7904C11.3651 18.0545 10.9708 18.0883 10.7068 17.8659L8.03491 15.6159C7.89781 15.5005 7.81687 15.3317 7.81267 15.1525C7.80847 14.9733 7.8814 14.801 8.01294 14.6792L10.6848 12.206C10.9381 11.9716 11.3336 11.9868 11.568 12.2402C11.8025 12.4935 11.7872 12.8889 11.5339 13.1234L10.0328 14.5129H12.7969C14.3157 14.5129 15.5469 13.2816 15.5469 11.7629V9.51286V7.26286C15.5469 5.74408 14.3157 4.51286 12.7969 4.51286C12.4517 4.51286 12.1719 4.23304 12.1719 3.88786C12.1719 3.54269 12.4517 3.26286 12.7969 3.26286C15.006 3.26286 16.7969 5.05373 16.7969 7.26286V9.51286V11.7629C16.7969 13.972 15.006 15.7629 12.7969 15.7629H10.15L11.512 16.9098C11.776 17.1321 11.8098 17.5264 11.5874 17.7904Z\"></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"threads-preview__icon--share\">\n\t\t\t\t<svg role=\"img\" viewBox=\"0 0 18 18\">\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M15.6097 4.09082L6.65039 9.11104\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t\t\t></path>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M7.79128 14.439C8.00463 15.3275 8.11131 15.7718 8.33426 15.932C8.52764 16.071 8.77617 16.1081 9.00173 16.0318C9.26179 15.9438 9.49373 15.5501 9.95761 14.7628L15.5444 5.2809C15.8883 4.69727 16.0603 4.40546 16.0365 4.16566C16.0159 3.95653 15.9071 3.76612 15.7374 3.64215C15.5428 3.5 15.2041 3.5 14.5267 3.5H3.71404C2.81451 3.5 2.36474 3.5 2.15744 3.67754C1.97758 3.83158 1.88253 4.06254 1.90186 4.29856C1.92415 4.57059 2.24363 4.88716 2.88259 5.52032L6.11593 8.7243C6.26394 8.87097 6.33795 8.94431 6.39784 9.02755C6.451 9.10144 6.4958 9.18101 6.53142 9.26479C6.57153 9.35916 6.59586 9.46047 6.64451 9.66309L7.79128 14.439Z\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t\t\t></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { formatThreadsDate } from '../helpers';\nimport { HeaderProps } from './types';\n\nexport const Header: React.FC< HeaderProps > = ( { name, date } ) => {\n\tconst postDate = date || new Date();\n\n\treturn (\n\t\t<div className=\"threads-preview__header\">\n\t\t\t<span className=\"threads-preview__name\">\n\t\t\t\t{ name || __( 'Account Name', 'social-previews' ) }\n\t\t\t</span>\n\t\t\t<time className=\"threads-preview__date\" dateTime={ postDate.toISOString() }>\n\t\t\t\t{ formatThreadsDate( postDate ) }\n\t\t\t</time>\n\t\t</div>\n\t);\n};\n","import clsx from 'clsx';\nimport { Fragment } from 'react';\nimport { MediaProps } from './types';\n\nexport const Media: React.FC< MediaProps > = ( { media } ) => {\n\t// Ensure we're only trying to show valid media, and the correct quantity.\n\tconst filteredMedia = media\n\t\t// Only image/ and video/ mime types are supported.\n\t\t.filter(\n\t\t\tmediaItem => mediaItem.type.startsWith( 'image/' ) || mediaItem.type.startsWith( 'video/' )\n\t\t)\n\t\t.filter( ( mediaItem, idx, array ) => {\n\t\t\t// We'll always keep the first item.\n\t\t\tif ( 0 === idx ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// If the first item was a video or GIF, discard all subsequent items.\n\t\t\tif ( array[ 0 ].type.startsWith( 'video/' ) || 'image/gif' === array[ 0 ].type ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// The first item wasn't a video or GIF, so discard all subsequent videos and GIFs.\n\t\t\tif ( mediaItem.type.startsWith( 'video/' ) || 'image/gif' === mediaItem.type ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} )\n\t\t// We only want the first four items of the array, at most.\n\t\t.slice( 0, 4 );\n\n\tif ( 0 === filteredMedia.length ) {\n\t\treturn null;\n\t}\n\n\tconst isVideo = filteredMedia[ 0 ].type.startsWith( 'video/' );\n\n\tconst mediaClasses = clsx( [\n\t\t'threads-preview__media',\n\t\t'threads-preview__media-children-' + filteredMedia.length,\n\t] );\n\n\treturn (\n\t\t<div className={ mediaClasses }>\n\t\t\t{ filteredMedia.map( ( mediaItem, index ) => (\n\t\t\t\t<Fragment key={ `threads-preview__media-item-${ index }` }>\n\t\t\t\t\t{ isVideo ? (\n\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t</video>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t) }\n\t\t\t\t</Fragment>\n\t\t\t) ) }\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { DefaultAvatar } from './icons/default-avatar';\nimport { SidebarProps } from './types';\n\nexport const Sidebar: React.FC< SidebarProps > = ( { profileImage, showThreadConnector } ) => {\n\treturn (\n\t\t<div className=\"threads-preview__sidebar\">\n\t\t\t<div className=\"threads-preview__profile-image\">\n\t\t\t\t{ profileImage ? (\n\t\t\t\t\t<img alt={ __( 'Threads profile image', 'social-previews' ) } src={ profileImage } />\n\t\t\t\t) : (\n\t\t\t\t\t<DefaultAvatar />\n\t\t\t\t) }\n\t\t\t</div>\n\t\t\t{ showThreadConnector && <div className=\"threads-preview__connector\" /> }\n\t\t</div>\n\t);\n};\n","export const DefaultAvatar: React.FC = () => {\n\treturn (\n\t\t<svg\n\t\t\twidth=\"36\"\n\t\t\theight=\"36\"\n\t\t\tviewBox=\"0 0 6.3500001 6.3500001\"\n\t\t\tversion=\"1.1\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t>\n\t\t\t<g>\n\t\t\t\t<g>\n\t\t\t\t\t<circle\n\t\t\t\t\t\tfill=\"#fff\"\n\t\t\t\t\t\tfillOpacity=\"1\"\n\t\t\t\t\t\tstroke=\"#dbdbdb\"\n\t\t\t\t\t\tstrokeWidth=\"0.144331\"\n\t\t\t\t\t\tstrokeOpacity=\"1\"\n\t\t\t\t\t\tstrokeDasharray=\"none\"\n\t\t\t\t\t\tcx=\"3.175\"\n\t\t\t\t\t\tcy=\"3.175\"\n\t\t\t\t\t\tr=\"3.1028347\"\n\t\t\t\t\t/>\n\t\t\t\t\t<path\n\t\t\t\t\t\tfill=\"#dbdbdb\"\n\t\t\t\t\t\tfillOpacity=\"1\"\n\t\t\t\t\t\tstroke=\"#dbdbdb\"\n\t\t\t\t\t\tstrokeWidth=\"0.00924637\"\n\t\t\t\t\t\tstrokeOpacity=\"1\"\n\t\t\t\t\t\td=\"m 3.175,0.10128581 c -0.2931267,2e-6 -0.5848453,0.0419523 -0.866097,0.1245402 C 2.0276513,0.30840593 1.7596787,0.43063749 1.5130859,0.58911133 1.1424103,0.82733009 0.82733009,1.1424103 0.58911133,1.5130859 0.43063749,1.7596787 0.30840793,2.0276513 0.22582601,2.308903 0.14323609,2.5901547 0.10128781,2.8818733 0.10128581,3.175 c 5.02e-4,0.1391369 0.0101356,0.2782044 0.0294556,0.4159953 0.01723,0.1151309 0.0411535,0.2291443 0.0713135,0.3415812 0.0045,0.0218 0.009469,0.043412 0.0144694,0.065112 0.03449,0.1203489 0.076152,0.2387347 0.12505697,0.3539836 0.0045,0.01235 0.009253,0.0244 0.0139526,0.03669 0.05201,0.1191279 0.111111,0.235155 0.17776693,0.3467489 0.0038,0.0071 0.008066,0.013651 0.0118856,0.020671 0.0694099,0.1145998 0.14620121,0.2246049 0.22996012,0.3291788 0.0022,0.0029 0.004001,0.00589 0.006201,0.00879 0.0861099,0.1069859 0.17942183,0.208301 0.27905277,0.3028239 0.3233817,-0.5511754 0.8330913,-0.701365 1.065568,-0.697115 h 2.0629232 c 0.5904654,-0.0058 0.9954919,0.5335544 1.1032918,0.6945312 0.0993,-0.09444 0.1921923,-0.1954752 0.2780192,-0.3023071 0.0023,-0.0031 0.00442,-0.0062 0.00672,-0.0093 0.08334,-0.1042929 0.1598386,-0.2139114 0.2289266,-0.3281453 0.004,-0.0073 0.00841,-0.014891 0.012402,-0.022221 0.0663,-0.1112249 0.1254962,-0.2265057 0.1772502,-0.3451986 0.0048,-0.01266 0.00934,-0.025004 0.013953,-0.037724 0.04856,-0.1146958 0.090239,-0.2321796 0.1245402,-0.3519165 0.0053,-0.02288 0.010256,-0.046256 0.014986,-0.069246 0.02971,-0.1111369 0.05321,-0.2236822 0.07028,-0.3374471 0.01929,-0.1376588 0.028946,-0.2764746 0.029456,-0.4154785 0,-0.0503 -0.00112,-0.1006562 -0.00362,-0.1508952 -0.0049,-0.1004917 -0.014695,-0.20073 -0.029455,-0.3002469 C 6.2008813,2.6243448 6.1811701,2.5258685 6.1567301,2.4282756 6.1445102,2.3794856 6.1310225,2.330673 6.1164225,2.282548 6.0286626,1.9932503 5.8988742,1.7184607 5.7309163,1.4670939 5.6750164,1.383444 5.6149083,1.3030201 5.5510824,1.2252482 5.5191724,1.1863682 5.4861603,1.1477995 5.4523804,1.1105265 5.3848104,1.0359766 5.3140214,0.96518559 5.2394735,0.89761963 5.1276256,0.79624473 5.008419,0.70295057 4.8829061,0.61908366 4.7573922,0.53522374 4.6255915,0.46089717 4.4891317,0.39635824 c -0.09095,-0.04302 -0.1838061,-0.0813435 -0.278536,-0.11523845 -0.09473,-0.0339 -0.1912764,-0.0634 -0.2888713,-0.0878499 C 3.7752926,0.15658989 3.6265025,0.13054519 3.4762736,0.11575521 3.3761487,0.10585522 3.2756099,0.10128581 3.175,0.10128581 Z m 0,1.44125569 A 1.4106187,1.4106187 0 0 1 4.5857666,2.9533081 1.4106187,1.4106187 0 0 1 3.175,4.3635579 1.4106187,1.4106187 0 0 1 1.7642334,2.9533081 1.4106187,1.4106187 0 0 1 3.175,1.5425415 Z\"\n\t\t\t\t\t/>\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t</svg>\n\t);\n};\n","import { preparePreviewText } from '../helpers';\nimport { Card } from './card';\nimport { Footer } from './footer';\nimport { Header } from './header';\nimport { CAPTION_MAX_CHARS } from './helpers';\nimport { Media } from './media';\nimport { Sidebar } from './sidebar';\nimport { ThreadsPreviewProps } from './types';\n\nimport './style.scss';\n\nexport const ThreadsPostPreview: React.FC< ThreadsPreviewProps > = ( {\n\tcaption,\n\tdate,\n\timage,\n\tmedia,\n\tname,\n\tprofileImage,\n\tshowThreadConnector,\n\ttitle,\n\turl,\n} ) => {\n\tconst hasMedia = !! media?.length;\n\n\tconst displayAsCard = url && image && ! hasMedia;\n\n\treturn (\n\t\t<div className=\"threads-preview__wrapper\">\n\t\t\t<div className=\"threads-preview__container\">\n\t\t\t\t<Sidebar profileImage={ profileImage } showThreadConnector={ showThreadConnector } />\n\t\t\t\t<div className=\"threads-preview__main\">\n\t\t\t\t\t<Header name={ name } date={ date } />\n\t\t\t\t\t<div className=\"threads-preview__content\">\n\t\t\t\t\t\t{ caption ? (\n\t\t\t\t\t\t\t<div className=\"threads-preview__text\">\n\t\t\t\t\t\t\t\t{ preparePreviewText( caption, {\n\t\t\t\t\t\t\t\t\tplatform: 'threads',\n\t\t\t\t\t\t\t\t\tmaxChars: CAPTION_MAX_CHARS,\n\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t{ hasMedia ? <Media media={ media } /> : null }\n\t\t\t\t\t\t{ displayAsCard ? <Card image={ image } title={ title || '' } url={ url } /> : null }\n\t\t\t\t\t</div>\n\t\t\t\t\t<Footer />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { ThreadsPostPreview } from './post-preview';\nimport { ThreadsPreviewProps } from './types';\n\nexport const ThreadsLinkPreview: React.FC< ThreadsPreviewProps > = props => {\n\treturn (\n\t\t<ThreadsPostPreview\n\t\t\t{ ...props }\n\t\t\t// Override the props that are irrelevant to link preview\n\t\t\tcaption=\"\"\n\t\t\tmedia={ undefined }\n\t\t/>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport SectionHeading from '../shared/section-heading';\nimport { ThreadsLinkPreview } from './link-preview';\nimport { ThreadsPostPreview } from './post-preview';\nimport type { ThreadsPreviewsProps } from './types';\n\nexport const ThreadsPreviews: React.FC< ThreadsPreviewsProps > = ( {\n\theadingLevel,\n\thideLinkPreview,\n\thidePostPreview,\n\tposts,\n} ) => {\n\tif ( ! posts?.length ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"social-preview threads-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section threads-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Threads\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on Threads:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t{ posts.map( ( post, index ) => {\n\t\t\t\t\t\tconst isLast = index + 1 === posts.length;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<ThreadsPostPreview\n\t\t\t\t\t\t\t\tkey={ `threads-preview__post-${ index }` }\n\t\t\t\t\t\t\t\t{ ...post }\n\t\t\t\t\t\t\t\tshowThreadConnector={ ! isLast }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview ? (\n\t\t\t\t<section className=\"social-preview__section threads-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a Threads post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t{ posts[ 0 ].image ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on Threads.',\n\t\t\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<ThreadsLinkPreview { ...posts[ 0 ] } name=\"\" profileImage=\"\" />\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t'Threads link preview requires an image to be set for the post. Please add an image to see the preview.',\n\t\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) }\n\t\t\t\t</section>\n\t\t\t) : null }\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { preparePreviewText } from '../helpers';\nimport { FEED_TEXT_MAX_LENGTH } from './constants';\nimport { Bookmark as BookmarkIcon } from './icons/bookmark';\nimport { Comment as CommentIcon } from './icons/comment';\nimport { DefaultAvatar } from './icons/default-avatar';\nimport { Heart as HeartIcon } from './icons/heart';\nimport { Menu as MenuIcon } from './icons/menu';\nimport { Share as ShareIcon } from './icons/share';\nimport { InstagramPreviewProps } from './types';\n\nimport './style.scss';\n\n/**\n * Instagram Post Preview Component\n *\n * @param {InstagramPreviewProps} props - The props for the Instagram post preview.\n *\n * @return The Instagram post preview component.\n */\nexport function InstagramPostPreview( {\n\timage,\n\tmedia,\n\tname,\n\tprofileImage,\n\tcaption,\n\turl,\n}: InstagramPreviewProps ) {\n\tconst username = name || 'username';\n\n\tconst mediaItem = media?.[ 0 ];\n\n\treturn (\n\t\t<div className=\"instagram-preview__wrapper\">\n\t\t\t<section className=\"instagram-preview__container\">\n\t\t\t\t<div className=\"instagram-preview__header\">\n\t\t\t\t\t<div className=\"instagram-preview__header--avatar\">\n\t\t\t\t\t\t{ profileImage ? <img src={ profileImage } alt=\"\" /> : <DefaultAvatar /> }\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"instagram-preview__header--profile\">\n\t\t\t\t\t\t<div className=\"instagram-preview__header--profile-name\">{ username }</div>\n\t\t\t\t\t\t<div className=\"instagram-preview__header--profile-menu\">\n\t\t\t\t\t\t\t<MenuIcon />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"instagram-preview__media\">\n\t\t\t\t\t{ mediaItem ? (\n\t\t\t\t\t\t<div className=\"instagram-preview__media-item\">\n\t\t\t\t\t\t\t{ mediaItem.type.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t<video controls={ false } className=\"instagram-preview__media--video\">\n\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<img className=\"instagram-preview__media--image\" src={ mediaItem.url } alt=\"\" />\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<img className=\"instagram-preview__media--image\" src={ image } alt=\"\" />\n\t\t\t\t\t) }\n\t\t\t\t</div>\n\t\t\t\t<div className=\"instagram-preview__content\">\n\t\t\t\t\t<section className=\"instagram-preview__content--actions\">\n\t\t\t\t\t\t<div className=\"instagram-preview__content--actions-primary\">\n\t\t\t\t\t\t\t<HeartIcon />\n\t\t\t\t\t\t\t<CommentIcon />\n\t\t\t\t\t\t\t<ShareIcon />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"instagram-preview__content--actions-secondary\">\n\t\t\t\t\t\t\t<BookmarkIcon />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</section>\n\t\t\t\t\t<div className=\"instagram-preview__content--body\">\n\t\t\t\t\t\t<div className=\"instagram-preview__content--name\">{ username }</div>\n\t\t\t\t\t\t \n\t\t\t\t\t\t{ caption ? (\n\t\t\t\t\t\t\t<div className=\"instagram-preview__content--text\">\n\t\t\t\t\t\t\t\t{ preparePreviewText( caption, {\n\t\t\t\t\t\t\t\t\tplatform: 'instagram',\n\t\t\t\t\t\t\t\t\tmaxChars: FEED_TEXT_MAX_LENGTH,\n\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t\t{ media && url && (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t{ url }\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null }\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"instagram-preview__content--footer\">\n\t\t\t\t\t\t<span>{ __( 'View one comment', 'social-previews' ) }</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</div>\n\t);\n}\n","export const FEED_TEXT_MAX_LENGTH = 520;\n","export const Bookmark: React.FC = () => {\n\treturn (\n\t\t<svg\n\t\t\tcolor=\"rgb(38, 38, 38)\"\n\t\t\tfill=\"rgb(38, 38, 38)\"\n\t\t\theight=\"24\"\n\t\t\trole=\"img\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\twidth=\"24\"\n\t\t>\n\t\t\t<polygon\n\t\t\t\tfill=\"none\"\n\t\t\t\tpoints=\"20 21 12 13.44 4 21 4 3 20 3 20 21\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t></polygon>\n\t\t</svg>\n\t);\n};\n","export const Comment: React.FC = () => {\n\treturn (\n\t\t<svg\n\t\t\tcolor=\"rgb(38, 38, 38)\"\n\t\t\tfill=\"rgb(38, 38, 38)\"\n\t\t\theight=\"24\"\n\t\t\trole=\"img\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\twidth=\"24\"\n\t\t>\n\t\t\t<path\n\t\t\t\td=\"M20.656 17.008a9.993 9.993 0 1 0-3.59 3.615L22 22Z\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t></path>\n\t\t</svg>\n\t);\n};\n","export const DefaultAvatar: React.FC = () => {\n\treturn (\n\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 340 340\" width=\"340\" height=\"340\">\n\t\t\t<path\n\t\t\t\tfill=\"#DDD\"\n\t\t\t\td=\"m169,.5a169,169 0 1,0 2,0zm0,86a76,76 0 1 1-2,0zM57,287q27-35 67-35h92q40,0 67,35a164,164 0 0,1-226,0\"\n\t\t\t/>\n\t\t</svg>\n\t);\n};\n","export const Heart: React.FC = () => {\n\treturn (\n\t\t<svg\n\t\t\tcolor=\"rgb(38, 38, 38)\"\n\t\t\tfill=\"rgb(38, 38, 38)\"\n\t\t\theight=\"24\"\n\t\t\trole=\"img\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\twidth=\"24\"\n\t\t>\n\t\t\t<path d=\"M16.792 3.904A4.989 4.989 0 0 1 21.5 9.122c0 3.072-2.652 4.959-5.197 7.222-2.512 2.243-3.865 3.469-4.303 3.752-.477-.309-2.143-1.823-4.303-3.752C5.141 14.072 2.5 12.167 2.5 9.122a4.989 4.989 0 0 1 4.708-5.218 4.21 4.21 0 0 1 3.675 1.941c.84 1.175.98 1.763 1.12 1.763s.278-.588 1.11-1.766a4.17 4.17 0 0 1 3.679-1.938m0-2a6.04 6.04 0 0 0-4.797 2.127 6.052 6.052 0 0 0-4.787-2.127A6.985 6.985 0 0 0 .5 9.122c0 3.61 2.55 5.827 5.015 7.97.283.246.569.494.853.747l1.027.918a44.998 44.998 0 0 0 3.518 3.018 2 2 0 0 0 2.174 0 45.263 45.263 0 0 0 3.626-3.115l.922-.824c.293-.26.59-.519.885-.774 2.334-2.025 4.98-4.32 4.98-7.94a6.985 6.985 0 0 0-6.708-7.218Z\"></path>\n\t\t</svg>\n\t);\n};\n","export const Menu: React.FC = () => {\n\treturn (\n\t\t<svg width=\"17\" height=\"5\" viewBox=\"0 0 17 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t<path\n\t\t\t\td=\"M2.11865 3.5C2.67094 3.5 3.11865 3.05228 3.11865 2.5C3.11865 1.94772 2.67094 1.5 2.11865 1.5C1.56637 1.5 1.11865 1.94772 1.11865 2.5C1.11865 3.05228 1.56637 3.5 2.11865 3.5Z\"\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"black\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M8.55933 3.5C9.11161 3.5 9.55933 3.05228 9.55933 2.5C9.55933 1.94772 9.11161 1.5 8.55933 1.5C8.00704 1.5 7.55933 1.94772 7.55933 2.5C7.55933 3.05228 8.00704 3.5 8.55933 3.5Z\"\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"black\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M15 3.5C15.5523 3.5 16 3.05228 16 2.5C16 1.94772 15.5523 1.5 15 1.5C14.4477 1.5 14 1.94772 14 2.5C14 3.05228 14.4477 3.5 15 3.5Z\"\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"black\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t/>\n\t\t</svg>\n\t);\n};\n","export const Share: React.FC = () => {\n\treturn (\n\t\t<svg\n\t\t\tcolor=\"rgb(38, 38, 38)\"\n\t\t\tfill=\"rgb(38, 38, 38)\"\n\t\t\theight=\"24\"\n\t\t\trole=\"img\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\twidth=\"24\"\n\t\t>\n\t\t\t<line\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\tx1=\"22\"\n\t\t\t\tx2=\"9.218\"\n\t\t\t\ty1=\"3\"\n\t\t\t\ty2=\"10.083\"\n\t\t\t></line>\n\t\t\t<polygon\n\t\t\t\tfill=\"none\"\n\t\t\t\tpoints=\"11.698 20.334 22 3.001 2 3.001 9.218 10.084 11.698 20.334\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t></polygon>\n\t\t</svg>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport SectionHeading from '../shared/section-heading';\nimport { InstagramPostPreview } from './post-preview';\nimport type { InstagramPreviewsProps } from './types';\n\nexport const InstagramPreviews: React.FC< InstagramPreviewsProps > = ( {\n\theadingLevel,\n\thidePostPreview,\n\t...props\n} ) => {\n\treturn (\n\t\t<div className=\"social-preview instagram-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section instagram-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Instagram\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what your social post will look like on Instagram:',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<InstagramPostPreview { ...props } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/jetpack/jetpack/projects/js-packages/social-previews/dist/index.js","../src/helpers.tsx","../src/google-search-preview/index.tsx","../src/twitter-preview/card.tsx","../src/twitter-preview/footer.tsx","../src/twitter-preview/header.tsx","../src/twitter-preview/media.tsx","../src/twitter-preview/quote-tweet.tsx","../src/avatar-with-fallback.tsx","../src/twitter-preview/sidebar.tsx","../src/twitter-preview/text.tsx","../src/twitter-preview/post-preview.tsx","../src/twitter-preview/link-preview.tsx","../src/twitter-preview/previews.tsx","../src/shared/section-heading/index.tsx","../src/linkedin-preview/post-preview.tsx","../src/linkedin-preview/constants.ts","../src/linkedin-preview/link-preview.tsx","../src/linkedin-preview/previews.tsx","../src/tumblr-preview/link-preview.tsx","../src/tumblr-preview/helpers.ts","../src/tumblr-preview/post/actions/index.tsx","../src/tumblr-preview/post/icons/index.tsx","../src/tumblr-preview/post/header/index.tsx","../src/tumblr-preview/post-preview.tsx","../src/tumblr-preview/previews.tsx","../src/facebook-preview/previews.tsx","../src/facebook-preview/link-preview.tsx","../src/constants.ts","../src/facebook-preview/helpers.ts","../src/facebook-preview/custom-text.tsx","../src/facebook-preview/hooks/use-image-hook.ts","../src/facebook-preview/post/actions/index.tsx","../src/facebook-preview/post/icons/index.tsx","../src/facebook-preview/post/header/index.tsx","../src/facebook-preview/link-preview-details.tsx","../src/facebook-preview/post-preview.tsx","../src/mastodon-preview/post/actions/index.tsx","../src/mastodon-preview/constants.ts","../src/mastodon-preview/helpers.ts","../src/mastodon-preview/post/body/index.tsx","../src/mastodon-preview/post/card/index.tsx","../src/mastodon-preview/post/header/index.tsx","../src/mastodon-preview/post/icons/index.tsx","../src/mastodon-preview/link-preview.tsx","../src/mastodon-preview/post-preview.tsx","../src/mastodon-preview/previews.tsx","../src/nextdoor-preview/post-preview.tsx","../src/nextdoor-preview/constants.ts","../src/nextdoor-preview/footer-actions.tsx","../src/nextdoor-preview/icons/comment-icon.tsx","../src/nextdoor-preview/icons/like-icon.tsx","../src/nextdoor-preview/icons/share-icon.tsx","../src/nextdoor-preview/icons/chevron-icon.tsx","../src/nextdoor-preview/icons/default-image.tsx","../src/nextdoor-preview/icons/globe-icon.tsx","../src/nextdoor-preview/link-preview.tsx","../src/nextdoor-preview/previews.tsx","../src/bluesky-preview/post-preview.tsx","../src/bluesky-preview/post/actions/index.tsx","../src/bluesky-preview/helpers.ts","../src/bluesky-preview/post/body/index.tsx","../src/bluesky-preview/post/card/index.tsx","../src/bluesky-preview/post/header/index.tsx","../src/bluesky-preview/post/sidebar/index.tsx","../src/bluesky-preview/link-preview.tsx","../src/bluesky-preview/previews.tsx","../src/threads-preview/card.tsx","../src/threads-preview/helpers.ts","../src/threads-preview/footer.tsx","../src/threads-preview/header.tsx","../src/threads-preview/media.tsx","../src/threads-preview/sidebar.tsx","../src/threads-preview/post-preview.tsx","../src/threads-preview/link-preview.tsx","../src/threads-preview/previews.tsx","../src/instagram-preview/post-preview.tsx","../src/instagram-preview/constants.tsx","../src/instagram-preview/icons/bookmark.tsx","../src/instagram-preview/icons/comment.tsx","../src/instagram-preview/icons/heart.tsx","../src/instagram-preview/icons/menu.tsx","../src/instagram-preview/icons/share.tsx","../src/instagram-preview/previews.tsx"],"names":["jsx","jsxs","DESCRIPTION_LENGTH","sprintf","useCallback","useState","icons_default","header_default","actions_default","URL_LENGTH","GlobeIcon","FEED_TEXT_MAX_LENGTH","_x","body_default","Fragment","Sidebar","Header","Footer"],"mappings":"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","file":"/home/runner/work/jetpack/jetpack/projects/js-packages/social-previews/dist/index.js","sourcesContent":[null,"import { createInterpolateElement } from '@wordpress/element';\nimport { sprintf } from '@wordpress/i18n';\n\nexport type Formatter< Options = unknown > = ( text: string, options?: Options ) => string;\ntype AugmentFormatterReturnType< T extends Formatter, TNewReturn > = (\n\t...a: Parameters< T >\n) => ReturnType< T > | TNewReturn;\ntype ConditionalFormatter = AugmentFormatterReturnType< Formatter, boolean >;\ntype NullableFormatter = AugmentFormatterReturnType< Formatter, undefined >;\n\nexport const baseDomain: Formatter = url => {\n\t// Strip leading protocol\n\tconst withoutProtocol = url.replace( /^[^/]+:\\/\\//, '' );\n\t// Strip everything after the domain using indexOf to avoid ReDoS\n\tconst slashIndex = withoutProtocol.indexOf( '/' );\n\treturn slashIndex === -1 ? withoutProtocol : withoutProtocol.substring( 0, slashIndex );\n};\n\nexport const shortEnough: ( n: number ) => ConditionalFormatter = limit => title =>\n\ttitle.length <= limit ? title : false;\n\nexport const truncatedAtSpace: ( a: number, b: number ) => ConditionalFormatter =\n\t( lower, upper ) => fullTitle => {\n\t\tconst title = fullTitle.slice( 0, upper );\n\t\tconst lastSpace = title.lastIndexOf( ' ' );\n\n\t\treturn lastSpace > lower && lastSpace < upper\n\t\t\t? title.slice( 0, lastSpace ).concat( '…' )\n\t\t\t: false;\n\t};\n\nexport const hardTruncation: ( n: number ) => Formatter = limit => title =>\n\ttitle.slice( 0, limit ).concat( '…' );\n\nexport const firstValid: ( ...args: ConditionalFormatter[] ) => NullableFormatter =\n\t( ...predicates ) =>\n\ta =>\n\t\t( predicates.find( p => false !== p( a ) ) as Formatter )?.( a );\n\nexport const stripHtmlTags: Formatter< Array< string > > = ( description, allowedTags = [] ) => {\n\tconst pattern = new RegExp( `(<([^${ allowedTags.join( '' ) }>]+)>)`, 'gi' );\n\n\treturn description ? description.replace( pattern, '' ) : '';\n};\n\n/**\n * For social note posts we use the first 50 characters of the description.\n * @param description - The post description.\n * @return The first 50 characters of the description.\n */\nexport const getTitleFromDescription = ( description: string ): string => {\n\treturn stripHtmlTags( description ).substring( 0, 50 );\n};\n\nexport const hasTag = ( text: string, tag: string ): boolean => {\n\tconst pattern = new RegExp( `<${ tag }[^>]*>`, 'gi' );\n\n\treturn pattern.test( text );\n};\n\nexport const formatNextdoorDate = new Intl.DateTimeFormat( 'en-GB', {\n\t// Result: \"7 Oct\", \"31 Dec\"\n\tday: 'numeric',\n\tmonth: 'short',\n} ).format;\n\nexport const formatThreadsDate = new Intl.DateTimeFormat( 'en-US', {\n\t// Result: \"'06/21/2024\"\n\tday: '2-digit',\n\tmonth: '2-digit',\n\tyear: 'numeric',\n} ).format;\n\nexport const formatTweetDate = new Intl.DateTimeFormat( 'en-US', {\n\t// Result: \"Apr 7\", \"Dec 31\"\n\tmonth: 'short',\n\tday: 'numeric',\n} ).format;\n\nexport const formatMastodonDate = new Intl.DateTimeFormat( 'en-US', {\n\t// Result: \"Apr 7, 2024\", \"Dec 31, 2023\"\n\tmonth: 'short',\n\tday: 'numeric',\n\tyear: 'numeric',\n} ).format;\n\nexport type Platform =\n\t| 'bluesky'\n\t| 'facebook'\n\t| 'instagram'\n\t| 'linkedin'\n\t| 'mastodon'\n\t| 'nextdoor'\n\t| 'threads'\n\t| 'tumblr'\n\t| 'twitter';\n\ntype PreviewTextOptions = {\n\tplatform: Platform;\n\tmaxChars?: number;\n\tmaxLines?: number;\n\thyperlinkUrls?: boolean;\n\thyperlinkHashtags?: boolean;\n\thashtagDomain?: string;\n};\n\nexport const hashtagUrlMap = {\n\ttwitter: 'https://twitter.com/hashtag/%1$s',\n\tfacebook: 'https://www.facebook.com/hashtag/%1$s',\n\tlinkedin: 'https://www.linkedin.com/feed/hashtag/?keywords=%1$s',\n\tinstagram: 'https://www.instagram.com/explore/tags/%1$s',\n\tmastodon: 'https://%2$s/tags/%1$s',\n\tnextdoor: 'https://nextdoor.com/hashtag/%1$s',\n\tthreads: 'https://www.threads.net/search?q=%1$s&serp_type=tags',\n\ttumblr: 'https://www.tumblr.com/tagged/%1$s',\n\tbluesky: 'https://bsky.app/hashtag/%1$s',\n} as const;\n\n/**\n * Prepares the text for the preview.\n * @param {string} text - The text to prepare.\n * @param {PreviewTextOptions} options - The options for preparing the text.\n * @return The prepared text as React nodes.\n */\nexport function preparePreviewText( text: string, options: PreviewTextOptions ): React.ReactNode {\n\tconst {\n\t\tplatform,\n\t\tmaxChars,\n\t\tmaxLines,\n\t\thyperlinkHashtags = true,\n\t\t// Instagram doesn't support hyperlink URLs at the moment.\n\t\thyperlinkUrls = 'instagram' !== platform,\n\t} = options;\n\n\tlet result = stripHtmlTags( text );\n\n\t// Replace multiple new lines (2+) with 2 new lines\n\t// There can be any whitespace characters in empty lines\n\t// That is why \"\\s*\"\n\tresult = result.replaceAll( /(?:\\s*[\\n\\r]){2,}/g, '\\n\\n' );\n\n\tif ( maxChars && result.length > maxChars ) {\n\t\tresult = hardTruncation( maxChars )( result );\n\t}\n\n\tif ( maxLines ) {\n\t\tconst lines = result.split( '\\n' );\n\n\t\tif ( lines.length > maxLines ) {\n\t\t\tresult = lines.slice( 0, maxLines ).join( '\\n' );\n\t\t}\n\t}\n\n\tconst componentMap: Record< string, React.ReactElement > = {};\n\n\tif ( hyperlinkUrls ) {\n\t\t// Convert URLs to hyperlinks.\n\t\t// TODO: Use a better regex here to match the URLs without protocol.\n\t\tconst urls = result.match( /(https?:\\/\\/\\S+)/g ) || [];\n\n\t\t/**\n\t\t * BEFORE:\n\t\t * result = 'Check out this cool site: https://wordpress.org and this one: https://wordpress.com'\n\t\t */\n\t\turls.forEach( ( url, index ) => {\n\t\t\t// Add the element to the component map.\n\t\t\tcomponentMap[ `Link${ index }` ] = (\n\t\t\t\t<a href={ url } rel=\"noopener noreferrer\" target=\"_blank\">\n\t\t\t\t\t{ url }\n\t\t\t\t</a>\n\t\t\t);\n\t\t\t// Replace the URL with the component placeholder.\n\t\t\tresult = result.replace( url, `<Link${ index } />` );\n\t\t} );\n\t\t/**\n\t\t * AFTER:\n\t\t * result = 'Check out this cool site: <Link0 /> and this one: <Link1 />'\n\t\t * componentMap = {\n\t\t * Link0: <a href=\"https://wordpress.org\" ...>https://wordpress.org</a>,\n\t\t * Link1: <a href=\"https://wordpress.com\" ...>https://wordpress.com</a>\n\t\t * }\n\t\t */\n\t}\n\n\t// Convert hashtags to hyperlinks.\n\tif ( hyperlinkHashtags && hashtagUrlMap[ platform ] ) {\n\t\t/**\n\t\t * We need to ensure that only the standalone hashtags are matched.\n\t\t * For example, we don't want to match the hash in the URL.\n\t\t * Thus we need to match the whitespace character before the hashtag or the beginning of the string.\n\t\t */\n\t\tconst hashtags = result.matchAll( /(^|\\s)#(\\w+)/g );\n\n\t\tconst hashtagUrl = hashtagUrlMap[ platform ];\n\n\t\t/**\n\t\t * BEFORE:\n\t\t * result = `#breaking text with a #hashtag on the #web\n\t\t * with a url https://github.com/Automattic/wp-calypso#security that has a hash in it`\n\t\t */\n\t\t[ ...hashtags ].forEach( ( [ fullMatch, whitespace, hashtag ], index ) => {\n\t\t\tconst url = sprintf( hashtagUrl, hashtag, options.hashtagDomain );\n\n\t\t\t// Add the element to the component map.\n\t\t\tcomponentMap[ `Hashtag${ index }` ] = (\n\t\t\t\t<a href={ url } rel=\"noopener noreferrer\" target=\"_blank\">\n\t\t\t\t\t{ `#${ hashtag }` }\n\t\t\t\t</a>\n\t\t\t);\n\n\t\t\t// Replace the hashtag with the component placeholder.\n\t\t\tresult = result.replace( fullMatch, `${ whitespace }<Hashtag${ index } />` );\n\t\t} );\n\t\t/**\n\t\t * AFTER:\n\t\t * result = `<Hashtag0 /> text with a <Hashtag1 /> on the <Hashtag2 />\n\t\t * with a url https://github.com/Automattic/wp-calypso#security that has a hash in it`\n\t\t *\n\t\t * componentMap = {\n\t\t * Hashtag0: <a href=\"https://twitter.com/hashtag/breaking\" ...>#breaking</a>,\n\t\t * Hashtag1: <a href=\"https://twitter.com/hashtag/hashtag\" ...>#hashtag</a>,\n\t\t * Hashtag2: <a href=\"https://twitter.com/hashtag/web\" ...>#web</a>\n\t\t * }\n\t\t */\n\t}\n\n\t// Convert newlines to <br> tags.\n\t/**\n\t * BEFORE:\n\t * result = 'This is a text\\nwith a newline\\nin it'\n\t */\n\tresult = result.replace( /\\n/g, '<br />' );\n\tcomponentMap.br = <br />;\n\t/**\n\t * AFTER:\n\t * result = 'This is a text<br />with a newline<br />in it'\n\t * componentMap = { br: <br /> }\n\t */\n\n\treturn createInterpolateElement( result, componentMap );\n}\n","import {\n\tfirstValid,\n\thardTruncation,\n\tshortEnough,\n\ttruncatedAtSpace,\n\tstripHtmlTags,\n\tbaseDomain,\n} from '../helpers';\nimport { SocialPreviewBaseProps } from '../types';\n\nimport './style.scss';\n\nconst URL_LENGTH = 68;\nconst TITLE_LENGTH = 63;\nconst DESCRIPTION_LENGTH = 160;\n\nconst googleUrl = ( url: string ) => {\n\tconst protocol = url.startsWith( 'https://' ) ? 'https://' : 'http://';\n\n\tconst breadcrumb = protocol + url.replace( protocol, '' ).split( '/' ).join( ' › ' );\n\n\tconst truncateBreadcrumb = firstValid( shortEnough( URL_LENGTH ), hardTruncation( URL_LENGTH ) );\n\n\treturn truncateBreadcrumb( breadcrumb );\n};\n\nconst googleTitle = firstValid(\n\tshortEnough( TITLE_LENGTH ),\n\ttruncatedAtSpace( TITLE_LENGTH - 40, TITLE_LENGTH + 10 ),\n\thardTruncation( TITLE_LENGTH )\n);\n\nconst googleDescription = firstValid(\n\tshortEnough( DESCRIPTION_LENGTH ),\n\ttruncatedAtSpace( DESCRIPTION_LENGTH - 80, DESCRIPTION_LENGTH + 10 ),\n\thardTruncation( DESCRIPTION_LENGTH )\n);\n\nexport type GoogleSearchPreviewProps = Omit< SocialPreviewBaseProps, 'image' > & {\n\tsiteTitle?: string;\n};\n\nexport const GoogleSearchPreview: React.FC< Partial< GoogleSearchPreviewProps > > = ( {\n\tdescription = '',\n\tsiteTitle,\n\ttitle = '',\n\turl = '',\n} ) => {\n\tconst domain = baseDomain( url );\n\n\treturn (\n\t\t<div className=\"search-preview\">\n\t\t\t<div className=\"search-preview__display\">\n\t\t\t\t<div className=\"search-preview__header\">\n\t\t\t\t\t<div className=\"search-preview__branding\">\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tclassName=\"search-preview__icon\"\n\t\t\t\t\t\t\tsrc={ `https://www.google.com/s2/favicons?sz=128&domain_url=${ domain }` }\n\t\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<div className=\"search-preview__site\">\n\t\t\t\t\t\t\t<div className=\"search-preview__site--title\">{ siteTitle || domain }</div>\n\t\t\t\t\t\t\t<div className=\"search-preview__url\">{ googleUrl( url ) }</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"search-preview__menu\">\n\t\t\t\t\t\t<svg focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n\t\t\t\t\t\t\t<path d=\"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"search-preview__title\">{ googleTitle( title ) }</div>\n\t\t\t\t<div className=\"search-preview__description\">\n\t\t\t\t\t{ googleDescription( stripHtmlTags( description ) ) }\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import clsx from 'clsx';\nimport { baseDomain, firstValid, hardTruncation, shortEnough, stripHtmlTags } from '../helpers';\nimport { TwitterCardProps } from './types';\n\nconst DESCRIPTION_LENGTH = 200;\n\nconst twitterDescription = firstValid(\n\tshortEnough( DESCRIPTION_LENGTH ),\n\thardTruncation( DESCRIPTION_LENGTH )\n);\n\nexport const Card: React.FC< TwitterCardProps > = ( {\n\tdescription,\n\timage,\n\ttitle,\n\tcardType,\n\turl,\n} ) => {\n\tconst cardClassNames = clsx( `twitter-preview__card-${ cardType }`, {\n\t\t'twitter-preview__card-has-image': !! image,\n\t} );\n\n\treturn (\n\t\t<div className=\"twitter-preview__card\">\n\t\t\t<div className={ cardClassNames }>\n\t\t\t\t{ image && <img className=\"twitter-preview__card-image\" src={ image } alt=\"\" /> }\n\t\t\t\t<div className=\"twitter-preview__card-body\">\n\t\t\t\t\t<div className=\"twitter-preview__card-url\">{ baseDomain( url || '' ) }</div>\n\t\t\t\t\t<div className=\"twitter-preview__card-title\">{ title }</div>\n\t\t\t\t\t<div className=\"twitter-preview__card-description\">\n\t\t\t\t\t\t{ twitterDescription( stripHtmlTags( description ) ) }\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","export const Footer: React.FC = () => {\n\treturn (\n\t\t<div className=\"twitter-preview__footer\">\n\t\t\t<span className=\"twitter-preview__icon-replies\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M1.751 10c0-4.42 3.584-8 8.005-8h4.366c4.49 0 8.129 3.64 8.129 8.13 0 2.96-1.607 5.68-4.196 7.11l-8.054 4.46v-3.69h-.067c-4.49.1-8.183-3.51-8.183-8.01zm8.005-6c-3.317 0-6.005 2.69-6.005 6 0 3.37 2.77 6.08 6.138 6.01l.351-.01h1.761v2.3l5.087-2.81c1.951-1.08 3.163-3.13 3.163-5.36 0-3.39-2.744-6.13-6.129-6.13H9.756z\"></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"twitter-preview__icon-retweets\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M4.5 3.88l4.432 4.14-1.364 1.46L5.5 7.55V16c0 1.1.896 2 2 2H13v2H7.5c-2.209 0-4-1.79-4-4V7.55L1.432 9.48.068 8.02 4.5 3.88zM16.5 6H11V4h5.5c2.209 0 4 1.79 4 4v8.45l2.068-1.93 1.364 1.46-4.432 4.14-4.432-4.14 1.364-1.46 2.068 1.93V8c0-1.1-.896-2-2-2z\"></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"twitter-preview__icon-likes\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M16.697 5.5c-1.222-.06-2.679.51-3.89 2.16l-.805 1.09-.806-1.09C9.984 6.01 8.526 5.44 7.304 5.5c-1.243.07-2.349.78-2.91 1.91-.552 1.12-.633 2.78.479 4.82 1.074 1.97 3.257 4.27 7.129 6.61 3.87-2.34 6.052-4.64 7.126-6.61 1.111-2.04 1.03-3.7.477-4.82-.561-1.13-1.666-1.84-2.908-1.91zm4.187 7.69c-1.351 2.48-4.001 5.12-8.379 7.67l-.503.3-.504-.3c-4.379-2.55-7.029-5.19-8.382-7.67-1.36-2.5-1.41-4.86-.514-6.67.887-1.79 2.647-2.91 4.601-3.01 1.651-.09 3.368.56 4.798 2.01 1.429-1.45 3.146-2.1 4.796-2.01 1.954.1 3.714 1.22 4.601 3.01.896 1.81.846 4.17-.514 6.67z\"></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"twitter-preview__icon-analytics\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M8.75 21V3h2v18h-2zM18 21V8.5h2V21h-2zM4 21l.004-10h2L6 21H4zm9.248 0v-7h2v7h-2z\"></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"twitter-preview__icon-share\">\n\t\t\t\t<svg viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M12 2.59l5.7 5.7-1.41 1.42L13 6.41V16h-2V6.41l-3.3 3.3-1.41-1.42L12 2.59zM21 15l-.02 3.51c0 1.38-1.12 2.49-2.5 2.49H5.5C4.11 21 3 19.88 3 18.5V15h2v3.5c0 .28.22.5.5.5h12.98c.28 0 .5-.22.5-.5L19 15h2z\"></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { formatTweetDate } from '../helpers';\nimport { HeaderProps } from './types';\n\nexport const Header: React.FC< HeaderProps > = ( { name, screenName, date } ) => {\n\treturn (\n\t\t<div className=\"twitter-preview__header\">\n\t\t\t<span className=\"twitter-preview__name\">\n\t\t\t\t{ name || __( 'Account Name', 'social-previews' ) }\n\t\t\t</span>\n\t\t\t<span className=\"twitter-preview__screen-name\">{ screenName || '@account' }</span>\n\t\t\t<span>·</span>\n\t\t\t<span className=\"twitter-preview__date\">{ formatTweetDate( date || Date.now() ) }</span>\n\t\t</div>\n\t);\n};\n","import clsx from 'clsx';\nimport { Fragment } from 'react';\nimport { MediaProps } from './types';\n\nexport const Media: React.FC< MediaProps > = ( { media } ) => {\n\t// Ensure we're only trying to show valid media, and the correct quantity.\n\tconst filteredMedia = media\n\t\t// Only image/ and video/ mime types are supported.\n\t\t.filter(\n\t\t\tmediaItem => mediaItem.type.startsWith( 'image/' ) || mediaItem.type.startsWith( 'video/' )\n\t\t)\n\t\t.filter( ( mediaItem, idx, array ) => {\n\t\t\t// We'll always keep the first item.\n\t\t\tif ( 0 === idx ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// If the first item was a video or GIF, discard all subsequent items.\n\t\t\tif ( array[ 0 ].type.startsWith( 'video/' ) || 'image/gif' === array[ 0 ].type ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// The first item wasn't a video or GIF, so discard all subsequent videos and GIFs.\n\t\t\tif ( mediaItem.type.startsWith( 'video/' ) || 'image/gif' === mediaItem.type ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} )\n\t\t// We only want the first four items of the array, at most.\n\t\t.slice( 0, 4 );\n\n\tif ( 0 === filteredMedia.length ) {\n\t\treturn null;\n\t}\n\n\tconst isVideo = filteredMedia[ 0 ].type.startsWith( 'video/' );\n\n\tconst mediaClasses = clsx( [\n\t\t'twitter-preview__media',\n\t\t'twitter-preview__media-children-' + filteredMedia.length,\n\t] );\n\n\treturn (\n\t\t<div className={ mediaClasses }>\n\t\t\t{ filteredMedia.map( ( mediaItem, index ) => (\n\t\t\t\t<Fragment key={ `twitter-preview__media-item-${ index }` }>\n\t\t\t\t\t{ isVideo ? (\n\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t</video>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t) }\n\t\t\t\t</Fragment>\n\t\t\t) ) }\n\t\t</div>\n\t);\n};\n","import { SandBox } from '@wordpress/components';\nimport { QuoteTweetProps } from './types';\n\nexport const QuoteTweet: React.FC< QuoteTweetProps > = ( { tweetUrl } ) => {\n\tif ( ! tweetUrl ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"twitter-preview__quote-tweet\">\n\t\t\t<SandBox\n\t\t\t\thtml={ `<blockquote class=\"twitter-tweet\" data-conversation=\"none\" data-dnt=\"true\"><a href=\"${ tweetUrl }\"></a></blockquote>` }\n\t\t\t\tscripts={ [ 'https://platform.twitter.com/widgets.js' ] }\n\t\t\t\ttitle=\"Embedded tweet\"\n\t\t\t/>\n\t\t\t<div className=\"twitter-preview__quote-tweet-overlay\" />\n\t\t</div>\n\t);\n};\n","import { useCallback, useState } from 'react';\n\nexport type AvatarWithFallbackProps = {\n\talt?: string;\n\tsrc?: string;\n\tclassName?: string;\n\tfallback?: React.ReactNode;\n};\n\n/**\n * Renders a default avatar SVG.\n *\n * @param {Pick< AvatarWithFallbackProps, 'className' >} props - The SVG props.\n * @return The DefaultAvatar component.\n */\nexport function DefaultAvatar( props: Pick< AvatarWithFallbackProps, 'className' > ) {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\tviewBox=\"0 0 340 340\"\n\t\t\twidth=\"36\"\n\t\t\theight=\"36\"\n\t\t\taria-hidden=\"true\"\n\t\t\t{ ...props }\n\t\t>\n\t\t\t<path\n\t\t\t\tfill=\"#DDD\"\n\t\t\t\td=\"m169,.5a169,169 0 1,0 2,0zm0,86a76,76 0 1 1-2,0zM57,287q27-35 67-35h92q40,0 67,35a164,164 0 0,1-226,0\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\n/**\n * Renders an avatar image with a fallback to a default avatar if no URL is provided or if the URL fails to load.\n *\n * @param {AvatarWithFallbackProps} props - The props for the AvatarWithFallback component.\n *\n * @return The AvatarWithFallback component.\n */\nexport function AvatarWithFallback( {\n\tsrc: avatarUrl,\n\talt = '',\n\tclassName,\n\tfallback = <DefaultAvatar className={ className } />,\n}: AvatarWithFallbackProps ) {\n\t// Use state to track if the image URL has encountered an error\n\tconst [ imageUrlWithError, setImageUrlWithError ] = useState( '' );\n\n\tconst onError = useCallback< React.ReactEventHandler< HTMLImageElement > >( event => {\n\t\tsetImageUrlWithError( ( event.target as HTMLImageElement ).src );\n\t}, [] );\n\n\tconst showAvatar =\n\t\t!! avatarUrl &&\n\t\t// Check if the image URL with error is different from the provided avatar URL\n\t\t// to ensure that a change in avatarUrl resets the error state\n\t\timageUrlWithError !== avatarUrl;\n\n\treturn showAvatar ? (\n\t\t<img src={ avatarUrl } alt={ alt } onError={ onError } className={ className } />\n\t) : (\n\t\tfallback\n\t);\n}\n","import { AvatarWithFallback } from '../avatar-with-fallback';\nimport { SidebarProps } from './types';\n\nexport const Sidebar: React.FC< SidebarProps > = ( { profileImage, showThreadConnector } ) => {\n\treturn (\n\t\t<div className=\"twitter-preview__sidebar\">\n\t\t\t<div className=\"twitter-preview__profile-image\">\n\t\t\t\t<AvatarWithFallback src={ profileImage } />\n\t\t\t</div>\n\t\t\t{ showThreadConnector && <div className=\"twitter-preview__connector\" /> }\n\t\t</div>\n\t);\n};\n","import { preparePreviewText } from '../helpers';\nimport { TextProps } from './types';\n\nexport const Text: React.FC< TextProps > = ( { text, url, retainUrl } ) => {\n\tif ( ! text ) {\n\t\treturn null;\n\t}\n\t// If the text ends with the card URL, remove it.\n\tconst tweetText =\n\t\turl && ! retainUrl && text.endsWith( url )\n\t\t\t? text.substring( 0, text.lastIndexOf( url ) )\n\t\t\t: text;\n\n\treturn (\n\t\t<div className=\"twitter-preview__text\">\n\t\t\t{ preparePreviewText( tweetText, { platform: 'twitter' } ) }\n\t\t</div>\n\t);\n};\n","import { Card } from './card';\nimport { Footer } from './footer';\nimport { Header } from './header';\nimport { Media } from './media';\nimport { QuoteTweet } from './quote-tweet';\nimport { Sidebar } from './sidebar';\nimport { Text } from './text';\nimport { TwitterPreviewProps } from './types';\n\nimport './style.scss';\n\nexport const TwitterPostPreview: React.FC< TwitterPreviewProps > = ( {\n\tdate,\n\tdescription,\n\timage,\n\tmedia,\n\tname,\n\tprofileImage,\n\tscreenName,\n\tshowThreadConnector,\n\ttext,\n\ttitle,\n\ttweetUrl,\n\tcardType,\n\turl,\n} ) => {\n\tconst hasMedia = !! media?.length;\n\n\treturn (\n\t\t<div className=\"twitter-preview__wrapper\">\n\t\t\t<div className=\"twitter-preview__container\">\n\t\t\t\t<Sidebar profileImage={ profileImage } showThreadConnector={ showThreadConnector } />\n\t\t\t\t<div className=\"twitter-preview__main\">\n\t\t\t\t\t<Header name={ name } screenName={ screenName } date={ date } />\n\t\t\t\t\t<div className=\"twitter-preview__content\">\n\t\t\t\t\t\t{ text ? <Text text={ text } url={ url || '' } retainUrl={ hasMedia } /> : null }\n\t\t\t\t\t\t{ hasMedia ? <Media media={ media } /> : null }\n\t\t\t\t\t\t{ tweetUrl ? <QuoteTweet tweetUrl={ tweetUrl } /> : null }\n\t\t\t\t\t\t{ ! hasMedia && url && (\n\t\t\t\t\t\t\t<Card\n\t\t\t\t\t\t\t\tdescription={ description || '' }\n\t\t\t\t\t\t\t\timage={ image }\n\t\t\t\t\t\t\t\ttitle={ title || '' }\n\t\t\t\t\t\t\t\tcardType={ cardType || '' }\n\t\t\t\t\t\t\t\turl={ url }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</div>\n\t\t\t\t\t<Footer />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { TwitterPostPreview } from './post-preview';\nimport { TwitterPreviewProps } from './types';\n\nexport const TwitterLinkPreview: React.FC< TwitterPreviewProps > = props => {\n\treturn (\n\t\t<TwitterPostPreview\n\t\t\t{ ...props }\n\t\t\t// Override the props that are irrelevant to link preview\n\t\t\ttext=\"\"\n\t\t\tmedia={ undefined }\n\t\t/>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport SectionHeading from '../shared/section-heading';\nimport { TwitterLinkPreview } from './link-preview';\nimport { TwitterPostPreview } from './post-preview';\nimport type { TwitterPreviewsProps } from './types';\n\nexport const TwitterPreviews: React.FC< TwitterPreviewsProps > = ( {\n\theadingLevel,\n\thideLinkPreview,\n\thidePostPreview,\n\ttweets,\n} ) => {\n\tif ( ! tweets?.length ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"social-preview twitter-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section twitter-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Twitter\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on X:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t{ tweets.map( ( tweet, index ) => {\n\t\t\t\t\t\tconst isLast = index + 1 === tweets.length;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<TwitterPostPreview\n\t\t\t\t\t\t\t\tkey={ `twitter-preview__tweet-${ index }` }\n\t\t\t\t\t\t\t\t{ ...tweet }\n\t\t\t\t\t\t\t\tshowThreadConnector={ ! isLast }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section twitter-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a Twitter post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on X.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<TwitterLinkPreview { ...tweets[ 0 ] } name=\"\" profileImage=\"\" screenName=\"\" />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","const HEADING_LEVELS = [ 2, 3, 4, 5, 6 ] as const;\n\nexport type SectionHeadingProps = {\n\tclassName?: string;\n\tlevel?: ( typeof HEADING_LEVELS )[ number ];\n\tchildren?: React.ReactNode;\n};\n\nexport const SectionHeading: React.FC< SectionHeadingProps > = ( {\n\tclassName,\n\tlevel,\n\tchildren,\n} ) => {\n\tconst Tag = `h${ level && HEADING_LEVELS.includes( level ) ? level : 3 }` as const;\n\n\treturn (\n\t\t<Tag className={ `social-preview__section-heading ${ className ?? '' }` }>{ children }</Tag>\n\t);\n};\n\nexport default SectionHeading;\n","import { __, sprintf } from '@wordpress/i18n';\nimport { AvatarWithFallback } from '../avatar-with-fallback';\nimport { baseDomain, getTitleFromDescription, preparePreviewText } from '../helpers';\nimport { FEED_TEXT_MAX_LENGTH } from './constants';\nimport { LinkedInPreviewProps } from './types';\nimport './style.scss';\n\n/**\n * LinkedIn Post Preview Component\n *\n * @param {LinkedInPreviewProps} props - The props for the LinkedIn post preview.\n *\n * @return The LinkedIn post preview component.\n */\nexport function LinkedInPostPreview( {\n\tarticleReadTime = 5,\n\timage,\n\tjobTitle,\n\tname,\n\tprofileImage,\n\tdescription,\n\tmedia,\n\ttitle,\n\turl,\n}: LinkedInPreviewProps ) {\n\tconst hasMedia = !! media?.length;\n\n\treturn (\n\t\t<div className=\"linkedin-preview__wrapper\">\n\t\t\t<section className={ `linkedin-preview__container ${ hasMedia ? 'has-media' : '' }` }>\n\t\t\t\t<div className=\"linkedin-preview__header\">\n\t\t\t\t\t<div className=\"linkedin-preview__header--avatar\">\n\t\t\t\t\t\t<AvatarWithFallback src={ profileImage } />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"linkedin-preview__header--profile\">\n\t\t\t\t\t\t<div className=\"linkedin-preview__header--profile-info\">\n\t\t\t\t\t\t\t<div className=\"linkedin-preview__header--profile-name\">\n\t\t\t\t\t\t\t\t{ name || __( 'Account Name', 'social-previews' ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<span>•</span>\n\t\t\t\t\t\t\t<div className=\"linkedin-preview__header--profile-actor\">\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t// translators: refers to the actor level of the post being shared, e.g. \"1st\", \"2nd\", \"3rd\", etc.\n\t\t\t\t\t\t\t\t\t__( '1st', 'social-previews' )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{ jobTitle ? (\n\t\t\t\t\t\t\t<div className=\"linkedin-preview__header--profile-title\">{ jobTitle }</div>\n\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t<div className=\"linkedin-preview__header--profile-meta\">\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t// translators: refers to the time since the post was published, e.g. \"1h\"\n\t\t\t\t\t\t\t\t\t__( '1h', 'social-previews' )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span>•</span>\n\t\t\t\t\t\t\t{ /* This is the Globe SVG that represents visibility to be \"public\" */ }\n\t\t\t\t\t\t\t<svg viewBox=\"0 0 16 16\" fill=\"currentColor\" width=\"16\" height=\"16\" focusable=\"false\">\n\t\t\t\t\t\t\t\t<path d=\"M8 1a7 7 0 107 7 7 7 0 00-7-7zM3 8a5 5 0 011-3l.55.55A1.5 1.5 0 015 6.62v1.07a.75.75 0 00.22.53l.56.56a.75.75 0 00.53.22H7v.69a.75.75 0 00.22.53l.56.56a.75.75 0 01.22.53V13a5 5 0 01-5-5zm6.24 4.83l2-2.46a.75.75 0 00.09-.8l-.58-1.16A.76.76 0 0010 8H7v-.19a.51.51 0 01.28-.45l.38-.19a.74.74 0 01.68 0L9 7.5l.38-.7a1 1 0 00.12-.48v-.85a.78.78 0 01.21-.53l1.07-1.09a5 5 0 01-1.54 9z\" />\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"linkedin-preview__content\">\n\t\t\t\t\t{ description ? (\n\t\t\t\t\t\t<div className=\"linkedin-preview__caption\">\n\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t{ preparePreviewText( description, {\n\t\t\t\t\t\t\t\t\tplatform: 'linkedin',\n\t\t\t\t\t\t\t\t\tmaxChars: FEED_TEXT_MAX_LENGTH,\n\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{ hasMedia && url && (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t{ ' - ' }\n\t\t\t\t\t\t\t\t\t<a href={ url } rel=\"nofollow noopener noreferrer\" target=\"_blank\">\n\t\t\t\t\t\t\t\t\t\t{ url }\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null }\n\t\t\t\t\t{ hasMedia ? (\n\t\t\t\t\t\t<div className=\"linkedin-preview__media\">\n\t\t\t\t\t\t\t{ media.map( ( mediaItem, index ) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={ `linkedin-preview__media-item-${ index }` }\n\t\t\t\t\t\t\t\t\tclassName=\"linkedin-preview__media-item\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ mediaItem.type.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<article>\n\t\t\t\t\t\t\t{ image ? <img className=\"linkedin-preview__image\" src={ image } alt=\"\" /> : null }\n\t\t\t\t\t\t\t{ url ? (\n\t\t\t\t\t\t\t\t<div className=\"linkedin-preview__description\">\n\t\t\t\t\t\t\t\t\t<h2 className=\"linkedin-preview__description--title\">\n\t\t\t\t\t\t\t\t\t\t{ title || getTitleFromDescription( description ) }\n\t\t\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t\t\t<div className=\"linkedin-preview__description--meta\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"linkedin-preview__description--url\">\n\t\t\t\t\t\t\t\t\t\t\t{ baseDomain( url ) }\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t<span>•</span>\n\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\t{ sprintf(\n\t\t\t\t\t\t\t\t\t\t\t\t// translators: %d is the number of minutes it takes to read the article\n\t\t\t\t\t\t\t\t\t\t\t\t__( '%d min read', 'social-previews' ),\n\t\t\t\t\t\t\t\t\t\t\t\tarticleReadTime\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t</article>\n\t\t\t\t\t) }\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</div>\n\t);\n}\n","export const FEED_TEXT_MAX_LENGTH = 550;\n","import { getTitleFromDescription } from '../helpers';\nimport { LinkedInPostPreview } from './post-preview';\nimport { LinkedInPreviewProps } from './types';\n\ntype OptionalProps = Partial< Pick< LinkedInPreviewProps, 'name' | 'profileImage' > >;\n\nexport type LinkedInLinkPreviewProps = Omit< LinkedInPreviewProps, keyof OptionalProps > &\n\tOptionalProps;\n\n/**\n * LinkedIn Link Preview Component\n * @param {LinkedInLinkPreviewProps} props - The props for the LinkedIn link preview.\n * @return The LinkedIn link preview component.\n */\nexport function LinkedInLinkPreview( props: LinkedInLinkPreviewProps ) {\n\treturn (\n\t\t<LinkedInPostPreview\n\t\t\tname=\"\"\n\t\t\tprofileImage=\"\"\n\t\t\t{ ...props }\n\t\t\t// Override the props that are irrelevant to link preview\n\t\t\tdescription=\"\"\n\t\t\tmedia={ undefined }\n\t\t\ttitle={ props.title || getTitleFromDescription( props.description ) }\n\t\t/>\n\t);\n}\n","import { __ } from '@wordpress/i18n';\nimport SectionHeading from '../shared/section-heading';\nimport { LinkedInLinkPreview } from './link-preview';\nimport { LinkedInPostPreview } from './post-preview';\nimport type { LinkedInPreviewsProps } from './types';\n\nexport const LinkedInPreviews: React.FC< LinkedInPreviewsProps > = ( {\n\theadingLevel,\n\thideLinkPreview,\n\thidePostPreview,\n\t...props\n} ) => {\n\treturn (\n\t\t<div className=\"social-preview linkedin-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section linkedin-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on LinkedIn\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on LinkedIn:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<LinkedInPostPreview { ...props } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section linkedin-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a LinkedIn post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on LinkedIn.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<LinkedInLinkPreview { ...props } name=\"\" profileImage=\"\" />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { baseDomain } from '../helpers';\nimport { tumblrTitle, tumblrDescription } from './helpers';\nimport TumblrPostActions from './post/actions';\nimport TumblrPostHeader from './post/header';\nimport type { TumblrPreviewProps } from './types';\n\nimport './styles.scss';\n\nexport const TumblrLinkPreview: React.FC< TumblrPreviewProps > = ( {\n\ttitle,\n\tdescription,\n\timage,\n\tuser,\n\turl,\n} ) => {\n\tconst avatarUrl = user?.avatarUrl;\n\n\treturn (\n\t\t<div className=\"tumblr-preview__post\">\n\t\t\t{ avatarUrl && <img className=\"tumblr-preview__avatar\" src={ avatarUrl } alt=\"\" /> }\n\t\t\t<div className=\"tumblr-preview__card\">\n\t\t\t\t<TumblrPostHeader user={ user } />\n\t\t\t\t<div className=\"tumblr-preview__window\">\n\t\t\t\t\t{ image && (\n\t\t\t\t\t\t<div className=\"tumblr-preview__window-top\">\n\t\t\t\t\t\t\t<div className=\"tumblr-preview__overlay\">\n\t\t\t\t\t\t\t\t<div className=\"tumblr-preview__title\">{ tumblrTitle( title ) }</div>\n\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tclassName=\"tumblr-preview__image\"\n\t\t\t\t\t\t\t\tsrc={ image }\n\t\t\t\t\t\t\t\talt={ __( 'Tumblr preview thumbnail', 'social-previews' ) }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) }\n\t\t\t\t\t<div className={ `tumblr-preview__window-bottom ${ ! image ? 'is-full' : '' }` }>\n\t\t\t\t\t\t{ ! image && <div className=\"tumblr-preview__title\">{ tumblrTitle( title ) }</div> }\n\t\t\t\t\t\t{ description && image && (\n\t\t\t\t\t\t\t<div className=\"tumblr-preview__description\">\n\t\t\t\t\t\t\t\t{ tumblrDescription( description ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) }\n\t\t\t\t\t\t{ url && <div className=\"tumblr-preview__site-name\">{ baseDomain( url ) }</div> }\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<TumblrPostActions />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { firstValid, hardTruncation, shortEnough, stripHtmlTags, Formatter } from '../helpers';\n\nconst TITLE_LENGTH = 1000;\nconst DESCRIPTION_LENGTH = 400;\n\nexport const tumblrTitle: Formatter = text =>\n\tfirstValid(\n\t\tshortEnough( TITLE_LENGTH ),\n\t\thardTruncation( TITLE_LENGTH )\n\t)( stripHtmlTags( text ) ) || '';\n\nexport const tumblrDescription: Formatter = text => {\n\t// Remove Gutenberg block comments using a safer approach to avoid ReDoS\n\tlet processedText = text;\n\tlet startIndex = processedText.indexOf( '<!--' );\n\twhile ( startIndex !== -1 ) {\n\t\tconst endIndex = processedText.indexOf( '-->', startIndex );\n\t\tif ( endIndex === -1 ) {\n\t\t\t// Incomplete comment, remove from startIndex to end\n\t\t\tprocessedText = processedText.substring( 0, startIndex );\n\t\t\tbreak;\n\t\t}\n\t\t// Remove the comment\n\t\tprocessedText =\n\t\t\tprocessedText.substring( 0, startIndex ) + processedText.substring( endIndex + 3 );\n\t\tstartIndex = processedText.indexOf( '<!--' );\n\t}\n\n\t// Convert closing paragraph tags to line breaks to preserve paragraph structure\n\tprocessedText = processedText.replace( /<\\/p>/g, '</p>\\n\\n' );\n\n\treturn (\n\t\tfirstValid(\n\t\t\tshortEnough( DESCRIPTION_LENGTH ),\n\t\t\thardTruncation( DESCRIPTION_LENGTH )\n\t\t)( stripHtmlTags( processedText ) ) || ''\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport TumblrPostIcon from '../icons';\n\nimport './styles.scss';\n\nconst TumblrPostActions: React.FC = () => (\n\t<div className=\"tumblr-preview__post-actions\">\n\t\t<div className=\"tumblr-preview__post-manage-actions\">\n\t\t\t<div className=\"tumblr-preview__post-actions-blaze\">\n\t\t\t\t<TumblrPostIcon name=\"blaze\" />\n\t\t\t\t Blaze\n\t\t\t</div>\n\t\t\t<ul>\n\t\t\t\t{ [\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: 'delete',\n\t\t\t\t\t\t// translators: \"Delete\" action on a Tumblr post\n\t\t\t\t\t\tlabel: __( 'Delete', 'social-previews' ),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: 'edit',\n\t\t\t\t\t\t// translators: \"Edit\" action on a Tumblr post\n\t\t\t\t\t\tlabel: __( 'Edit', 'social-previews' ),\n\t\t\t\t\t},\n\t\t\t\t].map( ( { icon, label } ) => (\n\t\t\t\t\t<li key={ icon } aria-label={ label }>\n\t\t\t\t\t\t<TumblrPostIcon name={ icon } />\n\t\t\t\t\t</li>\n\t\t\t\t) ) }\n\t\t\t</ul>\n\t\t</div>\n\t\t<div className=\"tumblr-preview__post-social-actions\">\n\t\t\t<div>\n\t\t\t\t{\n\t\t\t\t\t// translators: count of notes on a Tumblr post\n\t\t\t\t\t__( '0 notes', 'social-previews' )\n\t\t\t\t}\n\t\t\t</div>\n\t\t\t<ul>\n\t\t\t\t{ [\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: 'share',\n\t\t\t\t\t\t// translators: \"Share\" action on a Tumblr post\n\t\t\t\t\t\tlabel: __( 'Share', 'social-previews' ),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: 'reply',\n\t\t\t\t\t\t// translators: \"Reply\" action on a Tumblr post\n\t\t\t\t\t\tlabel: __( 'Reply', 'social-previews' ),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: 'reblog',\n\t\t\t\t\t\t// translators: \"Reblog\" action on a Tumblr post\n\t\t\t\t\t\tlabel: __( 'Reblog', 'social-previews' ),\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ticon: 'like',\n\t\t\t\t\t\t// translators: \"Like\" action on a Tumblr post\n\t\t\t\t\t\tlabel: __( 'Like', 'social-previews' ),\n\t\t\t\t\t},\n\t\t\t\t].map( ( { icon, label } ) => (\n\t\t\t\t\t<li key={ icon } aria-label={ label }>\n\t\t\t\t\t\t<TumblrPostIcon name={ icon } />\n\t\t\t\t\t</li>\n\t\t\t\t) ) }\n\t\t\t</ul>\n\t\t</div>\n\t</div>\n);\n\nexport default TumblrPostActions;\n","import './styles.scss';\n\nconst TumblrPostIcon: React.FC< { name: string } > = ( { name } ) => {\n\tlet svg;\n\n\tswitch ( name ) {\n\t\tcase 'blaze':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 25 22\">\n\t\t\t\t\t<path d=\"m7.5059-0.24414c-0.79843 0.057223-1.2169 0.88587-1.1635 1.6128-0.2266 2.0449-1.4898 3.8696-3.1975 4.9778-3.0182 2.414-4.2201 6.8066-2.8033 10.411 0.92417 2.4679 2.9589 4.5674 5.4768 5.3928 0.95914 0.16102 1.7233-0.94358 1.3074-1.8059-0.11578-0.51062-0.17482-0.96516-0.17845-1.487 1.0413 1.5607 2.5484 2.8986 4.341 3.4975 1.0396-0.0154 1.98-0.64458 2.8516-1.1608 3.3821-2.1786 4.9604-6.7097 3.6597-10.518-0.49144-1.4599-1.2948-2.8935-2.5028-3.8698-0.7512-0.45498-1.661 0.09677-1.9202 0.86038-0.12274 0.16822-0.70352 1.1955-0.6191 0.61976 0.25488-3.4397-1.6789-7.0066-4.8123-8.4958-0.14322-0.037843-0.292-0.049464-0.43945-0.035156zm1.0586 3.5605c1.8947 2.0016 2.2326 5.1984 0.89062 7.5879-0.38498 0.96148 0.71762 2.0063 1.6567 1.5681 1.4159-0.4624 2.6998-1.3259 3.6577-2.4665 1.6442 2.5888 1.1465 6.2819-1.0629 8.3379-0.62378 0.60782-1.3666 1.0945-2.1754 1.4179-1.9543-0.989-3.3534-3.0966-3.5625-5.3125-0.25636-1.0253-1.81-1.2013-2.2852-0.25781-0.75058 1.3054-1.1846 2.7948-1.2305 4.3008-2.2396-1.9852-2.8468-5.4435-1.4609-8.0527 0.58926-1.239 1.651-2.13 2.724-2.9329 1.2958-1.1271 2.2791-2.62 2.7682-4.2683l0.071578 0.069832z\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'delete':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 14 17\">\n\t\t\t\t\t<path d=\"M12 5v9c.1.7-.3 1-1 1H3c-.5 0-.9-.3-1-1V5c0-.6-.4-1-1-1-.5 0-1 .4-1 1v9.5C0 16.1 1.4 17 3 17h8c1.8 0 3-.8 3-2.5V5c0-.6-.5-1-1-1-.6 0-1 .5-1 1z\"></path>\n\t\t\t\t\t<path d=\"M4 12s0 1 1 1 1-1 1-1V5c0-.5-.4-1-1-1-.5 0-1 .5-1 1v7zm4 0s0 1 1 1 1-1 1-1V5c0-.5-.4-1-1-1-.5 0-1 .5-1 1v7zm5-10c.5 0 1-.4 1-1 0-.5-.4-.9-1-1H1C.5.1 0 .5 0 1c0 .6.6 1 1.1 1H13z\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'edit':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 17.6 17.6\">\n\t\t\t\t\t<path d=\"M5.3 13.8l-2.1.7.7-2.1L10.3 6l1.4 1.4-6.4 6.4zm6.4-9.3l-1.4-1.4-1.4 1.4-6.7 6.7-.2.5-2 5.9 3.8-1.3 2.1-.7.4-.1.3-.3 7.8-7.8c.1 0-2.7-2.9-2.7-2.9zm5.6-1.4L14.5.3c-.4-.4-1-.4-1.4 0l-1.4 1.4L15.9 6l1.4-1.4c.4-.5.4-1.1 0-1.5\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'share':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 24 24\">\n\t\t\t\t\t<path d=\"M12.6173 1.07612C12.991 0.921338 13.4211 1.00689 13.7071 1.29289L22.7071 10.2929C23.0832 10.669 23.0991 11.2736 22.7433 11.669L13.7433 21.669C13.4663 21.9767 13.0283 22.082 12.6417 21.9336C12.2552 21.7853 12 21.414 12 21V16H11.5C7.31775 16 3.92896 18.2486 2.95256 21.3044C2.80256 21.7738 2.33292 22.064 1.84598 21.9881C1.35904 21.9122 1 21.4928 1 21V18.5C1 12.3162 5.88069 7.27245 12 7.01067V2C12 1.59554 12.2436 1.2309 12.6173 1.07612ZM14 4.41421V8C14 8.55228 13.5523 9 13 9H12.5C7.64534 9 3.64117 12.6414 3.06988 17.3419C5.09636 15.2366 8.18218 14 11.5 14H13C13.5523 14 14 14.4477 14 15V18.394L20.622 11.0362L14 4.41421Z\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'reply':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 17 17\">\n\t\t\t\t\t<path d=\"M8.7 0C4.1 0 .4 3.7.4 8.3c0 1.2.2 2.3.7 3.4-.2.6-.4 1.5-.7 2.5L0 15.8c-.2.7.5 1.4 1.2 1.2l1.6-.4 2.4-.7c1.1.5 2.2.7 3.4.7 4.6 0 8.3-3.7 8.3-8.3C17 3.7 13.3 0 8.7 0zM15 8.3c0 3.5-2.8 6.3-6.4 6.3-1.2 0-2.3-.3-3.2-.9l-3.2.9.9-3.2c-.5-.9-.9-2-.9-3.2.1-3.4 3-6.2 6.5-6.2S15 4.8 15 8.3z\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'reblog':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 17 18.1\">\n\t\t\t\t\t<path d=\"M12.8.2c-.4-.4-.8-.2-.8.4v2H2c-2 0-2 2-2 2v5s0 1 1 1 1-1 1-1v-4c0-1 .5-1 1-1h9v2c0 .6.3.7.8.4L17 3.6 12.8.2zM4.2 17.9c.5.4.8.2.8-.3v-2h10c2 0 2-2 2-2v-5s0-1-1-1-1 1-1 1v4c0 1-.5 1-1 1H5v-2c0-.6-.3-.7-.8-.4L0 14.6l4.2 3.3z\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'like':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 20 18\">\n\t\t\t\t\t<path d=\"M14.658 0c-1.625 0-3.21.767-4.463 2.156-.06.064-.127.138-.197.225-.074-.085-.137-.159-.196-.225C8.547.766 6.966 0 5.35 0 4.215 0 3.114.387 2.162 1.117c-2.773 2.13-2.611 5.89-1.017 8.5 2.158 3.535 6.556 7.18 7.416 7.875A2.3 2.3 0 0 0 9.998 18c.519 0 1.028-.18 1.436-.508.859-.695 5.257-4.34 7.416-7.875 1.595-2.616 1.765-6.376-1-8.5C16.895.387 15.792 0 14.657 0h.001zm0 2.124c.645 0 1.298.208 1.916.683 1.903 1.461 1.457 4.099.484 5.695-1.973 3.23-6.16 6.7-6.94 7.331a.191.191 0 0 1-.241 0c-.779-.631-4.966-4.101-6.94-7.332-.972-1.595-1.4-4.233.5-5.694.619-.475 1.27-.683 1.911-.683 1.064 0 2.095.574 2.898 1.461.495.549 1.658 2.082 1.753 2.203.095-.12 1.259-1.654 1.752-2.203.8-.887 1.842-1.461 2.908-1.461h-.001z\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'ellipsis':\n\t\t\tsvg = (\n\t\t\t\t<svg viewBox=\"0 0 17.5 3.9\">\n\t\t\t\t\t<path d=\"M17.5 1.9c0 1.1-.9 1.9-1.9 1.9-1.1 0-1.9-.9-1.9-1.9S14.5 0 15.6 0c1 0 1.9.9 1.9 1.9m-6.8 0c0 1.1-.9 1.9-1.9 1.9-1.1.1-2-.8-2-1.9 0-1 .9-1.9 2-1.9s1.9.9 1.9 1.9m-6.8 0c0 1.1-.9 2-2 2-1 0-1.9-.9-1.9-2S.9 0 1.9 0c1.1 0 2 .9 2 1.9\"></path>\n\t\t\t\t</svg>\n\t\t\t);\n\t\t\tbreak;\n\t}\n\n\treturn (\n\t\t<span className={ `tumblr-preview__post-icon tumblr-preview__post-icon-${ name }` }>\n\t\t\t{ svg }\n\t\t</span>\n\t);\n};\n\nexport default TumblrPostIcon;\n","import { __ } from '@wordpress/i18n';\nimport TumblrPostIcon from '../icons';\nimport type { TumblrPreviewProps } from '../../types';\n\nimport './styles.scss';\n\ntype Props = Pick< TumblrPreviewProps, 'user' >;\n\nconst TumblrPostHeader: React.FC< Props > = ( { user } ) => (\n\t<div className=\"tumblr-preview__post-header\">\n\t\t<div className=\"tumblr-preview__post-header-username\">\n\t\t\t{ user?.displayName ||\n\t\t\t\t// translators: username of a fictional Tumblr User\n\t\t\t\t__( 'anonymous-user', 'social-previews' ) }\n\t\t</div>\n\t\t<TumblrPostIcon name=\"ellipsis\" />\n\t</div>\n);\n\nexport default TumblrPostHeader;\n","import { __ } from '@wordpress/i18n';\nimport { AvatarWithFallback } from '../avatar-with-fallback';\nimport { preparePreviewText } from '../helpers';\nimport { tumblrTitle, tumblrDescription } from './helpers';\nimport TumblrPostActions from './post/actions';\nimport TumblrPostHeader from './post/header';\nimport type { TumblrPreviewProps } from './types';\nimport './styles.scss';\n\nexport const TumblrPostPreview: React.FC< TumblrPreviewProps > = ( {\n\ttitle,\n\tdescription,\n\timage,\n\tuser,\n\turl,\n\tcustomText,\n\tmedia,\n} ) => {\n\tconst avatarUrl = user?.avatarUrl;\n\n\tconst mediaItem = media?.[ 0 ];\n\n\treturn (\n\t\t<div className=\"tumblr-preview__post\">\n\t\t\t<AvatarWithFallback className=\"tumblr-preview__avatar\" src={ avatarUrl } />\n\t\t\t<div className=\"tumblr-preview__card\">\n\t\t\t\t<TumblrPostHeader user={ user } />\n\t\t\t\t<div className=\"tumblr-preview__body\">\n\t\t\t\t\t<div className=\"tumblr-preview__title\">{ tumblrTitle( title ) }</div>\n\t\t\t\t\t{ customText && <div className=\"tumblr-preview__custom-text\">{ customText }</div> }\n\t\t\t\t\t{ description && (\n\t\t\t\t\t\t<div className=\"tumblr-preview__description\">\n\t\t\t\t\t\t\t{ preparePreviewText( tumblrDescription( description ), {\n\t\t\t\t\t\t\t\tplatform: 'tumblr',\n\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) }\n\t\t\t\t\t{ mediaItem ? (\n\t\t\t\t\t\t<div className=\"tumblr-preview__media-item\">\n\t\t\t\t\t\t\t{ mediaItem.type.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t<video controls className=\"tumblr-preview__media--video\">\n\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<img className=\"tumblr-preview__image\" src={ mediaItem.url } alt=\"\" />\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\timage && (\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tclassName=\"tumblr-preview__image\"\n\t\t\t\t\t\t\t\tsrc={ image }\n\t\t\t\t\t\t\t\talt={ __( 'Tumblr preview thumbnail', 'social-previews' ) }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)\n\t\t\t\t\t) }\n\t\t\t\t\t<a className=\"tumblr-preview__url\" href={ url } target=\"_blank\" rel=\"noreferrer\">\n\t\t\t\t\t\t{ __( 'View On WordPress', 'social-previews' ) }\n\t\t\t\t\t</a>\n\t\t\t\t</div>\n\t\t\t\t<TumblrPostActions />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { SectionHeading } from '../shared/section-heading';\nimport { SocialPreviewsBaseProps } from '../types';\nimport { TumblrLinkPreview } from './link-preview';\nimport { TumblrPostPreview } from './post-preview';\nimport { TumblrPreviewProps } from './types';\n\nexport type TumblrPreviewsProps = TumblrPreviewProps & SocialPreviewsBaseProps;\n\nexport const TumblrPreviews: React.FC< TumblrPreviewsProps > = ( {\n\theadingLevel,\n\thideLinkPreview,\n\thidePostPreview,\n\t...props\n} ) => {\n\tconst hasMedia = !! props.media?.length;\n\n\treturn (\n\t\t<div className=\"social-preview tumblr-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section tumblr-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Tumblr\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on Tumblr:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t{ hasMedia ? <TumblrPostPreview { ...props } /> : <TumblrLinkPreview { ...props } /> }\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section tumblr-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link on Tumblr\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on Tumblr.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<TumblrLinkPreview { ...props } user={ undefined } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport SectionHeading from '../shared/section-heading';\nimport { SocialPreviewsBaseProps } from '../types';\nimport { FacebookLinkPreview } from './link-preview';\nimport { LinkPreviewDetails } from './link-preview-details';\nimport { FacebookPostPreview } from './post-preview';\nimport type { FacebookPreviewProps } from './types';\n\nexport type FacebookPreviewsProps = FacebookPreviewProps & SocialPreviewsBaseProps;\n\nexport const FacebookPreviews: React.FC< FacebookPreviewsProps > = ( {\n\theadingLevel,\n\thideLinkPreview,\n\thidePostPreview,\n\t...props\n} ) => {\n\tconst hasMedia = !! props.media?.length;\n\tconst hasCustomImage = !! props.customImage;\n\n\treturn (\n\t\t<div className=\"social-preview facebook-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section facebook-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Facebook\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on Facebook:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t{ hasMedia ? <FacebookPostPreview { ...props } /> : <FacebookLinkPreview { ...props } /> }\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section facebook-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a Facebook post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on Facebook.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t{ hasCustomImage ? (\n\t\t\t\t\t\t<LinkPreviewDetails { ...props } />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<FacebookLinkPreview { ...props } compactDescription customText=\"\" user={ undefined } />\n\t\t\t\t\t) }\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { TYPE_ARTICLE, PORTRAIT_MODE } from '../constants';\nimport { baseDomain } from '../helpers';\nimport CustomText from './custom-text';\nimport { facebookTitle, facebookDescription } from './helpers';\nimport useImage from './hooks/use-image-hook';\nimport FacebookPostActions from './post/actions';\nimport FacebookPostHeader from './post/header';\nimport FacebookPostIcon from './post/icons';\nimport type { FacebookPreviewProps } from './types';\n\nimport './style.scss';\n\nexport type FacebookLinkPreviewProps = FacebookPreviewProps & {\n\tcompactDescription?: boolean;\n};\n\nexport const FacebookLinkPreview: React.FC< FacebookLinkPreviewProps > = ( {\n\turl,\n\ttitle,\n\tdescription,\n\timage,\n\tuser,\n\tcustomText,\n\ttype,\n\timageMode,\n\tcompactDescription,\n} ) => {\n\tconst [ mode, isLoadingImage, imgProps ] = useImage( { mode: imageMode } );\n\tconst isArticle = type === TYPE_ARTICLE;\n\tconst portraitMode = ( isArticle && ! image ) || mode === PORTRAIT_MODE;\n\tconst modeClass = `is-${ portraitMode ? 'portrait' : 'landscape' }`;\n\n\treturn (\n\t\t<div className=\"facebook-preview__post\">\n\t\t\t<FacebookPostHeader user={ user } />\n\t\t\t<div className=\"facebook-preview__content\">\n\t\t\t\t{ customText && <CustomText text={ customText } url={ url } /> }\n\t\t\t\t<div\n\t\t\t\t\tclassName={ `facebook-preview__body ${ modeClass } ${\n\t\t\t\t\t\timage && isLoadingImage ? 'is-loading' : ''\n\t\t\t\t\t}` }\n\t\t\t\t>\n\t\t\t\t\t{ ( image || isArticle ) && (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName={ `facebook-preview__image ${ image ? '' : 'is-empty' } ${ modeClass }` }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ /* eslint-disable jsx-a11y/alt-text */ }\n\t\t\t\t\t\t\t{ image && <img src={ image } { ...imgProps } /> }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) }\n\t\t\t\t\t<div className=\"facebook-preview__text\">\n\t\t\t\t\t\t<div className=\"facebook-preview__text-wrapper\">\n\t\t\t\t\t\t\t<div className=\"facebook-preview__url\">{ baseDomain( url ) }</div>\n\t\t\t\t\t\t\t<div className=\"facebook-preview__title\">\n\t\t\t\t\t\t\t\t{ facebookTitle( title ) || baseDomain( url ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={ `facebook-preview__description ${\n\t\t\t\t\t\t\t\t\tcompactDescription ? 'is-compact' : ''\n\t\t\t\t\t\t\t\t}` }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ description && facebookDescription( description ) }\n\t\t\t\t\t\t\t\t{ isArticle &&\n\t\t\t\t\t\t\t\t\t! description &&\n\t\t\t\t\t\t\t\t\t// translators: Default description for a Facebook post\n\t\t\t\t\t\t\t\t\t__( 'Visit the post for more.', 'social-previews' ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"facebook-preview__info\">\n\t\t\t\t\t\t\t\t<FacebookPostIcon name=\"info\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<FacebookPostActions />\n\t\t</div>\n\t);\n};\n","export const AUTO_SHARED_SOCIAL_POST_PREVIEW = 'AUTO_SHARED_SOCIAL_POST_PREVIEW';\nexport const AUTO_SHARED_LINK_PREVIEW = 'AUTO_SHARED_LINK_PREVIEW';\nexport const DEFAULT_LINK_PREVIEW = 'DEFAULT_LINK_PREVIEW';\n\nexport const TYPE_WEBSITE = 'website';\nexport const TYPE_ARTICLE = 'article';\n\nexport const LANDSCAPE_MODE = 'landscape';\nexport const PORTRAIT_MODE = 'portrait';\n","import { firstValid, hardTruncation, shortEnough, stripHtmlTags, Formatter } from '../helpers';\n\nconst TITLE_LENGTH = 110;\nconst DESCRIPTION_LENGTH = 200;\nexport const CUSTOM_TEXT_LENGTH = 440;\n\nexport const facebookTitle: Formatter = text =>\n\tfirstValid(\n\t\tshortEnough( TITLE_LENGTH ),\n\t\thardTruncation( TITLE_LENGTH )\n\t)( stripHtmlTags( text ) ) || '';\n\nexport const facebookDescription: Formatter = text =>\n\tfirstValid(\n\t\tshortEnough( DESCRIPTION_LENGTH ),\n\t\thardTruncation( DESCRIPTION_LENGTH )\n\t)( stripHtmlTags( text ) ) || '';\n","import { hasTag, preparePreviewText } from '../helpers';\nimport { CUSTOM_TEXT_LENGTH } from './helpers';\n\ntype Props = {\n\ttext: string;\n\turl: string;\n\tforceUrlDisplay?: boolean;\n};\n\nconst CustomText: React.FC< Props > = ( { text, url, forceUrlDisplay } ) => {\n\tlet postLink;\n\n\tif ( forceUrlDisplay || hasTag( text, 'a' ) ) {\n\t\tpostLink = (\n\t\t\t<a\n\t\t\t\tclassName=\"facebook-preview__custom-text-post-url\"\n\t\t\t\thref={ url }\n\t\t\t\trel=\"nofollow noopener noreferrer\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t>\n\t\t\t\t{ url }\n\t\t\t</a>\n\t\t);\n\t}\n\n\treturn (\n\t\t<p className=\"facebook-preview__custom-text\">\n\t\t\t<span>\n\t\t\t\t{ preparePreviewText( text, {\n\t\t\t\t\tplatform: 'facebook',\n\t\t\t\t\tmaxChars: CUSTOM_TEXT_LENGTH,\n\t\t\t\t} ) }\n\t\t\t</span>\n\t\t\t{ postLink }\n\t\t</p>\n\t);\n};\n\nexport default CustomText;\n","import { __ } from '@wordpress/i18n';\nimport { useCallback, useState } from 'react';\nimport { LANDSCAPE_MODE, PORTRAIT_MODE } from '../../constants';\nimport type { ImageMode } from '../types';\n\ntype ImageEventHandler = ( event: React.SyntheticEvent< HTMLImageElement > ) => void;\ntype ImgProps = {\n\talt: string;\n\tonLoad: ImageEventHandler;\n\tonError: ImageEventHandler;\n};\ntype UseImage = ( arg0: { mode?: ImageMode } ) => [ ImageMode | undefined, boolean, ImgProps ];\n\nconst useImage: UseImage = ( { mode: initialMode } ) => {\n\tconst [ mode, setMode ] = useState< ImageMode | undefined >( initialMode );\n\tconst [ isLoadingImage, setLoadingImage ] = useState< boolean >( true );\n\n\tconst onLoad = useCallback< ImageEventHandler >(\n\t\t( { target } ) => {\n\t\t\tif ( ! mode ) {\n\t\t\t\tconst image = target as HTMLImageElement;\n\t\t\t\tsetMode( image.naturalWidth > image.naturalHeight ? LANDSCAPE_MODE : PORTRAIT_MODE );\n\t\t\t}\n\t\t\tsetLoadingImage( false );\n\t\t},\n\t\t[ mode ]\n\t);\n\tconst onError = useCallback( () => setLoadingImage( false ), [] );\n\n\treturn [\n\t\tmode,\n\t\tisLoadingImage,\n\t\t{\n\t\t\talt: __( 'Facebook Preview Thumbnail', 'social-previews' ),\n\t\t\tonLoad,\n\t\t\tonError,\n\t\t},\n\t];\n};\n\nexport default useImage;\n","import { __ } from '@wordpress/i18n';\nimport FacebookPostIcon from '../icons';\n\nimport './styles.scss';\n\nconst FacebookPostActions: React.FC = () => (\n\t<ul className=\"facebook-preview__post-actions\">\n\t\t{ [\n\t\t\t{\n\t\t\t\ticon: 'like',\n\t\t\t\t// translators: Facebook \"Like\" action\n\t\t\t\tlabel: __( 'Like', 'social-previews' ),\n\t\t\t},\n\t\t\t{\n\t\t\t\ticon: 'comment',\n\t\t\t\t// translators: Facebook \"Comment\" action\n\t\t\t\tlabel: __( 'Comment', 'social-previews' ),\n\t\t\t},\n\t\t\t{\n\t\t\t\ticon: 'share',\n\t\t\t\t// translators: Facebook \"Share\" action\n\t\t\t\tlabel: __( 'Share', 'social-previews' ),\n\t\t\t},\n\t\t].map( ( { icon, label } ) => (\n\t\t\t<li key={ icon }>\n\t\t\t\t<FacebookPostIcon name={ icon } />\n\t\t\t\t<span>{ label }</span>\n\t\t\t</li>\n\t\t) ) }\n\t</ul>\n);\n\nexport default FacebookPostActions;\n","import './styles.scss';\n\nconst FacebookPostIcon: React.FC< { name: string } > = ( { name } ) => (\n\t<i className={ `facebook-preview__post-icon facebook-preview__post-icon-${ name }` } />\n);\n\nexport default FacebookPostIcon;\n","import { __, _x } from '@wordpress/i18n';\nimport { AvatarWithFallback } from '../../../avatar-with-fallback';\nimport FacebookPostIcon from '../icons';\nimport type { FacebookUser } from '../../types';\nimport './styles.scss';\n\ntype Props = {\n\tuser?: FacebookUser;\n\ttimeElapsed?: boolean;\n\thideOptions?: boolean;\n};\n\nconst FacebookPostHeader: React.FC< Props > = ( { user, timeElapsed, hideOptions } ) => {\n\treturn (\n\t\t<div className=\"facebook-preview__post-header\">\n\t\t\t<div className=\"facebook-preview__post-header-content\">\n\t\t\t\t<AvatarWithFallback\n\t\t\t\t\tclassName=\"facebook-preview__post-header-avatar\"\n\t\t\t\t\tsrc={ user?.avatarUrl }\n\t\t\t\t/>\n\t\t\t\t<div>\n\t\t\t\t\t<div className=\"facebook-preview__post-header-name\">\n\t\t\t\t\t\t{ user?.displayName ||\n\t\t\t\t\t\t\t// translators: name of a fictional Facebook User\n\t\t\t\t\t\t\t__( 'Anonymous User', 'social-previews' ) }\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"facebook-preview__post-header-share\">\n\t\t\t\t\t\t<span className=\"facebook-preview__post-header-time\">\n\t\t\t\t\t\t\t{ timeElapsed\n\t\t\t\t\t\t\t\t? __(\n\t\t\t\t\t\t\t\t\t\t// translators: short version of `1 hour`\n\t\t\t\t\t\t\t\t\t\t'1h',\n\t\t\t\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t\t: _x(\n\t\t\t\t\t\t\t\t\t\t// translators: temporal indication of when a post was published\n\t\t\t\t\t\t\t\t\t\t'Just now',\n\t\t\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t\t\t ) }\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"facebook-preview__post-header-dot\" aria-hidden=\"true\">\n\t\t\t\t\t\t\t·\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<FacebookPostIcon name=\"public\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{ ! hideOptions && <div className=\"facebook-preview__post-header-more\"></div> }\n\t\t</div>\n\t);\n};\n\nexport default FacebookPostHeader;\n","import { PORTRAIT_MODE } from '../constants';\nimport CustomText from './custom-text';\nimport useImage from './hooks/use-image-hook';\nimport FacebookPostActions from './post/actions';\nimport FacebookPostHeader from './post/header';\nimport type { FacebookPreviewProps } from './types';\n\nexport const LinkPreviewDetails: React.FC< FacebookPreviewProps > = ( {\n\turl,\n\tcustomImage,\n\tuser,\n\tcustomText,\n\timageMode,\n} ) => {\n\tconst [ mode, isLoadingImage, imgProps ] = useImage( { mode: imageMode } );\n\tconst modeClass = `is-${ mode === PORTRAIT_MODE ? 'portrait' : 'landscape' }`;\n\n\treturn (\n\t\t<div className=\"facebook-preview__post\">\n\t\t\t<FacebookPostHeader user={ undefined } />\n\t\t\t<div className=\"facebook-preview__content\">\n\t\t\t\t<div\n\t\t\t\t\tclassName={ `facebook-preview__window ${ modeClass } ${\n\t\t\t\t\t\tcustomImage && isLoadingImage ? 'is-loading' : ''\n\t\t\t\t\t}` }\n\t\t\t\t>\n\t\t\t\t\t<div className={ `facebook-preview__custom-image ${ modeClass }` }>\n\t\t\t\t\t\t{ /* eslint-disable jsx-a11y/alt-text */ }\n\t\t\t\t\t\t<img src={ customImage } { ...imgProps } />\n\t\t\t\t\t</div>\n\t\t\t\t\t<FacebookPostHeader user={ user } timeElapsed hideOptions />\n\t\t\t\t\t{ customText && <CustomText text={ customText } url={ url } forceUrlDisplay /> }\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<FacebookPostActions />\n\t\t</div>\n\t);\n};\n","import { PORTRAIT_MODE } from '../constants';\nimport CustomText from './custom-text';\nimport useImage from './hooks/use-image-hook';\nimport FacebookPostActions from './post/actions';\nimport FacebookPostHeader from './post/header';\nimport type { FacebookPreviewProps } from './types';\n\nimport './style.scss';\n\nexport const FacebookPostPreview: React.FC< FacebookPreviewProps > = ( {\n\turl,\n\tuser,\n\tcustomText,\n\tmedia,\n\timageMode,\n} ) => {\n\tconst [ mode ] = useImage( { mode: imageMode } );\n\tconst modeClass = `is-${ mode === PORTRAIT_MODE ? 'portrait' : 'landscape' }`;\n\n\treturn (\n\t\t<div className=\"facebook-preview__post\">\n\t\t\t<FacebookPostHeader user={ user } />\n\t\t\t<div className=\"facebook-preview__content\">\n\t\t\t\t{ customText && <CustomText text={ customText } url={ url } forceUrlDisplay /> }\n\t\t\t\t<div className=\"facebook-preview__body\">\n\t\t\t\t\t{ media ? (\n\t\t\t\t\t\t<div className={ `facebook-preview__media ${ modeClass }` }>\n\t\t\t\t\t\t\t{ media.map( ( mediaItem, index ) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={ `facebook-preview__media-item-${ index }` }\n\t\t\t\t\t\t\t\t\tclassName={ `facebook-preview__media-item ${ modeClass }` }\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ mediaItem.type.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null }\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<FacebookPostActions />\n\t\t</div>\n\t);\n};\n","import './styles.scss';\n\nconst MastodonPostActions: React.FC = () => (\n\t<div className=\"mastodon-preview__post-actions\">\n\t\t<div>\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\theight=\"24\"\n\t\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\t\twidth=\"24\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path d=\"M760-200v-160q0-50-35-85t-85-35H273l144 144-57 56-240-240 240-240 57 56-144 144h367q83 0 141.5 58.5T840-360v160h-80Z\"></path>\n\t\t\t</svg>\n\t\t\t \n\t\t\t<span>{ 0 }</span>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\theight=\"24\"\n\t\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\t\twidth=\"24\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path d=\"M280-80 120-240l160-160 56 58-62 62h406v-160h80v240H274l62 62-56 58Zm-80-440v-240h486l-62-62 56-58 160 160-160 160-56-58 62-62H280v160h-80Z\"></path>\n\t\t\t</svg>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\theight=\"24\"\n\t\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\t\twidth=\"24\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path d=\"m354-287 126-76 126 77-33-144 111-96-146-13-58-136-58 135-146 13 111 97-33 143ZM233-120l65-281L80-590l288-25 112-265 112 265 288 25-218 189 65 281-247-149-247 149Zm247-350Z\"></path>\n\t\t\t</svg>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\theight=\"24\"\n\t\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\t\twidth=\"24\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path d=\"M200-120v-640q0-33 23.5-56.5T280-840h400q33 0 56.5 23.5T760-760v640L480-240 200-120Zm80-122 200-86 200 86v-518H280v518Zm0-518h400-400Z\"></path>\n\t\t\t</svg>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\theight=\"24\"\n\t\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\t\twidth=\"24\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path d=\"M240-400q-33 0-56.5-23.5T160-480q0-33 23.5-56.5T240-560q33 0 56.5 23.5T320-480q0 33-23.5 56.5T240-400Zm240 0q-33 0-56.5-23.5T400-480q0-33 23.5-56.5T480-560q33 0 56.5 23.5T560-480q0 33-23.5 56.5T480-400Zm240 0q-33 0-56.5-23.5T640-480q0-33 23.5-56.5T720-560q33 0 56.5 23.5T800-480q0 33-23.5 56.5T720-400Z\"></path>\n\t\t\t</svg>\n\t\t</div>\n\t</div>\n);\n\nexport default MastodonPostActions;\n","export const DEFAULT_MASTODON_INSTANCE = 'mastodon.social';\n","import {\n\tfirstValid,\n\thardTruncation,\n\tshortEnough,\n\tstripHtmlTags,\n\tpreparePreviewText,\n\tFormatter,\n} from '../helpers';\nimport { DEFAULT_MASTODON_INSTANCE } from './constants';\nimport { MastodonAddressDetails } from './types';\n\nconst TITLE_LENGTH = 200;\nconst BODY_LENGTH = 500;\nconst URL_LENGTH = 30;\n\nconst ADDRESS_PATTERN = /^@([^@]*)@([^@]*)$/i;\n\nexport const mastodonTitle: Formatter = text =>\n\tfirstValid(\n\t\tshortEnough( TITLE_LENGTH ),\n\t\thardTruncation( TITLE_LENGTH )\n\t)( stripHtmlTags( text ) ) || '';\n\nexport const mastodonBody = ( text: string, options: { offset: number; instance: string } ) => {\n\tconst { instance, offset } = options;\n\n\treturn preparePreviewText( text, {\n\t\tplatform: 'mastodon',\n\t\tmaxChars: BODY_LENGTH - URL_LENGTH - offset,\n\t\thashtagDomain: instance,\n\t} );\n};\n\nexport const mastodonUrl: Formatter = text =>\n\tfirstValid( shortEnough( URL_LENGTH ), hardTruncation( URL_LENGTH ) )( stripHtmlTags( text ) ) ||\n\t'';\n\nexport const getMastodonAddressDetails = ( address: string ): MastodonAddressDetails => {\n\tconst matches = address.match( ADDRESS_PATTERN );\n\n\treturn {\n\t\tusername: matches?.[ 1 ] || '',\n\t\tinstance: matches?.[ 2 ] || DEFAULT_MASTODON_INSTANCE,\n\t};\n};\n","import { stripHtmlTags } from '../../../helpers';\nimport { getMastodonAddressDetails, mastodonBody, mastodonUrl } from '../../helpers';\nimport type { MastodonPreviewProps } from '../../types';\n\nimport './styles.scss';\n\ntype Props = MastodonPreviewProps & { children?: React.ReactNode };\n\nconst MastonPostBody: React.FC< Props > = props => {\n\tconst { title, description, customText, url, user, children } = props;\n\tconst instance = user?.address ? getMastodonAddressDetails( user.address ).instance : '';\n\tconst options = {\n\t\tinstance,\n\t\toffset: 0,\n\t};\n\n\tlet bodyTxt;\n\n\tif ( customText ) {\n\t\tbodyTxt = <p>{ mastodonBody( customText, options ) }</p>;\n\t} else if ( description ) {\n\t\tif ( title ) {\n\t\t\tconst renderedTitle = stripHtmlTags( title );\n\n\t\t\toptions.offset = renderedTitle.length;\n\n\t\t\tbodyTxt = (\n\t\t\t\t<>\n\t\t\t\t\t<p>{ renderedTitle }</p>\n\t\t\t\t\t<p>{ mastodonBody( description, options ) }</p>\n\t\t\t\t</>\n\t\t\t);\n\t\t} else {\n\t\t\tbodyTxt = <p>{ mastodonBody( description, options ) }</p>;\n\t\t}\n\t} else {\n\t\tbodyTxt = <p>{ mastodonBody( title, options ) }</p>;\n\t}\n\n\treturn (\n\t\t<div className=\"mastodon-preview__body\">\n\t\t\t{ bodyTxt }\n\t\t\t<a href={ url } target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t{ mastodonUrl( url.replace( /^https?:\\/\\//, '' ) ) }\n\t\t\t</a>\n\t\t\t{ children }\n\t\t</div>\n\t);\n};\n\nexport default MastonPostBody;\n","import { __ } from '@wordpress/i18n';\nimport clsx from 'clsx';\nimport { baseDomain, getTitleFromDescription, stripHtmlTags } from '../../../helpers';\nimport { mastodonTitle } from '../../helpers';\nimport { MastodonPreviewProps } from '../../types';\n\nimport './styles.scss';\n\nconst MastodonPostCard: React.FC< MastodonPreviewProps > = ( {\n\tsiteName,\n\ttitle,\n\tdescription,\n\turl,\n\timage,\n\tcustomImage,\n} ) => {\n\treturn (\n\t\t<div className={ clsx( 'mastodon-preview__card', { 'has-image': image } ) }>\n\t\t\t<div className=\"mastodon-preview__card-img\">\n\t\t\t\t{ image || customImage ? (\n\t\t\t\t\t<img\n\t\t\t\t\t\tsrc={ image || customImage }\n\t\t\t\t\t\talt={ __( 'Mastodon preview thumbnail', 'social-previews' ) }\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"mastodon-preview__card-img--fallback\">\n\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\theight=\"24\"\n\t\t\t\t\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\t\t\t\t\twidth=\"24\"\n\t\t\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<path d=\"M320-240h320v-80H320v80Zm0-160h320v-80H320v80ZM240-80q-33 0-56.5-23.5T160-160v-640q0-33 23.5-56.5T240-880h320l240 240v480q0 33-23.5 56.5T720-80H240Zm280-520h200L520-800v200Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t) }\n\t\t\t</div>\n\t\t\t<div className=\"mastodon-preview__card-text\">\n\t\t\t\t<span className=\"mastodon-preview__card-site\">{ siteName || baseDomain( url ) }</span>\n\t\t\t\t<span className=\"mastodon-preview__card-title\">\n\t\t\t\t\t{ mastodonTitle( title ) || getTitleFromDescription( description ) }\n\t\t\t\t</span>\n\t\t\t\t<span className=\"mastodon-preview__card-description\">{ stripHtmlTags( description ) }</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default MastodonPostCard;\n","import { __ } from '@wordpress/i18n';\nimport { AvatarWithFallback } from '../../../avatar-with-fallback';\nimport { formatMastodonDate } from '../../../helpers';\nimport { DEFAULT_MASTODON_INSTANCE } from '../../constants';\nimport { GlobeIcon } from '../icons';\nimport type { MastodonPreviewProps } from '../../types';\nimport './styles.scss';\n\ntype Props = Pick< MastodonPreviewProps, 'user' >;\n\nconst MastodonPostHeader: React.FC< Props > = ( { user } ) => {\n\tconst { displayName, address, avatarUrl } = user || {};\n\n\treturn (\n\t\t<div className=\"mastodon-preview__post-header\">\n\t\t\t<div className=\"mastodon-preview__post-header-user\">\n\t\t\t\t<AvatarWithFallback className=\"mastodon-preview__post-avatar\" src={ avatarUrl } />\n\t\t\t\t<div>\n\t\t\t\t\t<div className=\"mastodon-preview__post-header-displayname\">\n\t\t\t\t\t\t{ displayName ||\n\t\t\t\t\t\t\t// translators: username of a fictional Mastodon User\n\t\t\t\t\t\t\t__( 'anonymous-user', 'social-previews' ) }\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"mastodon-preview__post-header-username\">\n\t\t\t\t\t\t{ address?.replace( `@${ DEFAULT_MASTODON_INSTANCE }`, '' ) || '@username' }\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"mastodon-preview__post-header-audience\">\n\t\t\t\t<GlobeIcon />\n\t\t\t\t{ formatMastodonDate( new Date() ) }\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default MastodonPostHeader;\n","/**\n * Globe Icon Component\n *\n * @return The Globe SVG icon component.\n */\nexport function GlobeIcon() {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\theight=\"15\"\n\t\t\tviewBox=\"0 -960 960 960\"\n\t\t\twidth=\"15\"\n\t\t\trole=\"img\"\n\t\t>\n\t\t\t<path d=\"M480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm-40-82v-78q-33 0-56.5-23.5T360-320v-40L168-552q-3 18-5.5 36t-2.5 36q0 121 79.5 212T440-162Zm276-102q20-22 36-47.5t26.5-53q10.5-27.5 16-56.5t5.5-59q0-98-54.5-179T600-776v16q0 33-23.5 56.5T520-680h-80v80q0 17-11.5 28.5T400-560h-80v80h240q17 0 28.5 11.5T600-440v120h40q26 0 47 15.5t29 40.5Z\"></path>\n\t\t</svg>\n\t);\n}\n","import MastodonPostActions from './post/actions';\nimport MastonPostBody from './post/body';\nimport MastodonPostCard from './post/card';\nimport MastodonPostHeader from './post/header';\nimport type { MastodonPreviewProps } from './types';\n\nimport './styles.scss';\n\nexport const MastodonLinkPreview: React.FC< MastodonPreviewProps > = props => {\n\tconst { user } = props;\n\n\treturn (\n\t\t<div className=\"mastodon-preview__post\">\n\t\t\t<MastodonPostHeader user={ user } />\n\t\t\t<MastonPostBody { ...props } />\n\t\t\t<MastodonPostCard { ...props } customImage=\"\" />\n\t\t\t<MastodonPostActions />\n\t\t</div>\n\t);\n};\n","import clsx from 'clsx';\nimport MastodonPostActions from './post/actions';\nimport MastonPostBody from './post/body';\nimport MastodonPostCard from './post/card';\nimport MastodonPostHeader from './post/header';\nimport type { MastodonPreviewProps } from './types';\n\nimport './styles.scss';\n\nexport const MastodonPostPreview: React.FC< MastodonPreviewProps > = props => {\n\tconst { user, media } = props;\n\n\treturn (\n\t\t<div className=\"mastodon-preview__post\">\n\t\t\t<MastodonPostHeader user={ user } />\n\t\t\t<MastonPostBody { ...props }>\n\t\t\t\t{ media?.length ? (\n\t\t\t\t\t<div className={ clsx( 'mastodon-preview__media', { 'as-grid': media.length > 1 } ) }>\n\t\t\t\t\t\t{ media.map( ( mediaItem, index ) => (\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tkey={ `mastodon-preview__media-item-${ index }` }\n\t\t\t\t\t\t\t\tclassName=\"mastodon-preview__media-item\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ mediaItem.type.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) ) }\n\t\t\t\t\t</div>\n\t\t\t\t) : null }\n\t\t\t</MastonPostBody>\n\t\t\t{ ! media?.length ? <MastodonPostCard { ...props } /> : null }\n\t\t\t<MastodonPostActions />\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { SectionHeading } from '../shared/section-heading';\nimport { SocialPreviewsBaseProps } from '../types';\nimport { MastodonLinkPreview } from './link-preview';\nimport { MastodonPostPreview } from './post-preview';\nimport { MastodonPreviewProps } from './types';\n\nexport type MastodonPreviewsProps = MastodonPreviewProps & SocialPreviewsBaseProps;\n\nexport const MastodonPreviews: React.FC< MastodonPreviewsProps > = ( {\n\theadingLevel,\n\thidePostPreview,\n\thideLinkPreview,\n\t...props\n} ) => {\n\treturn (\n\t\t<div className=\"social-preview mastodon-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section mastodon-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Mastodon\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on Mastodon:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<MastodonPostPreview { ...props } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section mastodon-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a Mastodon post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on Mastodon.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<MastodonLinkPreview { ...props } user={ undefined } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport clsx from 'clsx';\nimport { AvatarWithFallback } from '../avatar-with-fallback';\nimport {\n\tbaseDomain,\n\tformatNextdoorDate,\n\tgetTitleFromDescription,\n\tpreparePreviewText,\n} from '../helpers';\nimport { FEED_TEXT_MAX_LENGTH } from './constants';\nimport { FooterActions } from './footer-actions';\nimport { ChevronIcon } from './icons/chevron-icon';\nimport { DefaultImage } from './icons/default-image';\nimport { GlobeIcon } from './icons/globe-icon';\nimport { NextdoorPreviewProps } from './types';\nimport './style.scss';\n\n/**\n * Nextdoor Post Preview Component.\n *\n * @param {NextdoorPreviewProps} props - The preview properties.\n * @return The Nextdoor post preview component.\n */\nexport function NextdoorPostPreview( {\n\timage,\n\tname,\n\tprofileImage,\n\tdescription,\n\tneighborhood,\n\tmedia,\n\ttitle,\n\turl,\n}: NextdoorPreviewProps ) {\n\tconst hasMedia = !! media?.length;\n\n\treturn (\n\t\t<div className=\"nextdoor-preview__wrapper\">\n\t\t\t<section className={ `nextdoor-preview__container ${ hasMedia ? 'has-media' : '' }` }>\n\t\t\t\t<div className=\"nextdoor-preview__content\">\n\t\t\t\t\t<div className=\"nextdoor-preview__header\">\n\t\t\t\t\t\t<div className=\"nextdoor-preview__header--avatar\">\n\t\t\t\t\t\t\t<AvatarWithFallback src={ profileImage } />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"nextdoor-preview__header--details\">\n\t\t\t\t\t\t\t<div className=\"nextdoor-preview__header--name\">\n\t\t\t\t\t\t\t\t{ name || __( 'Account Name', 'social-previews' ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"nextdoor-preview__header--meta\">\n\t\t\t\t\t\t\t\t<span>{ neighborhood || __( 'Neighborhood', 'social-previews' ) }</span>\n\t\t\t\t\t\t\t\t<span>•</span>\n\t\t\t\t\t\t\t\t<span>{ formatNextdoorDate( Date.now() ) }</span>\n\t\t\t\t\t\t\t\t<span>•</span>\n\t\t\t\t\t\t\t\t{ /* This is the Globe SVG that represents visibility to be \"public\" */ }\n\t\t\t\t\t\t\t\t<GlobeIcon />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"nextdoor-preview__body\">\n\t\t\t\t\t\t{ description ? (\n\t\t\t\t\t\t\t<div className=\"nextdoor-preview__caption\">\n\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t{ preparePreviewText( description, {\n\t\t\t\t\t\t\t\t\t\tplatform: 'nextdoor',\n\t\t\t\t\t\t\t\t\t\tmaxChars: FEED_TEXT_MAX_LENGTH,\n\t\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{ ! hasMedia && url && (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t<a href={ url } rel=\"nofollow noopener noreferrer\" target=\"_blank\">\n\t\t\t\t\t\t\t\t\t\t\t{ url }\n\t\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t{ hasMedia ? (\n\t\t\t\t\t\t\t<div className=\"nextdoor-preview__media\">\n\t\t\t\t\t\t\t\t{ media.map( ( mediaItem, index ) => {\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tkey={ `nextdoor-preview__media-item-${ index }` }\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"nextdoor-preview__media-item\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ mediaItem?.type?.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null }\n\n\t\t\t\t\t\t<article\n\t\t\t\t\t\t\tclassName={ clsx( 'nextdoor-preview__card', {\n\t\t\t\t\t\t\t\t'small-preview': ! image || hasMedia,\n\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ image ? (\n\t\t\t\t\t\t\t\t<img className=\"nextdoor-preview__image\" src={ image } alt=\"\" />\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<DefaultImage />\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t{ url ? (\n\t\t\t\t\t\t\t\t<div className=\"nextdoor-preview__description\">\n\t\t\t\t\t\t\t\t\t<h2 className=\"nextdoor-preview__description--title\">\n\t\t\t\t\t\t\t\t\t\t{ title || getTitleFromDescription( description ) }\n\t\t\t\t\t\t\t\t\t</h2>\n\t\t\t\t\t\t\t\t\t<span className=\"nextdoor-preview__description--url\">{ baseDomain( url ) }</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t\t{ hasMedia ? (\n\t\t\t\t\t\t\t\t<div className=\"nextdoor-preview__card--chevron-wrapper\">\n\t\t\t\t\t\t\t\t\t<ChevronIcon />\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t</article>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"nextdoor-preview__footer\">\n\t\t\t\t\t\t<FooterActions />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</div>\n\t);\n}\n","export const FEED_TEXT_MAX_LENGTH = 500;\n","import { __ } from '@wordpress/i18n';\nimport { CommentIcon } from './icons/comment-icon';\nimport { LikeIcon } from './icons/like-icon';\nimport { ShareIcon } from './icons/share-icon';\n\n/**\n * Footer Actions Component\n *\n * @return The Nextdoor footer actions component.\n */\nexport function FooterActions() {\n\treturn (\n\t\t<div className=\"nextdoor-preview__footer--actions\">\n\t\t\t<div className=\"nextdoor-preview__footer--actions-item\">\n\t\t\t\t<LikeIcon />\n\t\t\t\t<span>{ __( 'Like', 'social-previews' ) }</span>\n\t\t\t</div>\n\t\t\t<div className=\"nextdoor-preview__footer--actions-item\">\n\t\t\t\t<CommentIcon />\n\t\t\t\t<span>{ __( 'Comment', 'social-previews' ) }</span>\n\t\t\t</div>\n\t\t\t<div className=\"nextdoor-preview__footer--actions-item\">\n\t\t\t\t<ShareIcon />\n\t\t\t\t<span>{ __( 'Share', 'social-previews' ) }</span>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","/**\n * Comment Icon Component\n *\n * @return The Comment SVG icon component.\n */\nexport function CommentIcon() {\n\treturn (\n\t\t<svg width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n\t\t\t<path\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M2 10.031C2 5.596 5.574 2 10 2h4c4.427 0 8 3.596 8 8.031 0 4.435-3.573 8.031-8 8.031h-1.52a17.033 17.033 0 0 1-1.377 1.467c-.991.938-2.456 2.079-4.086 2.437a1.403 1.403 0 0 1-1.458-.565 1.55 1.55 0 0 1-.195-1.394c.28-.823.395-1.734.434-2.464.014-.257.018-.485.018-.672A8.017 8.017 0 0 1 2 10.031Zm5.798 6.178a7.02 7.02 0 0 1 .016.418c.005.252.004.606-.019 1.023-.03.573-.103 1.285-.266 2.024.775-.377 1.54-.974 2.202-1.598a15.066 15.066 0 0 0 1.448-1.586l.017-.022.003-.004a1 1 0 0 1 .801-.402h2c3.314 0 6-2.692 6-6.03C20 6.691 17.314 4 14 4h-4c-3.314 0-6 2.692-6 6.031 0 2.336 1.32 4.36 3.258 5.359.308.159.515.474.54.82Z\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t></path>\n\t\t</svg>\n\t);\n}\n","/**\n * Like Icon component.\n *\n * @return Like Icon component.\n */\nexport function LikeIcon() {\n\treturn (\n\t\t<svg width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n\t\t\t<path\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M13.275 8.752a1.5 1.5 0 0 1-2.55 0C9.75 7.18 8.719 5.617 6.565 6.074 5.248 6.352 4 7.433 4 9.644c0 2.153 1.348 4.592 4.259 7.236A28.475 28.475 0 0 0 12 19.74a28.475 28.475 0 0 0 3.741-2.86C18.651 14.236 20 11.797 20 9.643c0-2.21-1.25-3.29-2.564-3.57-2.155-.456-3.187 1.106-4.16 2.68Zm-2.581-3.48C7.634 2.58 2 4.217 2 9.643c0 2.996 1.85 5.934 4.914 8.717 1.478 1.343 3.1 2.585 4.839 3.575a.5.5 0 0 0 .494 0c1.739-.99 3.361-2.232 4.84-3.575C20.148 15.577 22 12.64 22 9.643c0-5.426-5.634-7.062-8.694-4.371A5.287 5.287 0 0 0 12 7.04a5.287 5.287 0 0 0-1.306-1.77Z\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t></path>\n\t\t</svg>\n\t);\n}\n","/**\n * Share Icon Component\n *\n * @return The Share SVG icon component.\n */\nexport function ShareIcon() {\n\treturn (\n\t\t<svg width=\"20\" height=\"20\" fill=\"none\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n\t\t\t<path\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M11.617 2.076a1 1 0 0 1 1.09.217l9 9a1 1 0 0 1 0 1.414l-9 9A1 1 0 0 1 11 21v-4.436c-2.849.366-5.261 2.271-6.384 4.837a1 1 0 0 1-1.856-.06C2.338 20.182 2 18.86 2 17.5a9.959 9.959 0 0 1 9-9.951V3a1 1 0 0 1 .617-.924ZM13 5.414V8.5a1 1 0 0 1-1 1c-4.448 0-8 3.552-8 8 0 .31.023.625.066.94C5.905 16.067 8.776 14.5 12 14.5a1 1 0 0 1 1 1v3.086L19.586 12 13 5.414Z\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t></path>\n\t\t</svg>\n\t);\n}\n","/**\n * Chevron Icon Component\n *\n * @return The Chevron SVG icon component.\n */\nexport function ChevronIcon() {\n\treturn (\n\t\t<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n\t\t\t<path\n\t\t\t\tfill=\"#dfe1e4\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M7.127 13.876a.732.732 0 1 0 1.035 1.035l4.75-4.749a.732.732 0 0 0 0-1.035L8.123 4.34A.732.732 0 0 0 7.09 5.375l4.27 4.27-4.232 4.23Z\"\n\t\t\t></path>\n\t\t</svg>\n\t);\n}\n","/**\n * Default Image Icon Component\n *\n * @return The Default Image SVG icon component.\n */\nexport function DefaultImage() {\n\treturn (\n\t\t<div className=\"nextdoor-preview__default-image\">\n\t\t\t<svg\n\t\t\t\twidth=\"24\"\n\t\t\t\theight=\"24\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\taria-hidden=\"true\"\n\t\t\t\tcolor=\"#055c00\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\td=\"M13.207 5.207c1.51-1.51 4.076-1.51 5.586 0 1.51 1.51 1.51 4.076 0 5.586l-2.1 2.1c-1.51 1.51-4.077 1.51-5.586 0a1 1 0 1 0-1.414 1.414c2.29 2.29 6.123 2.29 8.414 0l2.1-2.1c2.29-2.29 2.29-6.124 0-8.414s-6.124-2.29-8.414 0l-.7.7a1 1 0 0 0 1.414 1.414l.7-.7Z\"\n\t\t\t\t></path>\n\t\t\t\t<path\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\td=\"M7.307 11.107c1.51-1.51 4.076-1.51 5.586 0a1 1 0 0 0 1.414-1.414c-2.29-2.29-6.124-2.29-8.414 0l-2.1 2.1c-2.29 2.29-2.29 6.123 0 8.414 2.29 2.29 6.124 2.29 8.414 0l.7-.7a1 1 0 0 0-1.414-1.414l-.7.7c-1.51 1.51-4.076 1.51-5.586 0-1.51-1.51-1.51-4.076 0-5.586l2.1-2.1Z\"\n\t\t\t\t></path>\n\t\t\t</svg>\n\t\t</div>\n\t);\n}\n","/**\n * Globe Icon Component\n *\n * @return The Globe SVG icon component.\n */\nexport function GlobeIcon() {\n\treturn (\n\t\t<svg width=\"14\" height=\"14\" fill=\"none\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n\t\t\t<path\n\t\t\t\tfill=\"currentColor\"\n\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\td=\"M2 12C2 6.477 6.477 2 12 2s10 4.477 10 10-4.477 10-10 10S2 17.523 2 12Zm9.495-7.643c.286-.335.46-.357.505-.357.045 0 .219.022.505.357.282.33.581.868.852 1.619.464 1.283.79 3.034.872 5.024H9.771c.082-1.99.408-3.741.871-5.024.272-.751.571-1.289.854-1.62ZM7.77 11c.084-2.181.439-4.171.992-5.704.093-.255.192-.502.298-.738A8.009 8.009 0 0 0 4.062 11h3.707Zm-3.707 2h3.707c.084 2.181.439 4.171.992 5.704.093.255.192.502.298.738A8.009 8.009 0 0 1 4.062 13Zm15.876-2a8.009 8.009 0 0 0-4.997-6.442c.106.236.205.483.298.738.553 1.533.908 3.523.992 5.704h3.707Zm-3.707 2h3.707a8.009 8.009 0 0 1-4.997 6.442c.106-.236.205-.483.298-.738.553-1.533.908-3.523.992-5.704Zm-2.002 0c-.082 1.99-.408 3.741-.871 5.024-.272.751-.571 1.289-.854 1.62-.285.334-.46.356-.504.356-.045 0-.219-.022-.505-.357-.282-.33-.581-.868-.852-1.619-.464-1.283-.79-3.034-.872-5.024h4.458Z\"\n\t\t\t\tclipRule=\"evenodd\"\n\t\t\t></path>\n\t\t</svg>\n\t);\n}\n","import { getTitleFromDescription } from '../helpers';\nimport { NextdoorPostPreview } from './post-preview';\nimport { NextdoorPreviewProps } from './types';\n\ntype OptionalProps = Partial< Pick< NextdoorPreviewProps, 'name' | 'profileImage' > >;\n\nexport type NextdoorLinkPreviewProps = Omit< NextdoorPreviewProps, keyof OptionalProps > &\n\tOptionalProps;\n\n/**\n * Nextdoor Link Preview Component\n *\n * @param {NextdoorLinkPreviewProps} props - The props for the Nextdoor link preview.\n *\n * @return The Nextdoor link preview component.\n */\nexport function NextdoorLinkPreview( props: NextdoorLinkPreviewProps ) {\n\treturn (\n\t\t<NextdoorPostPreview\n\t\t\tname=\"\"\n\t\t\tprofileImage=\"\"\n\t\t\t{ ...props }\n\t\t\t// Override the props that are irrelevant to link preview\n\t\t\tdescription=\"\"\n\t\t\tmedia={ undefined }\n\t\t\ttitle={ props.title || getTitleFromDescription( props.description ) }\n\t\t/>\n\t);\n}\n","import { __ } from '@wordpress/i18n';\nimport SectionHeading from '../shared/section-heading';\nimport { NextdoorLinkPreview } from './link-preview';\nimport { NextdoorPostPreview } from './post-preview';\nimport type { NextdoorPreviewsProps } from './types';\n\nexport const NextdoorPreviews: React.FC< NextdoorPreviewsProps > = ( {\n\theadingLevel,\n\thideLinkPreview,\n\thidePostPreview,\n\t...props\n} ) => {\n\treturn (\n\t\t<div className=\"social-preview nextdoor-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section nextdoor-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Nextdoor\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on Nextdoor:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<NextdoorPostPreview { ...props } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section nextdoor-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a Nextdoor post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on Nextdoor.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<NextdoorLinkPreview { ...props } name=\"\" profileImage=\"\" />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","import clsx from 'clsx';\nimport BlueskyPostActions from './post/actions';\nimport BlueskyPostBody from './post/body';\nimport BlueskyPostCard from './post/card';\nimport BlueskyPostHeader from './post/header';\nimport { BlueskyPostSidebar } from './post/sidebar';\nimport type { BlueskyPreviewProps } from './types';\n\nimport './styles.scss';\n\nexport const BlueskyPostPreview: React.FC< BlueskyPreviewProps > = props => {\n\tconst { user, media, appendUrl } = props;\n\n\treturn (\n\t\t<div className=\"bluesky-preview__post\">\n\t\t\t<BlueskyPostSidebar user={ user } />\n\t\t\t<div>\n\t\t\t\t<BlueskyPostHeader user={ user } />\n\t\t\t\t<BlueskyPostBody { ...props } appendUrl={ appendUrl ?? Boolean( media?.length ) }>\n\t\t\t\t\t{ media?.length ? (\n\t\t\t\t\t\t<div className={ clsx( 'bluesky-preview__media', { 'as-grid': media.length > 1 } ) }>\n\t\t\t\t\t\t\t{ media.map( ( mediaItem, index ) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={ `bluesky-preview__media-item-${ index }` }\n\t\t\t\t\t\t\t\t\tclassName=\"bluesky-preview__media-item\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ mediaItem.type.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : null }\n\t\t\t\t</BlueskyPostBody>\n\t\t\t\t{ ! media?.length ? <BlueskyPostCard { ...props } /> : null }\n\t\t\t\t<BlueskyPostActions />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import './styles.scss';\n\nconst BlueskyPostActions: React.FC = () => (\n\t<div className=\"bluesky-preview__post-actions\">\n\t\t<div>\n\t\t\t<svg\n\t\t\t\tfill=\"none\"\n\t\t\t\twidth=\"18\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\theight=\"18\"\n\t\t\t\tstyle={ { color: 'rgb(111, 134, 159)' } }\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\tfill=\"hsl(211, 20%, 53%)\"\n\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\t\td=\"M2.002 6a3 3 0 0 1 3-3h14a3 3 0 0 1 3 3v10a3 3 0 0 1-3 3H12.28l-4.762 2.858A1 1 0 0 1 6.002 21v-2h-1a3 3 0 0 1-3-3V6Zm3-1a1 1 0 0 0-1 1v10a1 1 0 0 0 1 1h2a1 1 0 0 1 1 1v1.234l3.486-2.092a1 1 0 0 1 .514-.142h7a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1h-14Z\"\n\t\t\t\t></path>\n\t\t\t</svg>\n\t\t\t<span>{ 0 }</span>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg\n\t\t\t\tfill=\"none\"\n\t\t\t\twidth=\"18\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\theight=\"18\"\n\t\t\t\tstyle={ { color: 'rgb(111, 134, 159)' } }\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\tfill=\"hsl(211, 20%, 53%)\"\n\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\t\td=\"M17.957 2.293a1 1 0 1 0-1.414 1.414L17.836 5H6a3 3 0 0 0-3 3v3a1 1 0 1 0 2 0V8a1 1 0 0 1 1-1h11.836l-1.293 1.293a1 1 0 0 0 1.414 1.414l2.47-2.47a1.75 1.75 0 0 0 0-2.474l-2.47-2.47ZM20 12a1 1 0 0 1 1 1v3a3 3 0 0 1-3 3H6.164l1.293 1.293a1 1 0 1 1-1.414 1.414l-2.47-2.47a1.75 1.75 0 0 1 0-2.474l2.47-2.47a1 1 0 0 1 1.414 1.414L6.164 17H18a1 1 0 0 0 1-1v-3a1 1 0 0 1 1-1Z\"\n\t\t\t\t></path>\n\t\t\t</svg>\n\t\t\t<span>{ 0 }</span>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg\n\t\t\t\tfill=\"none\"\n\t\t\t\twidth=\"18\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\theight=\"18\"\n\t\t\t\tstyle={ { color: 'rgb(111, 134, 159)' } }\n\t\t\t\taria-hidden=\"true\"\n\t\t\t>\n\t\t\t\t<path\n\t\t\t\t\tfill=\"hsl(211, 20%, 53%)\"\n\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\t\td=\"M16.734 5.091c-1.238-.276-2.708.047-4.022 1.38a1 1 0 0 1-1.424 0C9.974 5.137 8.504 4.814 7.266 5.09c-1.263.282-2.379 1.206-2.92 2.556C3.33 10.18 4.252 14.84 12 19.348c7.747-4.508 8.67-9.168 7.654-11.7-.541-1.351-1.657-2.275-2.92-2.557Zm4.777 1.812c1.604 4-.494 9.69-9.022 14.47a1 1 0 0 1-.978 0C2.983 16.592.885 10.902 2.49 6.902c.779-1.942 2.414-3.334 4.342-3.764 1.697-.378 3.552.003 5.169 1.286 1.617-1.283 3.472-1.664 5.17-1.286 1.927.43 3.562 1.822 4.34 3.764Z\"\n\t\t\t\t></path>\n\t\t\t</svg>\n\t\t\t<span>{ 0 }</span>\n\t\t</div>\n\t\t<div>\n\t\t\t<svg fill=\"none\" viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" aria-hidden=\"true\">\n\t\t\t\t<path\n\t\t\t\t\tfill=\"hsl(211, 20%, 53%)\"\n\t\t\t\t\tfillRule=\"evenodd\"\n\t\t\t\t\tclipRule=\"evenodd\"\n\t\t\t\t\td=\"M2 12a2 2 0 1 1 4 0 2 2 0 0 1-4 0Zm16 0a2 2 0 1 1 4 0 2 2 0 0 1-4 0Zm-6-2a2 2 0 1 0 0 4 2 2 0 0 0 0-4Z\"\n\t\t\t\t></path>\n\t\t\t</svg>\n\t\t</div>\n\t</div>\n);\n\nexport default BlueskyPostActions;\n","import {\n\tfirstValid,\n\thardTruncation,\n\tshortEnough,\n\tstripHtmlTags,\n\tpreparePreviewText,\n\tFormatter,\n} from '../helpers';\n\nconst TITLE_LENGTH = 200;\nconst BODY_LENGTH = 300;\nconst URL_LENGTH = 40;\n\nexport const blueskyTitle: Formatter = text =>\n\tfirstValid(\n\t\tshortEnough( TITLE_LENGTH ),\n\t\thardTruncation( TITLE_LENGTH )\n\t)( stripHtmlTags( text ) ) || '';\n\nexport const blueskyBody = ( text: string, options: { offset?: number } = {} ) => {\n\tconst { offset = 0 } = options;\n\n\treturn preparePreviewText( text, {\n\t\tplatform: 'bluesky',\n\t\tmaxChars: BODY_LENGTH - URL_LENGTH - offset,\n\t} );\n};\n\nexport const blueskyUrl: Formatter = text =>\n\tfirstValid( shortEnough( URL_LENGTH ), hardTruncation( URL_LENGTH ) )( stripHtmlTags( text ) ) ||\n\t'';\n","import { blueskyBody, blueskyUrl } from '../../helpers';\nimport type { BlueskyPreviewProps } from '../../types';\n\nimport './styles.scss';\n\ntype Props = BlueskyPreviewProps & { children?: React.ReactNode };\n\nconst BlueskyPostBody: React.FC< Props > = ( { customText, url, children, appendUrl } ) => {\n\treturn (\n\t\t<div className=\"bluesky-preview__body\">\n\t\t\t{ customText ? (\n\t\t\t\t<>\n\t\t\t\t\t<div>{ blueskyBody( customText ) }</div>\n\t\t\t\t\t{ appendUrl && url ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t<a href={ url } target=\"_blank\" rel=\"noreferrer noopener\">\n\t\t\t\t\t\t\t\t{ blueskyUrl( url.replace( /^https?:\\/\\//, '' ) ) }\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : null }\n\t\t\t\t</>\n\t\t\t) : null }\n\t\t\t{ children }\n\t\t</div>\n\t);\n};\n\nexport default BlueskyPostBody;\n","import { baseDomain, getTitleFromDescription, stripHtmlTags } from '../../../helpers';\nimport { blueskyTitle } from '../../helpers';\nimport { BlueskyPreviewProps } from '../../types';\n\nimport './styles.scss';\n\nconst BlueskyPostCard: React.FC< BlueskyPreviewProps > = ( { title, description, url, image } ) => {\n\treturn (\n\t\t<div className=\"bluesky-preview__card\">\n\t\t\t{ image ? (\n\t\t\t\t<div className=\"bluesky-preview__card-image\">\n\t\t\t\t\t<img src={ image } alt=\"\" />\n\t\t\t\t</div>\n\t\t\t) : null }\n\t\t\t<div className=\"bluesky-preview__card-text\">\n\t\t\t\t<div className=\"bluesky-preview__card-site\">{ baseDomain( url ) }</div>\n\t\t\t\t<div className=\"bluesky-preview__card-title\">\n\t\t\t\t\t{ blueskyTitle( title ) || getTitleFromDescription( description ) }\n\t\t\t\t</div>\n\t\t\t\t<div className=\"bluesky-preview__card-description\">{ stripHtmlTags( description ) }</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default BlueskyPostCard;\n","import { __, _x } from '@wordpress/i18n';\nimport type { BlueskyPreviewProps } from '../../types';\n\nimport './styles.scss';\n\ntype Props = Pick< BlueskyPreviewProps, 'user' >;\n\nconst BlueskyPostHeader: React.FC< Props > = ( { user } ) => {\n\tconst { displayName, address } = user || {};\n\n\tlet handle = address || 'username.bsky.social';\n\t// Ensure that the handle starts with the '@' symbol.\n\tif ( ! handle.startsWith( '@' ) ) {\n\t\thandle = '@' + handle;\n\t}\n\n\treturn (\n\t\t<div className=\"bluesky-preview__post-header\">\n\t\t\t<div className=\"bluesky-preview__post-header-user\">\n\t\t\t\t<span className=\"bluesky-preview__post-header--displayname\">\n\t\t\t\t\t{ displayName || __( 'Account name', 'social-previews' ) }\n\t\t\t\t</span>\n\t\t\t\t<span className=\"bluesky-preview__post-header--username\">{ handle }</span>\n\t\t\t</div>\n\t\t\t<div className=\"bluesky-preview__post-header--separator\">·</div>\n\t\t\t<div className=\"bluesky-preview__post-header--date\">\n\t\t\t\t{ _x(\n\t\t\t\t\t'1h',\n\t\t\t\t\t'refers to the time since the post was published, e.g. \"1h\"',\n\t\t\t\t\t'social-previews'\n\t\t\t\t) }\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default BlueskyPostHeader;\n","import { AvatarWithFallback } from '../../../avatar-with-fallback';\nimport type { BlueskyPreviewProps } from '../../types';\n\nimport './styles.scss';\n\ntype Props = Pick< BlueskyPreviewProps, 'user' >;\n\nexport const BlueskyPostSidebar: React.FC< Props > = ( { user } ) => {\n\tconst { avatarUrl } = user || {};\n\n\treturn (\n\t\t<div className=\"bluesky-preview__post-sidebar\">\n\t\t\t<div className=\"bluesky-preview__post-sidebar-user\">\n\t\t\t\t<AvatarWithFallback className=\"bluesky-preview__post-avatar\" src={ avatarUrl } />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { BlueskyPostPreview } from './post-preview';\nimport type { BlueskyPreviewProps } from './types';\n\nexport const BlueskyLinkPreview: React.FC< BlueskyPreviewProps > = props => {\n\treturn <BlueskyPostPreview { ...props } user={ undefined } media={ undefined } customText=\"\" />;\n};\n","import { __ } from '@wordpress/i18n';\nimport { SectionHeading } from '../shared/section-heading';\nimport { SocialPreviewsBaseProps } from '../types';\nimport { BlueskyLinkPreview } from './link-preview';\nimport { BlueskyPostPreview } from './post-preview';\nimport { BlueskyPreviewProps } from './types';\n\nexport type BlueskyPreviewsProps = BlueskyPreviewProps & SocialPreviewsBaseProps;\n\nexport const BlueskyPreviews: React.FC< BlueskyPreviewsProps > = ( {\n\theadingLevel,\n\thidePostPreview,\n\thideLinkPreview,\n\t...props\n} ) => {\n\treturn (\n\t\t<div className=\"social-preview bluesky-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section bluesky-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Bluesky\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on Bluesky:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<BlueskyPostPreview { ...props } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview && (\n\t\t\t\t<section className=\"social-preview__section bluesky-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a Bluesky post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on Bluesky.',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<BlueskyLinkPreview { ...props } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n","import clsx from 'clsx';\nimport { baseDomain } from '../helpers';\nimport { threadsTitle } from './helpers';\nimport { ThreadsCardProps } from './types';\n\nexport const Card: React.FC< ThreadsCardProps > = ( { image, title, url } ) => {\n\tconst cardClassNames = clsx( {\n\t\t'threads-preview__card-has-image': !! image,\n\t} );\n\n\treturn (\n\t\t<div className=\"threads-preview__card\">\n\t\t\t<div className={ cardClassNames }>\n\t\t\t\t{ image && <img className=\"threads-preview__card-image\" src={ image } alt=\"\" /> }\n\t\t\t\t<div className=\"threads-preview__card-body\">\n\t\t\t\t\t<div className=\"threads-preview__card-url\">{ baseDomain( url || '' ) }</div>\n\t\t\t\t\t<div className=\"threads-preview__card-title\">{ threadsTitle( title ) }</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { firstValid, hardTruncation, shortEnough, stripHtmlTags, Formatter } from '../helpers';\n\nconst TITLE_LENGTH = 120;\n\nexport const CAPTION_MAX_CHARS = 500;\n\nexport const threadsTitle: Formatter = text =>\n\tfirstValid(\n\t\tshortEnough( TITLE_LENGTH ),\n\t\thardTruncation( TITLE_LENGTH )\n\t)( stripHtmlTags( text ) ) || '';\n","export const Footer: React.FC = () => {\n\treturn (\n\t\t<div className=\"threads-preview__footer\">\n\t\t\t<span className=\"threads-preview__icon--like\">\n\t\t\t\t<svg role=\"img\" viewBox=\"0 0 18 18\">\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M1.34375 7.53125L1.34375 7.54043C1.34374 8.04211 1.34372 8.76295 1.6611 9.65585C1.9795 10.5516 2.60026 11.5779 3.77681 12.7544C5.59273 14.5704 7.58105 16.0215 8.33387 16.5497C8.73525 16.8313 9.26573 16.8313 9.66705 16.5496C10.4197 16.0213 12.4074 14.5703 14.2232 12.7544C15.3997 11.5779 16.0205 10.5516 16.3389 9.65585C16.6563 8.76296 16.6563 8.04211 16.6562 7.54043V7.53125C16.6562 5.23466 15.0849 3.25 12.6562 3.25C11.5214 3.25 10.6433 3.78244 9.99228 4.45476C9.59009 4.87012 9.26356 5.3491 9 5.81533C8.73645 5.3491 8.40991 4.87012 8.00772 4.45476C7.35672 3.78244 6.47861 3.25 5.34375 3.25C2.9151 3.25 1.34375 5.23466 1.34375 7.53125Z\"\n\t\t\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t\t\t></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"threads-preview__icon--reply\">\n\t\t\t\t<svg role=\"img\" viewBox=\"0 0 18 18\">\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M15.376 13.2177L16.2861 16.7955L12.7106 15.8848C12.6781 15.8848 12.6131 15.8848 12.5806 15.8848C11.3779 16.5678 9.94767 16.8931 8.41995 16.7955C4.94194 16.5353 2.08152 13.7381 1.72397 10.2578C1.2689 5.63919 5.13697 1.76863 9.75264 2.22399C13.2307 2.58177 16.0261 5.41151 16.2861 8.92429C16.4161 10.453 16.0586 11.8841 15.376 13.0876C15.376 13.1526 15.376 13.1852 15.376 13.2177Z\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t\t\t></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"threads-preview__icon--repost\">\n\t\t\t\t<svg role=\"img\" viewBox=\"0 0 18 18\">\n\t\t\t\t\t<path d=\"M6.41256 1.23531C6.6349 0.971277 7.02918 0.937481 7.29321 1.15982L9.96509 3.40982C10.1022 3.52528 10.1831 3.69404 10.1873 3.87324C10.1915 4.05243 10.1186 4.2248 9.98706 4.34656L7.31518 6.81971C7.06186 7.05419 6.66643 7.03892 6.43196 6.7856C6.19748 6.53228 6.21275 6.13685 6.46607 5.90237L7.9672 4.51289H5.20312C3.68434 4.51289 2.45312 5.74411 2.45312 7.26289V9.51289V11.7629C2.45312 13.2817 3.68434 14.5129 5.20312 14.5129C5.5483 14.5129 5.82812 14.7927 5.82812 15.1379C5.82812 15.4831 5.5483 15.7629 5.20312 15.7629C2.99399 15.7629 1.20312 13.972 1.20312 11.7629V9.51289V7.26289C1.20312 5.05375 2.99399 3.26289 5.20312 3.26289H7.85002L6.48804 2.11596C6.22401 1.89362 6.19021 1.49934 6.41256 1.23531Z\"></path>\n\t\t\t\t\t<path d=\"M11.5874 17.7904C11.3651 18.0545 10.9708 18.0883 10.7068 17.8659L8.03491 15.6159C7.89781 15.5005 7.81687 15.3317 7.81267 15.1525C7.80847 14.9733 7.8814 14.801 8.01294 14.6792L10.6848 12.206C10.9381 11.9716 11.3336 11.9868 11.568 12.2402C11.8025 12.4935 11.7872 12.8889 11.5339 13.1234L10.0328 14.5129H12.7969C14.3157 14.5129 15.5469 13.2816 15.5469 11.7629V9.51286V7.26286C15.5469 5.74408 14.3157 4.51286 12.7969 4.51286C12.4517 4.51286 12.1719 4.23304 12.1719 3.88786C12.1719 3.54269 12.4517 3.26286 12.7969 3.26286C15.006 3.26286 16.7969 5.05373 16.7969 7.26286V9.51286V11.7629C16.7969 13.972 15.006 15.7629 12.7969 15.7629H10.15L11.512 16.9098C11.776 17.1321 11.8098 17.5264 11.5874 17.7904Z\"></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t\t<span className=\"threads-preview__icon--share\">\n\t\t\t\t<svg role=\"img\" viewBox=\"0 0 18 18\">\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M15.6097 4.09082L6.65039 9.11104\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t\t\t></path>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M7.79128 14.439C8.00463 15.3275 8.11131 15.7718 8.33426 15.932C8.52764 16.071 8.77617 16.1081 9.00173 16.0318C9.26179 15.9438 9.49373 15.5501 9.95761 14.7628L15.5444 5.2809C15.8883 4.69727 16.0603 4.40546 16.0365 4.16566C16.0159 3.95653 15.9071 3.76612 15.7374 3.64215C15.5428 3.5 15.2041 3.5 14.5267 3.5H3.71404C2.81451 3.5 2.36474 3.5 2.15744 3.67754C1.97758 3.83158 1.88253 4.06254 1.90186 4.29856C1.92415 4.57059 2.24363 4.88716 2.88259 5.52032L6.11593 8.7243C6.26394 8.87097 6.33795 8.94431 6.39784 9.02755C6.451 9.10144 6.4958 9.18101 6.53142 9.26479C6.57153 9.35916 6.59586 9.46047 6.64451 9.66309L7.79128 14.439Z\"\n\t\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t\t\tstrokeWidth=\"1.25\"\n\t\t\t\t\t></path>\n\t\t\t\t</svg>\n\t\t\t</span>\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { formatThreadsDate } from '../helpers';\nimport { HeaderProps } from './types';\n\nexport const Header: React.FC< HeaderProps > = ( { name, date } ) => {\n\tconst postDate = date || new Date();\n\n\treturn (\n\t\t<div className=\"threads-preview__header\">\n\t\t\t<span className=\"threads-preview__name\">\n\t\t\t\t{ name || __( 'Account Name', 'social-previews' ) }\n\t\t\t</span>\n\t\t\t<time className=\"threads-preview__date\" dateTime={ postDate.toISOString() }>\n\t\t\t\t{ formatThreadsDate( postDate ) }\n\t\t\t</time>\n\t\t</div>\n\t);\n};\n","import clsx from 'clsx';\nimport { Fragment } from 'react';\nimport { MediaProps } from './types';\n\nexport const Media: React.FC< MediaProps > = ( { media } ) => {\n\t// Ensure we're only trying to show valid media, and the correct quantity.\n\tconst filteredMedia = media\n\t\t// Only image/ and video/ mime types are supported.\n\t\t.filter(\n\t\t\tmediaItem => mediaItem.type.startsWith( 'image/' ) || mediaItem.type.startsWith( 'video/' )\n\t\t)\n\t\t.filter( ( mediaItem, idx, array ) => {\n\t\t\t// We'll always keep the first item.\n\t\t\tif ( 0 === idx ) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// If the first item was a video or GIF, discard all subsequent items.\n\t\t\tif ( array[ 0 ].type.startsWith( 'video/' ) || 'image/gif' === array[ 0 ].type ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// The first item wasn't a video or GIF, so discard all subsequent videos and GIFs.\n\t\t\tif ( mediaItem.type.startsWith( 'video/' ) || 'image/gif' === mediaItem.type ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t} )\n\t\t// We only want the first four items of the array, at most.\n\t\t.slice( 0, 4 );\n\n\tif ( 0 === filteredMedia.length ) {\n\t\treturn null;\n\t}\n\n\tconst isVideo = filteredMedia[ 0 ].type.startsWith( 'video/' );\n\n\tconst mediaClasses = clsx( [\n\t\t'threads-preview__media',\n\t\t'threads-preview__media-children-' + filteredMedia.length,\n\t] );\n\n\treturn (\n\t\t<div className={ mediaClasses }>\n\t\t\t{ filteredMedia.map( ( mediaItem, index ) => (\n\t\t\t\t<Fragment key={ `threads-preview__media-item-${ index }` }>\n\t\t\t\t\t{ isVideo ? (\n\t\t\t\t\t\t<video controls>\n\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t</video>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<img alt={ mediaItem.alt || '' } src={ mediaItem.url } />\n\t\t\t\t\t) }\n\t\t\t\t</Fragment>\n\t\t\t) ) }\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { AvatarWithFallback } from '../avatar-with-fallback';\nimport { SidebarProps } from './types';\n\nexport const Sidebar: React.FC< SidebarProps > = ( { profileImage, showThreadConnector } ) => {\n\treturn (\n\t\t<div className=\"threads-preview__sidebar\">\n\t\t\t<div className=\"threads-preview__profile-image\">\n\t\t\t\t<AvatarWithFallback\n\t\t\t\t\talt={ __( 'Threads profile image', 'social-previews' ) }\n\t\t\t\t\tsrc={ profileImage }\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t{ showThreadConnector && <div className=\"threads-preview__connector\" /> }\n\t\t</div>\n\t);\n};\n","import { preparePreviewText } from '../helpers';\nimport { Card } from './card';\nimport { Footer } from './footer';\nimport { Header } from './header';\nimport { CAPTION_MAX_CHARS } from './helpers';\nimport { Media } from './media';\nimport { Sidebar } from './sidebar';\nimport { ThreadsPreviewProps } from './types';\n\nimport './style.scss';\n\nexport const ThreadsPostPreview: React.FC< ThreadsPreviewProps > = ( {\n\tcaption,\n\tdate,\n\timage,\n\tmedia,\n\tname,\n\tprofileImage,\n\tshowThreadConnector,\n\ttitle,\n\turl,\n} ) => {\n\tconst hasMedia = !! media?.length;\n\n\tconst displayAsCard = url && image && ! hasMedia;\n\n\treturn (\n\t\t<div className=\"threads-preview__wrapper\">\n\t\t\t<div className=\"threads-preview__container\">\n\t\t\t\t<Sidebar profileImage={ profileImage } showThreadConnector={ showThreadConnector } />\n\t\t\t\t<div className=\"threads-preview__main\">\n\t\t\t\t\t<Header name={ name } date={ date } />\n\t\t\t\t\t<div className=\"threads-preview__content\">\n\t\t\t\t\t\t{ caption ? (\n\t\t\t\t\t\t\t<div className=\"threads-preview__text\">\n\t\t\t\t\t\t\t\t{ preparePreviewText( caption, {\n\t\t\t\t\t\t\t\t\tplatform: 'threads',\n\t\t\t\t\t\t\t\t\tmaxChars: CAPTION_MAX_CHARS,\n\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null }\n\t\t\t\t\t\t{ hasMedia ? <Media media={ media } /> : null }\n\t\t\t\t\t\t{ displayAsCard ? <Card image={ image } title={ title || '' } url={ url } /> : null }\n\t\t\t\t\t</div>\n\t\t\t\t\t<Footer />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { ThreadsPostPreview } from './post-preview';\nimport { ThreadsPreviewProps } from './types';\n\nexport const ThreadsLinkPreview: React.FC< ThreadsPreviewProps > = props => {\n\treturn (\n\t\t<ThreadsPostPreview\n\t\t\t{ ...props }\n\t\t\t// Override the props that are irrelevant to link preview\n\t\t\tcaption=\"\"\n\t\t\tmedia={ undefined }\n\t\t/>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport SectionHeading from '../shared/section-heading';\nimport { ThreadsLinkPreview } from './link-preview';\nimport { ThreadsPostPreview } from './post-preview';\nimport type { ThreadsPreviewsProps } from './types';\n\nexport const ThreadsPreviews: React.FC< ThreadsPreviewsProps > = ( {\n\theadingLevel,\n\thideLinkPreview,\n\thidePostPreview,\n\tposts,\n} ) => {\n\tif ( ! posts?.length ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"social-preview threads-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section threads-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Threads\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __( 'This is what your social post will look like on Threads:', 'social-previews' ) }\n\t\t\t\t\t</p>\n\t\t\t\t\t{ posts.map( ( post, index ) => {\n\t\t\t\t\t\tconst isLast = index + 1 === posts.length;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<ThreadsPostPreview\n\t\t\t\t\t\t\t\tkey={ `threads-preview__post-${ index }` }\n\t\t\t\t\t\t\t\t{ ...post }\n\t\t\t\t\t\t\t\tshowThreadConnector={ ! isLast }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</section>\n\t\t\t) }\n\t\t\t{ ! hideLinkPreview ? (\n\t\t\t\t<section className=\"social-preview__section threads-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a link to a Threads post\n\t\t\t\t\t\t\t__( 'Link preview', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t{ posts[ 0 ].image ? (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t'This is what it will look like when someone shares the link to your WordPress post on Threads.',\n\t\t\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<ThreadsLinkPreview { ...posts[ 0 ] } name=\"\" profileImage=\"\" />\n\t\t\t\t\t\t</>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t'Threads link preview requires an image to be set for the post. Please add an image to see the preview.',\n\t\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</p>\n\t\t\t\t\t) }\n\t\t\t\t</section>\n\t\t\t) : null }\n\t\t</div>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport { AvatarWithFallback } from '../avatar-with-fallback';\nimport { preparePreviewText } from '../helpers';\nimport { FEED_TEXT_MAX_LENGTH } from './constants';\nimport { Bookmark as BookmarkIcon } from './icons/bookmark';\nimport { Comment as CommentIcon } from './icons/comment';\nimport { Heart as HeartIcon } from './icons/heart';\nimport { Menu as MenuIcon } from './icons/menu';\nimport { Share as ShareIcon } from './icons/share';\nimport { InstagramPreviewProps } from './types';\nimport './style.scss';\n\n/**\n * Instagram Post Preview Component\n *\n * @param {InstagramPreviewProps} props - The props for the Instagram post preview.\n *\n * @return The Instagram post preview component.\n */\nexport function InstagramPostPreview( {\n\timage,\n\tmedia,\n\tname,\n\tprofileImage,\n\tcaption,\n\turl,\n}: InstagramPreviewProps ) {\n\tconst username = name || 'username';\n\n\tconst mediaItem = media?.[ 0 ];\n\n\treturn (\n\t\t<div className=\"instagram-preview__wrapper\">\n\t\t\t<section className=\"instagram-preview__container\">\n\t\t\t\t<div className=\"instagram-preview__header\">\n\t\t\t\t\t<div className=\"instagram-preview__header--avatar\">\n\t\t\t\t\t\t<AvatarWithFallback src={ profileImage } />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"instagram-preview__header--profile\">\n\t\t\t\t\t\t<div className=\"instagram-preview__header--profile-name\">{ username }</div>\n\t\t\t\t\t\t<div className=\"instagram-preview__header--profile-menu\">\n\t\t\t\t\t\t\t<MenuIcon />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"instagram-preview__media\">\n\t\t\t\t\t{ mediaItem ? (\n\t\t\t\t\t\t<div className=\"instagram-preview__media-item\">\n\t\t\t\t\t\t\t{ mediaItem.type.startsWith( 'video/' ) ? (\n\t\t\t\t\t\t\t\t<video controls={ false } className=\"instagram-preview__media--video\">\n\t\t\t\t\t\t\t\t\t<source src={ mediaItem.url } type={ mediaItem.type } />\n\t\t\t\t\t\t\t\t</video>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<img className=\"instagram-preview__media--image\" src={ mediaItem.url } alt=\"\" />\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<img className=\"instagram-preview__media--image\" src={ image } alt=\"\" />\n\t\t\t\t\t) }\n\t\t\t\t</div>\n\t\t\t\t<div className=\"instagram-preview__content\">\n\t\t\t\t\t<section className=\"instagram-preview__content--actions\">\n\t\t\t\t\t\t<div className=\"instagram-preview__content--actions-primary\">\n\t\t\t\t\t\t\t<HeartIcon />\n\t\t\t\t\t\t\t<CommentIcon />\n\t\t\t\t\t\t\t<ShareIcon />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"instagram-preview__content--actions-secondary\">\n\t\t\t\t\t\t\t<BookmarkIcon />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</section>\n\t\t\t\t\t<div className=\"instagram-preview__content--body\">\n\t\t\t\t\t\t<div className=\"instagram-preview__content--name\">{ username }</div>\n\t\t\t\t\t\t \n\t\t\t\t\t\t{ caption ? (\n\t\t\t\t\t\t\t<div className=\"instagram-preview__content--text\">\n\t\t\t\t\t\t\t\t{ preparePreviewText( caption, {\n\t\t\t\t\t\t\t\t\tplatform: 'instagram',\n\t\t\t\t\t\t\t\t\tmaxChars: FEED_TEXT_MAX_LENGTH,\n\t\t\t\t\t\t\t\t} ) }\n\t\t\t\t\t\t\t\t{ media && url && (\n\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t<br />\n\t\t\t\t\t\t\t\t\t\t{ url }\n\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : null }\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"instagram-preview__content--footer\">\n\t\t\t\t\t\t<span>{ __( 'View one comment', 'social-previews' ) }</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</div>\n\t);\n}\n","export const FEED_TEXT_MAX_LENGTH = 520;\n","export const Bookmark: React.FC = () => {\n\treturn (\n\t\t<svg\n\t\t\tcolor=\"rgb(38, 38, 38)\"\n\t\t\tfill=\"rgb(38, 38, 38)\"\n\t\t\theight=\"24\"\n\t\t\trole=\"img\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\twidth=\"24\"\n\t\t>\n\t\t\t<polygon\n\t\t\t\tfill=\"none\"\n\t\t\t\tpoints=\"20 21 12 13.44 4 21 4 3 20 3 20 21\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t></polygon>\n\t\t</svg>\n\t);\n};\n","export const Comment: React.FC = () => {\n\treturn (\n\t\t<svg\n\t\t\tcolor=\"rgb(38, 38, 38)\"\n\t\t\tfill=\"rgb(38, 38, 38)\"\n\t\t\theight=\"24\"\n\t\t\trole=\"img\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\twidth=\"24\"\n\t\t>\n\t\t\t<path\n\t\t\t\td=\"M20.656 17.008a9.993 9.993 0 1 0-3.59 3.615L22 22Z\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t></path>\n\t\t</svg>\n\t);\n};\n","export const Heart: React.FC = () => {\n\treturn (\n\t\t<svg\n\t\t\tcolor=\"rgb(38, 38, 38)\"\n\t\t\tfill=\"rgb(38, 38, 38)\"\n\t\t\theight=\"24\"\n\t\t\trole=\"img\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\twidth=\"24\"\n\t\t>\n\t\t\t<path d=\"M16.792 3.904A4.989 4.989 0 0 1 21.5 9.122c0 3.072-2.652 4.959-5.197 7.222-2.512 2.243-3.865 3.469-4.303 3.752-.477-.309-2.143-1.823-4.303-3.752C5.141 14.072 2.5 12.167 2.5 9.122a4.989 4.989 0 0 1 4.708-5.218 4.21 4.21 0 0 1 3.675 1.941c.84 1.175.98 1.763 1.12 1.763s.278-.588 1.11-1.766a4.17 4.17 0 0 1 3.679-1.938m0-2a6.04 6.04 0 0 0-4.797 2.127 6.052 6.052 0 0 0-4.787-2.127A6.985 6.985 0 0 0 .5 9.122c0 3.61 2.55 5.827 5.015 7.97.283.246.569.494.853.747l1.027.918a44.998 44.998 0 0 0 3.518 3.018 2 2 0 0 0 2.174 0 45.263 45.263 0 0 0 3.626-3.115l.922-.824c.293-.26.59-.519.885-.774 2.334-2.025 4.98-4.32 4.98-7.94a6.985 6.985 0 0 0-6.708-7.218Z\"></path>\n\t\t</svg>\n\t);\n};\n","export const Menu: React.FC = () => {\n\treturn (\n\t\t<svg width=\"17\" height=\"5\" viewBox=\"0 0 17 5\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t<path\n\t\t\t\td=\"M2.11865 3.5C2.67094 3.5 3.11865 3.05228 3.11865 2.5C3.11865 1.94772 2.67094 1.5 2.11865 1.5C1.56637 1.5 1.11865 1.94772 1.11865 2.5C1.11865 3.05228 1.56637 3.5 2.11865 3.5Z\"\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"black\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M8.55933 3.5C9.11161 3.5 9.55933 3.05228 9.55933 2.5C9.55933 1.94772 9.11161 1.5 8.55933 1.5C8.00704 1.5 7.55933 1.94772 7.55933 2.5C7.55933 3.05228 8.00704 3.5 8.55933 3.5Z\"\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"black\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M15 3.5C15.5523 3.5 16 3.05228 16 2.5C16 1.94772 15.5523 1.5 15 1.5C14.4477 1.5 14 1.94772 14 2.5C14 3.05228 14.4477 3.5 15 3.5Z\"\n\t\t\t\tfill=\"black\"\n\t\t\t\tstroke=\"black\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t/>\n\t\t</svg>\n\t);\n};\n","export const Share: React.FC = () => {\n\treturn (\n\t\t<svg\n\t\t\tcolor=\"rgb(38, 38, 38)\"\n\t\t\tfill=\"rgb(38, 38, 38)\"\n\t\t\theight=\"24\"\n\t\t\trole=\"img\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\twidth=\"24\"\n\t\t>\n\t\t\t<line\n\t\t\t\tfill=\"none\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t\tx1=\"22\"\n\t\t\t\tx2=\"9.218\"\n\t\t\t\ty1=\"3\"\n\t\t\t\ty2=\"10.083\"\n\t\t\t></line>\n\t\t\t<polygon\n\t\t\t\tfill=\"none\"\n\t\t\t\tpoints=\"11.698 20.334 22 3.001 2 3.001 9.218 10.084 11.698 20.334\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"2\"\n\t\t\t></polygon>\n\t\t</svg>\n\t);\n};\n","import { __ } from '@wordpress/i18n';\nimport SectionHeading from '../shared/section-heading';\nimport { InstagramPostPreview } from './post-preview';\nimport type { InstagramPreviewsProps } from './types';\n\nexport const InstagramPreviews: React.FC< InstagramPreviewsProps > = ( {\n\theadingLevel,\n\thidePostPreview,\n\t...props\n} ) => {\n\treturn (\n\t\t<div className=\"social-preview instagram-preview\">\n\t\t\t{ ! hidePostPreview && (\n\t\t\t\t<section className=\"social-preview__section instagram-preview__section\">\n\t\t\t\t\t<SectionHeading level={ headingLevel }>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// translators: refers to a social post on Instagram\n\t\t\t\t\t\t\t__( 'Your post', 'social-previews' )\n\t\t\t\t\t\t}\n\t\t\t\t\t</SectionHeading>\n\t\t\t\t\t<p className=\"social-preview__section-desc\">\n\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t'This is what your social post will look like on Instagram:',\n\t\t\t\t\t\t\t'social-previews'\n\t\t\t\t\t\t) }\n\t\t\t\t\t</p>\n\t\t\t\t\t<InstagramPostPreview { ...props } />\n\t\t\t\t</section>\n\t\t\t) }\n\t\t</div>\n\t);\n};\n"]}
|