From 6eb2589ceaff3b2ee0d56e08fed467c3cbe10cb5 Mon Sep 17 00:00:00 2001 From: Nico Schett Date: Tue, 8 Oct 2024 10:13:04 +0200 Subject: [PATCH] docs: move docs to pylon repo --- .github/workflows/vercel-merge.yml | 23 + .github/workflows/vercel-pull-request.yml | 26 + docs/.gitignore | 4 + docs/LICENSE | 21 + docs/README.md | 23 + docs/components.json | 20 + docs/components/authors.tsx | 23 + docs/components/callout.tsx | 50 + docs/components/clipboard-button.tsx | 39 + docs/components/counters.module.css | 6 + docs/components/counters.tsx | 24 + docs/components/features.module.css | 45 + docs/components/features.tsx | 238 ++ docs/components/icon.tsx | 94 + docs/components/icons/InstallationIcon.tsx | 44 + docs/components/icons/LightbulbIcon.tsx | 49 + docs/components/icons/PluginsIcon.tsx | 66 + docs/components/icons/PresetsIcon.tsx | 46 + docs/components/icons/ThemingIcon.tsx | 62 + docs/components/icons/WarningIcon.tsx | 58 + docs/components/landing.tsx | 36 + docs/components/logo.tsx | 108 + docs/components/playground.tsx | 16 + docs/components/quick-link/index.tsx | 37 + docs/components/ui/button.tsx | 56 + docs/lib/utils.ts | 6 + docs/next-env.d.ts | 5 + docs/next.config.js | 16 + docs/package.json | 45 + docs/pages/_app.mdx | 11 + docs/pages/_meta.json | 36 + docs/pages/blog.mdx | 40 + docs/pages/blog/_meta.json | 14 + docs/pages/blog/pylon-1.0.mdx | 82 + docs/pages/blog/pylon-2.0.mdx | 128 + docs/pages/docs/_meta.json | 24 + docs/pages/docs/about.mdx | 3 + docs/pages/docs/contributing/_meta.json | 5 + .../docs/contributing/architecture-guide.mdx | 3 + .../docs/contributing/design-principles.mdx | 3 + .../docs/contributing/how-to-contribute.mdx | 73 + docs/pages/docs/core-concepts/_meta.json | 8 + .../automatic-graphql-api-generation.mdx | 125 + ...lt-in-authentication-and-authorization.mdx | 141 ++ .../docs/core-concepts/context-management.mdx | 102 + docs/pages/docs/core-concepts/decorators.mdx | 186 ++ .../core-concepts/logging-and-monitoring.mdx | 54 + .../type-safety-and-type-integration.mdx | 458 ++++ docs/pages/docs/faq.mdx | 108 + docs/pages/docs/getting-started.mdx | 379 +++ docs/pages/docs/guides/_meta.json | 3 + docs/pages/docs/guides/testing.mdx | 491 ++++ docs/pages/docs/integrations/_meta.json | 4 + docs/pages/docs/integrations/databases.mdx | 277 +++ docs/pages/docs/integrations/gqty.mdx | 49 + docs/pages/docs/release-notes/_meta.json | 4 + .../release-notes/migrating-from-v1-to-v2.mdx | 177 ++ docs/pages/docs/release-notes/v2.0.mdx | 118 + docs/pages/docs/telemetry.mdx | 22 + docs/pages/imprint.mdx | 8 + docs/pages/index.mdx | 7 + docs/pages/playground.mdx | 8 + docs/pnpm-lock.yaml | 2181 +++++++++++++++++ docs/postcss.config.js | 6 + docs/styles/globals.css | 69 + docs/tailwind.config.js | 60 + docs/theme.config.tsx | 100 + docs/tsconfig.json | 23 + 68 files changed, 6876 insertions(+) create mode 100644 .github/workflows/vercel-merge.yml create mode 100644 .github/workflows/vercel-pull-request.yml create mode 100644 docs/.gitignore create mode 100644 docs/LICENSE create mode 100644 docs/README.md create mode 100644 docs/components.json create mode 100644 docs/components/authors.tsx create mode 100644 docs/components/callout.tsx create mode 100644 docs/components/clipboard-button.tsx create mode 100644 docs/components/counters.module.css create mode 100644 docs/components/counters.tsx create mode 100644 docs/components/features.module.css create mode 100644 docs/components/features.tsx create mode 100644 docs/components/icon.tsx create mode 100644 docs/components/icons/InstallationIcon.tsx create mode 100644 docs/components/icons/LightbulbIcon.tsx create mode 100644 docs/components/icons/PluginsIcon.tsx create mode 100644 docs/components/icons/PresetsIcon.tsx create mode 100644 docs/components/icons/ThemingIcon.tsx create mode 100644 docs/components/icons/WarningIcon.tsx create mode 100644 docs/components/landing.tsx create mode 100644 docs/components/logo.tsx create mode 100644 docs/components/playground.tsx create mode 100644 docs/components/quick-link/index.tsx create mode 100644 docs/components/ui/button.tsx create mode 100644 docs/lib/utils.ts create mode 100644 docs/next-env.d.ts create mode 100644 docs/next.config.js create mode 100644 docs/package.json create mode 100644 docs/pages/_app.mdx create mode 100644 docs/pages/_meta.json create mode 100644 docs/pages/blog.mdx create mode 100644 docs/pages/blog/_meta.json create mode 100644 docs/pages/blog/pylon-1.0.mdx create mode 100644 docs/pages/blog/pylon-2.0.mdx create mode 100644 docs/pages/docs/_meta.json create mode 100644 docs/pages/docs/about.mdx create mode 100644 docs/pages/docs/contributing/_meta.json create mode 100644 docs/pages/docs/contributing/architecture-guide.mdx create mode 100644 docs/pages/docs/contributing/design-principles.mdx create mode 100644 docs/pages/docs/contributing/how-to-contribute.mdx create mode 100644 docs/pages/docs/core-concepts/_meta.json create mode 100644 docs/pages/docs/core-concepts/automatic-graphql-api-generation.mdx create mode 100644 docs/pages/docs/core-concepts/built-in-authentication-and-authorization.mdx create mode 100644 docs/pages/docs/core-concepts/context-management.mdx create mode 100644 docs/pages/docs/core-concepts/decorators.mdx create mode 100644 docs/pages/docs/core-concepts/logging-and-monitoring.mdx create mode 100644 docs/pages/docs/core-concepts/type-safety-and-type-integration.mdx create mode 100644 docs/pages/docs/faq.mdx create mode 100644 docs/pages/docs/getting-started.mdx create mode 100644 docs/pages/docs/guides/_meta.json create mode 100644 docs/pages/docs/guides/testing.mdx create mode 100644 docs/pages/docs/integrations/_meta.json create mode 100644 docs/pages/docs/integrations/databases.mdx create mode 100644 docs/pages/docs/integrations/gqty.mdx create mode 100644 docs/pages/docs/release-notes/_meta.json create mode 100644 docs/pages/docs/release-notes/migrating-from-v1-to-v2.mdx create mode 100644 docs/pages/docs/release-notes/v2.0.mdx create mode 100644 docs/pages/docs/telemetry.mdx create mode 100644 docs/pages/imprint.mdx create mode 100644 docs/pages/index.mdx create mode 100644 docs/pages/playground.mdx create mode 100644 docs/pnpm-lock.yaml create mode 100644 docs/postcss.config.js create mode 100644 docs/styles/globals.css create mode 100644 docs/tailwind.config.js create mode 100644 docs/theme.config.tsx create mode 100644 docs/tsconfig.json diff --git a/.github/workflows/vercel-merge.yml b/.github/workflows/vercel-merge.yml new file mode 100644 index 0000000..9c5ead6 --- /dev/null +++ b/.github/workflows/vercel-merge.yml @@ -0,0 +1,23 @@ +# vercel-merge.yml +name: Deploy to vercel on merge +on: + push: + branches: + - main +jobs: + build_and_deploy: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + repository-projects: write + steps: + - uses: actions/checkout@v4 + - uses: amondnet/vercel-action@v20 + with: + vercel-token: ${{ secrets.VERCEL_TOKEN }} + github-token: ${{ secrets.GITHUB_TOKEN }} + vercel-args: '--prod' + vercel-org-id: ${{ secrets.ORG_ID}} + vercel-project-id: ${{ secrets.PROJECT_ID}} + scope: ${{ secrets.ORG_ID }} \ No newline at end of file diff --git a/.github/workflows/vercel-pull-request.yml b/.github/workflows/vercel-pull-request.yml new file mode 100644 index 0000000..e5a9e91 --- /dev/null +++ b/.github/workflows/vercel-pull-request.yml @@ -0,0 +1,26 @@ +# vercel-pull-request.yml +name: Create vercel preview URL on pull request +on: + pull_request: + branches: + - main +jobs: + build_and_deploy: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + repository-projects: write + steps: + - uses: actions/checkout@v4 + - uses: amondnet/vercel-action@v20 + id: vercel-deploy + with: + vercel-token: ${{ secrets.VERCEL_TOKEN }} + github-token: ${{ secrets.GITHUB_TOKEN }} + vercel-org-id: ${{ secrets.ORG_ID }} + vercel-project-id: ${{ secrets.PROJECT_ID }} + scope: ${{ secrets.ORG_ID }} + - name: preview-url + run: | + echo ${{ steps.vercel-deploy.outputs.preview-url }} \ No newline at end of file diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..5c86326 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,4 @@ +.next +node_modules +.DS_Store +.vercel diff --git a/docs/LICENSE b/docs/LICENSE new file mode 100644 index 0000000..490da1f --- /dev/null +++ b/docs/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Shu Ding + +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. diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..7b33473 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,23 @@ +# Nextra Docs Template + +This is a template for creating documentation with [Nextra](https://nextra.site). + +[**Live Demo →**](https://nextra-docs-template.vercel.app) + +[![](.github/screenshot.png)](https://nextra-docs-template.vercel.app) + +## Quick Start + +Click the button to clone this repository and deploy it on Vercel: + +[![](https://vercel.com/button)](https://vercel.com/new/clone?s=https%3A%2F%2Fgithub.com%2Fshuding%2Fnextra-docs-template&showOptionalTeamCreation=false) + +## Local Development + +First, run `pnpm i` to install the dependencies. + +Then, run `pnpm dev` to start the development server and visit localhost:3000. + +## License + +This project is licensed under the MIT License. diff --git a/docs/components.json b/docs/components.json new file mode 100644 index 0000000..8b84b18 --- /dev/null +++ b/docs/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "styles/globals.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + } +} \ No newline at end of file diff --git a/docs/components/authors.tsx b/docs/components/authors.tsx new file mode 100644 index 0000000..37ad97e --- /dev/null +++ b/docs/components/authors.tsx @@ -0,0 +1,23 @@ +export default function Authors({ date, children }) { + return ( +
+ {date} by {children} +
+ ); +} + +export function Author({ name, link }) { + return ( + + + {name} + + + ); +} diff --git a/docs/components/callout.tsx b/docs/components/callout.tsx new file mode 100644 index 0000000..9a08957 --- /dev/null +++ b/docs/components/callout.tsx @@ -0,0 +1,50 @@ +import clsx from "clsx"; + +import { Icon } from "./icon"; +import React from "react"; + +const styles = { + note: { + container: + "bg-sky-50 dark:bg-slate-800/60 dark:ring-1 dark:ring-slate-300/10", + title: "text-sky-900 dark:text-sky-400", + body: "text-sky-800 [--tw-prose-background:theme(colors.sky.50)] prose-a:text-sky-900 prose-code:text-sky-900 dark:text-slate-300 dark:prose-code:text-slate-300", + }, + warning: { + container: + "bg-amber-50 dark:bg-slate-800/60 dark:ring-1 dark:ring-slate-300/10", + title: "text-amber-900 dark:text-amber-500", + body: "text-amber-800 [--tw-prose-underline:theme(colors.amber.400)] [--tw-prose-background:theme(colors.amber.50)] prose-a:text-amber-900 prose-code:text-amber-900 dark:text-slate-300 dark:[--tw-prose-underline:theme(colors.sky.700)] dark:prose-code:text-slate-300", + }, +}; + +const icons = { + note: (props: Partial>) => ( + + ), + warning: (props: Partial>) => ( + + ), +}; + +export const Callout: React.FC<{ + type: keyof typeof icons; + title: string; + children: React.ReactNode; +}> = ({ type = "note", title, children }) => { + let IconComponent = icons[type]; + + return ( +
+ +
+

+ {title} +

+
+ {children} +
+
+
+ ); +}; diff --git a/docs/components/clipboard-button.tsx b/docs/components/clipboard-button.tsx new file mode 100644 index 0000000..8f8ef72 --- /dev/null +++ b/docs/components/clipboard-button.tsx @@ -0,0 +1,39 @@ +"use client"; + +import { useState } from "react"; +import { Copy, Check } from "lucide-react"; +import { useCopyToClipboard } from "usehooks-ts"; +import { Button } from "@/components/ui/button"; + +interface ClipboardButtonProps { + text: string; +} + +export function ClipboardButton( + { text }: ClipboardButtonProps = { text: "Copy me!" } +) { + const [isCopied, setIsCopied] = useState(false); + const [_, copy] = useCopyToClipboard(); + + const handleCopy = () => { + copy(text); + setIsCopied(true); + setTimeout(() => setIsCopied(false), 2000); + }; + + return ( + + ); +} diff --git a/docs/components/counters.module.css b/docs/components/counters.module.css new file mode 100644 index 0000000..4a5d0c8 --- /dev/null +++ b/docs/components/counters.module.css @@ -0,0 +1,6 @@ +.counter { + border: 1px solid #ccc; + border-radius: 5px; + padding: 2px 6px; + margin: 12px 0 0; +} diff --git a/docs/components/counters.tsx b/docs/components/counters.tsx new file mode 100644 index 0000000..b78f12d --- /dev/null +++ b/docs/components/counters.tsx @@ -0,0 +1,24 @@ +// Example from https://beta.reactjs.org/learn + +import { useState } from 'react' +import styles from './counters.module.css' + +function MyButton() { + const [count, setCount] = useState(0) + + function handleClick() { + setCount(count + 1) + } + + return ( +
+ +
+ ) +} + +export default function MyApp() { + return +} diff --git a/docs/components/features.module.css b/docs/components/features.module.css new file mode 100644 index 0000000..3224c0f --- /dev/null +++ b/docs/components/features.module.css @@ -0,0 +1,45 @@ +.features { + display: grid; + grid-template-columns: 1fr 1fr 1fr 1fr; + gap: 1rem 2rem; + margin: 2.5rem 0 2rem; + } + .feature { + align-items: center; + display: inline-flex; + } + .feature h4 { + margin: 0 0 0 0.5rem; + font-weight: 700; + font-size: 1.1rem; + white-space: nowrap; + } + @media (max-width: 860px) { + .features { + gap: 1rem 0.5rem; + } + .feature { + padding-left: 0; + justify-content: center; + } + .feature svg { + width: 20px; + } + .feature h4 { + font-size: 0.9rem; + } + } + @media (max-width: 660px) { + .features { + grid-template-columns: 1fr 1fr; + } + } + @media (max-width: 370px) { + .feature h4 { + font-size: 0.8rem; + } + .feature svg { + width: 16px; + stroke-width: 2.5px; + } + } \ No newline at end of file diff --git a/docs/components/features.tsx b/docs/components/features.tsx new file mode 100644 index 0000000..0984049 --- /dev/null +++ b/docs/components/features.tsx @@ -0,0 +1,238 @@ +import { useId } from "react"; +import styles from "./features.module.css"; + +// import BackendAgnosticIcon from "../components/icons/backend-agnostic"; +// import LightweightIcon from "../components/icons/lightweight"; +// import PaginationIcon from "../components/icons/pagination"; +// import RealtimeIcon from "../components/icons/realtime"; +// import RemoteLocalIcon from "../components/icons/remote-local"; +// import RenderingStrategiesIcon from "../components/icons/rendering-strategies"; +// import SuspenseIcon from "../components/icons/suspense"; +// import TypeScriptIcon from "../components/icons/typescript"; + +import { Icon } from "./icon"; + +export function Feature({ text, icon }) { + return ( +
+ {icon} +

