diff --git a/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx b/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx index 52c09114f..e6431ea71 100644 --- a/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx +++ b/docs/tutorialkit.dev/src/content/docs/guides/overriding-components.mdx @@ -89,4 +89,22 @@ interface Props { /** Content of the dialog */ children: ReactNode; } +``` + +### HeadTags + +Component for overriding title, links and metadata in the `` tag. + +When overriding `HeadTags` you can place TutorialKit's default components using following [Astro slots](https://docs.astro.build/en/basics/astro-components/#named-slots): + +- `title`: The page title +- `links`: Links for the favicon, fonts and other assets +- `meta`: Metadata and Open Graph tags + +```jsx title="src/components/CustomHeadLinks.astro" + + + +{/** Add your own tags */} + ``` \ No newline at end of file diff --git a/e2e/configs/override-components.ts b/e2e/configs/override-components.ts index 120234dcf..711a90e53 100644 --- a/e2e/configs/override-components.ts +++ b/e2e/configs/override-components.ts @@ -10,6 +10,7 @@ export default defineConfig({ components: { Dialog: './src/components/Dialog.tsx', TopBar: './src/components/TopBar.astro', + HeadTags: './src/components/CustomHeadTags.astro', }, }), ], diff --git a/e2e/src/components/CustomHeadTags.astro b/e2e/src/components/CustomHeadTags.astro new file mode 100644 index 000000000..2aff860fe --- /dev/null +++ b/e2e/src/components/CustomHeadTags.astro @@ -0,0 +1,5 @@ + + + + + diff --git a/e2e/test/headtags.override-components.test.ts b/e2e/test/headtags.override-components.test.ts new file mode 100644 index 000000000..896b7875c --- /dev/null +++ b/e2e/test/headtags.override-components.test.ts @@ -0,0 +1,23 @@ +import { test, expect } from '@playwright/test'; + +test('developer can override HeadTags', async ({ page }) => { + await page.goto('/'); + + const defaultElems = [ + page.locator('title'), + page.locator('meta[name="og:title"]'), + page.locator('link[rel="stylesheet"]').first(), + ]; + const customElems = [ + page.locator('meta[name="e2e-test-custom-meta-tag"][content="custom-content"]'), + page.locator('link[rel="sitemap"]'), + ]; + + for (const e of defaultElems) { + await expect(e).toBeAttached(); + } + + for (const e of customElems) { + await expect(e).toBeAttached(); + } +}); diff --git a/packages/astro/package.json b/packages/astro/package.json index da837197f..289f7934d 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -20,6 +20,7 @@ "./default/pages/index.astro": "./dist/default/pages/index.astro", "./default/pages/[...slug].astro": "./dist/default/pages/[...slug].astro", "./default/components/TopBar.astro": "./dist/default/components/TopBar.astro", + "./default/components/HeadTags.astro": "./dist/default/components/HeadTags.astro", "./package.json": "./package.json" }, "files": [ diff --git a/packages/astro/src/default/components/HeadTags.astro b/packages/astro/src/default/components/HeadTags.astro new file mode 100644 index 000000000..70983d763 --- /dev/null +++ b/packages/astro/src/default/components/HeadTags.astro @@ -0,0 +1,3 @@ + + + diff --git a/packages/astro/src/default/env-default.d.ts b/packages/astro/src/default/env-default.d.ts index 101487bff..303066a5a 100644 --- a/packages/astro/src/default/env-default.d.ts +++ b/packages/astro/src/default/env-default.d.ts @@ -9,9 +9,10 @@ interface WebContainerConfig { declare module 'tutorialkit:override-components' { const topBar: typeof import('./src/default/components/TopBar.astro').default; + const headTags: typeof import('./src/default/components/HeadTags.astro').default; const dialog: typeof import('@tutorialkit/react/dialog').default; - export { topBar as TopBar, dialog as Dialog }; + export { topBar as TopBar, dialog as Dialog, headTags as HeadTags }; } declare const __ENTERPRISE__: boolean; diff --git a/packages/astro/src/default/layouts/Layout.astro b/packages/astro/src/default/layouts/Layout.astro index ae98d9826..b26d2fe2e 100644 --- a/packages/astro/src/default/layouts/Layout.astro +++ b/packages/astro/src/default/layouts/Layout.astro @@ -1,4 +1,5 @@ --- +import { HeadTags } from 'tutorialkit:override-components'; import { ViewTransitions } from 'astro:transitions'; import type { MetaTagsConfig } from '@tutorialkit/types'; import MetaTags from '../components/MetaTags.astro'; @@ -15,13 +16,22 @@ const faviconUrl = readPublicAsset('favicon.svg'); - {title} - {faviconUrl ? : null} - - - - - + + {title} + + + {faviconUrl ? : null} + + + + + + + +