From 30fda0c8dab7785949f6c6766bb67c7d23ca33e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogumi=C5=82?= <47248711+milewskibogumil@users.noreply.github.com> Date: Fri, 13 Sep 2024 15:50:11 +0200 Subject: [PATCH] add Astro + Sanity + Turborepo starter --- .github/workflows/sanity-deploy.yml | 25 ++ .gitignore | 38 +++ .prettierrc.json | 7 + README.md | 75 ++++++ apps/astro/.gitignore | 24 ++ apps/astro/.vscode/extensions.json | 4 + apps/astro/.vscode/launch.json | 11 + apps/astro/astro.config.ts | 25 ++ apps/astro/eslint.config.js | 10 + apps/astro/package.json | 30 +++ apps/astro/public/fonts/Poppins-Regular.eot | Bin 0 -> 42702 bytes apps/astro/public/fonts/Poppins-Regular.ttf | Bin 0 -> 42544 bytes apps/astro/public/fonts/Poppins-Regular.woff | Bin 0 -> 19876 bytes apps/astro/public/fonts/Poppins-Regular.woff2 | Bin 0 -> 15728 bytes apps/astro/redirects.ts | 42 +++ apps/astro/src/assets/favicon.svg | 1 + apps/astro/src/assets/icon.png | Bin 0 -> 61752 bytes .../components/ui/PortableText/Block.astro | 1 + .../src/components/ui/PortableText/Cmp.astro | 14 + .../src/components/ui/PortableText/Mark.astro | 21 ++ .../components/ui/PortableText/index.astro | 28 ++ .../src/components/ui/PortableText/index.ts | 15 ++ .../astro/src/components/ui/image/index.astro | 51 ++++ apps/astro/src/components/ui/image/index.ts | 18 ++ apps/astro/src/env.d.ts | 9 + apps/astro/src/global/constants.ts | 70 +++++ apps/astro/src/global/global.scss | 245 ++++++++++++++++++ apps/astro/src/layouts/Head.astro | 72 +++++ apps/astro/src/layouts/Layout.astro | 19 ++ apps/astro/src/pages/favicon.ico.ts | 17 ++ apps/astro/src/pages/index.astro | 10 + apps/astro/src/pages/manifest.webmanifest.ts | 39 +++ apps/astro/src/utils/is-preview-deployment.ts | 1 + apps/astro/src/utils/metadata.fetch.ts | 28 ++ apps/astro/src/utils/sanity.fetch.ts | 27 ++ apps/astro/tsconfig.json | 15 ++ apps/sanity/.eslintrc | 6 + apps/sanity/.gitignore | 29 +++ apps/sanity/constants.ts | 17 ++ apps/sanity/env.d.ts | 5 + apps/sanity/package.json | 33 +++ apps/sanity/sanity-typegen.json | 4 + apps/sanity/sanity.cli.ts | 9 + apps/sanity/sanity.config.ts | 35 +++ .../schema/collectionTypes/Faq_Collection.ts | 37 +++ apps/sanity/schema/singleTypes/Index_Page.ts | 39 +++ apps/sanity/schema/singleTypes/global.tsx | 109 ++++++++ apps/sanity/schema/singleTypes/redirects.tsx | 98 +++++++ apps/sanity/schema/ui/Components.ts | 20 ++ .../schema/ui/PortableText/CustomInput.tsx | 23 ++ .../sanity/schema/ui/PortableText/Heading.tsx | 23 ++ apps/sanity/schema/ui/PortableText/index.tsx | 89 +++++++ apps/sanity/schema/ui/cta.ts | 35 +++ apps/sanity/schema/ui/seo.tsx | 41 +++ apps/sanity/static/.gitkeep | 0 apps/sanity/structure/create-singleton.tsx | 40 +++ apps/sanity/structure/index.tsx | 15 ++ .../structure/internal-linkable-types.ts | 9 + apps/sanity/structure/schema-types.ts | 42 +++ apps/sanity/tsconfig.json | 18 ++ apps/sanity/utils/count-items.ts | 11 + .../sanity/utils/define-slug-for-document.tsx | 41 +++ apps/sanity/utils/is-unique-slug.ts | 10 + apps/sanity/utils/is-valid-url.ts | 9 + apps/sanity/utils/show-production-url.ts | 13 + apps/sanity/utils/slugify.ts | 39 +++ apps/sanity/utils/to-plain-text.ts | 10 + bun.lockb | Bin 0 -> 617256 bytes package.json | 25 ++ turbo.json | 17 ++ 70 files changed, 1943 insertions(+) create mode 100644 .github/workflows/sanity-deploy.yml create mode 100644 .gitignore create mode 100644 .prettierrc.json create mode 100644 README.md create mode 100644 apps/astro/.gitignore create mode 100644 apps/astro/.vscode/extensions.json create mode 100644 apps/astro/.vscode/launch.json create mode 100644 apps/astro/astro.config.ts create mode 100644 apps/astro/eslint.config.js create mode 100644 apps/astro/package.json create mode 100644 apps/astro/public/fonts/Poppins-Regular.eot create mode 100644 apps/astro/public/fonts/Poppins-Regular.ttf create mode 100644 apps/astro/public/fonts/Poppins-Regular.woff create mode 100644 apps/astro/public/fonts/Poppins-Regular.woff2 create mode 100644 apps/astro/redirects.ts create mode 100644 apps/astro/src/assets/favicon.svg create mode 100644 apps/astro/src/assets/icon.png create mode 100644 apps/astro/src/components/ui/PortableText/Block.astro create mode 100644 apps/astro/src/components/ui/PortableText/Cmp.astro create mode 100644 apps/astro/src/components/ui/PortableText/Mark.astro create mode 100644 apps/astro/src/components/ui/PortableText/index.astro create mode 100644 apps/astro/src/components/ui/PortableText/index.ts create mode 100644 apps/astro/src/components/ui/image/index.astro create mode 100644 apps/astro/src/components/ui/image/index.ts create mode 100644 apps/astro/src/env.d.ts create mode 100644 apps/astro/src/global/constants.ts create mode 100644 apps/astro/src/global/global.scss create mode 100644 apps/astro/src/layouts/Head.astro create mode 100644 apps/astro/src/layouts/Layout.astro create mode 100644 apps/astro/src/pages/favicon.ico.ts create mode 100644 apps/astro/src/pages/index.astro create mode 100644 apps/astro/src/pages/manifest.webmanifest.ts create mode 100644 apps/astro/src/utils/is-preview-deployment.ts create mode 100644 apps/astro/src/utils/metadata.fetch.ts create mode 100644 apps/astro/src/utils/sanity.fetch.ts create mode 100644 apps/astro/tsconfig.json create mode 100644 apps/sanity/.eslintrc create mode 100644 apps/sanity/.gitignore create mode 100644 apps/sanity/constants.ts create mode 100644 apps/sanity/env.d.ts create mode 100644 apps/sanity/package.json create mode 100644 apps/sanity/sanity-typegen.json create mode 100644 apps/sanity/sanity.cli.ts create mode 100644 apps/sanity/sanity.config.ts create mode 100644 apps/sanity/schema/collectionTypes/Faq_Collection.ts create mode 100644 apps/sanity/schema/singleTypes/Index_Page.ts create mode 100644 apps/sanity/schema/singleTypes/global.tsx create mode 100644 apps/sanity/schema/singleTypes/redirects.tsx create mode 100644 apps/sanity/schema/ui/Components.ts create mode 100644 apps/sanity/schema/ui/PortableText/CustomInput.tsx create mode 100644 apps/sanity/schema/ui/PortableText/Heading.tsx create mode 100644 apps/sanity/schema/ui/PortableText/index.tsx create mode 100644 apps/sanity/schema/ui/cta.ts create mode 100644 apps/sanity/schema/ui/seo.tsx create mode 100644 apps/sanity/static/.gitkeep create mode 100644 apps/sanity/structure/create-singleton.tsx create mode 100644 apps/sanity/structure/index.tsx create mode 100644 apps/sanity/structure/internal-linkable-types.ts create mode 100644 apps/sanity/structure/schema-types.ts create mode 100644 apps/sanity/tsconfig.json create mode 100644 apps/sanity/utils/count-items.ts create mode 100644 apps/sanity/utils/define-slug-for-document.tsx create mode 100644 apps/sanity/utils/is-unique-slug.ts create mode 100644 apps/sanity/utils/is-valid-url.ts create mode 100644 apps/sanity/utils/show-production-url.ts create mode 100644 apps/sanity/utils/slugify.ts create mode 100644 apps/sanity/utils/to-plain-text.ts create mode 100755 bun.lockb create mode 100644 package.json create mode 100644 turbo.json diff --git a/.github/workflows/sanity-deploy.yml b/.github/workflows/sanity-deploy.yml new file mode 100644 index 0000000..814067d --- /dev/null +++ b/.github/workflows/sanity-deploy.yml @@ -0,0 +1,25 @@ +name: Deploy Sanity Studio +on: + push: + branches: [main] + paths: + - "apps/sanity/**" +jobs: + deploy: + name: Build and Deploy + runs-on: ubuntu-latest + env: + SANITY_AUTH_TOKEN: ${{ secrets.SANITY_DEPLOY_STUDIO_TOKEN }} + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 2 + - uses: actions/setup-node@v2 + with: + node-version: "18.x" + - uses: oven-sh/setup-bun@v2 + - name: Deploy Sanity Studio + run: | + cd ./apps/sanity + bun install + bun run sanity deploy diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96fab4f --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# Dependencies +node_modules +.pnp +.pnp.js + +# Local env files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Testing +coverage + +# Turbo +.turbo + +# Vercel +.vercel + +# Build Outputs +.next/ +out/ +build +dist + + +# Debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Misc +.DS_Store +*.pem diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..4e7126e --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "semi": false, + "singleQuote": true, + "trailingComma": "es5", + "tabWidth": 2, + "printWidth": 120 +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..0b178a4 --- /dev/null +++ b/README.md @@ -0,0 +1,75 @@ +# 🚀 Astro + Sanity + Turborepo Starter + +⚡️ Kickstart your web projects with the [Astro](https://astro.build/) + [Sanity](https://www.sanity.io/) + [Truborepo](https://turbo.build/) Starter! Integrate Astro, Sanity, and Turborepo for high performance, Core Web Vitals optimization, and SEO-friendly web development. Perfect for building modern, fast, and flexible web applications with ease. + +## Features + +- **Portable Text**: Flexible rich text handling with customizable structures. +- **Type Safety**: TypeScript support throughout the project. +- **SEO Optimization**: Dynamic metadata fetching and SEO-friendly URLs. +- **Sanity Integration**: Seamless content management with Sanity CMS. +- **Error Handling**: Robust error management in metadata and content fetching. +- **Customizable Components**: Flexibility in rendering text and links. +- **Development Tools**: Integrated ESLint, Prettier, and TypeScript for high code quality. +- **Preview Functionality**: Fast content preview and internal linking within Sanity. +- **Singleton Types & Validation**: Ensures data integrity and easy management of global settings. + +## Advantages + +- **Performance**: Fast builds and efficient development with Turborepo. +- **Type Safety**: Comprehensive TypeScript integration for reliable code. +- **SEO-Ready**: Built-in optimizations for improved SEO performance. +- **Seamless Integration**: Smooth content management with Sanity. +- **Customizability**: Extensible components and flexible Portable Text configuration. +- **CI/CD**: Automated Sanity deployments with GitHub Actions. + +## Setup Instructions + +### 1. Environment Variables + +Set the following environment variables for local or production setups: + +**Sanity Studio Preview** + +In the `/apps/sanity` directory, create a `.env.local` file with: + +``` +SANITY_STUDIO_PREVIEW_DOMAIN= +``` + +**Astro API Token** + +In the `/apps/astro` directory, create a `.env.local` file with: + +``` +SANITY_API_TOKEN= +``` + +_Generate this token in your Sanity project dashboard._ + +### 2. Constant Files + +Update `constants.ts` in both `/apps/sanity/constants.ts` and `/apps/astro/src/global/constants.ts` directories to match your project settings. + +### 3. Project ID + +Update the `projectId` in: + +- `/apps/astro/src/utils/sanity.fetch.ts` +- `/apps/sanity/sanity.cli.ts` +- `/apps/sanity/sanity.config.ts` + +_Ensure these IDs correspond to your Sanity project._ + +### 4. GitHub Actions + +To automatically deploy the Sanity Studio: + +- **Deployment Trigger**: Automatic deployment occurs when you push changes to any file within the `/apps/sanity/*` directory. +- **Required Environment Variables**: + - `SANITY_DEPLOY_STUDIO_TOKEN`: Add this token to your GitHub project's environment variables for deployment. + - `SANITY_STUDIO_PREVIEW_DOMAIN`: Set this variable for your preview deployment domain in Sanity Studio. + +## Authors + +- [@milewskibogumil](https://github.com/milewskibogumil) diff --git a/apps/astro/.gitignore b/apps/astro/.gitignore new file mode 100644 index 0000000..16d54bb --- /dev/null +++ b/apps/astro/.gitignore @@ -0,0 +1,24 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + +# jetbrains setting folder +.idea/ diff --git a/apps/astro/.vscode/extensions.json b/apps/astro/.vscode/extensions.json new file mode 100644 index 0000000..22a1505 --- /dev/null +++ b/apps/astro/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["astro-build.astro-vscode"], + "unwantedRecommendations": [] +} diff --git a/apps/astro/.vscode/launch.json b/apps/astro/.vscode/launch.json new file mode 100644 index 0000000..d642209 --- /dev/null +++ b/apps/astro/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "./node_modules/.bin/astro dev", + "name": "Development server", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/apps/astro/astro.config.ts b/apps/astro/astro.config.ts new file mode 100644 index 0000000..2ffb053 --- /dev/null +++ b/apps/astro/astro.config.ts @@ -0,0 +1,25 @@ +import { defineConfig } from "astro/config"; +import vercel from "@astrojs/vercel/serverless"; +import sitemap from "@astrojs/sitemap"; +import { DOMAIN } from "./src/global/constants"; +import { isPreviewDeployment } from "./src/utils/is-preview-deployment"; +import redirects from "./redirects"; + +export default defineConfig({ + site: DOMAIN, + integrations: [ + sitemap(), + ], + image: { + remotePatterns: [{ + protocol: "https", + hostname: "cdn.sanity.io" + }], + }, + prefetch: { + prefetchAll: true + }, + redirects: redirects, + output: isPreviewDeployment ? "server" : 'hybrid', + adapter: vercel(), +}); diff --git a/apps/astro/eslint.config.js b/apps/astro/eslint.config.js new file mode 100644 index 0000000..a279a37 --- /dev/null +++ b/apps/astro/eslint.config.js @@ -0,0 +1,10 @@ +import eslintPluginAstro from 'eslint-plugin-astro'; + +export default [ + ...eslintPluginAstro.configs.recommended, + { + rules: { + "no-unused-vars": "error", + } + } +]; diff --git a/apps/astro/package.json b/apps/astro/package.json new file mode 100644 index 0000000..e411f7e --- /dev/null +++ b/apps/astro/package.json @@ -0,0 +1,30 @@ +{ + "name": "astro-app", + "type": "module", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro check && astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/check": "^0.9.3", + "@astrojs/sitemap": "^3.1.6", + "@astrojs/vercel": "^7.8.1", + "@sanity/client": "^6.21.3", + "astro": "^4.15.5", + "astro-portabletext": "^0.10.0", + "sharp-ico": "^0.1.5", + "typescript": "^5.6.2" + }, + "devDependencies": { + "@typescript-eslint/parser": "^8.5.0", + "eslint": "^9.10.0", + "eslint-plugin-astro": "^1.2.4", + "eslint-plugin-jsx-a11y": "^6.10.0", + "sass": "^1.78.0" + } +} diff --git a/apps/astro/public/fonts/Poppins-Regular.eot b/apps/astro/public/fonts/Poppins-Regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..4132b0e768852e9ce6b1256cd939a5307657d5fa GIT binary patch literal 42702 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 literal 0 HcmV?d00001 diff --git a/apps/astro/public/fonts/Poppins-Regular.woff b/apps/astro/public/fonts/Poppins-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..d157296166bca4fc61d5ff879ba83e4ed2519cb9 GIT binary patch literal 19876 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 CK9VE= literal 0 HcmV?d00001 diff --git a/apps/astro/public/fonts/Poppins-Regular.woff2 b/apps/astro/public/fonts/Poppins-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..dd2881d9d6b13833f60878179489d5788a3df1b0 GIT binary patch literal 15728 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 literal 0 HcmV?d00001 diff --git a/apps/astro/redirects.ts b/apps/astro/redirects.ts new file mode 100644 index 0000000..e998a4b --- /dev/null +++ b/apps/astro/redirects.ts @@ -0,0 +1,42 @@ +import type { ValidRedirectStatus } from "astro"; +import { isPreviewDeployment } from "./src/utils/is-preview-deployment"; + +type RedirectData = { + source: string; + destination: string; + isPermanent: boolean; +}; + +let redirects = {}; + +if (isPreviewDeployment) { + console.log('\x1b[33m%s\x1b[0m', "🔀 Redirects are disabled in preview deployments"); +} else { + const { default: sanityFetch } = await import("./src/utils/sanity.fetch"); + const data = await sanityFetch({ + query: ` + *[_type == "redirects"][0].redirects { + "source": source.current, + "destination": destination.current, + isPermanent, + }[] + ` + }); + redirects = Object.fromEntries( + data.map(({ source, destination, isPermanent }) => [ + source, { + status: (isPermanent ? 301 : 302) as ValidRedirectStatus, + destination + } + ]) + ); + + const permanentRedirects = data.filter(r => r.isPermanent).length; + const temporaryRedirects = data.length - permanentRedirects; + console.log( + '\x1b[32m%s\x1b[0m', + `✅ \x1b[1m${Object.keys(redirects).length}\x1b[0m\x1b[32m redirects added from Sanity (\x1b[1m${permanentRedirects}\x1b[0m\x1b[32m permanent and \x1b[1m${temporaryRedirects}\x1b[0m\x1b[32m temporary)` + ); +} + +export default redirects; diff --git a/apps/astro/src/assets/favicon.svg b/apps/astro/src/assets/favicon.svg new file mode 100644 index 0000000..9efdfa9 --- /dev/null +++ b/apps/astro/src/assets/favicon.svg @@ -0,0 +1 @@ + diff --git a/apps/astro/src/assets/icon.png b/apps/astro/src/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7c2caef25738e5155076a6f560104afa78c57f3b GIT binary patch literal 61752 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�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 diff --git a/apps/astro/src/components/ui/PortableText/Cmp.astro b/apps/astro/src/components/ui/PortableText/Cmp.astro new file mode 100644 index 0000000..c345478 --- /dev/null +++ b/apps/astro/src/components/ui/PortableText/Cmp.astro @@ -0,0 +1,14 @@ +--- +import { PortableText } from 'astro-portabletext' +import type { PortableTextValue } from '.' +import Block from './Block.astro' +import Mark from './Mark.astro' + +type Props = { + value: PortableTextValue +} + +const { value } = Astro.props +--- + + diff --git a/apps/astro/src/components/ui/PortableText/Mark.astro b/apps/astro/src/components/ui/PortableText/Mark.astro new file mode 100644 index 0000000..78bd5f8 --- /dev/null +++ b/apps/astro/src/components/ui/PortableText/Mark.astro @@ -0,0 +1,21 @@ +--- +import type { Props as $, Mark as MarkType } from 'astro-portabletext/types' +import { Mark as PortableTextMark } from 'astro-portabletext/components' + +export type Props = $> + +const { node, ...props } = Astro.props + +const { href, type } = node.markDef as { href: string; type: 'external' | 'internal' } +const isExternal = type === 'external' +--- + +{ + node.markType === 'link' ? ( + + + + ) : ( + PortableTextMark + ) +} diff --git a/apps/astro/src/components/ui/PortableText/index.astro b/apps/astro/src/components/ui/PortableText/index.astro new file mode 100644 index 0000000..97e0ce7 --- /dev/null +++ b/apps/astro/src/components/ui/PortableText/index.astro @@ -0,0 +1,28 @@ +--- +import type { HTMLAttributes } from 'astro/types' +import type { PortableTextProps } from 'astro-portabletext/types' +import Cmp from './Cmp.astro' + +export type PortableTextValue = PortableTextProps['value'] + +type Props = { + value: PortableTextValue + heading?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' +} & HTMLAttributes<'div' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'> + +const { heading: HeadingTag, value, ...props } = Astro.props + +const valueArray = Array.isArray(value) ? value : [value] +--- + +{ + HeadingTag ? ( + + {valueArray.map((value: PortableTextValue, index: number) => + index > 0 ? {} : + )} + + ) : ( + + ) +} diff --git a/apps/astro/src/components/ui/PortableText/index.ts b/apps/astro/src/components/ui/PortableText/index.ts new file mode 100644 index 0000000..e53fa36 --- /dev/null +++ b/apps/astro/src/components/ui/PortableText/index.ts @@ -0,0 +1,15 @@ +export { default, type PortableTextValue } from './index.astro'; + +export const PortableTextQuery = (name: string) => ` + ${name}[] { + ..., + markDefs[] { + _type == "link" => { + _type, + _key, + type, + "href": select(type == "internal" => internal -> slug.current, type == "external" => external, "#"), + }, + }, + }, +` diff --git a/apps/astro/src/components/ui/image/index.astro b/apps/astro/src/components/ui/image/index.astro new file mode 100644 index 0000000..acec06c --- /dev/null +++ b/apps/astro/src/components/ui/image/index.astro @@ -0,0 +1,51 @@ +--- +import type { ComponentProps } from 'astro/types' +import { Image as AstroImage } from 'astro:assets' + +export type ImageDataProps = { + asset: { + url: string + altText: string + extension: string + metadata: { + dimensions: { + width: number + height: number + } + lqip: string + } + } +} + +type Props = ImageDataProps & { + sizes: string + priority?: boolean +} & Omit, 'src' | 'alt' | 'width' | 'height'> + +const { asset, sizes, priority, ...props } = Astro.props + +const imageProps = { + src: asset.url, + alt: asset.altText || '', + width: asset.metadata.dimensions.width, + height: asset.metadata.dimensions.height, + sizes, + style: { + background: `url(${asset.metadata.lqip}) center / cover no-repeat`, + }, + onload: 'this.removeAttribute("style")', + ...(priority && { + loading: 'eager', + fetchpriority: 'high', + }), + widths: [48, 64, 96, 128, 256, 384, 640, 750, 828, 1080, 1200, 1920, 2048, 3840], + ...(asset.extension === 'svg' && { + format: 'svg' as const, + widths: undefined, + sizes: undefined, + }), + ...props, +} +--- + +} /> diff --git a/apps/astro/src/components/ui/image/index.ts b/apps/astro/src/components/ui/image/index.ts new file mode 100644 index 0000000..d6f37c3 --- /dev/null +++ b/apps/astro/src/components/ui/image/index.ts @@ -0,0 +1,18 @@ +export { default, type ImageDataProps } from './index.astro'; + +export const ImageDataQuery = (name: string) => ` + ${name} { + asset -> { + url, + altText, + extension, + metadata { + dimensions { + width, + height, + }, + lqip, + }, + }, + }, +` diff --git a/apps/astro/src/env.d.ts b/apps/astro/src/env.d.ts new file mode 100644 index 0000000..164b7d1 --- /dev/null +++ b/apps/astro/src/env.d.ts @@ -0,0 +1,9 @@ +/// + +interface ImportMetaEnv { + readonly SANITY_API_TOKEN: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/apps/astro/src/global/constants.ts b/apps/astro/src/global/constants.ts new file mode 100644 index 0000000..e81d9e3 --- /dev/null +++ b/apps/astro/src/global/constants.ts @@ -0,0 +1,70 @@ + +/** + * Global declaration of theme color in HEX format. + * This color is used for theming purposes across the application. + * @constant + * @type {string} + */ +export const THEME_COLOR: string = "#011310"; + +/** + * Global declaration of background color in HEX format. + * This color is used for the background across the application. + * @constant + * @type {string} + */ +export const BACKGROUND_COLOR: string = "#000103"; + +/** + * Global declaration of the locale (language) for the application. + * This constant is used to set the language attribute in the HTML tag. + * @constant + * @type {string} + */ +export const LOCALE: string = "pl"; + +/** + * Global declaration of the domain for the application. + * This constant is used for constructing full URLs and determining external links. + * @constant + * @type {string} + */ +export const DOMAIN: string = "https://kryptonum.eu"; + +/** + * Global declaration of the default title for the application. + * This constant is used as a fallback title when a specific page title is not provided. + * @constant + * @type {string} + */ +export const DEFAULT_TITLE: string = "Kryptonum"; + +/** + * Global declaration of the default description for the application. + * This constant is used as a fallback description when a specific page description is not provided. + * It's typically used in meta tags for SEO purposes. + * @constant + * @type {string} + */ +export const DEFAULT_DESCRIPTION: string = "Kryptonum tworzy nieszablonowe projekty tym, którym zależy na: 👨🏻‍💻 profesjonalnej stronie, 🎨 unikatowym brandingu, 💰 dochodowym biznesie online."; + +/** + * Object containing regular expressions for validation purposes. + * @constant + * @type {Object} + * @property {RegExp} email - Regular expression for validating email addresses. + * @property {RegExp} phone - Regular expression for validating phone numbers. + * @property {RegExp} string - Regular expression for trimming and validating strings. + */ +export const REGEX: { email: RegExp; phone: RegExp; string: RegExp } = { + email: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i, + phone: /^(?:\+(?:\d{1,3}))?(?:[ -]?\(?\d{1,4}\)?[ -]?\d{1,5}[ -]?\d{1,5}[ -]?\d{1,6})$/, + string: /^(?!\s+$)(.*?)\s*$/, +}; + +/** + * Global declaration of the easing function for JS animations. + * @constant + * @type {number[]} + */ +export const EASING: number[] = [0.6, -0.15, 0.27, 1.15]; diff --git a/apps/astro/src/global/global.scss b/apps/astro/src/global/global.scss new file mode 100644 index 0000000..4cc312f --- /dev/null +++ b/apps/astro/src/global/global.scss @@ -0,0 +1,245 @@ +@font-face { + font-family: 'Poppins'; + src: + url('/fonts/Poppins-Regular.woff2') format('woff2'), + url('/fonts/Poppins-Regular.woff') format('woff'), + url('/fonts/Poppins-Regular.ttf') format('truetype'), + url('/fonts/Poppins-Regular.eot') format('embedded-opentype'); + font-weight: 400; + font-display: swap; + font-style: normal; +} + +@function rem($px) { + @if round($px) == $px { + @return calc($px / 16) + rem; + } @else { + @error "The value passed to rem() must be an integer"; + } +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +:root { + --gap: clamp(96px, calc(132vw / 7.68), 152px); + + --pageMargin: clamp(16px, calc(40vw / 7.68), 40px); + @media (max-width: 899px) and (min-width: 600px) { + --pageMargin: clamp(40px, calc(80vw / 7.68), 80px); + } +} + +svg { + max-width: 100%; + display: block; + height: auto; +} +canvas { + touch-action: pan-y; +} +a { + text-decoration: none; + color: inherit; +} +label { + display: block; +} +button { + border: none; + background-color: transparent; + cursor: pointer; + user-select: none; +} +::placeholder { + color: inherit; +} +sup { + font-size: 0.62em; + vertical-align: top; +} +textarea { + display: block; +} +input, +textarea, +button, +select { + font: inherit; + color: inherit; + background-color: transparent; + appearance: none; + border: none; + border-radius: 0; +} +ul, +ol { + list-style-type: none; +} +summary { + cursor: pointer; + list-style: none; + &::marker, + &::-webkit-details-marker { + display: none; + } +} +iframe { + border: none; + display: block; +} +video { + display: block; + max-width: 100%; + height: auto; +} +picture, +img { + display: inline-block; + max-width: 100%; + height: auto; + vertical-align: bottom; + object-fit: cover; +} + +:focus { + outline: none; +} +:focus-visible { + outline: 2px solid var(--primary-800, #01403b); + outline-offset: 3px; +} + +html, +body { + overflow-x: clip; +} +html { + scroll-behavior: smooth; + scroll-padding-top: 123px; +} +body { + overflow: clip; + min-width: 320px; + -webkit-tap-highlight-color: transparent; + background: var(--background-100, #fffcf9); + color: var(--primary-900, #001b19); + font-family: 'Poppins', sans-serif; + font-size: 1rem; + line-height: 158%; +} + +main, +.max-width { + max-width: 1200px; + width: calc(100% - var(--pageMargin) * 2); + margin: 0 auto; + height: 100%; +} +main { + display: grid; + row-gap: var(--gap); + margin: clamp(32px, calc(80vw / 7.68), 80px) auto var(--gap); +} + +h1, +.h1, +h2, +.h2, +h3, +.h3, +h4, +.h4, +h5, +.h5, +h6, +.h6 { + overflow-wrap: anywhere; + font-weight: 400; + line-height: 128%; + color: var(--primary-800, #01403b); + strong { + font-weight: 400; + color: var(--primary-900, #001b19); + } +} +h1, +.h1, +h2, +.h2 { + font-size: clamp(calc(28rem / 16), calc(42vw / 7.68), calc(42rem / 16)); +} +h3, +.h3 { + font-size: clamp(calc(18rem / 16), calc(24vw / 7.68), calc(24rem / 16)); +} + +.link { + line-height: normal; + text-decoration: underline; + transition: color 0.5s; + text-underline-offset: 5px; + &:hover { + color: var(--primary-700); + &::after { + transform: translate(1px, -1px); + } + } + &[target='_blank'] { + &::after { + content: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNyIgZmlsbD0ibm9uZSI+PHBhdGggc3Ryb2tlPSIjMUNCNkFBIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGQ9Im00LjMzMyAxMS43ODggNy4zMzQtNy4zMzNtMCAwaC02bTYgMHY2Ii8+PC9zdmc+'); + display: inline-block; + margin-left: 4px; + vertical-align: middle; + transition: transform 0.3s var(--easing); + } + } +} + +.sec-wo-margin { + margin: 0 calc(var(--pageMargin) * -1); + @media (min-width: 1280px) { + margin: 0 calc((100vw - 1200px) / -2); + } +} + +.ordered-list, +.unordered-list { + display: grid; + gap: 8px; +} +.unordered-list { + li { + padding-left: 18px; + position: relative; + &::before { + content: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMCIgaGVpZ2h0PSIxMyIgZmlsbD0iIzBGOTI4OCI+PHBhdGggZD0iTTUgLjgwMmMtLjM2NSAwLS42NDcuMTUyLS45MDQuMzg1LS4yMzUuMjE0LS40NzcuNTIzLS43NjIuODg2bC0uMDIuMDI1Yy0uNTgzLjc0My0xLjI0OCAxLjY2My0xLjc2OSAyLjU4NC0uNTEyLjkwNy0uOTIgMS44NzMtLjkyIDIuNjkzIDAgMi41NTggMS45MzMgNC42OCA0LjM3NSA0LjY4czQuMzc1LTIuMTIyIDQuMzc1LTQuNjhjMC0uODItLjQwOC0xLjc4Ni0uOTItMi42OTMtLjUyMS0uOTIxLTEuMTg2LTEuODQtMS43Ny0yLjU4NGwtLjAxOS0uMDI1Yy0uMjg1LS4zNjMtLjUyNy0uNjcyLS43NjItLjg4NkM1LjY0Ny45NTQgNS4zNjQuODAyIDUgLjgwMloiLz48L3N2Zz4='); + width: 10px; + position: absolute; + left: 0; + top: 1px; + } + } +} +.ordered-list { + list-style-type: decimal; + padding-left: 1.5rem; +} + +.cta-wrapper { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: clamp(12px, calc(16vw / 7.68), 16px); +} + +div.paragraph { + & > *:not(:last-child) { + margin-bottom: 8px; + } +} diff --git a/apps/astro/src/layouts/Head.astro b/apps/astro/src/layouts/Head.astro new file mode 100644 index 0000000..bad05fa --- /dev/null +++ b/apps/astro/src/layouts/Head.astro @@ -0,0 +1,72 @@ +--- +import { getImage } from 'astro:assets' +import icon from '@/assets/icon.png' +import faviconSvg from '@/assets/favicon.svg' +import { DOMAIN, LOCALE, THEME_COLOR } from '@/global/constants' +import sanityFetch from '@/utils/sanity.fetch' + +const icons = { + favicon: await getImage({ src: faviconSvg, format: 'svg' }), + appleTouchIcon: await getImage({ src: icon, width: 180, height: 180, format: 'png' }), +} + +export type OpenGraphImageProps = { + url: string + height: string +} + +const seo = await sanityFetch<{ openGraphImage: OpenGraphImageProps }>({ + query: ` + *[_type == "global"][0].seo { + "openGraphImage": { + "url": img.asset -> url + "?w=1200", + "height": round(1200 / img.asset -> metadata.dimensions.aspectRatio), + }, + } + `, +}) + +export type Props = { + path: string + title: string + description: string + openGraphImage?: OpenGraphImageProps +} + +const { path, title, description, openGraphImage } = Astro.props + +const OpenGraphImage = { + url: openGraphImage?.url || seo.openGraphImage?.url, + height: openGraphImage?.height || seo.openGraphImage?.height, +} + +const url = `${DOMAIN}${path}` +--- + + +{title} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/astro/src/layouts/Layout.astro b/apps/astro/src/layouts/Layout.astro new file mode 100644 index 0000000..e16dc61 --- /dev/null +++ b/apps/astro/src/layouts/Layout.astro @@ -0,0 +1,19 @@ +--- +import '@/global/global.scss' +import { LOCALE } from '../global/constants' +import Head, { type Props as HeadProps } from './Head.astro' + +type Props = HeadProps +--- + + + + + + + +
+ +
+ + diff --git a/apps/astro/src/pages/favicon.ico.ts b/apps/astro/src/pages/favicon.ico.ts new file mode 100644 index 0000000..7a5f1e3 --- /dev/null +++ b/apps/astro/src/pages/favicon.ico.ts @@ -0,0 +1,17 @@ +export const prerender = true; + +import type { APIRoute } from "astro"; +import path from "node:path"; +import sharp from "sharp"; +import ico from "sharp-ico"; + +const favicon = path.resolve("src/assets/favicon.svg"); + +export const GET: APIRoute = async () => { + const buffer = await sharp(favicon).resize(32).toBuffer(); + const icoBuffer = ico.encode([buffer]); + + return new Response(icoBuffer, { + headers: { "Content-Type": "image/x-icon" }, + }); +}; diff --git a/apps/astro/src/pages/index.astro b/apps/astro/src/pages/index.astro new file mode 100644 index 0000000..68ed073 --- /dev/null +++ b/apps/astro/src/pages/index.astro @@ -0,0 +1,10 @@ +--- +import Layout from '@/src/layouts/Layout.astro' +import metadataFetch from '@/utils/metadata.fetch' + +const metadata = await metadataFetch('Index_Page') +--- + + +

