├── .nvmrc ├── packages ├── utils │ ├── renderer │ │ ├── consts │ │ │ └── images.ts │ │ ├── services │ │ │ ├── HNRequest.ts │ │ │ └── embed.ts │ │ ├── hooks │ │ │ └── useEmbeds.tsx │ │ ├── sanitizeHTMLOptions.js │ │ └── headingSlugger.ts │ ├── package.json │ ├── seo │ │ ├── addPublicationJsonLd.ts │ │ └── addArticleJsonLd.ts │ ├── handle-math-jax.js │ └── trigger-custom-widget-embed.js ├── blog-starter-kit │ └── themes │ │ ├── enterprise │ │ ├── vercel.json │ │ ├── components │ │ │ ├── icons │ │ │ │ ├── index.js │ │ │ │ └── svgs │ │ │ │ │ ├── ChevronDownSVG.js │ │ │ │ │ ├── HamburgerSVG.js │ │ │ │ │ ├── RssSVG.js │ │ │ │ │ ├── ExternalArrowSVG.js │ │ │ │ │ ├── PlusCircleSVG.js │ │ │ │ │ ├── LinkedinSVG.js │ │ │ │ │ ├── XSVG.js │ │ │ │ │ ├── ArticleSVG.js │ │ │ │ │ ├── CloseSVG.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── GithubSVG.js │ │ │ │ │ ├── HashnodeSVG.js │ │ │ │ │ └── BookOpenSVG.js │ │ │ ├── section-separator.tsx │ │ │ ├── container.tsx │ │ │ ├── navbar.tsx │ │ │ ├── markdown-styles.module.css │ │ │ ├── post-title.tsx │ │ │ ├── date-formatter.tsx │ │ │ ├── resizable-image.js │ │ │ ├── scripts.tsx │ │ │ ├── post-read-time-in-minutes.tsx │ │ │ ├── layout.tsx │ │ │ ├── markdown-to-html.tsx │ │ │ ├── cover-image.tsx │ │ │ ├── more-posts.tsx │ │ │ ├── avatar.tsx │ │ │ ├── meta.tsx │ │ │ ├── subscribe.tsx │ │ │ ├── about-author.tsx │ │ │ └── contexts │ │ │ │ └── appContext.tsx │ │ ├── @types │ │ │ └── remark-html.d.ts │ │ ├── lib │ │ │ └── api │ │ │ │ ├── fragments │ │ │ │ ├── PageInfo.graphql │ │ │ │ ├── Post.graphql │ │ │ │ └── Publication.graphql │ │ │ │ ├── mutations │ │ │ │ └── SubscribeToNewsletter.graphql │ │ │ │ └── queries │ │ │ │ ├── PublicationByHost.graphql │ │ │ │ ├── SlugPostsByPublication.graphql │ │ │ │ ├── PageByPublication.graphql │ │ │ │ ├── DraftById.graphql │ │ │ │ ├── TagPostsByPublication.graphql │ │ │ │ ├── RSSFeed.graphql │ │ │ │ ├── SearchPostsOfPublication.graphql │ │ │ │ ├── SeriesPostsByPublication.graphql │ │ │ │ ├── PostsByPublication.graphql │ │ │ │ └── Sitemap.graphql │ │ ├── .eslintrc.js │ │ ├── .graphqlrc.yml │ │ ├── public │ │ │ ├── favicon │ │ │ │ ├── favicon.ico │ │ │ │ ├── favicon-16x16.png │ │ │ │ ├── favicon-32x32.png │ │ │ │ ├── mstile-150x150.png │ │ │ │ ├── apple-touch-icon.png │ │ │ │ ├── android-chrome-192x192.png │ │ │ │ ├── android-chrome-512x512.png │ │ │ │ └── browserconfig.xml │ │ │ └── assets │ │ │ │ └── blog │ │ │ │ ├── authors │ │ │ │ ├── jj.jpeg │ │ │ │ ├── joe.jpeg │ │ │ │ └── tim.jpeg │ │ │ │ ├── preview │ │ │ │ └── cover.jpg │ │ │ │ ├── hello-world │ │ │ │ └── cover.jpg │ │ │ │ └── dynamic-routing │ │ │ │ └── cover.jpg │ │ ├── assets │ │ │ ├── PlusJakartaSans-Bold.ttf │ │ │ ├── PlusJakartaSans-Medium.ttf │ │ │ ├── PlusJakartaSans-Regular.ttf │ │ │ ├── PlusJakartaSans-SemiBold.ttf │ │ │ └── PlusJakartaSans-ExtraBold.ttf │ │ ├── .env.example │ │ ├── pages │ │ │ ├── _app.tsx │ │ │ ├── _document.tsx │ │ │ ├── robots.txt.tsx │ │ │ ├── dashboard.tsx │ │ │ └── rss.xml.tsx │ │ ├── postcss.config.js │ │ ├── tsconfig.json │ │ ├── utils │ │ │ └── const │ │ │ │ └── index.ts │ │ ├── process-env.d.ts │ │ ├── codegen.yml │ │ └── README.md │ │ ├── hashnode │ │ ├── vercel.json │ │ ├── components │ │ │ ├── icons │ │ │ │ ├── index.js │ │ │ │ └── svgs │ │ │ │ │ ├── ChevronDownSVG_16x16.js │ │ │ │ │ ├── ChevronRightSVG_16x16.js │ │ │ │ │ ├── CheckSVG.js │ │ │ │ │ ├── ExternalLinkSVG.js │ │ │ │ │ ├── ChevronDownSVGV2.js │ │ │ │ │ ├── ChevronUpSVG_16x16.js │ │ │ │ │ ├── HamburgerSVG.js │ │ │ │ │ ├── PinSVG.js │ │ │ │ │ ├── ExternalArrowSVG.js │ │ │ │ │ ├── BarsSVG.js │ │ │ │ │ ├── PlusCircleSVG.js │ │ │ │ │ ├── RefreshSVG.js │ │ │ │ │ ├── HackernewsSVGV2.js │ │ │ │ │ ├── EarthSVG.js │ │ │ │ │ ├── LinkedInSVGV2.js │ │ │ │ │ ├── PaperPlaneSVG.js │ │ │ │ │ ├── FacebookSVGRound.js │ │ │ │ │ ├── SearchSvg.js │ │ │ │ │ ├── XSVG.js │ │ │ │ │ ├── ArticleSVG.js │ │ │ │ │ ├── ChevronDownSVG.js │ │ │ │ │ ├── AlertSVG.js │ │ │ │ │ ├── CloseSVG.js │ │ │ │ │ ├── ClipboardSVG.js │ │ │ │ │ ├── ChevronLeftSVG.js │ │ │ │ │ ├── LinkedinSVG.js │ │ │ │ │ ├── InstagramSVG.js │ │ │ │ │ ├── HashnodeLogoIconV2.js │ │ │ │ │ ├── ListSVG.js │ │ │ │ │ ├── YoutubeSVG.js │ │ │ │ │ ├── PencilSVG.js │ │ │ │ │ ├── TwitterXSVG.js │ │ │ │ │ ├── MastodonSVG.js │ │ │ │ │ ├── HeadphonesSVG.js │ │ │ │ │ ├── HashnodeSVG.js │ │ │ │ │ ├── ShareSVGV2.tsx │ │ │ │ │ ├── FileLineChartSVG.js │ │ │ │ │ ├── CommentSVGV2.js │ │ │ │ │ ├── RedditSVGV2.js │ │ │ │ │ ├── RedditSVG.js │ │ │ │ │ ├── BookOpenSVG.js │ │ │ │ │ ├── ChartMixedSVG.js │ │ │ │ │ └── LinkSVGV2.js │ │ │ ├── section-separator.tsx │ │ │ ├── container.tsx │ │ │ ├── markdown-styles.module.css │ │ │ ├── separator-root.js │ │ │ ├── resizable-image.js │ │ │ ├── scripts.tsx │ │ │ ├── layout.tsx │ │ │ ├── fonts │ │ │ │ └── index.tsx │ │ │ ├── static-page-content.tsx │ │ │ ├── post-comments-sidebar.tsx │ │ │ ├── publication-social-link-item.tsx │ │ │ ├── post-floating-bar-tooltip-wrapper.tsx │ │ │ ├── meta.tsx │ │ │ ├── header-tooltip.tsx │ │ │ ├── about-author.tsx │ │ │ ├── publication-meta.tsx │ │ │ ├── contexts │ │ │ │ └── appContext.tsx │ │ │ ├── header-blog-search.tsx │ │ │ ├── header-left-sidebar.tsx │ │ │ └── toast.js │ │ ├── @types │ │ │ └── remark-html.d.ts │ │ ├── lib │ │ │ └── api │ │ │ │ ├── fragments │ │ │ │ ├── PageInfo.graphql │ │ │ │ ├── Post.graphql │ │ │ │ ├── StaticPage.graphql │ │ │ │ ├── PostThumbnail.graphql │ │ │ │ └── Draft.graphql │ │ │ │ ├── queries │ │ │ │ ├── DraftById.graphql │ │ │ │ ├── PublicationByHost.graphql │ │ │ │ ├── SlugPostsByPublication.graphql │ │ │ │ ├── PageByPublication.graphql │ │ │ │ ├── Newsletter.graphql │ │ │ │ ├── TagPostsByPublication.graphql │ │ │ │ ├── RSSFeed.graphql │ │ │ │ ├── SeriesPostsByPublication.graphql │ │ │ │ ├── Tag.graphql │ │ │ │ ├── SearchPostsOfPublication.graphql │ │ │ │ ├── PostsByPublication.graphql │ │ │ │ ├── SeriesPageInitial.graphql │ │ │ │ ├── HomePage.graphql │ │ │ │ └── Sitemap.graphql │ │ │ │ └── mutations │ │ │ │ └── SubscribeToNewsletter.graphql │ │ ├── .eslintrc.js │ │ ├── .graphqlrc.yml │ │ ├── public │ │ │ ├── favicon │ │ │ │ ├── favicon.ico │ │ │ │ ├── favicon-16x16.png │ │ │ │ ├── favicon-32x32.png │ │ │ │ ├── apple-touch-icon.png │ │ │ │ ├── mstile-150x150.png │ │ │ │ ├── android-chrome-192x192.png │ │ │ │ ├── android-chrome-512x512.png │ │ │ │ └── browserconfig.xml │ │ │ └── assets │ │ │ │ └── blog │ │ │ │ ├── authors │ │ │ │ ├── jj.jpeg │ │ │ │ ├── joe.jpeg │ │ │ │ └── tim.jpeg │ │ │ │ ├── preview │ │ │ │ └── cover.jpg │ │ │ │ ├── hello-world │ │ │ │ └── cover.jpg │ │ │ │ └── dynamic-routing │ │ │ │ └── cover.jpg │ │ ├── assets │ │ │ ├── PlusJakartaSans-Bold.ttf │ │ │ ├── PlusJakartaSans-Medium.ttf │ │ │ ├── PlusJakartaSans-Regular.ttf │ │ │ ├── PlusJakartaSans-SemiBold.ttf │ │ │ └── PlusJakartaSans-ExtraBold.ttf │ │ ├── .env.example │ │ ├── postcss.config.js │ │ ├── tsconfig.json │ │ ├── utils │ │ │ ├── const │ │ │ │ ├── images.ts │ │ │ │ ├── styles.ts │ │ │ │ └── index.ts │ │ │ ├── gsspHelpers.ts │ │ │ ├── getReadTime.js │ │ │ ├── index.js │ │ │ ├── toast.tsx │ │ │ └── handle-math-jax.js │ │ ├── process-env.d.ts │ │ ├── pages │ │ │ ├── _document.tsx │ │ │ ├── _app.tsx │ │ │ ├── robots.txt.tsx │ │ │ ├── dashboard.tsx │ │ │ └── rss.xml.tsx │ │ ├── types │ │ │ ├── external │ │ │ │ └── mongodb.d.ts │ │ │ ├── index.ts │ │ │ ├── Page.ts │ │ │ ├── Badge.ts │ │ │ ├── Series.ts │ │ │ ├── User.ts │ │ │ ├── extras.ts │ │ │ └── Response.ts │ │ ├── codegen.yml │ │ └── README.md │ │ └── personal │ │ ├── vercel.json │ │ ├── components │ │ ├── icons │ │ │ ├── index.js │ │ │ └── svgs │ │ │ │ ├── ChevronDownSVG.js │ │ │ │ ├── HamburgerSVG.js │ │ │ │ ├── Moon.js │ │ │ │ ├── RssSVG.js │ │ │ │ ├── ExternalArrowSVG.js │ │ │ │ ├── PlusCircleSVG.js │ │ │ │ ├── LinkedinSVG.js │ │ │ │ ├── XSVG.js │ │ │ │ ├── ArticleSVG.js │ │ │ │ ├── index.js │ │ │ │ ├── Sun.js │ │ │ │ ├── GithubSVG.js │ │ │ │ └── HashnodeSVG.js │ │ ├── section-separator.tsx │ │ ├── container.tsx │ │ ├── markdown-styles.module.css │ │ ├── scripts.tsx │ │ ├── date-formatter.tsx │ │ ├── layout.tsx │ │ ├── markdown-to-html.tsx │ │ ├── toggle-theme.tsx │ │ ├── minimal-posts.tsx │ │ ├── cover-image.tsx │ │ ├── avatar.tsx │ │ ├── footer.tsx │ │ ├── meta.tsx │ │ └── contexts │ │ │ └── appContext.tsx │ │ ├── @types │ │ └── remark-html.d.ts │ │ ├── lib │ │ ├── api │ │ │ ├── fragments │ │ │ │ ├── PageInfo.graphql │ │ │ │ ├── Series.graphql │ │ │ │ ├── Post.graphql │ │ │ │ └── Publication.graphql │ │ │ └── queries │ │ │ │ ├── PublicationByHost.graphql │ │ │ │ ├── SlugPostsByPublication.graphql │ │ │ │ ├── DraftById.graphql │ │ │ │ ├── PageByPublication.graphql │ │ │ │ ├── TagPostsByPublication.graphql │ │ │ │ ├── SeriesByPublication.graphql │ │ │ │ ├── RSSFeed.graphql │ │ │ │ ├── PostsByPublication.graphql │ │ │ │ ├── Sitemap.graphql │ │ │ │ └── SinglePostByPublication.graphql │ │ └── types │ │ │ └── gtag.d.ts │ │ ├── .eslintrc.js │ │ ├── .graphqlrc.yml │ │ ├── utils │ │ └── const │ │ │ └── index.ts │ │ ├── public │ │ ├── favicon │ │ │ ├── favicon.ico │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── mstile-150x150.png │ │ │ ├── android-chrome-192x192.png │ │ │ ├── android-chrome-512x512.png │ │ │ └── browserconfig.xml │ │ └── assets │ │ │ └── blog │ │ │ ├── authors │ │ │ ├── jj.jpeg │ │ │ ├── joe.jpeg │ │ │ └── tim.jpeg │ │ │ ├── preview │ │ │ └── cover.jpg │ │ │ ├── hello-world │ │ │ └── cover.jpg │ │ │ └── dynamic-routing │ │ │ └── cover.jpg │ │ ├── assets │ │ ├── PlusJakartaSans-Bold.ttf │ │ ├── PlusJakartaSans-Medium.ttf │ │ ├── PlusJakartaSans-Regular.ttf │ │ ├── PlusJakartaSans-SemiBold.ttf │ │ └── PlusJakartaSans-ExtraBold.ttf │ │ ├── .env.example │ │ ├── postcss.config.js │ │ ├── tsconfig.json │ │ ├── pages │ │ ├── _document.tsx │ │ ├── _app.tsx │ │ ├── robots.txt.tsx │ │ ├── dashboard.tsx │ │ └── rss.xml.tsx │ │ ├── process-env.d.ts │ │ ├── codegen.yml │ │ ├── codegen.ts │ │ ├── README.md │ │ └── pnpm-lock.yaml ├── tsconfig │ ├── package.json │ ├── nextjs.json │ └── base.json └── eslint-config-custom │ ├── index.js │ └── package.json ├── .dockerignore ├── pnpm-workspace.yaml ├── .prettierignore ├── .vscode └── extensions.json ├── images ├── image.png ├── image-1.png ├── image-2.png ├── image-3.png ├── image-4.png ├── image-5.png ├── image-6.png ├── image-7.png ├── image-8.png └── image-9.png ├── prettier.config.js ├── .editorconfig ├── Dockerfile ├── .gitignore ├── package.json └── license.md /.nvmrc: -------------------------------------------------------------------------------- 1 | v18 -------------------------------------------------------------------------------- /packages/utils/renderer/consts/images.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/utils/renderer/services/HNRequest.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .git 3 | .gitignore -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - "./packages/**" -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .cache 3 | .next 4 | */*.yml 5 | generated -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["esbenp.prettier-vscode"] 3 | } 4 | -------------------------------------------------------------------------------- /images/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/images/image.png -------------------------------------------------------------------------------- /images/image-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/images/image-1.png -------------------------------------------------------------------------------- /images/image-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/images/image-2.png -------------------------------------------------------------------------------- /images/image-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/images/image-3.png -------------------------------------------------------------------------------- /images/image-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/images/image-4.png -------------------------------------------------------------------------------- /images/image-5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/images/image-5.png -------------------------------------------------------------------------------- /images/image-6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/images/image-6.png -------------------------------------------------------------------------------- /images/image-7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/images/image-7.png -------------------------------------------------------------------------------- /images/image-8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/images/image-8.png -------------------------------------------------------------------------------- /images/image-9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/images/image-9.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "framework": "nextjs" 3 | } -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "framework": "nextjs" 3 | } -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "framework": "nextjs" 3 | } -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/components/icons/index.js: -------------------------------------------------------------------------------- 1 | export * from './svgs'; 2 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/components/icons/index.js: -------------------------------------------------------------------------------- 1 | export * from './svgs'; 2 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/components/icons/index.js: -------------------------------------------------------------------------------- 1 | export * from './svgs'; 2 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/@types/remark-html.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'remark-html'; 2 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/@types/remark-html.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'remark-html'; 2 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/@types/remark-html.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'remark-html'; 2 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/lib/api/fragments/PageInfo.graphql: -------------------------------------------------------------------------------- 1 | fragment PageInfo on PageInfo { 2 | endCursor 3 | hasNextPage 4 | } 5 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/lib/api/fragments/PageInfo.graphql: -------------------------------------------------------------------------------- 1 | fragment PageInfo on PageInfo { 2 | endCursor 3 | hasNextPage 4 | } 5 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/lib/api/fragments/PageInfo.graphql: -------------------------------------------------------------------------------- 1 | fragment PageInfo on PageInfo { 2 | endCursor 3 | hasNextPage 4 | } 5 | -------------------------------------------------------------------------------- /packages/tsconfig/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@starter-kit/tsconfig", 3 | "version": "0.0.0", 4 | "private": true, 5 | "license": "MIT" 6 | } 7 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: ['@starter-kit/eslint-config-custom'], 4 | }; 5 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: ['@starter-kit/eslint-config-custom'], 4 | }; 5 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: ['@starter-kit/eslint-config-custom'], 4 | }; 5 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/.graphqlrc.yml: -------------------------------------------------------------------------------- 1 | schema: './generated/schema.graphql' 2 | documents: './{pages,components,lib}/**/*.{graphql,js,ts,jsx,tsx}' 3 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/lib/api/queries/DraftById.graphql: -------------------------------------------------------------------------------- 1 | query DraftById($id: ObjectId!) { 2 | draft(id: $id) { 3 | ...Draft 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/.graphqlrc.yml: -------------------------------------------------------------------------------- 1 | schema: './generated/schema.graphql' 2 | documents: './{pages,components,lib}/**/*.{graphql,js,ts,jsx,tsx}' 3 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/.graphqlrc.yml: -------------------------------------------------------------------------------- 1 | schema: './generated/schema.graphql' 2 | documents: './{pages,components,lib}/**/*.{graphql,js,ts,jsx,tsx}' 3 | -------------------------------------------------------------------------------- /packages/eslint-config-custom/index.js: -------------------------------------------------------------------------------- 1 | /** @type {import('@types/eslint').Linter.BaseConfig} */ 2 | module.exports = { 3 | extends: ['next/core-web-vitals', 'prettier'], 4 | }; 5 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/components/section-separator.tsx: -------------------------------------------------------------------------------- 1 | export const SectionSeparator = () => { 2 | return
; 3 | }; 4 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/components/section-separator.tsx: -------------------------------------------------------------------------------- 1 | export const SectionSeparator = () => { 2 | return
; 3 | }; 4 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/utils/const/index.ts: -------------------------------------------------------------------------------- 1 | export const DEFAULT_AVATAR = 2 | 'https://cdn.hashnode.com/res/hashnode/image/upload/v1659089761812/fsOct5gl6.png'; 3 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/components/section-separator.tsx: -------------------------------------------------------------------------------- 1 | export const SectionSeparator = () => { 2 | return
; 3 | }; 4 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/public/favicon/favicon.ico -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/public/favicon/favicon.ico -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/public/favicon/favicon.ico -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/assets/PlusJakartaSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/assets/PlusJakartaSans-Bold.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/public/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/public/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/assets/PlusJakartaSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/assets/PlusJakartaSans-Bold.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/public/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/public/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/assets/PlusJakartaSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/assets/PlusJakartaSans-Bold.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/assets/PlusJakartaSans-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/assets/PlusJakartaSans-Medium.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/public/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/public/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/favicon/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/public/favicon/mstile-150x150.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/assets/PlusJakartaSans-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/assets/PlusJakartaSans-Medium.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/assets/PlusJakartaSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/assets/PlusJakartaSans-Regular.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/assets/PlusJakartaSans-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/assets/PlusJakartaSans-SemiBold.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/assets/blog/authors/jj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/public/assets/blog/authors/jj.jpeg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/assets/blog/authors/joe.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/public/assets/blog/authors/joe.jpeg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/assets/blog/authors/tim.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/public/assets/blog/authors/tim.jpeg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/public/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/favicon/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/public/favicon/mstile-150x150.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/assets/PlusJakartaSans-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/assets/PlusJakartaSans-Medium.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/assets/PlusJakartaSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/assets/PlusJakartaSans-Regular.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/assets/PlusJakartaSans-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/assets/PlusJakartaSans-SemiBold.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/assets/blog/authors/jj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/public/assets/blog/authors/jj.jpeg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/assets/blog/authors/joe.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/public/assets/blog/authors/joe.jpeg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/assets/blog/authors/tim.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/public/assets/blog/authors/tim.jpeg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/public/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/favicon/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/public/favicon/mstile-150x150.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/assets/PlusJakartaSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/assets/PlusJakartaSans-Regular.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/assets/PlusJakartaSans-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/assets/PlusJakartaSans-SemiBold.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/assets/blog/authors/jj.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/public/assets/blog/authors/jj.jpeg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/assets/blog/authors/joe.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/public/assets/blog/authors/joe.jpeg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/assets/blog/authors/tim.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/public/assets/blog/authors/tim.jpeg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/public/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_HASHNODE_GQL_ENDPOINT=https://gql.hashnode.com 2 | NEXT_PUBLIC_HASHNODE_PUBLICATION_HOST=engineering.hashnode.com 3 | NEXT_PUBLIC_MODE=development -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/assets/PlusJakartaSans-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/assets/PlusJakartaSans-ExtraBold.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/assets/blog/preview/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/public/assets/blog/preview/cover.jpg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_HASHNODE_GQL_ENDPOINT=https://gql.hashnode.com 2 | NEXT_PUBLIC_HASHNODE_PUBLICATION_HOST=engineering.hashnode.com 3 | NEXT_PUBLIC_MODE=development -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/assets/PlusJakartaSans-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/assets/PlusJakartaSans-ExtraBold.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/assets/blog/preview/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/public/assets/blog/preview/cover.jpg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/.env.example: -------------------------------------------------------------------------------- 1 | NEXT_PUBLIC_HASHNODE_GQL_ENDPOINT=https://gql.hashnode.com 2 | NEXT_PUBLIC_HASHNODE_PUBLICATION_HOST=engineering.hashnode.com 3 | NEXT_PUBLIC_MODE=development -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/assets/PlusJakartaSans-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/assets/PlusJakartaSans-ExtraBold.ttf -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/assets/blog/preview/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/public/assets/blog/preview/cover.jpg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/assets/blog/hello-world/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/public/assets/blog/hello-world/cover.jpg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/assets/blog/hello-world/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/public/assets/blog/hello-world/cover.jpg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/assets/blog/hello-world/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/public/assets/blog/hello-world/cover.jpg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/public/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/public/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/public/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/public/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/public/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/public/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/assets/blog/dynamic-routing/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/hashnode/public/assets/blog/dynamic-routing/cover.jpg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/assets/blog/dynamic-routing/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/personal/public/assets/blog/dynamic-routing/cover.jpg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/assets/blog/dynamic-routing/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xxynly/starter-kit/HEAD/packages/blog-starter-kit/themes/enterprise/public/assets/blog/dynamic-routing/cover.jpg -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/lib/api/mutations/SubscribeToNewsletter.graphql: -------------------------------------------------------------------------------- 1 | mutation SubscribeToNewsletter($input: SubscribeToNewsletterInput!) { 2 | subscribeToNewsletter(input: $input) { 3 | status 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/lib/api/mutations/SubscribeToNewsletter.graphql: -------------------------------------------------------------------------------- 1 | mutation SubscribeToNewsletter($input: SubscribeToNewsletterInput!) { 2 | subscribeToNewsletter(input: $input) { 3 | status 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import { AppProps } from 'next/app'; 2 | import '../styles/index.css'; 3 | 4 | export default function MyApp({ Component, pageProps }: AppProps) { 5 | return ; 6 | } 7 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/lib/api/queries/PublicationByHost.graphql: -------------------------------------------------------------------------------- 1 | query PublicationByHost($host: String!) { 2 | publication(host: $host) { 3 | ...Publication 4 | posts(first:0) { 5 | totalDocuments 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/lib/api/queries/PublicationByHost.graphql: -------------------------------------------------------------------------------- 1 | query PublicationByHost($host: String!) { 2 | publication(host: $host) { 3 | ...Publication 4 | posts(first:0) { 5 | totalDocuments 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/lib/api/queries/PublicationByHost.graphql: -------------------------------------------------------------------------------- 1 | query PublicationByHost($host: String!) { 2 | publication(host: $host) { 3 | ...Publication 4 | posts(first:0) { 5 | totalDocuments 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/tsconfig/nextjs.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "display": "Next.js", 4 | "extends": "./base.json", 5 | "compilerOptions": { 6 | "plugins": [{ "name": "next" }], 7 | "jsx": "preserve" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/postcss.config.js: -------------------------------------------------------------------------------- 1 | // If you want to use other PostCSS plugins, see the following: 2 | // https://tailwindcss.com/docs/using-with-preprocessors 3 | module.exports = { 4 | plugins: { 5 | tailwindcss: {}, 6 | autoprefixer: {}, 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/postcss.config.js: -------------------------------------------------------------------------------- 1 | // If you want to use other PostCSS plugins, see the following: 2 | // https://tailwindcss.com/docs/using-with-preprocessors 3 | module.exports = { 4 | plugins: { 5 | tailwindcss: {}, 6 | autoprefixer: {}, 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/postcss.config.js: -------------------------------------------------------------------------------- 1 | // If you want to use other PostCSS plugins, see the following: 2 | // https://tailwindcss.com/docs/using-with-preprocessors 3 | module.exports = { 4 | plugins: { 5 | tailwindcss: {}, 6 | autoprefixer: {}, 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/lib/api/fragments/Post.graphql: -------------------------------------------------------------------------------- 1 | fragment Post on Post { 2 | id 3 | title 4 | url 5 | author { 6 | name 7 | profilePicture 8 | } 9 | coverImage { 10 | url 11 | } 12 | publishedAt 13 | slug 14 | brief 15 | } 16 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/components/container.tsx: -------------------------------------------------------------------------------- 1 | type Props = { 2 | children?: React.ReactNode; 3 | className?: string; 4 | }; 5 | 6 | export const Container = ({ children, className }: Props) => { 7 | return
{children}
; 8 | }; 9 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/components/container.tsx: -------------------------------------------------------------------------------- 1 | type Props = { 2 | children?: React.ReactNode; 3 | className?: string; 4 | }; 5 | 6 | export const Container = ({ children, className }: Props) => { 7 | return
{children}
; 8 | }; 9 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/lib/api/fragments/Post.graphql: -------------------------------------------------------------------------------- 1 | fragment Post on Post { 2 | id 3 | title 4 | url 5 | author { 6 | name 7 | profilePicture 8 | username 9 | } 10 | coverImage { 11 | url 12 | } 13 | publishedAt 14 | slug 15 | brief 16 | } 17 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/components/container.tsx: -------------------------------------------------------------------------------- 1 | type Props = { 2 | children?: React.ReactNode; 3 | className?: string; 4 | }; 5 | 6 | export const Container = ({ children, className }: Props) => { 7 | return
{children}
; 8 | }; 9 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@starter-kit/tsconfig/nextjs.json", 4 | "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@starter-kit/tsconfig/nextjs.json", 4 | "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://json.schemastore.org/tsconfig", 3 | "extends": "@starter-kit/tsconfig/nextjs.json", 4 | "include": ["next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"], 5 | "exclude": ["node_modules"] 6 | } 7 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/utils/const/index.ts: -------------------------------------------------------------------------------- 1 | export const DEFAULT_AVATAR = 2 | 'https://cdn.hashnode.com/res/hashnode/image/upload/v1659089761812/fsOct5gl6.png'; 3 | 4 | export const DEFAULT_COVER = 5 | 'https://cdn.hashnode.com/res/hashnode/image/upload/v1683525272978/MB5H_kgOC.png?auto=format'; 6 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/utils/const/images.ts: -------------------------------------------------------------------------------- 1 | export const blurImageDimensions = { w: 400, h: 210 }; 2 | 3 | // eslint-disable-next-line import/prefer-default-export 4 | export const DEFAULT_AVATAR: string = 5 | 'https://cdn.hashnode.com/res/hashnode/image/upload/v1659089761812/fsOct5gl6.png?auto=compress'; -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/process-env.d.ts: -------------------------------------------------------------------------------- 1 | declare namespace NodeJS { 2 | interface ProcessEnv { 3 | [key: string]: string | undefined; 4 | NEXT_PUBLIC_HASHNODE_GQL_ENDPOINT: string; 5 | NEXT_PUBLIC_HASHNODE_PUBLICATION_HOST: string; 6 | // add more environment variables and their types here 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/process-env.d.ts: -------------------------------------------------------------------------------- 1 | declare namespace NodeJS { 2 | interface ProcessEnv { 3 | [key: string]: string | undefined; 4 | NEXT_PUBLIC_HASHNODE_GQL_ENDPOINT: string; 5 | NEXT_PUBLIC_HASHNODE_PUBLICATION_HOST: string; 6 | // add more environment variables and their types here 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import { Head, Html, Main, NextScript } from 'next/document'; 2 | 3 | export default function Document() { 4 | return ( 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/process-env.d.ts: -------------------------------------------------------------------------------- 1 | declare namespace NodeJS { 2 | interface ProcessEnv { 3 | [key: string]: string | undefined; 4 | NEXT_PUBLIC_HASHNODE_GQL_ENDPOINT: string; 5 | NEXT_PUBLIC_HASHNODE_PUBLICATION_HOST: string; 6 | // add more environment variables and their types here 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import { Head, Html, Main, NextScript } from 'next/document'; 2 | 3 | export default function Document() { 4 | return ( 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/lib/api/fragments/Series.graphql: -------------------------------------------------------------------------------- 1 | fragment Series on Series { 2 | id 3 | name 4 | slug 5 | description { 6 | text 7 | } 8 | coverImage 9 | posts(first: 20) { 10 | edges { 11 | node { 12 | ...Post 13 | } 14 | } 15 | totalDocuments 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/eslint-config-custom/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@starter-kit/eslint-config-custom", 3 | "version": "0.0.0", 4 | "license": "MIT", 5 | "main": "index.js", 6 | "dependencies": { 7 | "eslint-config-next": "^13.5.4", 8 | "eslint-config-prettier": "^9.0.0" 9 | }, 10 | "peerDependencies": { 11 | "eslint": "^8.0.0" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/pages/_document.tsx: -------------------------------------------------------------------------------- 1 | import { Head, Html, Main, NextScript } from 'next/document'; 2 | 3 | export default function Document() { 4 | return ( 5 | 6 | 7 | 8 |
9 | 10 |
11 | 12 | 13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/lib/types/gtag.d.ts: -------------------------------------------------------------------------------- 1 | interface Window { 2 | gtag: ( 3 | command: 'config' | 'js' | 'event', 4 | targetId: string, 5 | config?: { 6 | transport_url?: string; 7 | first_party_collection?: boolean; 8 | [key: string]: any; 9 | } 10 | ) => void; 11 | dataLayer: any[]; 12 | } 13 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/public/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #000000 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/public/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #000000 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/public/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #000000 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/components/navbar.tsx: -------------------------------------------------------------------------------- 1 | import { Search } from './searchbar'; 2 | import { SocialLinks } from './social-links'; 3 | 4 | export const Navbar = () => { 5 | return ( 6 |
7 | 8 | 9 |
10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/lib/api/queries/SlugPostsByPublication.graphql: -------------------------------------------------------------------------------- 1 | query SlugPostsByPublication($host: String!, $first: Int!, $after: String) { 2 | publication(host: $host) { 3 | ...Publication 4 | posts(first: $first, after: $after) { 5 | edges { 6 | node { 7 | slug 8 | } 9 | } 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/lib/api/queries/SlugPostsByPublication.graphql: -------------------------------------------------------------------------------- 1 | query SlugPostsByPublication($host: String!, $first: Int!, $after: String) { 2 | publication(host: $host) { 3 | ...Publication 4 | posts(first: $first, after: $after) { 5 | edges { 6 | node { 7 | slug 8 | } 9 | } 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/lib/api/queries/SlugPostsByPublication.graphql: -------------------------------------------------------------------------------- 1 | query SlugPostsByPublication($host: String!, $first: Int!, $after: String) { 2 | publication(host: $host) { 3 | ...Publication 4 | posts(first: $first, after: $after) { 5 | edges { 6 | node { 7 | slug 8 | } 9 | } 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/pages/_app.tsx: -------------------------------------------------------------------------------- 1 | import { ThemeProvider } from 'next-themes'; 2 | import { AppProps } from 'next/app'; 3 | import '../styles/index.css'; 4 | 5 | export default function MyApp({ Component, pageProps }: AppProps) { 6 | return ( 7 | 8 | 9 | 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/lib/api/fragments/Post.graphql: -------------------------------------------------------------------------------- 1 | fragment Post on Post { 2 | id 3 | title 4 | url 5 | author { 6 | name 7 | profilePicture 8 | } 9 | coverImage { 10 | url 11 | } 12 | publishedAt 13 | readTimeInMinutes 14 | slug 15 | brief 16 | tags { 17 | name 18 | slug 19 | } 20 | comments(first: 0) { 21 | totalDocuments 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/lib/api/queries/DraftById.graphql: -------------------------------------------------------------------------------- 1 | query DraftById($id: ObjectId!) { 2 | draft(id: $id) { 3 | id 4 | title 5 | content { 6 | markdown 7 | } 8 | author { 9 | id 10 | name 11 | username 12 | } 13 | dateUpdated 14 | tags { 15 | id 16 | name 17 | slug 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/lib/api/queries/PageByPublication.graphql: -------------------------------------------------------------------------------- 1 | query PageByPublication($slug: String!, $host: String!) { 2 | publication(host: $host) { 3 | ...Publication 4 | staticPage(slug: $slug) { 5 | ...StaticPage 6 | } 7 | } 8 | } 9 | 10 | fragment StaticPage on StaticPage { 11 | id 12 | title 13 | slug 14 | content { 15 | markdown 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/utils/renderer/hooks/useEmbeds.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { loadIframeResizer } from '../services/embed'; 3 | 4 | interface UseEmbedsOptions { 5 | enabled?: boolean; 6 | } 7 | 8 | export const useEmbeds = ({ enabled = true }: UseEmbedsOptions = {}) => { 9 | useEffect(() => { 10 | if (enabled) { 11 | loadIframeResizer(); 12 | } 13 | }, [enabled]); 14 | }; -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/components/markdown-styles.module.css: -------------------------------------------------------------------------------- 1 | .markdown { 2 | @apply text-lg leading-relaxed; 3 | } 4 | 5 | .markdown p, 6 | .markdown ul, 7 | .markdown ol, 8 | .markdown blockquote { 9 | @apply my-6; 10 | } 11 | 12 | .markdown h2 { 13 | @apply text-3xl mt-12 mb-4 leading-snug; 14 | } 15 | 16 | .markdown h3 { 17 | @apply text-2xl mt-8 mb-4 leading-snug; 18 | } 19 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/components/markdown-styles.module.css: -------------------------------------------------------------------------------- 1 | .markdown { 2 | @apply text-lg leading-relaxed; 3 | } 4 | 5 | .markdown p, 6 | .markdown ul, 7 | .markdown ol, 8 | .markdown blockquote { 9 | @apply my-6; 10 | } 11 | 12 | .markdown h2 { 13 | @apply text-3xl mt-12 mb-4 leading-snug; 14 | } 15 | 16 | .markdown h3 { 17 | @apply text-2xl mt-8 mb-4 leading-snug; 18 | } 19 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/personal/components/markdown-styles.module.css: -------------------------------------------------------------------------------- 1 | .markdown { 2 | @apply text-lg leading-relaxed; 3 | } 4 | 5 | .markdown p, 6 | .markdown ul, 7 | .markdown ol, 8 | .markdown blockquote { 9 | @apply my-6; 10 | } 11 | 12 | .markdown h2 { 13 | @apply text-3xl mt-12 mb-4 leading-snug; 14 | } 15 | 16 | .markdown h3 { 17 | @apply text-2xl mt-8 mb-4 leading-snug; 18 | } 19 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/components/post-title.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react'; 2 | 3 | type Props = { 4 | children?: ReactNode; 5 | }; 6 | 7 | export const PostTitle = ({ children }: Props) => { 8 | return ( 9 |
10 |

{children}

11 |
12 | ); 13 | }; 14 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/components/icons/svgs/ChevronDownSVG_16x16.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default class ChevronDownSVG_16x16 extends React.Component { 4 | render() { 5 | return ( 6 | 7 | 8 | 9 | ); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/components/separator-root.js: -------------------------------------------------------------------------------- 1 | import { Root as SeparatorRoot } from '@radix-ui/react-separator'; 2 | import { twMerge } from 'tailwind-merge'; 3 | 4 | export const Separator = ({ className, ...props }) => ( 5 | 10 | ); 11 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/components/icons/svgs/ChevronRightSVG_16x16.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default class ChevronRightSVG16x16 extends React.Component { 4 | render() { 5 | return ( 6 | 7 | 8 | 9 | ); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/components/date-formatter.tsx: -------------------------------------------------------------------------------- 1 | import { format, parseISO } from 'date-fns'; 2 | 3 | type Props = { 4 | dateString: string; 5 | }; 6 | 7 | export const DateFormatter = ({ dateString }: Props) => { 8 | if (!dateString) return <>; 9 | const date = parseISO(dateString); 10 | 11 | return ( 12 | <> 13 | 14 | 15 | ); 16 | }; 17 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/types/external/mongodb.d.ts: -------------------------------------------------------------------------------- 1 | import { Db, MongoClient } from 'mongodb'; 2 | 3 | declare global { 4 | namespace NodeJS { 5 | type MongoConnection = { 6 | client: MongoClient; 7 | db: Db; 8 | }; 9 | 10 | interface Global { 11 | mongo: { 12 | conn: MongoConnection | null; 13 | promise: Promise | null; 14 | }; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/lib/api/queries/PageByPublication.graphql: -------------------------------------------------------------------------------- 1 | query PageByPublication($slug: String!, $host: String!) { 2 | publication(host: $host) { 3 | ...Publication 4 | posts(first: 0) { 5 | totalDocuments 6 | } 7 | staticPage(slug: $slug) { 8 | ...StaticPage 9 | } 10 | } 11 | } 12 | 13 | fragment StaticPage on StaticPage { 14 | id 15 | title 16 | slug 17 | content { 18 | markdown 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/components/icons/svgs/CheckSVG.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default class CheckSVG extends React.Component { 4 | render() { 5 | return ( 6 | 7 | 8 | 9 | 10 | ); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/components/icons/svgs/ExternalLinkSVG.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default class ExternalLinkSVG extends React.Component { 4 | render() { 5 | return ( 6 | 7 | 8 | 9 | 10 | ); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/utils/gsspHelpers.ts: -------------------------------------------------------------------------------- 1 | import { GetServerSidePropsContext } from 'next'; 2 | import { getSingleQueryParam } from './urls'; 3 | 4 | export function getHost({ req, query }: Pick) { 5 | const host = getSingleQueryParam(query, 'x-host') || req.headers.host; 6 | if (!host) { 7 | throw new Error('Could not determine host'); 8 | } 9 | return host; 10 | } -------------------------------------------------------------------------------- /prettier.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import("prettier").Config} */ 2 | const config = { 3 | bracketSpacing: true, 4 | printWidth: 100, 5 | trailingComma: 'all', 6 | tabWidth: 2, 7 | useTabs: true, 8 | semi: true, 9 | singleQuote: true, 10 | plugins: [ 11 | // comment for better diff 12 | 'prettier-plugin-organize-imports', 13 | 'prettier-plugin-tailwindcss', 14 | 'prettier-plugin-packagejson', 15 | ], 16 | }; 17 | 18 | module.exports = config; 19 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/lib/api/queries/PageByPublication.graphql: -------------------------------------------------------------------------------- 1 | query PageByPublication($slug: String!, $host: String!) { 2 | publication(host: $host) { 3 | ...Publication 4 | posts(first: 0) { 5 | totalDocuments 6 | } 7 | staticPage(slug: $slug) { 8 | ...StaticPage 9 | } 10 | } 11 | } 12 | 13 | fragment StaticPage on StaticPage { 14 | id 15 | title 16 | slug 17 | content { 18 | markdown 19 | html 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/utils/const/styles.ts: -------------------------------------------------------------------------------- 1 | // twin classes 2 | export const inputText = 3 | 'w-full p-4 placeholder-slate-500 bg-transparent border rounded-lg outline-none focus:border-blue-600 disabled:bg-slate-50 dark:text-white dark:border-slate-800 dark:focus:bg-slate-900 dark:focus:border-blue-600'; 4 | 5 | export const dropdownMenu = 6 | 'w-full flex flex-row items-center px-4 py-3 text-slate-600 hover:bg-slate-100 focus:outline-none'; 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_size = 2 7 | indent_style = tabs 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | # Markdown syntax specifies that trailing whitespaces can be meaningful, 12 | # so let’s not trim those. e.g. 2 trailing spaces = linebreak (
) 13 | # See https://daringfireball.net/projects/markdown/syntax#p 14 | [*.md] 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/components/resizable-image.js: -------------------------------------------------------------------------------- 1 | import { ProgressiveImage } from './progressive-image'; 2 | 3 | function ResizableImage(props) { 4 | const { src, alt, resize, className, ...restOfTheProps } = props; 5 | 6 | return ( 7 | 8 | ); 9 | } 10 | 11 | export default ResizableImage; 12 | export { ResizableImage }; -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/components/resizable-image.js: -------------------------------------------------------------------------------- 1 | import { ProgressiveImage } from './progressive-image'; 2 | 3 | function ResizableImage(props) { 4 | const { src, alt, resize, className, ...restOfTheProps } = props; 5 | 6 | return ( 7 | 8 | ); 9 | } 10 | 11 | export default ResizableImage; 12 | export { ResizableImage }; 13 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/hashnode/lib/api/queries/Newsletter.graphql: -------------------------------------------------------------------------------- 1 | query Newsletter($host: String!, $slug: String!) { 2 | publication(host: $host) { 3 | ...Publication 4 | author { 5 | id 6 | followersCount 7 | } 8 | staticPage(slug: $slug) { 9 | id 10 | } 11 | recentPosts: posts(first: 3) { 12 | edges { 13 | node { 14 | ...PostThumbnail 15 | } 16 | } 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages/blog-starter-kit/themes/enterprise/components/scripts.tsx: -------------------------------------------------------------------------------- 1 | export const Scripts = () => { 2 | const googleAnalytics = ` 3 | window.dataLayer = window.dataLayer || []; 4 | function gtag(){window.dataLayer.push(arguments);} 5 | gtag('js', new Date());`; 6 | return ( 7 | <> 8 |