├── tmp └── .gitkeep ├── public ├── .gitkeep └── favicon.ico ├── .github ├── config │ └── exclude.txt ├── pull_request_template.md └── workflows │ └── recover-cache.yml ├── postcss.config.js ├── src ├── components │ ├── notion-blocks │ │ ├── Divider.astro │ │ ├── embeds │ │ │ ├── astro-tweet │ │ │ │ ├── src │ │ │ │ │ ├── api │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ ├── types │ │ │ │ │ │ │ ├── edit.ts │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── photo.ts │ │ │ │ │ │ │ ├── user.ts │ │ │ │ │ │ │ ├── video.ts │ │ │ │ │ │ │ ├── entities.ts │ │ │ │ │ │ │ ├── media.ts │ │ │ │ │ │ │ └── tweet.ts │ │ │ │ │ │ └── get-tweet.ts │ │ │ │ │ ├── twitter-theme │ │ │ │ │ │ ├── tweet-skeleton.module.css │ │ │ │ │ │ ├── Skeleton.astro │ │ │ │ │ │ ├── AvatarImg.astro │ │ │ │ │ │ ├── MediaImg.astro │ │ │ │ │ │ ├── quoted-tweet │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── QuotedTweetContainer.astro │ │ │ │ │ │ │ ├── quoted-tweet-body.module.css │ │ │ │ │ │ │ ├── QuotedTweetBody.astro │ │ │ │ │ │ │ ├── quoted-tweet-container.module.css │ │ │ │ │ │ │ ├── QuotedTweet.astro │ │ │ │ │ │ │ ├── quoted-tweet-header.module.css │ │ │ │ │ │ │ └── QuotedTweetHeader.astro │ │ │ │ │ │ ├── icons │ │ │ │ │ │ │ ├── icons.module.css │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ ├── Verified.astro │ │ │ │ │ │ │ ├── VerifiedGovernment.astro │ │ │ │ │ │ │ └── VerifiedBusiness.astro │ │ │ │ │ │ ├── tweet-not-found.module.css │ │ │ │ │ │ ├── TweetLink.astro │ │ │ │ │ │ ├── tweet-link.module.css │ │ │ │ │ │ ├── tweet-body.module.css │ │ │ │ │ │ ├── verified-badge.module.css │ │ │ │ │ │ ├── tweet-info-created-at.module.css │ │ │ │ │ │ ├── tweet-in-reply-to.module.css │ │ │ │ │ │ ├── TweetNotFound.astro │ │ │ │ │ │ ├── TweetContainer.astro │ │ │ │ │ │ ├── TweetInReplyTo.astro │ │ │ │ │ │ ├── skeleton.module.css │ │ │ │ │ │ ├── TweetInfoCreatedAt.astro │ │ │ │ │ │ ├── types.ts │ │ │ │ │ │ ├── TweetSkeleton.astro │ │ │ │ │ │ ├── TweetMediaVideo.astro │ │ │ │ │ │ ├── tweet-container.module.css │ │ │ │ │ │ ├── TweetReplies.astro │ │ │ │ │ │ ├── components.ts │ │ │ │ │ │ ├── tweet-replies.module.css │ │ │ │ │ │ ├── TweetBody.astro │ │ │ │ │ │ ├── tweet-info.module.css │ │ │ │ │ │ ├── VerifiedBadge.astro │ │ │ │ │ │ ├── tweet-media.module.css │ │ │ │ │ │ ├── TweetInfo.astro │ │ │ │ │ │ ├── EmbeddedTweet.astro │ │ │ │ │ │ ├── tweet-media-video.module.css │ │ │ │ │ │ ├── TweetHeader.astro │ │ │ │ │ │ ├── tweet-header.module.css │ │ │ │ │ │ ├── TweetMedia.astro │ │ │ │ │ │ ├── TweetActions.astro │ │ │ │ │ │ └── tweet-actions.module.css │ │ │ │ │ ├── AstroTweet.astro │ │ │ │ │ ├── Tweet.astro │ │ │ │ │ └── TweetContent.astro │ │ │ │ └── index.ts │ │ │ ├── astro-bluesky │ │ │ │ ├── index.ts │ │ │ │ ├── types.ts │ │ │ │ ├── starter-pack.astro │ │ │ │ ├── list.astro │ │ │ │ ├── media-container.astro │ │ │ │ ├── avatar.astro │ │ │ │ ├── video-thumbnail.astro │ │ │ │ ├── image-grid.astro │ │ │ │ ├── embed.astro │ │ │ │ ├── external.astro │ │ │ │ ├── quote-embed.astro │ │ │ │ └── card.astro │ │ │ ├── PinterestEmbed.astro │ │ │ ├── SpotifyEmbed.astro │ │ │ ├── NotionEmbed.astro │ │ │ ├── BlueskyEmbed.astro │ │ │ ├── CodePenEmbed.astro │ │ │ ├── TikTokEmbed.astro │ │ │ ├── TweetEmbed.astro │ │ │ ├── EmbedGeneric.astro │ │ │ ├── NAudio.astro │ │ │ ├── GoogleMapsEmbed.astro │ │ │ └── Video.astro │ │ ├── MentionDate.astro │ │ ├── annotations │ │ │ ├── Italic.astro │ │ │ ├── Underline.astro │ │ │ ├── Bold.astro │ │ │ ├── Strikethrough.astro │ │ │ ├── Color.astro │ │ │ ├── Code.astro │ │ │ └── Anchor.astro │ │ ├── LinkToPage.astro │ │ ├── Equation.astro │ │ ├── SyncedBlock.astro │ │ ├── Caption.astro │ │ ├── ColumnList.astro │ │ ├── Quote.astro │ │ ├── MentionCustomEmoji.astro │ │ ├── TableOfContents.astro │ │ ├── Paragraph.astro │ │ ├── BulletedListItems.astro │ │ ├── File.astro │ │ ├── NumberedListItems.astro │ │ ├── Heading1.astro │ │ ├── Heading3.astro │ │ ├── Heading2.astro │ │ ├── ToDo.astro │ │ ├── Toggle.astro │ │ └── FootnoteContent.astro │ ├── ui │ │ ├── SkipLink.astro │ │ ├── FormattedDate.astro │ │ ├── Icon.astro │ │ └── ThemeIcon.astro │ ├── generated-mdx-snippets │ │ ├── MdxSnippetRenderer.astro │ │ └── mdxSnippetRegistry.ts │ ├── layout │ │ ├── Footer.astro │ │ └── HeroBackgroundCover.astro │ ├── auto-added-sections │ │ ├── webmentions │ │ │ ├── index.astro │ │ │ ├── Likes.astro │ │ │ └── Comments.astro │ │ ├── TOCHeading.astro │ │ ├── interlinked-content │ │ │ ├── LinksToThisPage.astro │ │ │ └── MediaLinksInThisPage.astro │ │ ├── FootnotesSection.astro │ │ └── BibliographySection.astro │ ├── popover │ │ ├── TagDescPopover.astro │ │ └── NPagePopover.astro │ └── listing-layout │ │ ├── Paginator.astro │ │ └── PostPreview.astro ├── integrations │ ├── delete-build-cache.ts │ ├── create-folders-if-missing.ts │ ├── build-timestamp-recorder.ts │ ├── custom-icon-downloader.ts │ ├── public-notion-copier.ts │ ├── citations-initializer.ts │ ├── external-render-cacheer.ts │ └── google-woff2-provider.mjs ├── env.d.ts ├── scripts │ ├── lightbox.ts │ ├── to-top-btn.ts │ └── print.ts ├── pages │ ├── 404.astro │ ├── collections │ │ └── index.astro │ ├── tags │ │ └── index.astro │ ├── rss.xml.ts │ ├── authors │ │ └── index.astro │ └── sitemap.xml.ts ├── utils │ ├── numbering.ts │ ├── shiki-highlighter.ts │ ├── date.ts │ └── index.ts ├── lib │ ├── notion │ │ ├── mdx-snippet-writer.ts │ │ └── request-params.ts │ ├── external-content │ │ ├── external-html-content.ts │ │ ├── remark-external-mdx-assets.ts │ │ └── external-html-utils.ts │ └── vite-external-content-plugins.ts ├── site.config.ts ├── layouts │ └── Base.astro └── types.ts ├── .editorconfig ├── .prettierignore ├── .prettierrc.js ├── .gitignore ├── tsconfig.json ├── LICENSE └── eslint.config.mjs /tmp/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.github/config/exclude.txt: -------------------------------------------------------------------------------- 1 | .vscode/ -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | "@tailwindcss/postcss": {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /src/components/notion-blocks/Divider.astro: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | --- 4 | 5 |
11 | {Astro.props.tweet.entities.map((item, i) => {item.text})} 12 |
13 | -------------------------------------------------------------------------------- /src/components/notion-blocks/embeds/astro-tweet/src/twitter-theme/tweet-in-reply-to.module.css: -------------------------------------------------------------------------------- 1 | .root { 2 | text-decoration: none; 3 | color: var(--tweet-font-color-secondary); 4 | font-size: 0.7rem; 5 | line-height: 1rem; 6 | margin-bottom: 0.25rem; 7 | overflow-wrap: break-word; 8 | white-space: pre-wrap; 9 | } 10 | .root:hover { 11 | text-decoration-thickness: 1px; 12 | text-decoration-line: underline; 13 | } 14 | -------------------------------------------------------------------------------- /src/components/notion-blocks/annotations/Bold.astro: -------------------------------------------------------------------------------- 1 | --- 2 | /* @jsxImportSource astro */ 3 | import type { RichText } from "@/lib/interfaces.ts"; 4 | 5 | export interface Props { 6 | richText: RichText; 7 | } 8 | 9 | const { richText } = Astro.props; 10 | --- 11 | 12 | { 13 | richText.Annotation.Bold ? ( 14 | 15 |The embedded tweet could not be found…
14 |
14 |
MDX snippet failed to load.
} 17 | -------------------------------------------------------------------------------- /src/components/notion-blocks/embeds/astro-tweet/src/twitter-theme/quoted-tweet/quoted-tweet-container.module.css: -------------------------------------------------------------------------------- 1 | .root { 2 | width: 100%; 3 | overflow: hidden; 4 | border: var(--tweet-border); 5 | border-radius: 12px; 6 | margin: var(--tweet-quoted-container-margin); 7 | transition-property: background-color, box-shadow; 8 | transition-duration: 0.2s; 9 | /* cursor: pointer; */ 10 | } 11 | 12 | .root:hover { 13 | background-color: var(--tweet-quoted-bg-color-hover); 14 | } 15 | 16 | .article { 17 | position: relative; 18 | box-sizing: inherit; 19 | } 20 | -------------------------------------------------------------------------------- /src/integrations/delete-build-cache.ts: -------------------------------------------------------------------------------- 1 | import fs from "node:fs"; 2 | import type { AstroIntegration } from "astro"; 3 | import { BUILD_FOLDER_PATHS } from "../constants"; 4 | 5 | export default (): AstroIntegration => ({ 6 | name: "delete-build-cache", 7 | hooks: { 8 | "astro:build:done": async () => { 9 | const buildCacheDir = BUILD_FOLDER_PATHS["buildcache"]; 10 | if (fs.existsSync(buildCacheDir)) { 11 | fs.rmSync(buildCacheDir, { recursive: true, force: true }); 12 | console.log("Build cache deleted successfully."); 13 | } 14 | }, 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /src/components/notion-blocks/embeds/NotionEmbed.astro: -------------------------------------------------------------------------------- 1 | --- 2 | export interface Props { 3 | url: URL; 4 | caption: string | undefined; 5 | } 6 | 7 | const { url, caption } = Astro.props; 8 | --- 9 | 10 |Please use the navigation to find your way back
16 |23 | Responses powered by{" "} 24 | 25 | Webmentions 26 | 27 |
28 |15 |24 |16 | {user} 22 | 23 |
28 |
29 |
30 | ) : (
31 | {description}
29 |
12 | {
13 | tweet.entities.map((item, i) => {
14 | switch (item.type) {
15 | case "hashtag":
16 | case "mention":
17 | case "url":
18 | case "symbol":
19 | return
{description}35 |
27 |40 | -------------------------------------------------------------------------------- /src/components/notion-blocks/embeds/astro-bluesky/avatar.astro: -------------------------------------------------------------------------------- 1 | --- 2 | import type { AppBskyActorDefs } from "@atproto/api"; 3 | 4 | type Props = { 5 | user: AppBskyActorDefs.ProfileViewBasic; 6 | link?: boolean | undefined; 7 | size?: "small" | "medium" | undefined; 8 | }; 9 | 10 | const { user, link, size = "medium" } = Astro.props; 11 | 12 | const src = user.avatar; 13 | --- 14 | 15 | { 16 | link ? ( 17 | 23 | {src &&28 | { 29 | block.Quote.RichTexts.map((richText: interfaces.RichText) => ( 30 |39 |31 | )) 32 | } 33 | { 34 | block.Quote.Children && renderChildren && ( 35 | 36 | ) 37 | } 38 |
22 | {likes.length} 23 | {likes.length > 1 ? " People" : " Person"} liked this 24 |
25 | {!!likesToShow.length && ( 26 |{domain}
18 | { 19 | !compact && ( 20 | <> 21 |{title}
22 |{description}
23 | > 24 | ) 25 | } 26 |{post.Excerpt}} 46 | {post.Authors !== undefined &&
28 | {comments.length} Mention{comments.length > 1 ? "s" : ""} 29 |
30 |{mention.author?.name}
63 | 70 |{mention.content?.text}
74 |{embed.record.value.text}
38 | 39 | 44 |{title}
29 |{subtitle}
30 |{description}
} 33 |