Aimpress_site/tina/config.ts
Vadym Samoilenko 09943e9f5e Re-enable visual editor preview for Site Content collections
Add router: () => '/' back to translationsEn and translationsUk collections
so TinaCloud shows the homepage preview alongside the editing form.
The EOF error that previously blocked this is fixed (TinaConnectedProvider
defers useTina calls until both queries are loaded).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 22:31:12 +00:00

538 lines
29 KiB
TypeScript

import { defineConfig, type TinaField } from "tinacms";
function stringField(name: string, label: string): TinaField {
return { name, label, type: "string" };
}
function textareaField(name: string, label: string): TinaField {
return { name, label, type: "string", ui: { component: "textarea" } };
}
function objectField(name: string, label: string, fields: TinaField[]): TinaField {
return {
name,
label,
type: "object",
ui: { allowedActions: { create: false, delete: false } },
fields,
};
}
// For pricing entries that have both a value (_) and sub-keys (price, split, desc, disc)
function pricingItemField(name: string, label: string, extraFields: TinaField[] = []): TinaField {
return objectField(name, label, [
stringField("_", "Name"),
...extraFields,
]);
}
function colorField(name: string, label: string): TinaField {
return { name, label, type: "string", ui: { component: "color", colorFormat: "hex" } as any };
}
function designFields(): TinaField[] {
return [
{
name: "design",
label: "Design Tokens",
type: "object",
ui: { allowedActions: { create: false, delete: false } } as any,
fields: [
colorField("colorPrimary", "Primary Color (Orange)"),
colorField("colorBackground", "Background Color (Dark)"),
colorField("colorAccent", "Accent Color (Teal)"),
colorField("colorYellow", "Yellow Accent"),
colorField("colorText", "Text Color"),
],
} as TinaField,
...translationFields(),
];
}
function translationFields(): TinaField[] {
return [
objectField("header", "Header", [
objectField("nav", "Navigation", [
stringField("home", "Home"),
stringField("about", "About"),
stringField("services", "Services"),
stringField("pricing", "Pricing"),
stringField("blog", "Blog"),
stringField("contacts", "Contacts"),
]),
objectField("lang", "Language Labels", [
stringField("en", "English"),
stringField("uk", "Ukrainian"),
]),
stringField("login", "Login Button"),
objectField("loginModal", "Login Modal", [
stringField("title", "Title"),
stringField("emailLabel", "Email Label"),
stringField("emailPlaceholder", "Email Placeholder"),
stringField("passwordLabel", "Password Label"),
stringField("passwordPlaceholder", "Password Placeholder"),
stringField("submit", "Submit Button"),
stringField("signupPrompt", "Signup Prompt"),
stringField("signupLink", "Signup Link"),
]),
]),
objectField("hero", "Hero Section", [
stringField("circle1", "Rotating Text 1"),
stringField("circle2", "Rotating Text 2"),
stringField("circle3", "Rotating Text 3"),
textareaField("title", "Headline"),
stringField("cta", "CTA Button"),
]),
objectField("benefits", "Benefits Section", [
objectField("card1", "Card 1", [
stringField("front", "Front"),
stringField("subtitle", "Subtitle"),
textareaField("back", "Back"),
]),
objectField("card2", "Card 2", [
stringField("front", "Front"),
stringField("subtitle", "Subtitle"),
textareaField("back", "Back"),
]),
objectField("card3", "Card 3", [
stringField("front", "Front"),
stringField("subtitle", "Subtitle"),
textareaField("back", "Back"),
]),
stringField("builtTitle", "Built Title"),
textareaField("builtDesc", "Built Description"),
objectField("static1", "Static 1", [stringField("title", "Title"), stringField("desc", "Desc")]),
objectField("static2", "Static 2", [stringField("title", "Title"), stringField("desc", "Desc")]),
objectField("static3", "Static 3", [stringField("title", "Title"), stringField("desc", "Desc")]),
objectField("static4", "Static 4", [stringField("title", "Title"), stringField("desc", "Desc")]),
]),
objectField("banner1", "Banner 1 (Quiz)", [
stringField("q1", "Question 1"),
stringField("q2", "Question 2"),
stringField("q3", "Question 3"),
stringField("cta", "CTA Button"),
]),
objectField("realResults", "Real Results Section", [
stringField("title", "Title"),
objectField("card1", "Card 1 — AutoBrat Garage", [
stringField("title", "Title"),
stringField("resultsLabel", "Results Label"),
textareaField("desc", "Description"),
stringField("stat1", "Stat 1"),
stringField("stat2", "Stat 2"),
stringField("stat3", "Stat 3"),
]),
objectField("card2", "Card 2 — Cotswolld Honey", [
stringField("title", "Title"),
textareaField("desc", "Description"),
stringField("stat1", "Stat 1"),
stringField("stat2", "Stat 2"),
]),
objectField("card3", "Card 3 — Wcounting", [
stringField("title", "Title"),
textareaField("desc", "Description"),
stringField("stat1", "Stat 1"),
stringField("stat2", "Stat 2"),
]),
]),
objectField("timeline", "Timeline Section", [
stringField("title", "Title"),
objectField("step1", "Step 1", [stringField("title", "Title"), stringField("duration", "Duration"), textareaField("short", "Short"), textareaField("detail", "Detail")]),
objectField("step2", "Step 2", [stringField("title", "Title"), stringField("duration", "Duration"), textareaField("short", "Short"), textareaField("detail", "Detail")]),
objectField("step3", "Step 3", [stringField("title", "Title"), stringField("duration", "Duration"), textareaField("short", "Short"), textareaField("detail", "Detail")]),
objectField("step4", "Step 4", [stringField("title", "Title"), stringField("duration", "Duration"), textareaField("short", "Short"), textareaField("detail", "Detail")]),
objectField("step5", "Step 5", [stringField("title", "Title"), stringField("duration", "Duration"), textareaField("short", "Short"), textareaField("detail", "Detail")]),
]),
objectField("banner2", "Banner 2", [
stringField("cta", "CTA Button"),
]),
objectField("comparison", "Comparison Table", [
stringField("title", "Title"),
stringField("aiLabel", "AI Label"),
objectField("metric1", "Metric 1 — Cost", [stringField("label", "Label"), stringField("ai", "AI"), stringField("agency", "Agency"), stringField("inhouse", "In-House")]),
objectField("metric2", "Metric 2 — Speed", [stringField("label", "Label"), stringField("ai", "AI"), stringField("agency", "Agency"), stringField("inhouse", "In-House")]),
objectField("metric3", "Metric 3 — Availability", [stringField("label", "Label"), stringField("ai", "AI"), stringField("agency", "Agency"), stringField("inhouse", "In-House")]),
objectField("metric4", "Metric 4 — Scalability", [stringField("label", "Label"), stringField("ai", "AI"), stringField("agency", "Agency"), stringField("inhouse", "In-House")]),
stringField("altHeading", "Alternatives Heading"),
stringField("alt1", "Alternative 1"),
stringField("alt2", "Alternative 2"),
textareaField("footer", "Footer Text"),
stringField("cta", "CTA Button"),
]),
objectField("blogSection", "Blog Section (Homepage)", [
stringField("title", "Title"),
stringField("readMore", "Read More Link"),
stringField("viewAll", "View All Link"),
]),
objectField("resources", "Resources Section", [
stringField("title", "Title"),
]),
objectField("contactSection", "Contact Section", [
stringField("title", "Title"),
textareaField("subtitle", "Subtitle"),
]),
objectField("contactForm", "Contact Form", [
stringField("title", "Title"),
stringField("fullName", "Full Name Label"),
stringField("fullNamePlaceholder", "Full Name Placeholder"),
stringField("jobTitle", "Job Title Label"),
stringField("jobTitlePlaceholder", "Job Title Placeholder"),
stringField("email", "Email Label"),
stringField("emailPlaceholder", "Email Placeholder"),
stringField("need", "Need Label"),
stringField("needPlaceholder", "Need Placeholder"),
stringField("company", "Company Label"),
stringField("companyPlaceholder", "Company Placeholder"),
stringField("phone", "Phone Label"),
stringField("phonePlaceholder", "Phone Placeholder"),
stringField("submit", "Submit Button"),
stringField("sending", "Sending State"),
stringField("error", "Error Message"),
stringField("successTitle", "Success Title"),
textareaField("successText", "Success Text"),
stringField("sendAnother", "Send Another Button"),
]),
objectField("footer", "Footer", [
stringField("privacy", "Privacy Link"),
stringField("terms", "Terms Link"),
stringField("copyright", "Copyright"),
]),
objectField("cookie", "Cookie Consent", [
textareaField("text", "Cookie Text"),
stringField("privacyLink", "Privacy Link Text"),
stringField("reject", "Reject Button"),
stringField("accept", "Accept Button"),
]),
objectField("chat", "Chat Widget", [
stringField("greeting", "Greeting"),
stringField("openChat", "Open Chat"),
stringField("headerTitle", "Header Title"),
stringField("status", "Status"),
stringField("clearChat", "Clear Chat"),
stringField("closeChat", "Close Chat"),
textareaField("welcome", "Welcome Message"),
objectField("lead", "Lead Form", [
stringField("title", "Title"),
stringField("subtitle", "Subtitle"),
textareaField("intro", "Intro"),
stringField("namePlaceholder", "Name Placeholder"),
stringField("nameError", "Name Error"),
stringField("emailPlaceholder", "Email Placeholder"),
stringField("emailError", "Email Error"),
stringField("emailInvalid", "Email Invalid"),
stringField("companyPlaceholder", "Company Placeholder"),
textareaField("consent", "Consent Text"),
stringField("privacyLink", "Privacy Link Text"),
stringField("consentError", "Consent Error"),
stringField("submit", "Submit Button"),
]),
stringField("inputPlaceholder", "Input Placeholder"),
stringField("send", "Send Button"),
]),
objectField("quoteForm", "Quote Form", [
stringField("title", "Title"),
stringField("fullName", "Full Name Label"),
stringField("fullNamePlaceholder", "Full Name Placeholder"),
stringField("jobTitle", "Job Title Label"),
stringField("jobTitlePlaceholder", "Job Title Placeholder"),
stringField("email", "Email Label"),
stringField("emailPlaceholder", "Email Placeholder"),
stringField("phone", "Phone Label"),
stringField("phonePlaceholder", "Phone Placeholder"),
stringField("company", "Company Label"),
stringField("companyPlaceholder", "Company Placeholder"),
stringField("service", "Service Label"),
stringField("serviceDefault", "Service Default"),
stringField("service1", "Service 1"),
stringField("service2", "Service 2"),
stringField("service3", "Service 3"),
stringField("service4", "Service 4"),
stringField("service5", "Service 5"),
stringField("service6", "Service 6"),
stringField("service7", "Service 7"),
stringField("service8", "Service 8"),
stringField("service9", "Service 9"),
stringField("description", "Description Label"),
textareaField("descriptionPlaceholder", "Description Placeholder"),
stringField("submit", "Submit Button"),
stringField("sending", "Sending State"),
stringField("error", "Error Message"),
stringField("successTitle", "Success Title"),
textareaField("successText", "Success Text"),
stringField("sendAnother", "Send Another Button"),
]),
objectField("about", "About Page", [
objectField("hero", "Hero", [stringField("title", "Title"), textareaField("subtitle", "Subtitle")]),
objectField("story", "Our Story", [
stringField("title", "Title"),
textareaField("p1", "Paragraph 1"),
textareaField("p2", "Paragraph 2"),
textareaField("p3", "Paragraph 3"),
]),
objectField("diff", "What Makes Us Different", [stringField("title", "Title")]),
objectField("diff1", "Differentiator 1", [stringField("title", "Title"), textareaField("desc", "Description")]),
objectField("diff2", "Differentiator 2", [stringField("title", "Title"), textareaField("desc", "Description")]),
objectField("diff3", "Differentiator 3", [stringField("title", "Title"), textareaField("desc", "Description")]),
objectField("diff4", "Differentiator 4", [stringField("title", "Title"), textareaField("desc", "Description")]),
objectField("values", "Values", [stringField("title", "Title")]),
objectField("val1", "Value 1", [stringField("name", "Name"), stringField("desc", "Description")]),
objectField("val2", "Value 2", [stringField("name", "Name"), stringField("desc", "Description")]),
objectField("val3", "Value 3", [stringField("name", "Name"), stringField("desc", "Description")]),
objectField("val4", "Value 4", [stringField("name", "Name"), stringField("desc", "Description")]),
objectField("val5", "Value 5", [stringField("name", "Name"), stringField("desc", "Description")]),
objectField("founder", "Founder", [
stringField("title", "Section Title"),
stringField("name", "Name"),
stringField("role", "Role"),
stringField("bgLabel", "Background Label"),
textareaField("bgText", "Background Text"),
stringField("certLabel", "Certifications Label"),
textareaField("certText", "Certifications Text"),
stringField("analyticsLabel", "Analytics Label"),
textareaField("analyticsText", "Analytics Text"),
stringField("eduLabel", "Education Label"),
textareaField("eduText", "Education Text"),
stringField("visionLabel", "Vision Label"),
textareaField("visionText", "Vision Text"),
]),
objectField("industries", "Industries", [stringField("title", "Title")]),
objectField("ind1", "Industry 1", [stringField("name", "Name"), stringField("desc", "Description")]),
objectField("ind2", "Industry 2", [stringField("name", "Name"), stringField("desc", "Description")]),
objectField("ind3", "Industry 3", [stringField("name", "Name"), stringField("desc", "Description")]),
objectField("ind4", "Industry 4", [stringField("name", "Name"), stringField("desc", "Description")]),
objectField("ind5", "Industry 5", [stringField("name", "Name"), stringField("desc", "Description")]),
objectField("ind6", "Industry 6", [stringField("name", "Name"), stringField("desc", "Description")]),
objectField("ind7", "Industry 7", [stringField("name", "Name"), stringField("desc", "Description")]),
objectField("cta", "CTA", [stringField("title", "Title"), textareaField("subtitle", "Subtitle"), stringField("button", "Button")]),
]),
objectField("services", "Services Page", [
objectField("hero", "Hero", [stringField("title", "Title"), textareaField("subtitle", "Subtitle")]),
objectField("s1", "Service 1 — AI Chatbots", [stringField("title", "Title"), stringField("price", "Price"), textareaField("purpose", "Purpose"), stringField("f1", "F1"), stringField("f2", "F2"), stringField("f3", "F3"), stringField("f4", "F4"), stringField("f5", "F5"), stringField("f6", "F6")]),
objectField("s2", "Service 2 — Website Dev", [stringField("title", "Title"), stringField("price", "Price"), textareaField("purpose", "Purpose"), stringField("f1", "F1"), stringField("f2", "F2"), stringField("f3", "F3"), stringField("f4", "F4"), stringField("f5", "F5"), stringField("f6", "F6")]),
objectField("s3", "Service 3 — Workflow Automation", [stringField("title", "Title"), stringField("price", "Price"), textareaField("purpose", "Purpose"), stringField("f1", "F1"), stringField("f2", "F2"), stringField("f3", "F3"), stringField("f4", "F4"), stringField("f5", "F5")]),
objectField("s4", "Service 4 — System Integration", [stringField("title", "Title"), stringField("price", "Price"), textareaField("purpose", "Purpose"), stringField("f1", "F1"), stringField("f2", "F2"), stringField("f3", "F3"), stringField("f4", "F4"), stringField("f5", "F5")]),
objectField("s5", "Service 5 — CRM", [stringField("title", "Title"), stringField("price", "Price"), textareaField("purpose", "Purpose"), stringField("f1", "F1"), stringField("f2", "F2"), stringField("f3", "F3"), stringField("f4", "F4"), stringField("f5", "F5")]),
objectField("s6", "Service 6 — Marketing Automation", [stringField("title", "Title"), stringField("price", "Price"), textareaField("purpose", "Purpose"), stringField("f1", "F1"), stringField("f2", "F2"), stringField("f3", "F3"), stringField("f4", "F4"), stringField("f5", "F5")]),
objectField("s7", "Service 7 — AI Integration", [stringField("title", "Title"), stringField("price", "Price"), textareaField("purpose", "Purpose"), stringField("f1", "F1"), stringField("f2", "F2"), stringField("f3", "F3"), stringField("f4", "F4"), stringField("f5", "F5")]),
objectField("s8", "Service 8 — Infrastructure", [stringField("title", "Title"), stringField("price", "Price"), textareaField("purpose", "Purpose"), stringField("f1", "F1"), stringField("f2", "F2"), stringField("f3", "F3"), stringField("f4", "F4"), stringField("f5", "F5")]),
stringField("popular", "Popular Badge"),
stringField("whatsIncluded", "What's Included"),
stringField("showLess", "Show Less"),
objectField("assurance", "Assurance Pack", [
stringField("title", "Title"),
stringField("subtitle", "Subtitle"),
stringField("i1", "Item 1"), stringField("i2", "Item 2"), stringField("i3", "Item 3"),
stringField("i4", "Item 4"), stringField("i5", "Item 5"), stringField("i6", "Item 6"),
stringField("i7", "Item 7"), stringField("i8", "Item 8"), stringField("i9", "Item 9"),
]),
objectField("metrics", "Metrics", [
stringField("title", "Title"),
stringField("v1", "Value 1"), stringField("l1", "Label 1"),
stringField("v2", "Value 2"), stringField("l2", "Label 2"),
stringField("v3", "Value 3"), stringField("l3", "Label 3"),
stringField("v4", "Value 4"), stringField("l4", "Label 4"),
]),
objectField("selector", "Service Selector", [
stringField("title", "Title"),
stringField("step1", "Step 1"), stringField("step2", "Step 2"), stringField("step3", "Step 3"),
stringField("goalQ", "Goal Question"),
stringField("goal1", "Goal 1"), stringField("goal2", "Goal 2"), stringField("goal3", "Goal 3"),
stringField("goal4", "Goal 4"), stringField("goal5", "Goal 5"),
stringField("budgetQ", "Budget Question"),
stringField("budget1", "Budget 1"), stringField("budget2", "Budget 2"), stringField("budget3", "Budget 3"),
stringField("resultsHeading", "Results Heading"),
textareaField("noMatch", "No Match"),
stringField("viewButton", "View Button"), stringField("resetButton", "Reset Button"), stringField("backButton", "Back Button"),
]),
objectField("bundles", "Bundles", [stringField("title", "Title")]),
objectField("bundle1", "Bundle 1 — Starter", [stringField("name", "Name"), stringField("tagline", "Tagline"), stringField("price", "Price")]),
objectField("bundle2", "Bundle 2 — Growth", [stringField("name", "Name"), stringField("tagline", "Tagline"), stringField("price", "Price"), stringField("badge", "Badge")]),
objectField("bundle3", "Bundle 3 — Full Stack", [stringField("name", "Name"), stringField("tagline", "Tagline"), stringField("price", "Price")]),
objectField("bundle", "Bundle CTA", [stringField("cta", "CTA Button")]),
objectField("cta", "Bottom CTA", [stringField("title", "Title"), textareaField("subtitle", "Subtitle"), stringField("button", "Button")]),
]),
objectField("pricing", "Pricing Page", [
objectField("hero", "Hero", [stringField("title", "Title"), textareaField("subtitle", "Subtitle")]),
objectField("impl", "Implementation Pricing", [
stringField("title", "Section Title"),
pricingItemField("s1", "Service 1", [stringField("price", "Price")]),
pricingItemField("s2", "Service 2", [stringField("price", "Price")]),
pricingItemField("s3", "Service 3", [stringField("price", "Price")]),
pricingItemField("s4", "Service 4", [stringField("price", "Price")]),
pricingItemField("s5", "Service 5", [stringField("price", "Price")]),
pricingItemField("s6", "Service 6", [stringField("price", "Price")]),
pricingItemField("s7", "Service 7", [stringField("price", "Price")]),
pricingItemField("s8", "Service 8", [stringField("price", "Price")]),
]),
stringField("popular", "Popular Badge"),
objectField("retainers", "Retainers", [stringField("title", "Title")]),
objectField("ret1", "Retainer — Essential", [
stringField("name", "Name"), stringField("price", "Price"), stringField("period", "Period"),
stringField("hours", "Hours"), stringField("sla", "SLA"),
stringField("f1", "F1"), stringField("f2", "F2"), stringField("f3", "F3"), stringField("f4", "F4"), stringField("f5", "F5"),
]),
objectField("ret2", "Retainer — Professional", [
stringField("name", "Name"), stringField("price", "Price"), stringField("hours", "Hours"), stringField("sla", "SLA"), stringField("badge", "Badge"),
stringField("f1", "F1"), stringField("f2", "F2"), stringField("f3", "F3"), stringField("f4", "F4"), stringField("f5", "F5"), stringField("f6", "F6"),
]),
objectField("ret3", "Retainer — Enterprise", [
stringField("name", "Name"), stringField("price", "Price"), stringField("hours", "Hours"), stringField("sla", "SLA"),
stringField("f1", "F1"), stringField("f2", "F2"), stringField("f3", "F3"), stringField("f4", "F4"), stringField("f5", "F5"), stringField("f6", "F6"), stringField("f7", "F7"),
]),
objectField("training", "Training & Workshops", [
stringField("title", "Title"),
pricingItemField("t1", "Training 1", [stringField("price", "Price"), stringField("desc", "Desc")]),
pricingItemField("t2", "Training 2", [stringField("price", "Price")]),
pricingItemField("t3", "Training 3", [stringField("price", "Price"), stringField("desc", "Desc")]),
pricingItemField("t4", "Training 4", [stringField("price", "Price"), stringField("desc", "Desc")]),
]),
objectField("payment", "Payment Terms", [
stringField("title", "Title"),
pricingItemField("r1", "Range 1", [stringField("split", "Split")]),
pricingItemField("r2", "Range 2", [stringField("split", "Split")]),
pricingItemField("r3", "Range 3", [stringField("split", "Split")]),
pricingItemField("r4", "Range 4 (Public Sector)", [stringField("split", "Split")]),
]),
objectField("discounts", "Discounts / Impact Grant", [
stringField("title", "Title"),
textareaField("intro", "Intro"),
pricingItemField("g1", "Group 1", [stringField("disc", "Discount")]),
stringField("g2", "Group 2"),
stringField("g3", "Group 3"),
pricingItemField("g4", "Group 4", [stringField("disc", "Discount")]),
stringField("g5", "Group 5"),
]),
objectField("compare", "Comparison Table", [
stringField("title", "Title"),
stringField("aimpress", "AImpress Label"), stringField("agency", "Agency Label"), stringField("inhouse", "In-House Label"),
objectField("r1", "Row 1", [stringField("metric", "Metric"), stringField("ai", "AI"), stringField("agency", "Agency"), stringField("inhouse", "In-House")]),
objectField("r2", "Row 2", [stringField("metric", "Metric"), stringField("ai", "AI"), stringField("agency", "Agency"), stringField("inhouse", "In-House")]),
objectField("r3", "Row 3", [stringField("metric", "Metric"), stringField("ai", "AI"), stringField("agency", "Agency"), stringField("inhouse", "In-House")]),
objectField("r4", "Row 4", [stringField("metric", "Metric"), stringField("ai", "AI"), stringField("agency", "Agency"), stringField("inhouse", "In-House")]),
objectField("r5", "Row 5", [stringField("metric", "Metric"), stringField("ai", "AI"), stringField("agency", "Agency")]),
objectField("r6", "Row 6", [stringField("metric", "Metric"), stringField("ai", "AI"), stringField("agency", "Agency"), stringField("inhouse", "In-House")]),
]),
objectField("faq", "FAQ", [
stringField("title", "Title"),
stringField("q1", "Q1"), textareaField("a1", "A1"),
stringField("q2", "Q2"), textareaField("a2", "A2"),
stringField("q3", "Q3"), textareaField("a3", "A3"),
stringField("q4", "Q4"), textareaField("a4", "A4"),
stringField("q5", "Q5"), textareaField("a5", "A5"),
stringField("q6", "Q6"), textareaField("a6", "A6"),
]),
objectField("cta", "Bottom CTA", [stringField("title", "Title"), textareaField("subtitle", "Subtitle")]),
]),
objectField("blog", "Blog Page", [
stringField("title", "Title"),
stringField("loading", "Loading"),
stringField("noPosts", "No Posts"),
stringField("readMore", "Read More"),
]),
objectField("blogPost", "Blog Post Page", [
stringField("back", "Back Link"),
stringField("notFound", "Not Found"),
stringField("loading", "Loading"),
stringField("source", "Source Label"),
]),
objectField("seo", "SEO Meta Tags", [
objectField("home", "Home Page", [stringField("title", "Title"), textareaField("description", "Description")]),
objectField("about", "About Page", [stringField("title", "Title"), textareaField("description", "Description")]),
objectField("services", "Services Page", [stringField("title", "Title"), textareaField("description", "Description")]),
objectField("pricing", "Pricing Page", [stringField("title", "Title"), textareaField("description", "Description")]),
objectField("blog", "Blog Page", [stringField("title", "Title"), textareaField("description", "Description")]),
stringField("siteName", "Site Name"),
]),
];
}
export default defineConfig({
branch: process.env.GITHUB_REF_NAME ?? "main",
clientId: process.env.TINA_PUBLIC_CLIENT_ID!,
token: process.env.TINA_TOKEN!,
build: {
outputFolder: "admin",
publicFolder: "public",
},
media: {
tina: {
mediaRoot: "",
publicFolder: "public",
},
},
search: {
tina: {
indexerToken: "49c8a879a1b8028c7f720c5d497c0bbab9ea69f6",
stopwordLanguages: ["eng"],
},
indexBatchSize: 100,
maxSearchIndexFieldLength: 100,
},
schema: {
collections: [
{
name: "translationsEn",
label: "Site Content (English)",
path: "content/translations",
match: { include: "en" },
format: "json",
ui: {
allowedActions: { create: false, delete: false },
global: true,
router: () => "/",
},
fields: designFields(),
},
{
name: "translationsUk",
label: "Site Content (Ukrainian)",
path: "content/translations",
match: { include: "uk" },
format: "json",
ui: {
allowedActions: { create: false, delete: false },
global: true,
router: () => "/",
},
fields: translationFields(),
},
{
name: "blogPost",
label: "Blog Posts",
path: "content/blog",
format: "md",
ui: {
router: ({ document }: { document: { _sys: { filename: string } } }) =>
`/blog/${document._sys.filename}`,
filename: {
readonly: false,
slugify: (values: Record<string, unknown>) => {
const title = values.title as string | undefined;
return title
? title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '').slice(0, 80)
: 'new-post';
},
},
beforeSubmit: async ({ values }: { values: Record<string, unknown> }) => ({
...values,
date: (values.date as string | undefined) ?? new Date().toISOString(),
}),
},
fields: [
{ name: "title", type: "string", label: "Title", required: true, isTitle: true },
{ name: "date", type: "datetime", label: "Date", required: true },
{ name: "excerpt", type: "string", label: "Excerpt", ui: { component: "textarea" } },
{ name: "coverImage", type: "image", label: "Cover Image" },
{ name: "hashtags", type: "string", label: "Tags", list: true },
{ name: "sourceTitle", type: "string", label: "Source Name" },
{ name: "sourceUrl", type: "string", label: "Source URL" },
{ name: "body", type: "rich-text", label: "Body", isBody: true },
],
},
],
},
});