From 8ac61ee4f3244da87d4291d5a6e813bc3830a412 Mon Sep 17 00:00:00 2001 From: Casey Milne <61839698+caseymilne@users.noreply.github.com> Date: Mon, 12 Feb 2024 23:08:20 -0600 Subject: [PATCH] Initial commit --- .contentful/vault-secrets.yaml | 5 + .editorconfig | 18 + .env.example | 18 + .eslintignore | 2 + .eslintrc.js | 118 + .github/CODEOWNERS | 1 + .github/ISSUE_TEMPLATE/bug-report.md | 38 + .github/ISSUE_TEMPLATE/feedback.md | 17 + .github/ISSUE_TEMPLATE/proposal.md | 31 + .github/PULL_REQUEST_TEMPLATE.md | 43 + .github/dependabot.yml | 39 + .github/workflows/auto-merge.yml | 15 + .github/workflows/eslint-tsc.yml | 45 + .github/workflows/sast.yaml | 31 + .gitignore | 47 + .husky/pre-commit | 4 + .husky/pre-push | 4 + .nvmrc | 1 + .prettierignore | 1 + .prettierrc | 9 + .vercelignore | 1 + CHANGELOG.md | 5 + CODE_OF_CONDUCT.md | 7 + CONTRIBUTING.md | 42 + LICENSE | 21 + README.md | 261 + SECURITY.md | 31 + bin/setup.sh | 40 + blog-starter-template.jpg | Bin 0 -> 165046 bytes catalog-info.yaml | 27 + codegen.ts | 40 + config/headers.js | 40 + config/plugins.js | 23 + .../contentful-and-the-starter-template.md | 169 + netlify.toml | 2 + next-i18next.config.js | 10 + next.config.js | 73 + package.json | 82 + postcss.config.js | 6 + public/assets/svg/blog-logo.svg | 1 + public/assets/svg/contentful.svg | 1 + public/assets/svg/example.svg | 3 + public/favicons/android-chrome-192x192.png | Bin 0 -> 2388 bytes public/favicons/android-chrome-384x384.png | Bin 0 -> 3936 bytes public/favicons/apple-touch-icon.png | Bin 0 -> 2317 bytes public/favicons/browserconfig.xml | 9 + public/favicons/favicon-16x16.png | Bin 0 -> 723 bytes public/favicons/favicon-32x32.png | Bin 0 -> 1231 bytes public/favicons/favicon.ico | Bin 0 -> 15086 bytes public/favicons/mstile-150x150.png | Bin 0 -> 1833 bytes public/favicons/safari-pinned-tab.svg | 25 + public/favicons/site.webmanifest | 19 + public/locales/de-DE/common.json | 25 + public/locales/en-US/common.json | 24 + public/robots.txt | 3 + .../features/article/ArticleAuthor.tsx | 36 + .../features/article/ArticleContent.tsx | 18 + .../features/article/ArticleHero.tsx | 76 + .../features/article/ArticleImage.tsx | 35 + .../features/article/ArticleLabel.tsx | 20 + .../features/article/ArticleTile.tsx | 53 + .../features/article/ArticleTileGrid.tsx | 25 + src/components/features/article/index.ts | 7 + .../features/contentful/CtfImage.tsx | 29 + .../features/contentful/CtfRichText.tsx | 51 + src/components/features/contentful/index.ts | 2 + .../language-selector/LanguageSelector.tsx | 27 + .../LanguageSelectorDesktop.tsx | 134 + .../LanguageSelectorMobile.tsx | 88 + .../features/language-selector/index.ts | 1 + src/components/features/seo/SeoFields.tsx | 57 + src/components/features/seo/index.ts | 1 + src/components/shared/container/Container.tsx | 6 + src/components/shared/container/index.ts | 1 + .../shared/format-date/FormatDate.tsx | 22 + src/components/shared/format-date/index.ts | 1 + src/components/shared/portal/Portal.tsx | 19 + src/components/shared/portal/index.ts | 1 + src/components/templates/footer/footer.tsx | 28 + src/components/templates/footer/index.ts | 1 + src/components/templates/header/header.tsx | 23 + src/components/templates/header/index.ts | 1 + src/components/templates/layout/index.ts | 1 + src/components/templates/layout/layout.tsx | 18 + src/lib/__generated/graphql.schema.graphql | 912 ++ src/lib/__generated/graphql.schema.json | 11431 ++++++++++++++++ src/lib/__generated/sdk.ts | 1739 +++ src/lib/client.ts | 19 + src/lib/graphql/authorFields.graphql | 10 + src/lib/graphql/imageFields.graphql | 12 + src/lib/graphql/pageBlogPost.graphql | 62 + .../graphql/pageBlogPostCollection.graphql | 13 + src/lib/graphql/pageLanding.graphql | 25 + src/lib/graphql/pageLandingCollection.graphql | 7 + src/lib/graphql/richImageFields.graphql | 12 + src/lib/graphql/seoFields.graphql | 13 + src/lib/graphql/sitemap.graphql | 22 + src/pages/404.page.tsx | 31 + src/pages/[slug].page.tsx | 113 + src/pages/_app.page.tsx | 32 + src/pages/_document.page.tsx | 23 + src/pages/api/disable-draft.page.tsx | 26 + src/pages/api/draft.page.tsx | 77 + src/pages/index.page.tsx | 88 + src/pages/sitemap.xml/index.page.tsx | 50 + src/pages/utils/constants.ts | 1 + .../utils/get-serverside-translations.ts | 9 + src/pages/utils/globals.css | 34 + tailwind.config.js | 39 + tsconfig.json | 32 + types/declaration.d.ts | 2 + types/lib.es5.d.ts | 25 + vercel.json | 3 + yarn.lock | 7524 ++++++++++ 114 files changed, 24645 insertions(+) create mode 100644 .contentful/vault-secrets.yaml create mode 100644 .editorconfig create mode 100644 .env.example create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .github/CODEOWNERS create mode 100644 .github/ISSUE_TEMPLATE/bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/feedback.md create mode 100644 .github/ISSUE_TEMPLATE/proposal.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/auto-merge.yml create mode 100644 .github/workflows/eslint-tsc.yml create mode 100644 .github/workflows/sast.yaml create mode 100644 .gitignore create mode 100755 .husky/pre-commit create mode 100755 .husky/pre-push create mode 100644 .nvmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .vercelignore create mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 SECURITY.md create mode 100755 bin/setup.sh create mode 100644 blog-starter-template.jpg create mode 100644 catalog-info.yaml create mode 100644 codegen.ts create mode 100644 config/headers.js create mode 100644 config/plugins.js create mode 100644 docs/tutorials/contentful-and-the-starter-template.md create mode 100644 netlify.toml create mode 100644 next-i18next.config.js create mode 100644 next.config.js create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/assets/svg/blog-logo.svg create mode 100644 public/assets/svg/contentful.svg create mode 100644 public/assets/svg/example.svg create mode 100644 public/favicons/android-chrome-192x192.png create mode 100644 public/favicons/android-chrome-384x384.png create mode 100644 public/favicons/apple-touch-icon.png create mode 100644 public/favicons/browserconfig.xml create mode 100644 public/favicons/favicon-16x16.png create mode 100644 public/favicons/favicon-32x32.png create mode 100644 public/favicons/favicon.ico create mode 100644 public/favicons/mstile-150x150.png create mode 100644 public/favicons/safari-pinned-tab.svg create mode 100644 public/favicons/site.webmanifest create mode 100644 public/locales/de-DE/common.json create mode 100644 public/locales/en-US/common.json create mode 100644 public/robots.txt create mode 100644 src/components/features/article/ArticleAuthor.tsx create mode 100644 src/components/features/article/ArticleContent.tsx create mode 100644 src/components/features/article/ArticleHero.tsx create mode 100644 src/components/features/article/ArticleImage.tsx create mode 100644 src/components/features/article/ArticleLabel.tsx create mode 100644 src/components/features/article/ArticleTile.tsx create mode 100644 src/components/features/article/ArticleTileGrid.tsx create mode 100644 src/components/features/article/index.ts create mode 100644 src/components/features/contentful/CtfImage.tsx create mode 100644 src/components/features/contentful/CtfRichText.tsx create mode 100644 src/components/features/contentful/index.ts create mode 100644 src/components/features/language-selector/LanguageSelector.tsx create mode 100644 src/components/features/language-selector/LanguageSelectorDesktop.tsx create mode 100644 src/components/features/language-selector/LanguageSelectorMobile.tsx create mode 100644 src/components/features/language-selector/index.ts create mode 100644 src/components/features/seo/SeoFields.tsx create mode 100644 src/components/features/seo/index.ts create mode 100644 src/components/shared/container/Container.tsx create mode 100644 src/components/shared/container/index.ts create mode 100644 src/components/shared/format-date/FormatDate.tsx create mode 100644 src/components/shared/format-date/index.ts create mode 100644 src/components/shared/portal/Portal.tsx create mode 100644 src/components/shared/portal/index.ts create mode 100644 src/components/templates/footer/footer.tsx create mode 100644 src/components/templates/footer/index.ts create mode 100644 src/components/templates/header/header.tsx create mode 100644 src/components/templates/header/index.ts create mode 100644 src/components/templates/layout/index.ts create mode 100644 src/components/templates/layout/layout.tsx create mode 100644 src/lib/__generated/graphql.schema.graphql create mode 100644 src/lib/__generated/graphql.schema.json create mode 100644 src/lib/__generated/sdk.ts create mode 100644 src/lib/client.ts create mode 100644 src/lib/graphql/authorFields.graphql create mode 100644 src/lib/graphql/imageFields.graphql create mode 100644 src/lib/graphql/pageBlogPost.graphql create mode 100644 src/lib/graphql/pageBlogPostCollection.graphql create mode 100644 src/lib/graphql/pageLanding.graphql create mode 100644 src/lib/graphql/pageLandingCollection.graphql create mode 100644 src/lib/graphql/richImageFields.graphql create mode 100644 src/lib/graphql/seoFields.graphql create mode 100644 src/lib/graphql/sitemap.graphql create mode 100644 src/pages/404.page.tsx create mode 100644 src/pages/[slug].page.tsx create mode 100644 src/pages/_app.page.tsx create mode 100644 src/pages/_document.page.tsx create mode 100644 src/pages/api/disable-draft.page.tsx create mode 100644 src/pages/api/draft.page.tsx create mode 100644 src/pages/index.page.tsx create mode 100644 src/pages/sitemap.xml/index.page.tsx create mode 100644 src/pages/utils/constants.ts create mode 100644 src/pages/utils/get-serverside-translations.ts create mode 100644 src/pages/utils/globals.css create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 types/declaration.d.ts create mode 100644 types/lib.es5.d.ts create mode 100644 vercel.json create mode 100644 yarn.lock diff --git a/.contentful/vault-secrets.yaml b/.contentful/vault-secrets.yaml new file mode 100644 index 0000000..03e1a90 --- /dev/null +++ b/.contentful/vault-secrets.yaml @@ -0,0 +1,5 @@ +version: 1 +services: + github-action: + policies: + - dependabot diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3838083 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# EditorConfig: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +# Ignore paths +[/.next/**] \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..686face --- /dev/null +++ b/.env.example @@ -0,0 +1,18 @@ +BUNDLE_ANALYZE=false +ENVIRONMENT_NAME=local + +# The URL for the domain your app is hosted on (used for generating the urls needed for SEO) +# If you deploy to Vercel or Netlify it is configured through the respective config files (`vercel.json` and `netlify.toml`) +NEXT_PUBLIC_BASE_URL=http://localhost:3000/ + +# Your current space ID: https://www.contentful.com/help/find-space-id/ +CONTENTFUL_SPACE_ID= + +# Your current space Content Delivery API access token: https://www.contentful.com/developers/docs/references/content-delivery-api/ +CONTENTFUL_ACCESS_TOKEN= + +# Your current space Content Preview API access token: https://www.contentful.com/developers/docs/references/content-preview-api/ +CONTENTFUL_PREVIEW_ACCESS_TOKEN= + +# A unique string used to identify preview requests: https://nextjs.org/docs/advanced-features/preview-mode#securely-accessing-it-from-your-headless-cms +CONTENTFUL_PREVIEW_SECRET= diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..d2daf08 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +scripts/**/*.js +src/**/__generated \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..2d4a06a --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,118 @@ +module.exports = { + root: true, + parser: "@babel/eslint-parser", + parserOptions: { + requireConfigFile: false, + }, + env: { + browser: true, + commonjs: true, + es6: true, + jest: true, + node: true, + }, + plugins: ["react-hooks"], + settings: { + react: { + version: "detect", + }, + }, + extends: [ + "plugin:prettier/recommended", + "plugin:import/errors", + "plugin:import/warnings", + "plugin:import/typescript", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react/recommended", + "plugin:jsx-a11y/recommended", + "plugin:@next/next/recommended", + ], + rules: { + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-unused-vars": [ + "warn", + { + argsIgnorePattern: "^_|req|res|next|err|ctx|args|context|info", + }, + ], + "@typescript-eslint/no-object-literal-type-assertion": "off", + "@typescript-eslint/explicit-member-accessibility": "off", + "@typescript-eslint/camelcase": "off", + "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/ban-ts-ignore": "off", + "prettier/prettier": "off", + "import/no-named-as-default": "off", + "import/no-named-as-default-member": "off", + "import/default": "off", + "import/named": "off", + "import/namespace": "off", + "import/order": [ + "warn", + { + groups: ["builtin", "external", ["parent", "sibling"], "index"], + "newlines-between": "always", + pathGroups: [ + { + pattern: "@/**", + group: "external", + position: "after", + }, + { + pattern: "@test/**", + group: "external", + position: "after", + }, + ], + alphabetize: { + order: + "asc" /* sort in ascending order. Options: ['ignore', 'asc', 'desc'] */, + caseInsensitive: true /* ignore case. Options: [true, false] */, + }, + }, + ], + "jsx-a11y/click-events-have-key-events": "off", + "jsx-a11y/anchor-is-valid": "off", + "react/prop-types": "off", + "react/display-name": "off", + "react-hooks/rules-of-hooks": "error", + "react-hooks/exhaustive-deps": "warn", + "react/jsx-uses-react": "off", + "react/react-in-jsx-scope": "off", + "react/self-closing-comp": "warn", + }, + overrides: [ + { + files: ["**/*.ts?(x)"], + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaVersion: 2018, + sourceType: "module", + ecmaFeatures: { + jsx: true, + }, + // typescript-eslint specific options + warnOnUnsupportedTypeScriptVersion: true, + }, + settings: { + "import/parsers": { + "@typescript-eslint/parser": [".ts", ".tsx"], + }, + "import/resolver": { + typescript: { + alwaysTryTypes: true, + }, + }, + }, + }, + ], + globals: { + React: "writable", + }, +}; diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..922b79e --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @contentful/team-plato diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..953796f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,38 @@ +--- +name: "\U0001F41B Bug Report" +about: Spotted a bug? Add a report to help us improve this template +title: "\U0001F41B Bug - " +labels: bug, needs triage +--- + +# Bug report + +## Summary + + + +## Environment + + + +## Steps to reproduce + + + +## Expected results + + + +## Actual results + + diff --git a/.github/ISSUE_TEMPLATE/feedback.md b/.github/ISSUE_TEMPLATE/feedback.md new file mode 100644 index 0000000..5818f82 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feedback.md @@ -0,0 +1,17 @@ +--- +name: "\U0001F4AC Give feedback on a component" +about: Give us feedback to help us improve this template +title: "\U0001F4AC Feedback - " +labels: needs triage +--- + + + +# Template feedback + + diff --git a/.github/ISSUE_TEMPLATE/proposal.md b/.github/ISSUE_TEMPLATE/proposal.md new file mode 100644 index 0000000..fec5b24 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/proposal.md @@ -0,0 +1,31 @@ +--- +name: "\U0001F4A1 Proposal" +about: Want to extend the template or modify existing functionality? Send us a proposal +title: "\U0001F4A1 Proposal - " +labels: needs review, needs triage, proposal +--- + + + +# Template contribution proposal + +## The problem + + + +## The proposed solution + + + +## Breaking changes + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..d6c7cc2 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,43 @@ +**_What will change?_** + +- Stuff that is going to change +- even more interesting stuff that is going to change + + + + + + + + + +## Security + +_Before you click Merge, take a step back and think how someone could break the [Confidentiality, Integrity and Availability](https://docs.google.com/presentation/d/1YdFlYBLnbNoiSAMOKjopiF4u34StXTK2qYdOLkMsEKo/edit?usp=sharing) of the code you've just written. Are secrets secret? Is there any sensitive information disclosed in logs or error messages? How does your code ensure that information is accurate, complete and protected from modification? Will your code keep Contentful working and functioning?_ + + diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..ff25425 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,39 @@ +version: 2 + +registries: + npm-registry-registry-npmjs-org: + type: npm-registry + url: https://registry.npmjs.org + token: '${{secrets.NPM_REGISTRY_REGISTRY_NPMJS_ORG_TOKEN}}' + +updates: + - package-ecosystem: 'npm' + directory: '/' + schedule: + interval: 'daily' + time: '05:00' + timezone: UTC + commit-message: + prefix: build + include: scope + labels: + - 'dependencies' + - 'dependabot' + open-pull-requests-limit: 2 + reviewers: + - 'contentful/team-tolkien' + registries: + - npm-registry-registry-npmjs-org + allow: + - dependency-name: '@contentful/live-preview' + + - package-ecosystem: github-actions + directory: '/' + schedule: + interval: daily + time: '05:00' + timezone: UTC + open-pull-requests-limit: 15 + commit-message: + prefix: build + include: scope diff --git a/.github/workflows/auto-merge.yml b/.github/workflows/auto-merge.yml new file mode 100644 index 0000000..445ce15 --- /dev/null +++ b/.github/workflows/auto-merge.yml @@ -0,0 +1,15 @@ +name: 'dependabot approve-and-request-merge' + +on: pull_request_target + +jobs: + worker: + permissions: + contents: write + id-token: write + runs-on: ubuntu-latest + if: github.actor == 'dependabot[bot]' + steps: + - uses: contentful/github-auto-merge@v1 + with: + VAULT_URL: ${{ secrets.VAULT_URL }} diff --git a/.github/workflows/eslint-tsc.yml b/.github/workflows/eslint-tsc.yml new file mode 100644 index 0000000..c671551 --- /dev/null +++ b/.github/workflows/eslint-tsc.yml @@ -0,0 +1,45 @@ +# Workflow name +name: ESLint & TSC + +# Event for the workflow +on: [pull_request] + +# List of jobs +jobs: + eslint-tsc: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Read .nvmrc + run: echo "##[set-output name=NVMRC;]$(cat .nvmrc)" + id: nvm + + - name: Use Node.js (.nvmrc) + uses: actions/setup-node@v3 + with: + node-version: "${{ steps.nvm.outputs.NVMRC }}" + + - name: Get Yarn cache directory + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + + - name: Use Yarn cache + uses: actions/cache@v3.0.11 + id: yarn-cache + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ matrix.node-version }}-${{ hashFiles('**/yarn.lock') }} + + - name: Install dependencies + run: yarn install --frozen-lockfile --prefer-offline + # `--prefer-offline` gives cache priority + + - name: ESLint + run: yarn lint + + - name: TSC + run: yarn type-check \ No newline at end of file diff --git a/.github/workflows/sast.yaml b/.github/workflows/sast.yaml new file mode 100644 index 0000000..7ac4b04 --- /dev/null +++ b/.github/workflows/sast.yaml @@ -0,0 +1,31 @@ +name: SAST (Static Application Security Testing) + +on: + push: + branches: [master, main, main-private] + pull_request: + branches: [master, main, main-private] + +jobs: + polaris: + name: polaris / code-scan + continue-on-error: true + runs-on: ubuntu-latest + if: (github.repository_owner == 'contentful') && (endsWith(github.actor, '[bot]') == false) + steps: + - name: Clone repo + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Synopsys Polaris + uses: contentful/polaris-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + polaris_url: ${{ secrets.POLARIS_SERVER_URL }} + polaris_access_token: ${{ secrets.POLARIS_ACCESS_TOKEN }} + debug: true + polaris_command: analyze -w --coverity-ignore-capture-failure + security_gate_filters: '{ "severity": ["High", "Medium"] }' + fail_on_error: false + report_url: "https://github.com/contentful/security-tools-config/issues/new?title=False%20positive%20in%20Polaris" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7f0c54b --- /dev/null +++ b/.gitignore @@ -0,0 +1,47 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts + +# Intellij +*.iml +.gradle +.idea +.idea/libraries +.idea/workspace.xml +.idea/gradle.xml +.idea/misc.xml +.idea/modules.xml +.idea/vcs.xml diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..b23d309 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +yarn type-check && yarn lint-staged \ No newline at end of file diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100755 index 0000000..b23d309 --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +yarn type-check && yarn lint-staged \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..5e0828a --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v18.16.1 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..0f998f2 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +src/**/__generated \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..962bb96 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "printWidth": 100, + "semi": true, + "arrowParens": "avoid", + "singleQuote": true, + "trailingComma": "all", + "jsxBracketSameLine": true, + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/.vercelignore b/.vercelignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/.vercelignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..73a9447 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# CHANGELOG + +The changelog is automatically updated using +[semantic-release](https://github.com/semantic-release/semantic-release). You +can see it on the [releases page](https://github.com/contentful/template-blog-webapp-nextjs/releases). diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..3543534 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,7 @@ +# Contentful Community Code of Conduct + +The **Contentful Community** and the **Code of Conduct** governs all interactions with the contentful community. + +The **Contentful Community** is dedicated to providing a safe, inclusive, welcoming, and harassment-free space and experience for all community participants, regardless of gender identity and expression, sexual orientation, disability, physical appearance, socioeconomic status, body size, ethnicity, nationality, level of experience, age, religion (or lack thereof), or other identity markers. + +Our **Code of Conduct** exists because of that dedication, and we do not tolerate harassment in any form. See our full Code of Conduct and reporting guidelines at this [link](https://www.contentful.com/developers/code-of-conduct/). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..eca0962 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,42 @@ +# Introduction + +We appreciate any community contributions to this project, whether in the form of issues or Pull Requests. + +This document outlines what we'd like you to follow in terms of commit messages and code style. + +It also explains what to do in case you want to set up the project locally. + +If you have any questions or concerns please reach out to us either by filing an issue in the relevant repository or posting in the [Contentful Community Slack](https://www.contentful.com/slack/). + +## How Can I Contribute? + +Before creating a new issue; please check out the open issues as someone might have already created one for you! Please use the recommended templates for each section as helps us resolve issues faster. + +### Reporting Bugs + +Bugs are tracked as [GitHub issues](https://guides.github.com/features/issues/). If you are sure there's currently not an issue that describes the bug you're experiencing, create an issue on the repository and provide the following information by filling in [the template](https://github.com/contentful/template-blog-webapp-nextjs/tree/main/.github/ISSUE_TEMPLATE/bug-report.md). + +> **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one. + +### Proposals + +Want to make an enhancement proposal, including completely new features and minor improvements to existing functionality? Please create an issue with [the proposal template](https://github.com/contentful/template-blog-webapp-nextjs/tree/main/.github/ISSUE_TEMPLATE/proposal.md). + +### General feedback + +Not experiencing a bug or wanting to make a proposal, but still want to reach out? A lot of our colleagues are hanging out in [Contentful Community Slack](https://www.contentful.com/slack/) and might be able to help. Can't find your answer there? You can file a feedback issue through [this template](https://github.com/contentful/template-blog-webapp-nextjs/tree/main/.github/ISSUE_TEMPLATE/feedback.md). + +## Pull Requests + +The process described here has several goals: + +- Maintain the quality of the repository +- Fix problems that are important to users +- Enable a sustainable system for the maintainers from Contentful to review contributions + +Please follow these steps to have your contribution considered by the maintainers: + +1. Follow all instructions in [the template](https://github.com/contentful/template-blog-webapp-nextjs/tree/main/.github/PULL_REQUEST_TEMPLATE.md) +2. After you submit your pull request, verify that all [status checks](https://help.github.com/articles/about-status-checks/) are passing
What if the status checks are failing?If a status check is failing, and you believe that the failure is unrelated to your change, please leave a comment on the pull request explaining why you believe the failure is unrelated. A maintainer will re-run the status check for you. If we conclude that the failure was a false positive, then we will open an issue to track that problem with our status check suite.
+ +While the prerequisites above must be satisfied prior to having your pull request reviewed, the reviewer(s) may ask you to complete additional design work, tests, or other changes before your pull request can be ultimately accepted. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..92fee44 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2022 Contentful + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..cd8d286 --- /dev/null +++ b/README.md @@ -0,0 +1,261 @@ +# Contentful Blog Starter Template + +A Blog Starter Template powered by Next.js & Contentful, pre-designed with optimized & adjustable pages, components, and data management. + +![The homepage of the Blog Starter Template](blog-starter-template.jpg 'The homepage of the Blog Starter Template') + +$~$ + +## What is Contentful? + +[Contentful](https://www.contentful.com/) provides content infrastructure for digital teams to power websites, apps, and devices. Unlike a CMS, Contentful was built to integrate with the modern software stack. It offers a central hub for structured content, powerful management, and delivery APIs, and a customizable web app that enables developers and content creators to ship their products faster. + +$~$ + +## DISCLAIMER ⚠️ + +The Starter Templates experience is currently only available to new users. + +To benefit from this experience, please follow this link to create a new +account and select the template to install: [https://www.contentful.com/starter-templates/nextjs-blog/sign-up/?action=create_starter_template](https://www.contentful.com/starter-templates/nextjs-blog/sign-up/?action=create_starter_template&utm_source=github.com&utm_medium=referral&utm_campaign=template-blog-webapp-nextjs). + +Alternatively, to immediately start the auto installation of this template after creating a new account, +please follow this link: +[https://www.contentful.com/starter-templates/nextjs-blog/sign-up/?action=create_starter_template&template_name=blog](https://www.contentful.com/starter-templates/nextjs-blog/sign-up/?action=create_starter_template&template_name=blog&utm_source=github.com&utm_medium=referral&utm_campaign=template-blog-webapp-nextjs). + +$~$ + +## Begin your journey with Contentful and the Blog Starter Template + +Follow this [guide](https://github.com/contentful/template-blog-webapp-nextjs/blob/main/docs/tutorials/contentful-and-the-starter-template.md/?utm_source=github.com-guide&utm_medium=referral&utm_campaign=template-blog-webapp-nextjs) to understand the relationship between +Contentful and the Starter Template source code through guided steps: + +- Entry editing, and updates preview in the Starter Template application (online/locally) +- Content type editing in the Contentful web app, as well as in the Starter Template's code + +$~$ + +## Features + +- Composable content through powerful & flexible content modeling. +- Localization ready. +- SEO ready. +- Incremental Static Regeneration with Next.js[^1]. +- Generation of GraphQL[^2] typed code (schema, and types), in sync with the content types through graphql-codegen[^3]. +- Enhanced Developer Experience with TypeScript[^4]. + +$~$ + +## Getting started + +To get started, read the following guidelines. + +- [Environment variables](./README.md#environment-variables) +- [Dependencies](./README.md#dependencies) +- [Development](./README.md#development) +- [Contentful API & GraphQL](./README.md#contentful-api--graphql) +- [Deployment](./README.md#deployment) + +$~$ + +### Environment variables + +In order to authenticate the requests to the Contentful APIs, the following values are necessary: + +- Your space ID: [https://www.contentful.com/help/find-space-id/](https://www.contentful.com/help/find-space-id/) +- Contentful Delivery API token: [https://www.contentful.com/developers/docs/references/content-delivery-api/](https://www.contentful.com/developers/docs/references/content-delivery-api/) +- Contentful Preview API token: [https://www.contentful.com/developers/docs/references/content-preview-api/](https://www.contentful.com/developers/docs/references/content-preview-api/) + +Rename the `.env.example` file to `.env` and add the necessary values. + +$~$ + +### Dependencies + +To install the necessary dependencies, run: + +```bash +yarn +``` + +### Run the Starter Template in development mode + +```bash +yarn dev +``` + +The Starter Template should be up and running on `http://localhost:3000`. + +All necessary dependencies are installed under `node_modules` and any necessary tools can be accessed via npm scripts. + +$~$ + +## Development + +### Node + +It is recommended to use the Node version listed in the `.nvmrc` file, we recommend using [nvm](https://github.com/nvm-sh/nvm) to easily switch between Node versions. + +$~$ + +### Husky & git hooks + +This repository makes use of [Husky](https://github.com/typicode/husky) to enforce commit hooks. + +The config for both the `pre-commit` and `pre-push` hooks can be found in the `.husky` folder, located in the root of the project. + +--- + +#### Pre-commit + +Before allowing a commit, we require a successful result from the TypeScript compiler (`tsc`) and our `lint-staged` script will be run. + +This ensures all ESLint and Prettier rules are enforced on the files that are staged to be committed. + +The `tsc` command is run separately from the `lint-staged` step because we require the Typescript compiler to sample _all_ files. + +This is important to ensure that no deviating types were introduced by the [codegen](./README.md#graphql--code-generation) for example. + +--- + +#### Pre-push + +The same two tasks are run for pre-push and for pre-commit. + +--- + +#### Overriding the Husky git hooks + +In case of wanting to bypass the `pre-commit` or `pre-push` hooks, pass a `--noVerify` flag to your Git commands. + +⚠️ Make sure you only use this if you know why you're using it. ⚠️ + +$~$ + +### Contentful API & GraphQL + +This project makes use of Contentful's [GraphQL API](https://www.contentful.com/developers/docs/references/graphql/). + +API calls made to the Contentful GraphQL endpoint are made through `graphql-request`. + +The types are generated from the `.graphql` files located in the `/lib/graphql/` directory: + +1. `lib/graphql/[fileName].graphql` is detected by the [codegen](./README.md#graphql--code-generation) +2. `lib/__generated/sdk.ts` is generated +3. Within the generated file, their types and a new `getSdk` function are generated +4. The `getSdk` function can now be imported and used within the `getStaticProps` in the pages files + +$~$ + +### GraphQL & code generation + +We use `graphql-codegen` to generate a type-safe API client, utilizing [GraphQLClient](https://the-guild.dev/graphql/codegen/plugins/typescript/typescript-graphql-request) as the "client". + +--- + +#### Commands + +In order to (re-)generate the GraphQL schema, types and sdk, please use either of the following commands: + +- `yarn graphql-codegen:generate` generates a schema, types and code to fetch data from the Contentful APIs +- `yarn graphql-codegen:watch` similar to the `generate` command, but it runs as a watch task which will rerun the steps when changes are made in the `.graphql` files + +The first steps of the codegen generate files that contain the GraphQL schema and matching TypeScript types. All these files are located in the `src/lib/graphql` folder. +They're generated to the `src/lib/__generated` folder and ought to be committed once altered/added to the repository. + +The TS types for these files are generated in the same location, in a `__generated` folder and like the other files ought to be committed. + +--- + +#### Configuration + +The configuration for the codegen can be found in `codegen.ts`, located in the root of the project. + +$~$ + +--- + +$~$ + +## Deployment + +The Starter Template can be deployed to your hosting provider of choice. + +We offer integrations with Vercel and Netlify to speed up the process by clicking one of the deploy buttons below. The GitHub repository and +the necessary environment variables keys are pre-configured in the hosting provider space. + +| Vercel | Netlify | +| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fcontentful%2Ftemplate-blog-webapp-nextjs&env=CONTENTFUL_SPACE_ID,CONTENTFUL_ACCESS_TOKEN,CONTENTFUL_PREVIEW_ACCESS_TOKEN&envDescription=API%20Keys%20needed%20for%20the%20application&envLink=https%3A%2F%2Fgithub.com%2Fcontentful%2Ftemplate-blog-webapp-nextjs%23environment-variables) | [![Deploy to Netlify Button](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https%3A%2F%2Fgithub.com%2Fcontentful%2Ftemplate-blog-webapp-nextjs#CONTENTFUL_SPACE_ID=&CONTENTFUL_ACCESS_TOKEN=&CONTENTFUL_PREVIEW_ACCESS_TOKEN=) | +| [Environment variables docs](https://vercel.com/docs/concepts/projects/environment-variables) | [Environment variables docs](https://docs.netlify.com/environment-variables/overview/) | + +Make sure to add the necessary [environment variables values](./README.md#environment-variables) to the hosting provider +environment variables. + +--- + +## Content preview + +Once you have the Starter Template deployed on your hosting provider, you can update the Content preview URL in your space settings. + +You can follow our guide to learn how to do +so: [https://www.contentful.com/help/setup-content-preview](https://www.contentful.com/help/setup-content-preview/?utm_source=github.com-preview-guide&utm_medium=referral&utm_campaign=template-marketing-webapp-nextjs). + +For the live preview the basic field tagging for the inspector mode and live updates are already implemented. +For custom components, you can find the instructions at our [guide](https://www.contentful.com/developers/docs/tutorials/general/live-preview/). + +### Adjustments in code + +1. Set a unique value for `process.env.CONTENTFUL_PREVIEW_SECRET` in your environment variables. This value should be kept secret and only known to the API route and the CMS. +2. Configure the entry preview URLs in Contentful to match the draft API route's URL structure. This can be done in the Contentful web interface under "Settings" for each content type. For more information see: https://www.contentful.com/help/setup-content-preview/#preview-content-in-your-online-environment +3. The draft mode API route is already written in the app and can be found in `pages/api/draft.page.tsx`. This route checks for a valid secret and slug before redirecting to the corresponding page\*. +4. To disable draft mode, navigate to the `/api/disable-draft` route. This route already exists in the app and can be found in `pages/api/disable-draft.page.tsx`. + +_\*The `slug` field is optional; When not passed we redirect the page to the root of the domain._ + +### Adjustments in Contentful + +1. Next, you will need to configure your Contentful space to use the correct preview URLs. To do this, go to the "Settings" section of your space, and click on the "Content Preview" tab. From here, you can configure the preview URLs for each of your content models. +2. Edit all content models that need a preview url. We usually expect that to only be the models prefixed with `📄 page -`. +3. Add a new URL with the following format: `https:///api/draft?secret=&slug={entry.fields.slug}`. Make sure to replace `` with the URL of your Next.js site, and `` with the value of `process.env.CONTENTFUL_PREVIEW_SECRET`. Optionally, a `locale` parameter can be passed. +4. Now, when you view an unpublished entry in Contentful, you should see a "Preview" button that will take you to the preview URL for that entry. Clicking this button should show you a preview of the entry on your Next.js site, using the draft API route that we set up earlier. + +### Exiting the Content Preview + +To disable draft mode, navigate to the `/api/disable-draft` route. This route already exists in the app and can be found in `pages/api/disable-draft.page.tsx`. + +$~$ + +--- + +$~$ + +## Support + +If you have a problem with this Starter Template, post a message in our [Contentful Community Slack](https://www.contentful.com/slack/). + +Can't find your answer there? You can file a feedback issue through [this template](https://github.com/contentful/template-blog-webapp-nextjs/tree/main/.github/ISSUE_TEMPLATE/feedback.md). + +If you have other problems with Contentful not related to the Starter Template, you can contact the [Customer Support](https://support.contentful.com/). + +$~$ + +## Contributing + +See [CONTRIBUTING.md](./CONTRIBUTING.md). + +$~$ + +## License + +MIT License, see [LICENSE](./LICENSE). + +$~$ + + + +[^1]: [Next.js docs](https://nextjs.org/docs/basic-features/data-fetching/get-static-props) +[^2]: [GraphQL docs](https://graphql.org/learn/) +[^3]: [graphql-codegen](https://www.the-guild.dev/graphql/codegen) +[^4]: [TypeScript](https://www.typescriptlang.org/) +[^note]: [React docs](https://reactjs.org/docs/getting-started.html) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..cd5e7b8 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,31 @@ +## Security Policy + +Security at Contentful + +Security being just important to us is a huge understatement. Security is a top priority at Contentful, and we live it in our day-to-day activities. + +If you believe you have found a security vulnerability in any Contentful-owned repository, please report it to us as described below. + +## Supported Versions + +Refer to individual repositories for supported versions. + +## Reporting a Vulnerability + +Contentful engages with the community via our Responsible Disclosure Program, also known as our Bug Bounty Program. Our community plays an important role in helping us stay bug-free and secure. + +Found a vulnerability? Would you like to report a bug or something interesting that you found? The best way to reach out to us is via the submission form at the end of the [page](https://www.contentful.com/security/). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + +- Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) +- Full paths of source file(s) related to the manifestation of the issue +- The location of the affected source code (tag/branch/commit or direct URL) +- Any special configuration required to reproduce the issue +- Step-by-step instructions to reproduce the issue +- Proof-of-concept or exploit code (if possible) +- Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +Report security vulnerabilities in third-party modules to the person or team maintaining the module. diff --git a/bin/setup.sh b/bin/setup.sh new file mode 100755 index 0000000..9a80f86 --- /dev/null +++ b/bin/setup.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# Check if .env file already exists +if [ -f .env ]; then + echo ".env.example file does not exist. Aborting." + exit 1 +fi + +# Check if .env.example file exists +if [ ! -f .env.example ]; then + echo ".env.example file does not exist. Aborting." + exit 1 +fi + +# Copy .env.example to .env +cp .env.example .env + +# Read the values of the variables from command-line arguments +for arg in "$@"; do + if [[ "$arg" != *"="* ]]; then + echo "Invalid argument: $arg. Arguments must be in the format KEY=VALUE. Aborting." + exit 1 + fi + + key=$(echo "$arg" | cut -d'=' -f1) + value=$(echo "$arg" | cut -d'=' -f2) + + # Sanitize inputs + if [[ "$key" != *[![:alnum:]_]* ]]; then + sed -e "s/^${key}=.*/${key}=${value}/" .env > temp && mv temp .env + else + echo "Invalid key: $key. Keys must contain only letters, numbers, and underscores. Aborting." + exit 1 + fi +done + +# install node_modules and run dev +echo Installing dependencies +yarn +yarn dev \ No newline at end of file diff --git a/blog-starter-template.jpg b/blog-starter-template.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6929f923ee7d41d79c6c0618b45d5f1a7c3d178c GIT binary patch literal 165046 zcmdSB2Ou0;w=g=0PIM71di34}(L2!@Ey`ew(R+!6=q*GidS{3>dL(L$7DSKUB3eig z1pg!_=bW7O-S7VQd+*)14YS)?d$qmy+RfGU)iQuW!3S&$0H~<21F!(UhpQa`k-Voh z#20`9xQ5KW0{~ntqw(2$c({o3@Hn}1TiQ5Vfw--mp*%j8E?Fys-`c@I2ey%9Fci|@)o_sm*@Kn++(5d1ntIlL5Nk0T25Bj}J3it*P!}l3 z!;;Pi>gePy?jy}JQqCnhGw!^_XZ&(DRd!R7Ajb!zD+YOxyR{qG#RKf@ME4D& zrIoX%ha>}%*k8DSy8MRrZ^iXfMGcLAT@?!bCWG&2-92~8PuLdP%2%}2+oVQCF^`j*4?9YjMz zT*b-V!_vtbq#`fLfJDL#2HS`$^2;d5%kv6|h|2Kt@hQlQ3Cjt}iV2D+$jJ&Qipa?R z3M=ny?Fj`rdHf1%^E<5IKf-=92&fCPWqFVr*b8K%=;jQi`_8pE_@8Ov`$v2~U~T@H z7XE*PH60!qyc@4{${+$#Bb&gazfg?8`8M1_5jzvn=HWQC9)HtT+IO< z12C>#yM}%Z105X$8w2@^i-m!Kg^P!SgNuWMM~L@55aL}YASAesM?ykMN$iY{iHV7ihfhIBNI^+PL`L~r!M_{1dI=!HLYqR*MMEJ1pc0{=5usdl1BQ@29R(c) z1?Bfa00kB88af6h7B(^y4O#NnB0>NP8tOGvBr~{}*qCSlToeE*8qqa+K4Nqk3~ftS z1`^Ci38Va^c{Pb-Sg&MttZK&?b)O3Axe2&?kQ?0ixO@=YS;xd8k}qfdm{~~JrruMY zLbM>MVI`y+bejl?3>5|K8Y21| zeeOOAM#aFwLc%5y2H%rK#lHK!3DUdy=%~maOxYhFRAdRVh#BRViiEPrY@2qskh&N!9~>+f>=#~A&! z+<(OVe^u~Tg8oF`|L4hH1@xPFprZaevZBA1`)>*4KPG^`q4Up#{<}2&mGJ)-mBEBR zZ0aYG{S^Ior1u8{{DtgrO1|Ou*Um!k1)S9RZg1Y=o!{egTVw?~B|yhtU_YY{ZLwdW zsxX;}#9x9x^Nc$j<`I~A<5r#BdhT00mF#;3NTnG#k6YTPMRK>Q_GKV?b^4_ADk|o5p-zwiS!n;uiVDu$ZL_WBectw z-hSS=Q{n;+lZ2yG3)f*z4qNR4VM6em=bKW-z7-oK>?S>gGs3$sY*U8(j^V~y5i``I zntLVo_|`I_rBPqHpGxU$J$Os;NsB(nP$uNoQF{}8uNWg)0lR{HntiouQ5l~o zkSlFq&}+f%)8^pJo;U414+%`}&QCP0>tk
?v8s?hFtjtRyjZ!}bUx`TJd_ZQqw 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

ntU*EmYES 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®%0wc2FaNaJkC9S__Xi70+DJenSQ2 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 { + return [ + { + // Apply these headers to all routes in your application. + source: '/:path*', + headers: securityHeaders, + }, + ]; +}; diff --git a/config/plugins.js b/config/plugins.js new file mode 100644 index 0000000..882aa81 --- /dev/null +++ b/config/plugins.js @@ -0,0 +1,23 @@ +const withBundleAnalyzer = require('@next/bundle-analyzer'); +const withPWA = require('next-pwa'); + +module.exports = [ + [ + withPWA, + { + pwa: { + disable: process.env.NODE_ENV !== 'production', + dest: `public`, + register: false, + swSrc: './service-worker.js', + publicExcludes: ['!favicon/**/*'], + }, + }, + ], + [ + withBundleAnalyzer, + { + enabled: process.env.BUNDLE_ANALYZE === 'true', + }, + ], +]; diff --git a/docs/tutorials/contentful-and-the-starter-template.md b/docs/tutorials/contentful-and-the-starter-template.md new file mode 100644 index 0000000..9f258b5 --- /dev/null +++ b/docs/tutorials/contentful-and-the-starter-template.md @@ -0,0 +1,169 @@ +# DISCLAIMER ⚠️ + +The Starter Templates experience is currently only available to new users. + +To benefit from this experience, please follow this link to create a new +account and select the template to install: [https://www.contentful.com/starter-templates/nextjs-blog/sign-up/?action=create_starter_template](https://www.contentful.com/starter-templates/nextjs-blog/sign-up/?action=create_starter_template&utm_source=github.com&utm_medium=referral&utm_campaign=template-blog-webapp-nextjs). + +Alternatively, to immediately start the auto installation of this template after creating a new account, +please follow this link: +[https://www.contentful.com/starter-templates/nextjs-blog/sign-up/?action=create_starter_template&template_name=blog](https://www.contentful.com/starter-templates/nextjs-blog/sign-up/?action=create_starter_template&template_name=blog&utm_source=github.com&utm_medium=referral&utm_campaign=template-blog-webapp-nextjs). + + +$~$ + +## Begin your journey with Contentful and the Blog Starter Template + +After reading this document, you will be able to: + +- Understand some of the core features of Contentful (content model, content type, entry, reference). +- Understand the relationship between Contentful and the Starter Template: + - Edit an entry, and see the update in the Starter Template application (online/locally). + - Edit a content type in the Contentful web app, as well as in the Starter Template's code. + +$~$ + +### Contentful core features + +#### What is a content model + +A content model is the foundation of every great digital project. Your model is the bones of your project; it tells our APIs what kind of content to send to your end application. In short, a content model gives structure and organization to your content. + +Designing your content model is a critical step in building a solid, efficient, and future-proof application with Contentful. + +--- + +#### What is a content type + +Within your overall content model, you’ll have individual content types. You can think of each content type as an outline for your content; it tells you what data will be contained within each individual entry. Think of the content type as the “stencil” for the “drawing” that will be your entry. + +Each content type is made up of fields that denote the type of data that will be included in the entry. For example, the title of a web page or news article would have its own text field, the body would have another, and there would also be fields to include any media files. + +--- + +#### What is an entry + +An entry is a piece of content created from a content model, Contentful provides an editor to create content. + +--- + +#### What is a reference + +A reference is a field type you can add to your content type. This field gives you the ability to link one or multiple entries to another. + +$~$ + +### Relationship between Contentful and the Starter Template + +In the previous step, we learned the basics of Contentful's core features. + +Now, we will explore the relationship between Contentful and the Starter Template frontend layer, by using the `Homepage` entry as an example. + +Note that from now on, we will refer to the Contentful application, as the `web app`. + +> **Pre-requisites:** +> +> To follow the next steps, make sure you are logged into [https://app.contentful.com/](https://app.contentful.com/). + +$~$ + +#### Homepage - Entry + +Start by opening the `Homepage` entry, you have several ways to do so: + +- From anywhere in the web app, press `Q` to open the Quick search, search for `Homepage`, and click on the item in the results. +- From the main navigation bar, click on Content, search for `Homepage` in the text field, and click on the item in the results. + +You will be directed to the `Homepage` entry editor, where you will see the structure and fields, which are outlined by the `📄 page - Landing` content type: + +- The SEO metadata (title, description, meta tags...). +- A featured blog post + + +1. Edit the `Featured blog post` field by selecting a different blog post to feature on the homepage, the changes are saved automatically. +2. Open the preview to see the changes, by clicking on the `Open preview` button in the right entry sidebar. +3. You should see the changes, they are only visible to you until you decide to publish them, this is made possible thanks to the preview mode. + +NOTE: you can also see the changes by running the Starter Template application locally, after completing the [setup](../../README.md/#getting-started). You will have to publish the changes, as the preview mode is only available from Contentful. + +--- + +#### Homepage - Content type + +In the previous step, we explored the `Homepage` entry's structure and edited the `Featured blog post`. + +Now, we are going to edit the `📄 page - Landing` content type to understand its relationship with the Starter Template source code. + +> **Pre-requisites:** +> +> To follow the next steps, make sure you have completed the [Starter Template setup](../../README.md/#getting-started) and that the Starter Template application is running locally, at [http://localhost:3000](http://localhost:3000). + +$~$ + +#### Edit the content type in the web app + +Start by opening the `📄 page - Landing` content type, you have several ways to do so: + +- From anywhere in the web app, press `Q` to open the Quick search, search for `📄 page - Landing`, and click on the item in the results. +- From the main navigation bar, click on the `Content model` link, search for `📄 page - Landing` in the text field, and click on the item in the results. + +From the `📄 page - Landing` content type page: + +1. Add a new field, by clicking on the `Add field` button in the right sidebar. +2. Select the `Text` field. +3. Give the `Greeting` a name (it will appear in the entry editor). +4. Keep the default options. +5. Click **Create**. +6. Re-organize the new field by dragging and dropping it to the top of the list. +7. Save the changes, by clicking on the `Save` button in the top right corner. + +The new field is now available, let's add a value in the `Homepage` entry: + +- Go to the `Homepage` entry editor (see [Homepage - Entry](#homepage---entry) to do so). +- Add a value to the `Greeting` field. +- Publish the changes by clicking on the `Publish changes` button in the right entry sidebar. + +--- + +#### Edit the content type in the Starter Template source code + +Now, let's connect the new `Greeting` field to our Starter Template source code: + +- In your terminal of choice, run `yarn run graphql-codegen:watch`, this script will sync the Starter Template's source code with the web app content models, and generate the necessary updated typings files, as soon as a change is made in a `.graphql` file. + - In our case, it will update the typings of our `📄 page - Landing` content type, to make the `Greeting` field available. +- Open the `pageLanding.graphql` file, this file represents the query made to Contentful to get the `📄 page - Landing` content type fields values + - Follow the comment in the file, line #6, save the changes. +- Open the `index.page.tsx` file. + - Follow the comments in the file starting line #25, save the changes. +- Navigate to the running Starter Template application, [http://localhost:3000/](http://localhost:3000/) + - If the application is not running yet, in your terminal of choice, run `yarn dev`. +- You should see the `Greeting` field on the homepage. + +$~$ + +## Wrap up + +We summarized the fundamentals of Contentful's core features (content model, content type, entry, reference), as well as the relationship between Contentful and the Starter Template source code. + +You are now equipped to make this Starter Template your own and utilize the full potential of Contentful. + +Have a great journey with Contentful! + +$~$ + +## Support + +If you have a problem with this Starter Template, post a message in our [Contentful Community Slack](https://www.contentful.com/slack/). + +Can't find your answer there? You can file a feedback issue through [this template](https://github.com/contentful/template-blog-webapp-nextjs/tree/main/.github/ISSUE_TEMPLATE/feedback.md). + +If you have other problems with Contentful not related to the Starter Template, you can contact the [Customer Support](https://support.contentful.com/). + +$~$ + +## Notes + +- [Contentful Web App Overview](https://www.contentful.com/help/contentful-web-app-overview/) +- [Content Modelling Basics](https://www.contentful.com/help/content-modelling-basics/) +- [References](https://www.contentful.com/help/references/) +- [Entry Editor](https://www.contentful.com/help/entry-editor/) diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 0000000..d369e0e --- /dev/null +++ b/netlify.toml @@ -0,0 +1,2 @@ +[build] + command = "NEXT_PUBLIC_BASE_URL=\"${NEXT_PUBLIC_BASE_URL:-$URL}\" yarn build" diff --git a/next-i18next.config.js b/next-i18next.config.js new file mode 100644 index 0000000..a5174f8 --- /dev/null +++ b/next-i18next.config.js @@ -0,0 +1,10 @@ +const path = require('path'); + +module.exports = { + i18n: { + defaultLocale: 'en-US', + locales: ['en-US', 'de-DE'], + localeDetection: false, + localePath: path.resolve('./public/locales'), + }, +}; diff --git a/next.config.js b/next.config.js new file mode 100644 index 0000000..c0e44f7 --- /dev/null +++ b/next.config.js @@ -0,0 +1,73 @@ +const dotenv = require('dotenv').config(); +const nextComposePlugins = require('next-compose-plugins'); + +const headers = require('./config/headers'); +const plugins = require('./config/plugins'); +const { i18n } = require('./next-i18next.config.js'); + +/** + * https://github.com/cyrilwanner/next-compose-plugins/issues/59 + */ +const { withPlugins } = nextComposePlugins.extend(() => ({})); + +/** + * Next config + * documentation: https://nextjs.org/docs/api-reference/next.config.js/introduction + */ +module.exports = withPlugins(plugins, { + i18n, + /** + * add the environment variables you would like exposed to the client here + * documentation: https://nextjs.org/docs/api-reference/next.config.js/environment-variables + */ + env: { + ENVIRONMENT_NAME: process.env.ENVIRONMENT_NAME, + }, + + /** + * The experimental option allows you to enable future/experimental options + * like React 18 concurrent features. + */ + experimental: { + // urlImports: true, + // concurrentFeatures: true, + // serverComponents: true, + }, + + /** + * SWC minification opt-in + * Please note that while not in experimental, the swcMinification may cause issues in your build. + * example: https://github.com/vercel/next.js/issues/30429 (Yup email validation causes an exception) + */ + // swcMinify: true, + + poweredByHeader: false, + reactStrictMode: false, + compress: true, + + /** + * add the headers you would like your next server to use + * documentation: https://nextjs.org/docs/api-reference/next.config.js/headers + * https://nextjs.org/docs/advanced-features/security-headers + */ + headers, + + /** + * https://nextjs.org/docs/basic-features/image-optimization + * Settings are the defaults + */ + images: { + domains: ['images.ctfassets.net','images.eu.ctfassets.net'], + }, + + pageExtensions: ['page.tsx', 'page.ts', 'page.jsx', 'page.js'], + + webpack(config) { + config.module.rules.push({ + test: /\.svg$/, + use: ['@svgr/webpack'], + }); + + return config; + }, +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..7d4d60f --- /dev/null +++ b/package.json @@ -0,0 +1,82 @@ +{ + "name": "template-blog-webapp-nextjs", + "version": "0.1.0", + "private": true, + "engines": { + "node": ">=18", + "npm": "Please use Yarn" + }, + "scripts": { + "prepare": "husky install", + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "type-check": "tsc --noEmit", + "graphql-codegen:generate": "graphql-codegen -r dotenv/config --config codegen.ts", + "graphql-codegen:watch": "graphql-codegen --watch -r dotenv/config --config codegen.ts", + "setup": "./bin/setup.sh" + }, + "lint-staged": { + "src/**/*.{js,jsx,ts,tsx}": [ + "eslint --quiet --fix" + ], + "src/**/*.{json,js,ts,jsx,tsx}": [ + "prettier --write" + ] + }, + "license": "MIT", + "dependencies": { + "@contentful/f36-icons": "^4.23.2", + "@contentful/f36-tokens": "^4.0.1", + "@contentful/rich-text-react-renderer": "^15.16.2", + "@contentful/live-preview": "^2.11.1", + "@next/bundle-analyzer": "^13.0.4", + "dotenv": "^16.0.3", + "graphql": "^16.6.0", + "next": "^13.4.1", + "next-compose-plugins": "^2.2.1", + "next-i18next": "^12.1.0", + "next-pwa": "^5.6.0", + "next-seo": "^5.15.0", + "next-sitemap": "^3.1.32", + "react": "18.2.0", + "react-dom": "18.2.0", + "react-focus-lock": "^2.9.2", + "sharp": "^0.31.3" + }, + "devDependencies": { + "@babel/eslint-parser": "^7.19.1", + "@contentful/rich-text-types": "^16.0.2", + "@graphql-codegen/cli": "2.13.12", + "@graphql-codegen/client-preset": "1.1.4", + "@graphql-codegen/introspection": "2.2.1", + "@svgr/webpack": "^6.5.1", + "@tailwindcss/typography": "^0.5.8", + "@types/node": "18.11.9", + "@types/react": "18.0.25", + "@types/react-dom": "18.0.9", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.32.0", + "autoprefixer": "^10.4.13", + "eslint": "8.26.0", + "eslint-config-next": "13.0.1", + "eslint-config-prettier": "^8.3.0", + "eslint-import-resolver-typescript": "^2.4.0", + "eslint-plugin-import": "^2.23.4", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.22.0", + "eslint-plugin-react-hooks": "^4.2.0", + "husky": "^8.0.2", + "i18next": "^21.9.2", + "i18next-http-backend": "^1.4.4", + "lint-staged": "^13.0.3", + "postcss": "^8.4.19", + "prettier": "^2.7.1", + "prettier-plugin-tailwindcss": "^0.2.1", + "tailwind-merge": "^1.8.0", + "tailwindcss": "^3.2.4", + "typescript": "4.9.3", + "typescript-graphql-request": "^4.4.6" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..33ad091 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/assets/svg/blog-logo.svg b/public/assets/svg/blog-logo.svg new file mode 100644 index 0000000..caada1f --- /dev/null +++ b/public/assets/svg/blog-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/assets/svg/contentful.svg b/public/assets/svg/contentful.svg new file mode 100644 index 0000000..bf515e0 --- /dev/null +++ b/public/assets/svg/contentful.svg @@ -0,0 +1 @@ + diff --git a/public/assets/svg/example.svg b/public/assets/svg/example.svg new file mode 100644 index 0000000..bc9668e --- /dev/null +++ b/public/assets/svg/example.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/public/favicons/android-chrome-192x192.png b/public/favicons/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3a46f45bf4cba94c00f756e2dfc43b59179a3f GIT binary patch literal 2388 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 bJZ(`}I?dw0sVbF9DFIqH^wi5$Z6p2%7~Aml literal 0 HcmV?d00001 diff --git a/public/favicons/apple-touch-icon.png b/public/favicons/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e98183b7c106476106fde0354743eb9b01029249 GIT binary patch literal 2317 zcmV+o3G()dP)Px%xKK<~MgRZ*^7HgAIZD;o+xPeQUT1VZNLU*uIvy%L zzrx5+S!nwD`#MBbUubpV zFF{#ia4|eh=;`Y-Jx*?QfhaRYKuTI5EI!)Y-=U_h>g(+!Fha-5&s=13OjTq}R%I_b zOV85QFgr{^OItZZRI0AECNe}RG)65rN*^md*V*0M-QeEfj?)CNd zG(Jz?;p1pom-o~G2-+V1Y~s;{>8 z_xP-_x00Bl`1$$i>g-x$aE+6kI6_m7l%3_~=)AziJxEx^$j#Q++>@E2oS~{pQ({wG zYV`E=_V)K+X?8L_PSe%d=jiK*kC}OZi&R}}!^X=iH%LWJUWt&IR$pyKP+vz;V4I++ zB{4%cLQ-LAcfiBQb9#nSTWR9t=9ZhJud}+r#L0$?mSk*sc72GLou+qwiQV4ekd>di zzQnV)y*x)(-QVI)SY~H$eD3e@MNeOGd4x4UQO?oTdV!2`dWBeFZ`j)1YI1(@^7BYi zVT_WTxV*t@bARIF=4WqvqNc9*`1pW_lJN2JxxB)nr>|yidTn%p^YryzW^>fm*;Za` zO;={d$n=l z*4oU@)5FKifrygl>FTt&zIcC&rKzx_sjydIZZ<(ty}`zckeaNqxTUJGgNl^4y1*wg zM16#g(bL!b{QRG!tbT=$OH^aAwYx)2T$h}sXcYA`3+1uX9%+PFffWX7aouaB;Wpi6&aT8H$MgRZ> zkV!;ARCwC$-St-+SriBG8)*Bml9@mfLJ};vI~2D96|A@wDblU&c57RAcXyX{cXxMp zw|`^VJ^k^%31`Vn?>lF{zw^$AFihs%dtU;eM~@yodi3bgqsIgB^L+LxVHL;Xy~!LJ-;_l77fi-{hx`4X2x)8p?GL!{JLK}G_!2>7Z1%c zKN1klIk;^=iI!f1GwQz)}hMn4~gu5@P}Wpqvwy3&GV%IL!Bc)95|%IKnIyw?5} zWwbN{FWbCM84Y{z+sBKf(Hn8}Y0~HeIQk6{ujvNTcMm&$_c%@&ZN(p{W8)~J@4#1Vb~2z2d4#H1xmjOMlc0haTHz{r-~~#Cvlo{=^_2nnhjuR6I0e*SZBn zvqWzJ(Jb*-0nyCfE+CqHuVF1O7rO+GUcVmXDFx-S_z`Za(PR9F#oY{Ce`}%kqez%^)?sTo=eWfY@T|pOcf31MtE0t zS}s{Mn4&{C>bvNoK|0M*&$ZG;gY+jpaT;7p7!7C6;&s$;i7*;s@S%^^Jj!VJvKW1X zNhgh#zdW7)H-xq&i8XAsuVOWK`2e7bap0=F>*Q9q3KZOdFlM7u(|6XroO# zu~ye6+GvPI?s~D$5Jx8?&rQach@)c`A}c;g9BrDc@-vefXu#$Q=MNA^FG5zFKASkY z0^2AC3W#=e6G!)8)xjF#=wm7mf2)FiN9B`6YM{-f*m$omZM0z}HifmEHu_{5vSMf# zZFKcgtcUwFZS)3o{%jU$^qFPo3D6SK=p1waocOZ`y0K-=^_0=JK6J$wWXkCK@Sc$; z3m+aw+g?T&4E3dqj>eCV2dpBD?%sxXFqSpZMH>!l(JS&S+W!mu;$RE*kwwc55xfR@ zKUK86bsn#2>)HOe2hslNT=Od~qG(%N1h=REfte&)9{M?(KdAB@P((X7v?|Q0j7s#- z@>lO4RT>G}>*>><6ZpKmoBw{!HI*M{E1nN%(P-YIFWK9D-mO_v-Zmq3shfc@zhTe@ zZOQU-pO6eoko(EJkn^As+JocvBa(RNcojY%S#5Oc5D15!w*`blXO@F-=!{-TICN&O zO6OfvL_5;eI$ES2dfIu_PP(XtHrj^(1Vd+5s(Bz$o$m=qIIilEGd0kTkum_W(4X(w zCxKY#lml^103x9+3m;5Y{n)2R(Xj<9YM(O$2!b{SJC>Yke8Bl0Xq4Ylr%WJ`OA;18 zyuYG0`4)W5nI1iQ^ytx}N6&=w4`Zd$XRK3j*Z=?kS9(-fbW&k=AaHVTW@&6?Aar?f zWguyAbYlPjc%0+%3K74o@ + + + + + #ffffff + + + diff --git a/public/favicons/favicon-16x16.png b/public/favicons/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..158e304aa85e1853edeba9aa775019b26f540c12 GIT binary patch literal 723 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM(|R0G|-o|5O4?R&EqiHj~k?UbcEuXa7ujZM!)OSBk5cOQ~7z-go5K$#XmR z9+FnKl29>!@#?ilVB&@?yI;O~qo89~-!|d&*-IV$GfJx4J%SRKtk@u{Vg32b*9A-0 ze*5tze%ik4Kzv4NQB|v~rp=98cbBi;ET?62>(2f1y3T+9{we7>q~}-5 zY1uAbu_2?N_SdgplB$*s?GyJNIOZOhkXzcgaM?O#Jx5th>wO20@7i}*%hbK3rd?FY z)GIhSySRS#f|YmfJy@}J%b}yEBvdWdZQ8kN-PV=swjMrqIzGK*&w-;`cI=xpW1*!> z$W)EDlE82jFA4Gs{(I}+y^KHX390X|Ut@jykRvbm)1wD$H}9^M_5>=~+(II~w*x zJ0vYwK6$BNm*l&!G^+x}*a=C=qP!xa%c_F96c{%go+CO{cgxl*R~?v=92ogE#jUfQ zYgHBI_ct~N+c-&asHgKi%N5z)O$emAGKZCnwXXKr0wLUHx3vIVCg!0OGJy AN&o-= literal 0 HcmV?d00001 diff --git a/public/favicons/favicon-32x32.png b/public/favicons/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ec3408111d24fc984dba35390cbd8940ca9015b0 GIT binary patch literal 1231 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 + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/public/favicons/site.webmanifest b/public/favicons/site.webmanifest new file mode 100644 index 0000000..79ad15d --- /dev/null +++ b/public/favicons/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/favicons/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/favicons/android-chrome-384x384.png", + "sizes": "384x384", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/public/locales/de-DE/common.json b/public/locales/de-DE/common.json new file mode 100644 index 0000000..dc61dfe --- /dev/null +++ b/public/locales/de-DE/common.json @@ -0,0 +1,25 @@ +{ + "article": { + "relatedArticles": "Verwandte Artikel", + "featured": "gekennzeichnet" + }, + "landingPage": { + "latestArticles": "Neueste Artikel" + }, + "common": { + "homepage": "Startseite", + "regionalSettings": "Regionale Einstellungen", + "language": "Sprache", + "languageDrawer": "Sprachschublade umschalten" + + }, + "footer": { + "aboutUs": "über uns", + "description": "Unser Unternehmen ist auf die Entwicklung fortschrittlicher Technologien für eine Vielzahl von Branchen spezialisiert. Wir verwenden modernste Techniken und Algorithmen, um intelligente Systeme zu erstellen, die Unternehmen dabei helfen können, Aufgaben zu automatisieren, die Effizienz zu verbessern und Innovationen voranzutreiben.", + "powerBy": "Unterstützt von" + }, + "notFound": { + "title": "Seite nicht gefunden", + "description": "Diese Seite scheint nicht zu existieren. <0>Klicken Sie hier, um zur Startseite zurückzukehren." + } +} diff --git a/public/locales/en-US/common.json b/public/locales/en-US/common.json new file mode 100644 index 0000000..3ad78b5 --- /dev/null +++ b/public/locales/en-US/common.json @@ -0,0 +1,24 @@ +{ + "article": { + "relatedArticles": "Related articles", + "featured": "featured" + }, + "landingPage": { + "latestArticles": "Latest articles" + }, + "common": { + "regionalSettings": "Regional Settings", + "homepage": "Homepage", + "language": "Language", + "languageDrawer": "Toggle language drawer" + }, + "footer": { + "aboutUs": "about us", + "description": "Our company specialises in the development of advanced technologies for a wide range of industries. We use cutting-edge techniques and algorithms to create intelligent systems that can help businesses automate tasks, improve efficiency, and drive innovation.", + "powerBy": "Powered by" + }, + "notFound": { + "title": "Page not found", + "description": "This page doesn't seem to exist. <0>Click here to go back the homepage." + } +} diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..e22f31f --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,3 @@ +# As soon as you are ready to go public, change the `Disallow: /` to `Allow: /` +User-agent: * +Disallow: / diff --git a/src/components/features/article/ArticleAuthor.tsx b/src/components/features/article/ArticleAuthor.tsx new file mode 100644 index 0000000..71adda5 --- /dev/null +++ b/src/components/features/article/ArticleAuthor.tsx @@ -0,0 +1,36 @@ +import { useContentfulInspectorMode } from '@contentful/live-preview/react'; + +import { CtfImage } from '@src/components/features/contentful'; +import { PageBlogPostFieldsFragment } from '@src/lib/__generated/sdk'; + +interface ArticleAuthorProps { + article: PageBlogPostFieldsFragment; +} + +export const ArticleAuthor = ({ article }: ArticleAuthorProps) => { + const { author } = article; + const inspectorProps = useContentfulInspectorMode({ entryId: author?.sys.id }); + + return ( +

+
+ {author?.avatar && ( + + )} +
+ + {author?.name} + +
+ ); +}; diff --git a/src/components/features/article/ArticleContent.tsx b/src/components/features/article/ArticleContent.tsx new file mode 100644 index 0000000..0518716 --- /dev/null +++ b/src/components/features/article/ArticleContent.tsx @@ -0,0 +1,18 @@ +import { useContentfulInspectorMode } from '@contentful/live-preview/react'; + +import { CtfRichText } from '@src/components/features/contentful'; +import { PageBlogPostFieldsFragment } from '@src/lib/__generated/sdk'; + +interface ArticleContentProps { + article: PageBlogPostFieldsFragment; +} +export const ArticleContent = ({ article }: ArticleContentProps) => { + const { content } = article; + const inspectorProps = useContentfulInspectorMode({ entryId: article.sys.id }); + + return ( +
+ +
+ ); +}; diff --git a/src/components/features/article/ArticleHero.tsx b/src/components/features/article/ArticleHero.tsx new file mode 100644 index 0000000..e48003e --- /dev/null +++ b/src/components/features/article/ArticleHero.tsx @@ -0,0 +1,76 @@ +import { useContentfulInspectorMode } from '@contentful/live-preview/react'; +import { useTranslation } from 'next-i18next'; +import { twMerge } from 'tailwind-merge'; + +import { ArticleAuthor } from '@src/components/features/article/ArticleAuthor'; +import { ArticleLabel } from '@src/components/features/article/ArticleLabel'; +import { CtfImage } from '@src/components/features/contentful'; +import { FormatDate } from '@src/components/shared/format-date'; +import { PageBlogPostFieldsFragment } from '@src/lib/__generated/sdk'; + +interface ArticleHeroProps { + article: PageBlogPostFieldsFragment; + isFeatured?: boolean; + isReversedLayout?: boolean; +} +export const ArticleHero = ({ + article, + isFeatured, + isReversedLayout = false, +}: ArticleHeroProps) => { + const { t } = useTranslation(); + const inspectorProps = useContentfulInspectorMode({ entryId: article.sys.id }); + + const { title, shortDescription, publishedDate } = article; + + return ( +
+
+ {article.featuredImage && ( + + )} +
+ +
+
+ + {isFeatured && ( + + {t('article.featured')} + + )} + +
+

{title}

+ {shortDescription && ( +

+ {shortDescription} +

+ )} +
+ +
+
+
+ ); +}; diff --git a/src/components/features/article/ArticleImage.tsx b/src/components/features/article/ArticleImage.tsx new file mode 100644 index 0000000..2c2f33f --- /dev/null +++ b/src/components/features/article/ArticleImage.tsx @@ -0,0 +1,35 @@ +import { useContentfulInspectorMode } from '@contentful/live-preview/react'; +import { twMerge } from 'tailwind-merge'; + +import { CtfImage } from '@src/components/features/contentful'; +import { ComponentRichImage } from '@src/lib/__generated/sdk'; + +interface ArticleImageProps { + image: ComponentRichImage; +} + +export const ArticleImage = ({ image }: ArticleImageProps) => { + const inspectorProps = useContentfulInspectorMode({ entryId: image.sys.id }); + return image.image ? ( +
+
+ +
+ {image.caption && ( +
+ {image.caption} +
+ )} +
+ ) : null; +}; diff --git a/src/components/features/article/ArticleLabel.tsx b/src/components/features/article/ArticleLabel.tsx new file mode 100644 index 0000000..15342a8 --- /dev/null +++ b/src/components/features/article/ArticleLabel.tsx @@ -0,0 +1,20 @@ +import { HTMLProps, ReactNode } from 'react'; +import { twMerge } from 'tailwind-merge'; + +interface ArticleLabelProps extends HTMLProps { + children: ReactNode; +} + +export const ArticleLabel = ({ children, className, ...props }: ArticleLabelProps) => { + return ( + + {children} + + ); +}; diff --git a/src/components/features/article/ArticleTile.tsx b/src/components/features/article/ArticleTile.tsx new file mode 100644 index 0000000..a66f22e --- /dev/null +++ b/src/components/features/article/ArticleTile.tsx @@ -0,0 +1,53 @@ +import { useContentfulInspectorMode } from '@contentful/live-preview/react'; +import Link from 'next/link'; +import { HTMLProps } from 'react'; +import { twMerge } from 'tailwind-merge'; + +import { ArticleAuthor } from '@src/components/features/article/ArticleAuthor'; +import { CtfImage } from '@src/components/features/contentful'; +import { FormatDate } from '@src/components/shared/format-date'; +import { PageBlogPostFieldsFragment } from '@src/lib/__generated/sdk'; + +interface ArticleTileProps extends HTMLProps { + article: PageBlogPostFieldsFragment; +} + +export const ArticleTile = ({ article, className }: ArticleTileProps) => { + const { title, publishedDate } = article; + const inspectorProps = useContentfulInspectorMode({ entryId: article.sys.id }); + + return ( + +
+ {article.featuredImage && ( +
+ +
+ )} +
+ {title && ( +

+ {title} +

+ )} + +
+ +
+ +
+
+
+
+ + ); +}; diff --git a/src/components/features/article/ArticleTileGrid.tsx b/src/components/features/article/ArticleTileGrid.tsx new file mode 100644 index 0000000..8cc7696 --- /dev/null +++ b/src/components/features/article/ArticleTileGrid.tsx @@ -0,0 +1,25 @@ +import { HTMLProps } from 'react'; +import { twMerge } from 'tailwind-merge'; + +import { ArticleTile } from '@src/components/features/article/ArticleTile'; +import { PageBlogPostFieldsFragment } from '@src/lib/__generated/sdk'; + +interface ArticleTileGridProps extends HTMLProps { + articles?: Array; +} + +export const ArticleTileGrid = ({ articles, className, ...props }: ArticleTileGridProps) => { + return articles && articles.length > 0 ? ( +
+ {articles.map((article, index) => { + return article ? : null; + })} +
+ ) : null; +}; diff --git a/src/components/features/article/index.ts b/src/components/features/article/index.ts new file mode 100644 index 0000000..8b04085 --- /dev/null +++ b/src/components/features/article/index.ts @@ -0,0 +1,7 @@ +export * from './ArticleAuthor'; +export * from './ArticleContent'; +export * from './ArticleHero'; +export * from './ArticleImage'; +export * from './ArticleLabel'; +export * from './ArticleTile'; +export * from './ArticleTileGrid'; diff --git a/src/components/features/contentful/CtfImage.tsx b/src/components/features/contentful/CtfImage.tsx new file mode 100644 index 0000000..557b162 --- /dev/null +++ b/src/components/features/contentful/CtfImage.tsx @@ -0,0 +1,29 @@ +import NextImage, { ImageProps as NextImageProps } from 'next/image'; +import { twMerge } from 'tailwind-merge'; + +import { ImageFieldsFragment } from '@src/lib/__generated/sdk'; + +interface ImageProps extends Omit { + nextImageProps?: Omit; +} + +export const CtfImage = ({ url, width, height, title, nextImageProps }: ImageProps) => { + if (!url || !width || !height) return null; + + const blurURL = new URL(url); + blurURL.searchParams.set('w', '10'); + + return ( + + ); +}; diff --git a/src/components/features/contentful/CtfRichText.tsx b/src/components/features/contentful/CtfRichText.tsx new file mode 100644 index 0000000..4e5de14 --- /dev/null +++ b/src/components/features/contentful/CtfRichText.tsx @@ -0,0 +1,51 @@ +import { documentToReactComponents, Options } from '@contentful/rich-text-react-renderer'; +import { BLOCKS, Document } from '@contentful/rich-text-types'; + +import { ArticleImage } from '@src/components/features/article'; +import { ComponentRichImage } from '@src/lib/__generated/sdk'; + +export type EmbeddedEntryType = ComponentRichImage | null; + +export interface ContentfulRichTextInterface { + json: Document; + links?: + | { + entries: { + block: Array; + }; + } + | any; +} + +export const EmbeddedEntry = (entry: EmbeddedEntryType) => { + switch (entry?.__typename) { + case 'ComponentRichImage': + return ; + default: + return null; + } +}; + +export const contentfulBaseRichTextOptions = ({ links }: ContentfulRichTextInterface): Options => ({ + renderNode: { + [BLOCKS.EMBEDDED_ENTRY]: node => { + const entry = links?.entries?.block?.find( + (item: EmbeddedEntryType) => item?.sys?.id === node.data.target.sys.id, + ); + + if (!entry) return null; + + return ; + }, + }, +}); + +export const CtfRichText = ({ json, links }: ContentfulRichTextInterface) => { + const baseOptions = contentfulBaseRichTextOptions({ links, json }); + + return ( +
+ {documentToReactComponents(json, baseOptions)} +
+ ); +}; diff --git a/src/components/features/contentful/index.ts b/src/components/features/contentful/index.ts new file mode 100644 index 0000000..c7ce9e1 --- /dev/null +++ b/src/components/features/contentful/index.ts @@ -0,0 +1,2 @@ +export * from './CtfRichText'; +export * from './CtfImage'; diff --git a/src/components/features/language-selector/LanguageSelector.tsx b/src/components/features/language-selector/LanguageSelector.tsx new file mode 100644 index 0000000..78934e5 --- /dev/null +++ b/src/components/features/language-selector/LanguageSelector.tsx @@ -0,0 +1,27 @@ +import { useRouter } from 'next/router'; + +import { LanguageSelectorDesktop } from './LanguageSelectorDesktop'; +import { LanguageSelectorMobile } from './LanguageSelectorMobile'; + +const localeName = locale => locale.split('-')[0]; + +const displayName = locale => + new Intl.DisplayNames([locale], { + type: 'language', + }); + +export const LanguageSelector = () => { + const { locales } = useRouter(); + + return locales && locales.length > 1 ? ( + <> +
+ +
+ +
+ +
+ + ) : null; +}; diff --git a/src/components/features/language-selector/LanguageSelectorDesktop.tsx b/src/components/features/language-selector/LanguageSelectorDesktop.tsx new file mode 100644 index 0000000..000a4c7 --- /dev/null +++ b/src/components/features/language-selector/LanguageSelectorDesktop.tsx @@ -0,0 +1,134 @@ +import { LanguageIcon, ChevronDownTrimmedIcon, ChevronUpTrimmedIcon } from '@contentful/f36-icons'; +import Link from 'next/link'; +import { useRouter } from 'next/router'; +import { KeyboardEvent, useEffect, useRef, useState } from 'react'; +import FocusLock from 'react-focus-lock'; +import { twMerge } from 'tailwind-merge'; + +const useClickOutside = (ref, setIsOpen) => { + useEffect(() => { + const handleClickOutside = event => { + if (ref.current && !ref.current.contains(event.target)) { + setIsOpen(false); + } + }; + + document.addEventListener('mousedown', handleClickOutside); + return () => { + document.removeEventListener('mousedown', handleClickOutside); + }; + }, [ref, setIsOpen]); +}; + +export const LanguageSelectorDesktop = ({ localeName, displayName }) => { + const router = useRouter(); + const menuRef = useRef(null); + const containerRef = useRef(null); + const localesToShow = router.locales?.filter(locale => locale !== router.locale); + + const [isOpen, setIsOpen] = useState(false); + + useClickOutside(containerRef, setIsOpen); + + const handleMenuKeyDown = (e: KeyboardEvent) => { + switch (e.key) { + case ' ': + case 'SpaceBar': + case 'Enter': + e.preventDefault(); + + setIsOpen(currentState => !currentState); + break; + case 'Escape': + e.preventDefault(); + + setIsOpen(false); + break; + default: + break; + } + }; + + const handleMenuItemKeydown = (e: KeyboardEvent, index: number) => { + switch (e.key) { + case ' ': + case 'SpaceBar': + case 'Enter': + e.stopPropagation(); + e.preventDefault(); + + e.currentTarget?.click(); + + break; + case 'ArrowUp': + case 'ArrowDown': + e.stopPropagation(); + e.preventDefault(); + + const items = [...(menuRef.current?.children || [])]; + + if (e.key === 'ArrowUp') { + (items?.[index - 1] || items?.[items.length - 1])?.querySelector('a')?.focus(); + } + + if (e.key === 'ArrowDown') { + (items?.[index + 1] || items?.[0])?.querySelector('a')?.focus(); + } + + break; + default: + break; + } + }; + + return ( +
+ + + + +
+ ); +}; diff --git a/src/components/features/language-selector/LanguageSelectorMobile.tsx b/src/components/features/language-selector/LanguageSelectorMobile.tsx new file mode 100644 index 0000000..854f7b6 --- /dev/null +++ b/src/components/features/language-selector/LanguageSelectorMobile.tsx @@ -0,0 +1,88 @@ +import { LanguageIcon, CloseIcon } from '@contentful/f36-icons'; +import { useTranslation } from 'next-i18next'; +import { useRouter } from 'next/router'; +import { useEffect, useState } from 'react'; +import FocusLock from 'react-focus-lock'; +import { twMerge } from 'tailwind-merge'; + +import { Portal } from '@src/components/shared/portal'; + +export const LanguageSelectorMobile = ({ localeName, displayName }) => { + const { locale, locales } = useRouter(); + const router = useRouter(); + const { t } = useTranslation(); + const [showDrawer, setShowDrawer] = useState(false); + + useEffect(() => { + const close = e => { + if (e.key === 'Escape') { + setShowDrawer(false); + } + }; + + window.addEventListener('keydown', close); + return () => window.removeEventListener('keydown', close); + }); + + return ( + <> + + + + +
setShowDrawer(false)} + /> +
+
+

{t('common.regionalSettings')}

+ + +
+ +

{t('common.language')}

+ +
+ + + + ); +}; diff --git a/src/components/features/language-selector/index.ts b/src/components/features/language-selector/index.ts new file mode 100644 index 0000000..3151142 --- /dev/null +++ b/src/components/features/language-selector/index.ts @@ -0,0 +1 @@ +export * from './LanguageSelector'; diff --git a/src/components/features/seo/SeoFields.tsx b/src/components/features/seo/SeoFields.tsx new file mode 100644 index 0000000..55578d3 --- /dev/null +++ b/src/components/features/seo/SeoFields.tsx @@ -0,0 +1,57 @@ +import path from 'path'; + +import { NextSeo } from 'next-seo'; +import { useRouter } from 'next/router'; + +import { SeoFieldsFragment } from '@src/lib/__generated/sdk'; + +const generateUrl = (locale: string, slug: string) => + new URL(path.join(locale, slug), process.env.NEXT_PUBLIC_BASE_URL!).toString(); + +export const SeoFields = ({ + pageTitle, + pageDescription, + noindex, + nofollow, + canonicalUrl, + shareImagesCollection, +}: SeoFieldsFragment) => { + const { locale, locales, asPath } = useRouter(); + + const url = generateUrl(locale || '', asPath); + + const languageAlternates = + locales?.map(locale => ({ + hrefLang: locale, + href: generateUrl(locale, asPath), + })) || []; + + return ( + ({ + url: item?.url || '', + width: item?.width || 0, + height: item?.height || 0, + alt: item?.description || '', + type: item?.contentType || '', + })), + }} + twitter={{ + site: url, + cardType: 'summary_large_image', + }} + /> + ); +}; diff --git a/src/components/features/seo/index.ts b/src/components/features/seo/index.ts new file mode 100644 index 0000000..bf50fa9 --- /dev/null +++ b/src/components/features/seo/index.ts @@ -0,0 +1 @@ +export * from './SeoFields'; diff --git a/src/components/shared/container/Container.tsx b/src/components/shared/container/Container.tsx new file mode 100644 index 0000000..6e8d6ee --- /dev/null +++ b/src/components/shared/container/Container.tsx @@ -0,0 +1,6 @@ +import { HTMLProps } from 'react'; +import { twMerge } from 'tailwind-merge'; + +export const Container = ({ className, ...props }: HTMLProps) => { + return
; +}; diff --git a/src/components/shared/container/index.ts b/src/components/shared/container/index.ts new file mode 100644 index 0000000..8a1103f --- /dev/null +++ b/src/components/shared/container/index.ts @@ -0,0 +1 @@ +export * from './Container'; diff --git a/src/components/shared/format-date/FormatDate.tsx b/src/components/shared/format-date/FormatDate.tsx new file mode 100644 index 0000000..1c822b2 --- /dev/null +++ b/src/components/shared/format-date/FormatDate.tsx @@ -0,0 +1,22 @@ +import { useRouter } from 'next/router'; + +interface FormatDateProps { + date: number | Date | undefined; + locale?: string; +} + +export const formatDateFunc = ({ date, locale }: FormatDateProps) => { + if (!locale || !date) return null; + + return new Intl.DateTimeFormat(locale, { + dateStyle: 'long', + }).format(new Date(date)); +}; + +export const FormatDate = (props: FormatDateProps) => { + const { locale: localeFromRouter } = useRouter(); + + if (!localeFromRouter) return null; + + return <>{formatDateFunc({ ...props, locale: localeFromRouter })}; +}; diff --git a/src/components/shared/format-date/index.ts b/src/components/shared/format-date/index.ts new file mode 100644 index 0000000..746fa64 --- /dev/null +++ b/src/components/shared/format-date/index.ts @@ -0,0 +1 @@ +export * from './FormatDate'; diff --git a/src/components/shared/portal/Portal.tsx b/src/components/shared/portal/Portal.tsx new file mode 100644 index 0000000..0392d99 --- /dev/null +++ b/src/components/shared/portal/Portal.tsx @@ -0,0 +1,19 @@ +import { ReactNode, useEffect, useState } from 'react'; +import { createPortal } from 'react-dom'; + +interface PortalProps { + children: ReactNode; + id?: string; +} + +export const Portal = ({ children, id = 'portal' }: PortalProps) => { + const [mounted, setMounted] = useState(false); + + useEffect(() => { + setMounted(true); + + return () => setMounted(false); + }, []); + + return mounted ? createPortal(children, document.querySelector(`#${id}`) || document.body) : null; +}; diff --git a/src/components/shared/portal/index.ts b/src/components/shared/portal/index.ts new file mode 100644 index 0000000..73d42c8 --- /dev/null +++ b/src/components/shared/portal/index.ts @@ -0,0 +1 @@ +export * from './Portal'; diff --git a/src/components/templates/footer/footer.tsx b/src/components/templates/footer/footer.tsx new file mode 100644 index 0000000..c860a0c --- /dev/null +++ b/src/components/templates/footer/footer.tsx @@ -0,0 +1,28 @@ +import { useTranslation } from 'next-i18next'; +import Link from 'next/link'; + +import { Container } from '@src/components/shared/container'; + +export const Footer = () => { + const { t } = useTranslation(); + + return ( +
+ +

{t('footer.aboutUs')}

+
{t('footer.description')}
+
+ {t('footer.powerBy')}{' '} + + Contentful + +
+
+
+ ); +}; diff --git a/src/components/templates/footer/index.ts b/src/components/templates/footer/index.ts new file mode 100644 index 0000000..4248c0b --- /dev/null +++ b/src/components/templates/footer/index.ts @@ -0,0 +1 @@ +export { Footer } from './footer'; diff --git a/src/components/templates/header/header.tsx b/src/components/templates/header/header.tsx new file mode 100644 index 0000000..0fd89a3 --- /dev/null +++ b/src/components/templates/header/header.tsx @@ -0,0 +1,23 @@ +import { useTranslation } from 'next-i18next'; +import Link from 'next/link'; + +import BlogLogo from '@icons/blog-logo.svg'; +import { LanguageSelector } from '@src/components/features/language-selector'; +import { Container } from '@src/components/shared/container'; + +export const Header = () => { + const { t } = useTranslation(); + + return ( +
+ +
+ ); +}; diff --git a/src/components/templates/header/index.ts b/src/components/templates/header/index.ts new file mode 100644 index 0000000..ddd9723 --- /dev/null +++ b/src/components/templates/header/index.ts @@ -0,0 +1 @@ +export { Header } from './header'; diff --git a/src/components/templates/layout/index.ts b/src/components/templates/layout/index.ts new file mode 100644 index 0000000..a101e27 --- /dev/null +++ b/src/components/templates/layout/index.ts @@ -0,0 +1 @@ +export { Layout } from './layout'; diff --git a/src/components/templates/layout/layout.tsx b/src/components/templates/layout/layout.tsx new file mode 100644 index 0000000..73fbc97 --- /dev/null +++ b/src/components/templates/layout/layout.tsx @@ -0,0 +1,18 @@ +import { ReactNode } from 'react'; + +import { Footer } from '../footer'; +import { Header } from '../header'; + +interface LayoutPropsInterface { + children: ReactNode; +} + +export const Layout = ({ children }: LayoutPropsInterface) => { + return ( + <> +
+ {children} +