Index Page

+
diff --git a/apps/astro/src/pages/manifest.webmanifest.ts b/apps/astro/src/pages/manifest.webmanifest.ts new file mode 100644 index 0000000..a847ff6 --- /dev/null +++ b/apps/astro/src/pages/manifest.webmanifest.ts @@ -0,0 +1,39 @@ +import type { APIRoute } from "astro"; +import { getImage } from "astro:assets"; +import icon from "@/assets/icon.png"; +import { BACKGROUND_COLOR, DEFAULT_DESCRIPTION, DEFAULT_TITLE, THEME_COLOR } from "@/global/constants"; + +const sizes = [192, 512]; + +export const GET: APIRoute = async () => { + const icons = await Promise.all( + sizes.map(async size => { + const { src, options: { format, width, height } } = await getImage({ + src: icon, + width: size, + height: size, + format: "png", + }); + return { + src: src, + type: `image/${format}`, + sizes: `${width}x${height}`, + }; + }) + ); + + const manifest = JSON.stringify({ + start_url: "/", + display: "standalone", + name: DEFAULT_TITLE, + short_name: DEFAULT_TITLE, + description: DEFAULT_DESCRIPTION, + background_color: BACKGROUND_COLOR, + theme_color: THEME_COLOR, + icons, + }); + + return new Response(manifest, { + headers: { "Content-Type": "application/manifest+json" }, + }); +}; diff --git a/apps/astro/src/utils/is-preview-deployment.ts b/apps/astro/src/utils/is-preview-deployment.ts new file mode 100644 index 0000000..8882e59 --- /dev/null +++ b/apps/astro/src/utils/is-preview-deployment.ts @@ -0,0 +1 @@ +export const isPreviewDeployment = process.env.VERCEL_ENV === "preview" || process.env.NODE_ENV !== "production"; diff --git a/apps/astro/src/utils/metadata.fetch.ts b/apps/astro/src/utils/metadata.fetch.ts new file mode 100644 index 0000000..a73cc23 --- /dev/null +++ b/apps/astro/src/utils/metadata.fetch.ts @@ -0,0 +1,28 @@ + +import type { Props } from "@/src/layouts/Head.astro"; +import sanityFetch from "@/utils/sanity.fetch"; + +export default async function metadataFetch(type: string, slug?: string): Promise { + const filter = slug + ? `*[_type == '${type}' && slug.current == $slug][0]` + : `*[_type == "${type}"][0]`; + + const seo = await sanityFetch({ + query: /* groq */ ` + ${filter} { + "path": slug.current, + "title": seo.title, + "description": seo.description, + "openGraphImage": { + "url": seo.img.asset -> url + "?w=1200", + "height": round(1200 / seo.img.asset -> metadata.dimensions.aspectRatio), + }, + } + `, + ...(slug && { params: { slug: slug } }), + }); + if (!seo?.path) throw new Error(`The path for '${type}' is not specified`); + if (!seo?.title) throw new Error(`The title for '${type}' is not specified`); + if (!seo?.description) throw new Error(`The description for '${type}' is not specified`); + return seo; +} diff --git a/apps/astro/src/utils/sanity.fetch.ts b/apps/astro/src/utils/sanity.fetch.ts new file mode 100644 index 0000000..c0ff8df --- /dev/null +++ b/apps/astro/src/utils/sanity.fetch.ts @@ -0,0 +1,27 @@ +import { createClient, type QueryParams } from '@sanity/client' +import { isPreviewDeployment } from '../utils/is-preview-deployment'; + +const TOKEN = import.meta.env.SANITY_API_TOKEN || process.env.SANITY_API_TOKEN; + +if (isPreviewDeployment && !TOKEN) { + throw new Error("The `SANITY_API_TOKEN` environment variable is required."); +} + +export const client = createClient({ + projectId: 'YOUR_PROJECT_ID', + dataset: 'production', + apiVersion: '2024-08-30', + useCdn: false, + perspective: isPreviewDeployment ? 'previewDrafts' : 'published', + ...(isPreviewDeployment && { token: TOKEN }), +}) + +export default async function sanityFetch({ + query, + params = {}, +}: { + query: string; + params?: QueryParams; +}): Promise { + return await client.fetch(query, params); +} diff --git a/apps/astro/tsconfig.json b/apps/astro/tsconfig.json new file mode 100644 index 0000000..235e379 --- /dev/null +++ b/apps/astro/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "astro/tsconfigs/strict", + "compilerOptions": { + "verbatimModuleSyntax": true, + "baseUrl": ".", + "paths": { + "@/src/*": ["./src/*"], + "@/global/*": ["./src/global/*"], + "@/components/*": ["./src/components/*"], + "@/utils/*": ["./src/utils/*"], + "@/assets/*": ["./src/assets/*"], + "@/public/*": ["./public/*"] + } + } +} diff --git a/apps/sanity/.eslintrc b/apps/sanity/.eslintrc new file mode 100644 index 0000000..af05325 --- /dev/null +++ b/apps/sanity/.eslintrc @@ -0,0 +1,6 @@ +{ + "extends": "@sanity/eslint-config-studio", + "rules": { + "@typescript-eslint/no-unused-vars": "error" + } +} diff --git a/apps/sanity/.gitignore b/apps/sanity/.gitignore new file mode 100644 index 0000000..aa9909c --- /dev/null +++ b/apps/sanity/.gitignore @@ -0,0 +1,29 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# Dependencies +/node_modules +/.pnp +.pnp.js + +# Compiled Sanity Studio +/dist + +# Temporary Sanity runtime, generated by the CLI on every dev server start +/.sanity + +# Logs +/logs +*.log + +# Coverage directory used by testing tools +/coverage + +# Misc +.DS_Store +*.pem + +# Typescript +*.tsbuildinfo + +# Dotenv and similar local-only files +*.local diff --git a/apps/sanity/constants.ts b/apps/sanity/constants.ts new file mode 100644 index 0000000..6f2443f --- /dev/null +++ b/apps/sanity/constants.ts @@ -0,0 +1,17 @@ + +/** + * Global declaration of the domain for the application. + * This constant is used for constructing full URLs and determining external links. + * @constant + * @type {string} + */ +export const DOMAIN: string = "https://kryptonum.eu"; + +/** + * The domain used for preview deployments. + * This constant is utilized to generate URLs for preview environments, + * allowing content to be reviewed before it's published to the main site. + * @constant + * @type {string} + */ +export const PREVIEW_DEPLOYMENT_DOMAIN: string = import.meta.env.SANITY_STUDIO_PREVIEW_DOMAIN; diff --git a/apps/sanity/env.d.ts b/apps/sanity/env.d.ts new file mode 100644 index 0000000..ef3c5c9 --- /dev/null +++ b/apps/sanity/env.d.ts @@ -0,0 +1,5 @@ +/// + +interface ImportMetaEnv { + SANITY_STUDIO_PREVIEW_DOMAIN: string; +} diff --git a/apps/sanity/package.json b/apps/sanity/package.json new file mode 100644 index 0000000..15e7713 --- /dev/null +++ b/apps/sanity/package.json @@ -0,0 +1,33 @@ +{ + "name": "sanity-app", + "private": true, + "version": "1.0.0", + "main": "package.json", + "license": "UNLICENSED", + "scripts": { + "dev": "sanity dev", + "start": "sanity start", + "build": "sanity build", + "deploy": "sanity deploy", + "deploy-graphql": "sanity graphql deploy" + }, + "keywords": [ + "sanity" + ], + "dependencies": { + "@sanity/vision": "^3.57.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "sanity": "^3.57.2", + "sanity-plugin-iframe-pane": "^3.1.6", + "sanity-plugin-media": "^2.3.2", + "styled-components": "^6.1.13" + }, + "devDependencies": { + "@sanity/eslint-config-studio": "^4.0.0", + "@types/react": "^18.3.5", + "eslint": "^9.10.0", + "prettier": "^3.3.3", + "typescript": "^5.6.2" + } +} diff --git a/apps/sanity/sanity-typegen.json b/apps/sanity/sanity-typegen.json new file mode 100644 index 0000000..fcd6e42 --- /dev/null +++ b/apps/sanity/sanity-typegen.json @@ -0,0 +1,4 @@ +{ + "schema": "schema.json", + "generates": "../astro/sanity.types.ts" +} diff --git a/apps/sanity/sanity.cli.ts b/apps/sanity/sanity.cli.ts new file mode 100644 index 0000000..8f0d77b --- /dev/null +++ b/apps/sanity/sanity.cli.ts @@ -0,0 +1,9 @@ +import { defineCliConfig } from 'sanity/cli' + +export default defineCliConfig({ + api: { + projectId: 'YOUR_PROJECT_ID', + dataset: 'production' + }, + studioHost: 'kryptonum' +}) diff --git a/apps/sanity/sanity.config.ts b/apps/sanity/sanity.config.ts new file mode 100644 index 0000000..a1d9607 --- /dev/null +++ b/apps/sanity/sanity.config.ts @@ -0,0 +1,35 @@ +import { defineConfig } from 'sanity' +import { structure } from './structure' +import { schemaTypes, singletonActions, singletonTypes } from './structure/schema-types' +import { structureTool } from 'sanity/structure' +import { media } from 'sanity-plugin-media' +import { visionTool } from '@sanity/vision' +import { showProductionUrl } from './utils/show-production-url' + +export default defineConfig({ + name: 'default', + title: 'kryptonum-eu', + + projectId: 'YOUR_PROJECT_ID', + dataset: 'production', + + plugins: [ + structureTool({ structure }), + media(), + visionTool(), + showProductionUrl(), + ], + + schema: { + types: schemaTypes, + templates: (templates) => + templates.filter(({ schemaType }) => !singletonTypes.has(schemaType)), + }, + + document: { + actions: (input, context) => + singletonTypes.has(context.schemaType) + ? input.filter(({ action }) => action && singletonActions.has(action)) + : input, + }, +}) diff --git a/apps/sanity/schema/collectionTypes/Faq_Collection.ts b/apps/sanity/schema/collectionTypes/Faq_Collection.ts new file mode 100644 index 0000000..d5c6081 --- /dev/null +++ b/apps/sanity/schema/collectionTypes/Faq_Collection.ts @@ -0,0 +1,37 @@ +import { defineField, defineType } from "sanity"; +import { toPlainText } from "../../utils/to-plain-text"; + +const title = 'Zbiór elementów FAQ'; +const icon = () => '❓'; + +export default defineType({ + name: 'Faq_Collection', + type: 'document', + title, + icon, + fields: [ + defineField({ + name: 'question', + type: 'Heading', + title: 'Pytanie', + validation: Rule => Rule.required(), + }), + defineField({ + name: 'answer', + type: 'PortableText', + title: 'Odpowiedź', + validation: Rule => Rule.required(), + }), + ], + preview: { + select: { + title: 'question', + subtitle: 'answer', + }, + prepare: ({ title, subtitle }) => ({ + title: toPlainText(title), + subtitle: toPlainText(subtitle), + icon, + }), + }, +}); diff --git a/apps/sanity/schema/singleTypes/Index_Page.ts b/apps/sanity/schema/singleTypes/Index_Page.ts new file mode 100644 index 0000000..693b9ec --- /dev/null +++ b/apps/sanity/schema/singleTypes/Index_Page.ts @@ -0,0 +1,39 @@ +import { defineField, defineType } from "sanity" +import { defineSlugForDocument } from "../../utils/define-slug-for-document"; + +const name = 'Index_Page'; +const title = 'Homepage'; +const slug = '/'; + +export default defineType({ + name: name, + type: 'document', + title: title, + icon: () => '🏠', + fields: [ + ...defineSlugForDocument({ slug: slug }), + defineField({ + name: 'components', + type: 'components', + title: 'Page Components', + }), + defineField({ + name: 'seo', + type: 'seo', + title: 'SEO', + group: 'seo', + }), + ], + groups: [ + { + name: 'seo', + title: 'SEO', + }, + ], + preview: { + prepare: () => ({ + title: title, + subtitle: slug + }) + } +}); diff --git a/apps/sanity/schema/singleTypes/global.tsx b/apps/sanity/schema/singleTypes/global.tsx new file mode 100644 index 0000000..4e99ef1 --- /dev/null +++ b/apps/sanity/schema/singleTypes/global.tsx @@ -0,0 +1,109 @@ +import { defineField, defineType } from 'sanity'; + +export default defineType({ + name: 'global', + type: 'document', + title: 'Global', + icon: () => '🌍', + fields: [ + defineField({ + name: 'email', + type: 'string', + title: 'Email', + validation: Rule => Rule.required().email(), + }), + defineField({ + name: 'tel', + type: 'string', + title: 'Phone number (optional)', + }), + defineField({ + name: 'socials', + type: 'object', + title: 'Social media', + options: { collapsible: true }, + fields: [ + defineField({ + name: 'instagram', + type: 'url', + title: 'Instagram', + validation: Rule => Rule.uri({ scheme: ['https'] }).error('Provide a valid URL (starting with https://)'), + }), + defineField({ + name: 'facebook', + type: 'url', + title: 'Facebook', + validation: Rule => Rule.uri({ scheme: ['https'] }).error('Provide a valid URL (starting with https://)'), + }), + defineField({ + name: 'tiktok', + type: 'url', + title: 'TikTok', + validation: Rule => Rule.uri({ scheme: ['https'] }).error('Provide a valid URL (starting with https://)'), + }), + defineField({ + name: 'linkedin', + type: 'url', + title: 'LinkedIn', + validation: Rule => Rule.uri({ scheme: ['https'] }).error('Provide a valid URL (starting with https://)'), + }), + ], + }), + defineField({ + name: 'seo', + type: 'object', + title: 'Global SEO', + fields: [ + defineField({ + name: 'img', + type: 'image', + title: 'Social Share Image', + description: 'Social Share Image is visible when sharing website on social media. The dimensions of the image should be 1200x630px. For maximum compatibility, use JPG or PNG formats, as WebP may not be supported everywhere.', + validation: Rule => Rule.required() + }), + ], + validation: Rule => Rule.required(), + }), + defineField({ + name: 'OrganizationSchema', + type: 'object', + title: 'Organization structured data', + description: ( + <> + Learn more about{' '} + + Organization structured data + + + ), + options: { collapsible: true }, + fields: [ + defineField({ + name: 'name', + type: 'string', + title: 'Name', + description: 'Enter the name of your organization as you want it to appear in search results.', + validation: Rule => Rule.required(), + }), + defineField({ + name: 'description', + type: 'text', + rows: 3, + title: 'Description', + description: 'A brief description of your organization that will appear in search results.', + validation: Rule => Rule.required(), + }), + ], + }), + ], + preview: { + prepare: () => ({ + title: 'Global settings', + }) + } +}) + diff --git a/apps/sanity/schema/singleTypes/redirects.tsx b/apps/sanity/schema/singleTypes/redirects.tsx new file mode 100644 index 0000000..8780afa --- /dev/null +++ b/apps/sanity/schema/singleTypes/redirects.tsx @@ -0,0 +1,98 @@ +import { defineField, defineType, type SlugRule } from 'sanity'; +import { Box, Text, Tooltip } from '@sanity/ui'; + +type RedirectTypes = { + _key: string; + source: { current: string }; + destination: { current: string }; + isPermanent: boolean; +} + +const SlugValidation = (Rule: SlugRule) => Rule.custom((value) => { + if (!value || !value.current) return "The value can't be blank"; + if (!value.current.startsWith("/")) return "The path must be a relative path (starts with /)"; + return true; +}); + +export default defineType({ + name: 'redirects', + type: 'document', + title: 'Redirects', + description: 'Redirects are used to redirect users to a different page. This is useful for SEO purposes.', + icon: () => '🔀', + fields: [ + defineField({ + name: 'redirects', + type: 'array', + description: 'Redirects are used to redirect users to a different page. This is useful for SEO purposes. Remember about good practices for redirects as they can affect SEO.', + of: [ + defineField({ + name: 'redirect', + type: 'object', + fields: [ + defineField({ + name: 'source', + type: 'slug', + validation: Rule => [ + SlugValidation(Rule), + Rule.custom((value, context) => { + const redirects = (context.document?.redirects || []) as RedirectTypes[]; + const currentRedirect = context.parent as RedirectTypes + const isDuplicate = redirects.some(redirect => + redirect._key !== currentRedirect._key && redirect.source?.current === value?.current + ); + if (isDuplicate) return "This source path is already used in another redirect. Source paths must be unique."; + return true; + }) + ] + }), + defineField({ + name: 'destination', + type: 'slug', + validation: SlugValidation, + }), + defineField({ + name: 'isPermanent', + type: 'boolean', + initialValue: true, + }), + ], + preview: { + select: { + source: 'source.current', + destination: 'destination.current', + isPermanent: 'isPermanent', + }, + prepare({ source, destination, isPermanent }) { + return { + title: `Source: ${source}`, + subtitle: `Destination: ${destination}`, + media: () => + + {isPermanent ? '🔒 Permanent' : '🔄 Temporary'} + + + } + placement="top" + portal + > + + {isPermanent ? '🔒' : '🔄'} + + + } + } + }, + }) + ], + }) + ], + preview: { + prepare: () => ({ + title: 'Redirects', + }) + } +}) + diff --git a/apps/sanity/schema/ui/Components.ts b/apps/sanity/schema/ui/Components.ts new file mode 100644 index 0000000..08cd79a --- /dev/null +++ b/apps/sanity/schema/ui/Components.ts @@ -0,0 +1,20 @@ +import { defineType } from "sanity"; + +export default defineType({ + name: 'components', + type: 'array', + title: 'Components', + of: [ + + ], + options: { + insertMenu: { + filter: true, + showIcons: true, + views: [ + { name: 'grid', previewImageUrl: (schemaTypeName) => `/static/${schemaTypeName}.webp` }, + { name: 'list' }, + ] + } + } +}); diff --git a/apps/sanity/schema/ui/PortableText/CustomInput.tsx b/apps/sanity/schema/ui/PortableText/CustomInput.tsx new file mode 100644 index 0000000..4644b54 --- /dev/null +++ b/apps/sanity/schema/ui/PortableText/CustomInput.tsx @@ -0,0 +1,23 @@ +import type { PortableTextInputProps } from "sanity"; +import styled from "styled-components"; + +const Container = styled.div` + [data-testid='pt-editor'][data-fullscreen='false'] { + height: auto; + min-height: 88px; + max-height: 377px; + .pt-editable { + padding-bottom: 12px; + } + } +` +export const CustomInput = (props: PortableTextInputProps) => { + return ( + + {props.renderDefault({ + initialActive: true, + ...props, + })} + + ); +}; diff --git a/apps/sanity/schema/ui/PortableText/Heading.tsx b/apps/sanity/schema/ui/PortableText/Heading.tsx new file mode 100644 index 0000000..e37c515 --- /dev/null +++ b/apps/sanity/schema/ui/PortableText/Heading.tsx @@ -0,0 +1,23 @@ +import { defineArrayMember, defineType } from "sanity"; +import { CustomInput } from "./CustomInput"; + +export default defineType({ + name: 'Heading', + type: 'array', + title: 'Heading', + components: { + // @ts-ignore + input: CustomInput + }, + of: [defineArrayMember({ + type: 'block', + styles: [{ title: 'Normal', value: 'normal' }], + lists: [], + marks: { + annotations: [], + decorators: [ + { title: 'Strong', value: 'strong' }, + ], + } + })], +}); diff --git a/apps/sanity/schema/ui/PortableText/index.tsx b/apps/sanity/schema/ui/PortableText/index.tsx new file mode 100644 index 0000000..6e3c384 --- /dev/null +++ b/apps/sanity/schema/ui/PortableText/index.tsx @@ -0,0 +1,89 @@ +import { defineField, defineType, useClient } from "sanity"; +import { CustomInput } from "./CustomInput"; +import { isValidUrl } from "../../../utils/is-valid-url"; +import { InternalLinkableTypes } from "../../../structure/internal-linkable-types"; + +export default defineType({ + name: 'PortableText', + type: 'array', + title: 'Portable Text', + components: { + // @ts-ignore + input: CustomInput + }, + of: [{ + type: 'block', + styles: [{ title: 'Normal', value: 'normal' }], + lists: [ + { title: 'Bullet', value: 'bullet' }, + { title: 'Numbered', value: 'number' } + ], + marks: { + decorators: [ + { title: 'Strong', value: 'strong' }, + { title: 'Emphasis', value: 'em' } + ], + annotations: [ + defineField({ + name: 'link', + type: 'object', + title: 'Link', + icon: () => '🔗', + fields: [ + defineField({ + name: 'type', + type: 'string', + title: 'Type', + description: 'Choose "External" for links to websites outside your domain, or "Internal" for links to pages within your site.', + options: { + list: ['external', 'internal'], + layout: 'radio', + direction: 'horizontal', + }, + initialValue: 'external', + }), + defineField({ + name: 'external', + type: 'string', + title: 'URL', + description: 'Specify the full URL. Ensure it starts with "https://" and is a valid URL.', + hidden: ({ parent }) => parent?.type !== 'external', + validation: (Rule) => [ + Rule.custom((value, { parent }) => { + const type = (parent as { type?: string })?.type; + if (type === 'external') { + if (!value) return "URL is required"; + if (!value.startsWith('https://')) { + return 'External link must start with the "https://" protocol'; + } + if (!isValidUrl(value)) return 'Invalid URL'; + } + return true; + }), + ], + }), + defineField({ + name: 'internal', + type: 'reference', + title: 'Internal reference to page', + description: 'Select an internal page to link to.', + to: InternalLinkableTypes, + options: { + disableNew: true, + filter: 'defined(slug.current)', + }, + hidden: ({ parent }) => parent?.type !== 'internal', + validation: (rule) => [ + rule.custom((value, { parent }) => { + const type = (parent as { type?: string })?.type; + if (type === 'internal' && !value?._ref) return "You have to choose internal page to link to."; + return true; + }), + ], + }), + ] + }), + ] + } + }], +}); diff --git a/apps/sanity/schema/ui/cta.ts b/apps/sanity/schema/ui/cta.ts new file mode 100644 index 0000000..212e499 --- /dev/null +++ b/apps/sanity/schema/ui/cta.ts @@ -0,0 +1,35 @@ +import { defineField, defineType } from "sanity" + +export default defineType({ + name: 'cta', + type: 'object', + title: 'Wezwanie do działania', + icon: () => '🗣️', + fields: [ + defineField({ + name: 'text', + type: 'string', + title: 'Tekst', + validation: Rule => Rule.required(), + }), + defineField({ + name: 'href', + type: 'string', + title: 'Link', + description: 'Link relatywny lub absolutny (wymagany protokół https://)', + validation: Rule => + Rule.custom(value => { + if (value && !value.startsWith('#') && !value.startsWith('/') && !value.startsWith('https://')) { + return 'Nieprawidłowy adres URL.'; + } + return true; + }).required(), + }), + ], + preview: { + select: { + title: 'text', + subtitle: 'href', + }, + }, +}); diff --git a/apps/sanity/schema/ui/seo.tsx b/apps/sanity/schema/ui/seo.tsx new file mode 100644 index 0000000..8d99aca --- /dev/null +++ b/apps/sanity/schema/ui/seo.tsx @@ -0,0 +1,41 @@ +import { defineField, defineType } from "sanity" + +export default defineType({ + name: 'seo', + title: 'SEO', + type: 'object', + validation: Rule => Rule.required(), + fields: [ + defineField({ + name: 'title', + type: 'string', + title: 'Title', + description: 'Title is visible in the browser tab and in search engines.', + validation: Rule => [ + Rule.max(70).warning('The field should not be longer than 70 characters.'), + Rule.required() + ], + }), + defineField({ + name: 'description', + type: 'text', + title: 'Description', + rows: 4, + description: 'Description is visible in search engines and when sharing the page on social media.', + validation: Rule => [ + Rule.max(165).warning('The field should not be longer than 165 characters.'), + Rule.required() + ], + }), + defineField({ + name: 'img', + type: 'image', + title: 'Social Share Image (optional)', + description: ( + <> + Social Share Image is visible when sharing website on social media. The dimensions of the image should be 1200x630px. For maximum compatibility, use JPG or PNG formats, as WebP may not be supported everywhere. If this field is left empty, the image defined in global settings will be used. + + ), + }), + ], +}); diff --git a/apps/sanity/static/.gitkeep b/apps/sanity/static/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/apps/sanity/structure/create-singleton.tsx b/apps/sanity/structure/create-singleton.tsx new file mode 100644 index 0000000..6dc063c --- /dev/null +++ b/apps/sanity/structure/create-singleton.tsx @@ -0,0 +1,40 @@ +import type { StructureBuilder } from 'sanity/structure' +import { Iframe, type IframeProps } from 'sanity-plugin-iframe-pane' +import { schemaTypes } from "./schema-types"; +import { PREVIEW_DEPLOYMENT_DOMAIN } from '../constants'; + +const Preview = ({ document }: { document: IframeProps['document'] }) => { + const slug = (document.displayed.slug as { current?: string })?.current; + if (!slug) return
🛑 Preview not available: The slug is missing
; + return