Initial commit

This commit is contained in:
2023-08-28 13:12:21 +02:00
commit 52134c91ef
78 changed files with 13869 additions and 0 deletions

372
tina/config.tsx Normal file
View File

@@ -0,0 +1,372 @@
import { defineConfig } from "tinacms";
import { contentBlockSchema } from "../components/blocks/content";
import { featureBlockSchema } from "../components/blocks/features";
import { heroBlockSchema } from "../components/blocks/hero";
import { testimonialBlockSchema } from "../components/blocks/testimonial";
import { ColorPickerInput } from "./fields/color";
import { iconSchema } from "../components/util/icon";
const config = defineConfig({
clientId: process.env.NEXT_PUBLIC_TINA_CLIENT_ID!,
branch:
process.env.NEXT_PUBLIC_TINA_BRANCH! || // custom branch env override
process.env.NEXT_PUBLIC_VERCEL_GIT_COMMIT_REF! || // Vercel branch env
process.env.HEAD!, // Netlify branch env
token: process.env.TINA_TOKEN!,
media: {
// If you wanted cloudinary do this
// loadCustomStore: async () => {
// const pack = await import("next-tinacms-cloudinary");
// return pack.TinaCloudCloudinaryMediaStore;
// },
// this is the config for the tina cloud media store
tina: {
publicFolder: "public",
mediaRoot: "uploads",
},
},
build: {
publicFolder: "public", // The public asset folder for your framework
outputFolder: "admin", // within the public folder
},
schema: {
collections: [
{
label: "Blog Posts",
name: "post",
path: "content/posts",
format: "mdx",
ui: {
router: ({ document }) => {
return `/posts/${document._sys.filename}`;
},
},
fields: [
{
type: "string",
label: "Title",
name: "title",
isTitle: true,
required: true,
},
{
type: "image",
name: "heroImg",
label: "Hero Image",
},
{
type: "rich-text",
label: "Excerpt",
name: "excerpt",
},
{
type: "reference",
label: "Author",
name: "author",
collections: ["author"],
},
{
type: "datetime",
label: "Posted Date",
name: "date",
ui: {
dateFormat: "MMMM DD YYYY",
timeFormat: "hh:mm A",
},
},
{
type: "rich-text",
label: "Body",
name: "_body",
templates: [
{
name: "DateTime",
label: "Date & Time",
inline: true,
fields: [
{
name: "format",
label: "Format",
type: "string",
options: ["utc", "iso", "local"],
},
],
},
{
name: "BlockQuote",
label: "Block Quote",
fields: [
{
name: "children",
label: "Quote",
type: "rich-text",
},
{
name: "authorName",
label: "Author",
type: "string",
},
],
},
{
name: "NewsletterSignup",
label: "Newsletter Sign Up",
fields: [
{
name: "children",
label: "CTA",
type: "rich-text",
},
{
name: "placeholder",
label: "Placeholder",
type: "string",
},
{
name: "buttonText",
label: "Button Text",
type: "string",
},
{
name: "disclaimer",
label: "Disclaimer",
type: "rich-text",
},
],
ui: {
defaultItem: {
placeholder: "Enter your email",
buttonText: "Notify Me",
},
},
},
],
isBody: true,
},
],
},
{
label: "Global",
name: "global",
path: "content/global",
format: "json",
ui: {
global: true,
},
fields: [
{
type: "object",
label: "Header",
name: "header",
fields: [
iconSchema as any,
{
type: "string",
label: "Name",
name: "name",
},
{
type: "string",
label: "Color",
name: "color",
options: [
{ label: "Default", value: "default" },
{ label: "Primary", value: "primary" },
],
},
{
type: "object",
label: "Nav Links",
name: "nav",
list: true,
ui: {
itemProps: (item) => {
return { label: item?.label };
},
defaultItem: {
href: "home",
label: "Home",
},
},
fields: [
{
type: "string",
label: "Link",
name: "href",
},
{
type: "string",
label: "Label",
name: "label",
},
],
},
],
},
{
type: "object",
label: "Footer",
name: "footer",
fields: [
{
type: "string",
label: "Color",
name: "color",
options: [
{ label: "Default", value: "default" },
{ label: "Primary", value: "primary" },
],
},
{
type: "object",
label: "Social Links",
name: "social",
fields: [
{
type: "string",
label: "Facebook",
name: "facebook",
},
{
type: "string",
label: "Twitter",
name: "twitter",
},
{
type: "string",
label: "Instagram",
name: "instagram",
},
{
type: "string",
label: "Github",
name: "github",
},
],
},
],
},
{
type: "object",
label: "Theme",
name: "theme",
// @ts-ignore
fields: [
{
type: "string",
label: "Primary Color",
name: "color",
ui: {
component: ColorPickerInput,
},
},
{
type: "string",
name: "font",
label: "Font Family",
options: [
{
label: "System Sans",
value: "sans",
},
{
label: "Nunito",
value: "nunito",
},
{
label: "Lato",
value: "lato",
},
],
},
{
type: "string",
name: "darkMode",
label: "Dark Mode",
options: [
{
label: "System",
value: "system",
},
{
label: "Light",
value: "light",
},
{
label: "Dark",
value: "dark",
},
],
},
],
},
],
},
{
label: "Authors",
name: "author",
path: "content/authors",
format: "md",
fields: [
{
type: "string",
label: "Name",
name: "name",
isTitle: true,
required: true,
},
{
type: "image",
label: "Avatar",
name: "avatar",
},
],
},
{
label: "Pages",
name: "page",
path: "content/pages",
ui: {
router: ({ document }) => {
if (document._sys.filename === "home") {
return `/`;
}
if (document._sys.filename === "about") {
return `/about`;
}
return undefined;
},
},
fields: [
{
type: "string",
label: "Title",
name: "title",
description:
"The title of the page. This is used to display the title in the CMS",
isTitle: true,
required: true,
},
{
type: "object",
list: true,
name: "blocks",
label: "Sections",
ui: {
visualSelector: true,
},
templates: [
heroBlockSchema,
// @ts-ignore
featureBlockSchema,
contentBlockSchema,
testimonialBlockSchema,
],
},
],
},
],
},
});
export default config;