{text}

+
+ ); +} + +/** @type {{ key: string; icon: React.FC }[]} */ +const FEATURES_LIST = [ + { + key: "realtimeSchema", + icon: ( + + + + + + + + ), + }, + { + key: "typeSafety", + icon: ( + + + + + + ), + }, + { + key: "authentication", + icon: ( + + + + + + + ), + }, + { + key: "authorization", + icon: ( + + + + + ), + }, + { + key: "runtimes", + icon: ( + + + + + + + ), + }, + { + key: "errorTracking", + icon: ( + + + + + + + + + + + + + ), + }, + { + key: "databaseIntegration", + icon: ( + + + + + ), + }, + { + key: "optimizedDeployment", + icon: ( + + + + + + + + + + + + + ), + }, +]; + +export default function Features() { + const keyId = useId(); + + const features = { + realtimeSchema: "Real-time Schema", + typeSafety: "Type Safety", + authentication: "OIDC Auth", + authorization: "Role-Based", + runtimes: "Multiple Runtimes", + errorTracking: "Error Tracking", + databaseIntegration: "Prisma Integration", + optimizedDeployment: "Docker Ready", + }; + + return ( +
+

+ A code-first approach to GraphQL API development +

+
+ {FEATURES_LIST.map(({ key, icon }) => ( + + ))} +
+
+ ); +} diff --git a/docs/components/icon.tsx b/docs/components/icon.tsx new file mode 100644 index 0000000..3b74f8f --- /dev/null +++ b/docs/components/icon.tsx @@ -0,0 +1,94 @@ +import { SVGProps, useId } from "react"; +import clsx from "clsx"; + +import { InstallationIcon } from "./icons/InstallationIcon"; +import { LightbulbIcon } from "./icons/LightbulbIcon"; +import { PluginsIcon } from "./icons/PluginsIcon"; +import { PresetsIcon } from "./icons/PresetsIcon"; +import { ThemingIcon } from "./icons/ThemingIcon"; +import { WarningIcon } from "./icons/WarningIcon"; + +const icons = { + installation: InstallationIcon, + presets: PresetsIcon, + plugins: PluginsIcon, + theming: ThemingIcon, + lightbulb: LightbulbIcon, + warning: WarningIcon, +}; + +export type Icons = keyof typeof icons; + +const iconStyles = { + blue: "[--icon-foreground:theme(colors.slate.900)] [--icon-background:theme(colors.white)]", + amber: + "[--icon-foreground:theme(colors.amber.900)] [--icon-background:theme(colors.amber.100)]", +}; + +export const Icon: React.FC< + SVGProps & { + color?: keyof typeof iconStyles; + icon: keyof typeof icons; + } +> = ({ color = "blue", icon, className, ...props }) => { + let id = useId(); + let IconComponent = icons[icon]; + + return ( + + ); +}; + +const gradients = { + blue: [ + { stopColor: "#0EA5E9" }, + { stopColor: "#22D3EE", offset: ".527" }, + { stopColor: "#818CF8", offset: 1 }, + ], + amber: [ + { stopColor: "#FDE68A", offset: ".08" }, + { stopColor: "#F59E0B", offset: ".837" }, + ], +}; + +export const Gradient: React.FC< + SVGProps & { + color: keyof typeof gradients; + } +> = ({ color = "blue", ...props }) => { + return ( + + {gradients[color].map((stop, stopIndex) => ( + + ))} + + ); +}; + +export const LightMode: React.FC> = ({ + className, + ...props +}) => { + return ; +}; + +export const DarkMode: React.FC> = ({ + className, + ...props +}) => { + return ; +}; diff --git a/docs/components/icons/InstallationIcon.tsx b/docs/components/icons/InstallationIcon.tsx new file mode 100644 index 0000000..031305c --- /dev/null +++ b/docs/components/icons/InstallationIcon.tsx @@ -0,0 +1,44 @@ +import { DarkMode, Gradient, LightMode } from "../icon"; + +export const InstallationIcon: React.FC<{ + id: string; + color: "blue" | "amber"; +}> = ({ id, color }) => { + return ( + <> + + + + + + + + + + + + + ); +}; diff --git a/docs/components/icons/LightbulbIcon.tsx b/docs/components/icons/LightbulbIcon.tsx new file mode 100644 index 0000000..ab421f0 --- /dev/null +++ b/docs/components/icons/LightbulbIcon.tsx @@ -0,0 +1,49 @@ +import { DarkMode, Gradient, LightMode } from "../icon"; + +export const LightbulbIcon: React.FC<{ + id: string; + color: "blue" | "amber"; +}> = ({ id, color }) => { + return ( + <> + + + + + + + + + + + + + + + ); +}; diff --git a/docs/components/icons/PluginsIcon.tsx b/docs/components/icons/PluginsIcon.tsx new file mode 100644 index 0000000..7bb87c0 --- /dev/null +++ b/docs/components/icons/PluginsIcon.tsx @@ -0,0 +1,66 @@ +import { DarkMode, Gradient, LightMode } from "../icon"; + +export const PluginsIcon: React.FC<{ + id: string; + color: "blue" | "amber"; +}> = ({ id, color }) => { + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/docs/components/icons/PresetsIcon.tsx b/docs/components/icons/PresetsIcon.tsx new file mode 100644 index 0000000..3113f0e --- /dev/null +++ b/docs/components/icons/PresetsIcon.tsx @@ -0,0 +1,46 @@ +import { DarkMode, Gradient, LightMode } from "../icon"; + +export const PresetsIcon: React.FC<{ + id: string; + color: "blue" | "amber"; +}> = ({ id, color }) => { + return ( + <> + + + + + + + + + + + + + + + + + + + ); +}; diff --git a/docs/components/icons/ThemingIcon.tsx b/docs/components/icons/ThemingIcon.tsx new file mode 100644 index 0000000..b953e3c --- /dev/null +++ b/docs/components/icons/ThemingIcon.tsx @@ -0,0 +1,62 @@ +import { DarkMode, Gradient, LightMode } from "../icon"; + +export const ThemingIcon: React.FC<{ + id: string; + color: "blue" | "amber"; +}> = ({ id, color }) => { + return ( + <> + + + + + + + + + + + + + + + + ); +}; diff --git a/docs/components/icons/WarningIcon.tsx b/docs/components/icons/WarningIcon.tsx new file mode 100644 index 0000000..e886700 --- /dev/null +++ b/docs/components/icons/WarningIcon.tsx @@ -0,0 +1,58 @@ +import { DarkMode, Gradient, LightMode } from "../icon"; + +export const WarningIcon: React.FC<{ + id: string; + color: "blue" | "amber"; +}> = ({ id, color }) => { + return ( + <> + + + + + + + + + + + + + + + ); +}; diff --git a/docs/components/landing.tsx b/docs/components/landing.tsx new file mode 100644 index 0000000..768e680 --- /dev/null +++ b/docs/components/landing.tsx @@ -0,0 +1,36 @@ +import { ArrowRightIcon } from "lucide-react"; +import Link from "next/link"; +import { ClipboardButton } from "./clipboard-button"; +import Logo from "./logo"; +import { Button } from "./ui/button"; + +export const Landing: React.FC = () => { + return ( +
+
+
+ +
+

+ The next generation of building APIs +

+
+

+ A code-first framework for GraphQL API development, where your + schema reflects your functionality. +

+
+
+
+ + + +
+
+ ); +}; diff --git a/docs/components/logo.tsx b/docs/components/logo.tsx new file mode 100644 index 0000000..5a6068d --- /dev/null +++ b/docs/components/logo.tsx @@ -0,0 +1,108 @@ +import { cn } from "@lib/utils"; + +const Logo: React.FC<{ className?: string }> = (props) => { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default Logo; diff --git a/docs/components/playground.tsx b/docs/components/playground.tsx new file mode 100644 index 0000000..7482425 --- /dev/null +++ b/docs/components/playground.tsx @@ -0,0 +1,16 @@ +export const Playground: React.FC = () => { + return ( +
+