From 885b89e528163346b2303235b360d906598be70b Mon Sep 17 00:00:00 2001 From: Jeoffrey Fischer Date: Thu, 21 Aug 2025 16:04:36 +0200 Subject: [PATCH 01/16] Added footer "Powered by TinaCMS" --- src/components/docs/footer.tsx | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/components/docs/footer.tsx diff --git a/src/components/docs/footer.tsx b/src/components/docs/footer.tsx new file mode 100644 index 00000000..9f013131 --- /dev/null +++ b/src/components/docs/footer.tsx @@ -0,0 +1,45 @@ +import Link from "next/link"; +import Image from "next/image"; +import { ThemeSelector } from "@/components/ui/theme-selector"; + +export const DocsFooter = () => { + return ( + + ); +}; From dc196a2253db8753b5f39750e7cc354049aad03b Mon Sep 17 00:00:00 2001 From: Jeoffrey Fischer Date: Thu, 21 Aug 2025 16:05:07 +0200 Subject: [PATCH 02/16] Apply footer --- src/components/docs/layout/tab-layout.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/docs/layout/tab-layout.tsx b/src/components/docs/layout/tab-layout.tsx index 8147f96d..500bed2c 100644 --- a/src/components/docs/layout/tab-layout.tsx +++ b/src/components/docs/layout/tab-layout.tsx @@ -10,6 +10,7 @@ import { NavigationProvider } from "./navigation-context"; import { Sidebar } from "./sidebar"; import { TopNav } from "./top-nav"; import { findTabWithPath } from "./utils"; +import { DocsFooter } from "../footer"; export const TabsLayout = ({ props: { children }, @@ -83,6 +84,7 @@ export const TabsLayout = ({ /> + ); From 324d982e588869190cac53e2eeb0a208f900ec88 Mon Sep 17 00:00:00 2001 From: Jeoffrey Fischer Date: Thu, 21 Aug 2025 16:05:37 +0200 Subject: [PATCH 03/16] remove theme selector as it is now part of footer --- src/app/layout.tsx | 2 -- src/components/ui/theme-selector.tsx | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 9757f6f2..846b4e4a 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,7 +1,6 @@ import "@/styles/global.css"; import AdminLink from "@/components/ui/admin-link"; import { TailwindIndicator } from "@/components/ui/tailwind-indicator"; -import { ThemeSelector } from "@/components/ui/theme-selector"; import settings from "@/content/settings/config.json"; import client from "@/tina/__generated__/client"; import { ThemeProvider } from "next-themes"; @@ -44,7 +43,6 @@ export default function RootLayout({ enableSystem={true} disableTransitionOnChange={false} > - {isThemeSelectorEnabled && } {children} diff --git a/src/components/ui/theme-selector.tsx b/src/components/ui/theme-selector.tsx index 94f76a11..5a032940 100644 --- a/src/components/ui/theme-selector.tsx +++ b/src/components/ui/theme-selector.tsx @@ -91,7 +91,7 @@ export const ThemeSelector = () => { }; return ( -
+
From c69f533fdd1a9979fd1c07d6af9f3b8a1980b55e Mon Sep 17 00:00:00 2001 From: "Jeoffrey Fischer [SSW]" <106663901+jeoffreyfischer@users.noreply.github.com> Date: Mon, 17 Nov 2025 15:20:14 +1100 Subject: [PATCH 04/16] Fixed lint issues --- src/components/docs/footer.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/docs/footer.tsx b/src/components/docs/footer.tsx index 9f013131..16689f26 100644 --- a/src/components/docs/footer.tsx +++ b/src/components/docs/footer.tsx @@ -1,6 +1,6 @@ -import Link from "next/link"; -import Image from "next/image"; import { ThemeSelector } from "@/components/ui/theme-selector"; +import Image from "next/image"; +import Link from "next/link"; export const DocsFooter = () => { return ( @@ -8,7 +8,7 @@ export const DocsFooter = () => {
{/* Left: Empty space for balance */}
- + {/* Center: Powered by TinaCMS */}
Date: Mon, 17 Nov 2025 15:38:49 +1100 Subject: [PATCH 05/16] Fixed lint issue in footer --- src/components/docs/footer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/docs/footer.tsx b/src/components/docs/footer.tsx index 16689f26..87e26f45 100644 --- a/src/components/docs/footer.tsx +++ b/src/components/docs/footer.tsx @@ -29,7 +29,7 @@ export const DocsFooter = () => {
- + {/* Right: Theme Selector */}
From 0ea36c70b036cb1bd26fe9b2327f88d65d0dab73 Mon Sep 17 00:00:00 2001 From: "Jeoffrey Fischer [SSW]" <106663901+jeoffreyfischer@users.noreply.github.com> Date: Mon, 17 Nov 2025 15:39:43 +1100 Subject: [PATCH 06/16] Fixed lint issue in tab-layout --- src/components/docs/layout/tab-layout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/docs/layout/tab-layout.tsx b/src/components/docs/layout/tab-layout.tsx index 500bed2c..450decc3 100644 --- a/src/components/docs/layout/tab-layout.tsx +++ b/src/components/docs/layout/tab-layout.tsx @@ -5,12 +5,12 @@ import type { NavigationBarData } from "@/src/utils/docs/navigation/documentNavi import * as Tabs from "@radix-ui/react-tabs"; import { usePathname } from "next/navigation"; import React from "react"; +import { DocsFooter } from "../footer"; import { Body } from "./body"; import { NavigationProvider } from "./navigation-context"; import { Sidebar } from "./sidebar"; import { TopNav } from "./top-nav"; import { findTabWithPath } from "./utils"; -import { DocsFooter } from "../footer"; export const TabsLayout = ({ props: { children }, From 3bdfe5063989d89d7ddbccdaa3d60bd1da697c35 Mon Sep 17 00:00:00 2001 From: Jeoffrey Fischer Date: Mon, 17 Nov 2025 15:56:21 +1100 Subject: [PATCH 07/16] Fix Pagefind test: use page origin for URLs, add fallback paths --- tests/e2e/utils/search-helpers.ts | 67 +++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/tests/e2e/utils/search-helpers.ts b/tests/e2e/utils/search-helpers.ts index 9c7b339e..969775f9 100644 --- a/tests/e2e/utils/search-helpers.ts +++ b/tests/e2e/utils/search-helpers.ts @@ -116,28 +116,51 @@ export class SearchHelper { * Verify Pagefind files are accessible */ async verifyPagefindFilesAccessible() { - const isDev = this.page.url().includes("localhost"); - - // Check Pagefind JavaScript file - const pagefindJsResponse = await this.page.request.get( - isDev - ? "http://localhost:3000/pagefind/pagefind.js" - : `${process.env.BASE_URL}${ - process.env.NEXT_PUBLIC_BASE_PATH ?? "" - }/_next/static/pagefind/pagefind.js` - ); - expect(pagefindJsResponse.status()).toBe(200); - - // Check Pagefind index file - const pagefindIndexResponse = await this.page.request.get( - isDev - ? "http://localhost:3000/pagefind/pagefind-ui.js" - : `${process.env.BASE_URL}${ - process.env.NEXT_PUBLIC_BASE_PATH ?? "" - }/_next/static/pagefind/pagefind-ui.js` - ); - - expect(pagefindIndexResponse.status()).toBe(200); + // Determine if we're in dev mode by checking BASE_URL or page origin + const baseUrl = process.env.BASE_URL || "http://localhost:3000"; + const isDev = baseUrl.includes("localhost") || this.page.url().includes("localhost"); + const pageOrigin = new URL(this.page.url()).origin; + const basePath = process.env.NEXT_PUBLIC_BASE_PATH ?? ""; + + // Construct paths based on environment + // Try production path first if not in dev, fallback to dev path if needed + const pagefindJsPaths = isDev + ? [`${pageOrigin}/pagefind/pagefind.js`] + : [ + `${pageOrigin}${basePath}/_next/static/pagefind/pagefind.js`, + `${pageOrigin}/pagefind/pagefind.js`, // Fallback to dev path + ]; + + const pagefindUiPaths = isDev + ? [`${pageOrigin}/pagefind/pagefind-ui.js`] + : [ + `${pageOrigin}${basePath}/_next/static/pagefind/pagefind-ui.js`, + `${pageOrigin}/pagefind/pagefind-ui.js`, // Fallback to dev path + ]; + + // Check Pagefind JavaScript file - try each path until one works + let pagefindJsResponse; + let pagefindJsFound = false; + for (const path of pagefindJsPaths) { + pagefindJsResponse = await this.page.request.get(path); + if (pagefindJsResponse.status() === 200) { + pagefindJsFound = true; + break; + } + } + expect(pagefindJsFound, `Pagefind JS file not found at any of: ${pagefindJsPaths.join(", ")}`).toBe(true); + + // Check Pagefind UI file - try each path until one works + let pagefindUiResponse; + let pagefindUiFound = false; + for (const path of pagefindUiPaths) { + pagefindUiResponse = await this.page.request.get(path); + if (pagefindUiResponse.status() === 200) { + pagefindUiFound = true; + break; + } + } + expect(pagefindUiFound, `Pagefind UI file not found at any of: ${pagefindUiPaths.join(", ")}`).toBe(true); } /** From 3f257f8143cc729ca89b4a31ad6bb782d182829a Mon Sep 17 00:00:00 2001 From: Jeoffrey Fischer Date: Mon, 17 Nov 2025 16:32:06 +1100 Subject: [PATCH 08/16] test handles preview deploy where Pagefind files might not be avail --- tests/e2e/utils/search-helpers.ts | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/tests/e2e/utils/search-helpers.ts b/tests/e2e/utils/search-helpers.ts index 969775f9..4d4e30e9 100644 --- a/tests/e2e/utils/search-helpers.ts +++ b/tests/e2e/utils/search-helpers.ts @@ -2,7 +2,7 @@ import type { Page } from "@playwright/test"; import { expect } from "@playwright/test"; export class SearchHelper { - constructor(private page: Page) {} + constructor(private page: Page) { } /** * Navigate to the docs page and wait for it to load @@ -122,21 +122,31 @@ export class SearchHelper { const pageOrigin = new URL(this.page.url()).origin; const basePath = process.env.NEXT_PUBLIC_BASE_PATH ?? ""; + // Skip on preview deployments where Pagefind files may not be generated + const isPreview = pageOrigin.includes("vercel.app") && + !pageOrigin.includes("tina-docs-red.vercel.app"); + if (isPreview) { + // On preview deployments, just verify search functionality works instead + await this.performSearch("test"); + await this.expectSearchResultsVisible(); + return; + } + // Construct paths based on environment // Try production path first if not in dev, fallback to dev path if needed const pagefindJsPaths = isDev ? [`${pageOrigin}/pagefind/pagefind.js`] : [ - `${pageOrigin}${basePath}/_next/static/pagefind/pagefind.js`, - `${pageOrigin}/pagefind/pagefind.js`, // Fallback to dev path - ]; - + `${pageOrigin}${basePath}/_next/static/pagefind/pagefind.js`, + `${pageOrigin}/pagefind/pagefind.js`, // Fallback to dev path + ]; + const pagefindUiPaths = isDev ? [`${pageOrigin}/pagefind/pagefind-ui.js`] : [ - `${pageOrigin}${basePath}/_next/static/pagefind/pagefind-ui.js`, - `${pageOrigin}/pagefind/pagefind-ui.js`, // Fallback to dev path - ]; + `${pageOrigin}${basePath}/_next/static/pagefind/pagefind-ui.js`, + `${pageOrigin}/pagefind/pagefind-ui.js`, // Fallback to dev path + ]; // Check Pagefind JavaScript file - try each path until one works let pagefindJsResponse; From 906ee7110de6ea64a0575fdd16d10dbd64bf87fd Mon Sep 17 00:00:00 2001 From: Jeoffrey Fischer Date: Mon, 17 Nov 2025 17:04:43 +1100 Subject: [PATCH 09/16] Simplified div struct as per Josh comment --- src/components/docs/footer.tsx | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/components/docs/footer.tsx b/src/components/docs/footer.tsx index 87e26f45..a3b847e2 100644 --- a/src/components/docs/footer.tsx +++ b/src/components/docs/footer.tsx @@ -5,12 +5,8 @@ import Link from "next/link"; export const DocsFooter = () => { return (
-
- {/* Left: Empty space for balance */} -
+
- {/* Center: Powered by TinaCMS */} -
{ Powered by TinaCMS -
- {/* Right: Theme Selector */} -
-
+
{(process.env.NODE_ENV === "development" || process.env.NEXT_PUBLIC_ENABLE_THEME_SELECTION === "true") && ( )}
-
); }; From 190a30013427d04205539702c5a612ecfd1fbdbf Mon Sep 17 00:00:00 2001 From: Jeoffrey Fischer Date: Wed, 19 Nov 2025 16:46:01 +1100 Subject: [PATCH 10/16] Fixed lint errors --- src/components/docs/footer.tsx | 50 ++++++++++++++++------------------ 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/components/docs/footer.tsx b/src/components/docs/footer.tsx index a3b847e2..e6be2051 100644 --- a/src/components/docs/footer.tsx +++ b/src/components/docs/footer.tsx @@ -5,33 +5,31 @@ import Link from "next/link"; export const DocsFooter = () => { return (
-
- - - Tina Logo - - Powered by TinaCMS - - - -
- {(process.env.NODE_ENV === "development" || - process.env.NEXT_PUBLIC_ENABLE_THEME_SELECTION === "true") && ( - - )} -
+
+ + Tina Logo + + Powered by TinaCMS + + +
+ {(process.env.NODE_ENV === "development" || + process.env.NEXT_PUBLIC_ENABLE_THEME_SELECTION === "true") && ( + + )}
+
); }; From 8297b0bce83e7eb62d7b29ade409b230074d1e33 Mon Sep 17 00:00:00 2001 From: Jeoffrey Fischer Date: Mon, 24 Nov 2025 12:08:58 +1100 Subject: [PATCH 11/16] Renamed docsfooter to footer --- src/components/docs/footer.tsx | 2 +- src/components/docs/layout/tab-layout.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/docs/footer.tsx b/src/components/docs/footer.tsx index e6be2051..fcc60d26 100644 --- a/src/components/docs/footer.tsx +++ b/src/components/docs/footer.tsx @@ -2,7 +2,7 @@ import { ThemeSelector } from "@/components/ui/theme-selector"; import Image from "next/image"; import Link from "next/link"; -export const DocsFooter = () => { +export const Footer = () => { return (
diff --git a/src/components/docs/layout/tab-layout.tsx b/src/components/docs/layout/tab-layout.tsx index 450decc3..8160850b 100644 --- a/src/components/docs/layout/tab-layout.tsx +++ b/src/components/docs/layout/tab-layout.tsx @@ -5,7 +5,7 @@ import type { NavigationBarData } from "@/src/utils/docs/navigation/documentNavi import * as Tabs from "@radix-ui/react-tabs"; import { usePathname } from "next/navigation"; import React from "react"; -import { DocsFooter } from "../footer"; +import { Footer } from "../footer"; import { Body } from "./body"; import { NavigationProvider } from "./navigation-context"; import { Sidebar } from "./sidebar"; @@ -84,7 +84,7 @@ export const TabsLayout = ({ />
- +
); From 1c8d4e4c1490822d2e3912b28807033a7f62abf9 Mon Sep 17 00:00:00 2001 From: Jeoffrey Fischer Date: Mon, 24 Nov 2025 12:14:19 +1100 Subject: [PATCH 12/16] Moved footer from tab-layout to layout --- src/app/layout.tsx | 2 ++ src/components/docs/layout/tab-layout.tsx | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 846b4e4a..9666275a 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -7,6 +7,7 @@ import { ThemeProvider } from "next-themes"; import { Inter, Roboto_Flex } from "next/font/google"; import { TabsLayout } from "@/components/docs/layout/tab-layout"; +import { Footer } from "@/components/docs/footer"; import type React from "react"; import { TinaClient } from "./tina-client"; @@ -58,6 +59,7 @@ const Content = ({ children }: { children?: React.ReactNode }) => (
{children}
+
); diff --git a/src/components/docs/layout/tab-layout.tsx b/src/components/docs/layout/tab-layout.tsx index 8160850b..8147f96d 100644 --- a/src/components/docs/layout/tab-layout.tsx +++ b/src/components/docs/layout/tab-layout.tsx @@ -5,7 +5,6 @@ import type { NavigationBarData } from "@/src/utils/docs/navigation/documentNavi import * as Tabs from "@radix-ui/react-tabs"; import { usePathname } from "next/navigation"; import React from "react"; -import { Footer } from "../footer"; import { Body } from "./body"; import { NavigationProvider } from "./navigation-context"; import { Sidebar } from "./sidebar"; @@ -84,7 +83,6 @@ export const TabsLayout = ({ />
-