diff --git a/src/components/site/ComponentCatalogBrowser.tsx b/src/components/site/ComponentCatalogBrowser.tsx
index 219fbbe7..ae62bb2d 100644
--- a/src/components/site/ComponentCatalogBrowser.tsx
+++ b/src/components/site/ComponentCatalogBrowser.tsx
@@ -35,6 +35,17 @@ function countByCategory(items: { category: string }[]) {
return counts
}
+function componentRequestUrl(repoUrl: string, component: UpcomingComponent) {
+ const params = new URLSearchParams({
+ area: 'New component',
+ proposal: `Ship ${component.title} (${component.slug}) as a Payload Components post component.`,
+ template: 'feature_request.yml',
+ title: `[feature] ${component.slug}`,
+ })
+
+ return `${repoUrl}/issues/new?${params.toString()}`
+}
+
export function ComponentCatalogBrowser({
categories,
families,
@@ -273,7 +284,11 @@ export function ComponentCatalogBrowser({
) : null}
{postsCards.map((component) => (
-
+
))}
diff --git a/src/components/site/ComponentGrid.tsx b/src/components/site/ComponentGrid.tsx
index b99d2530..7ea57d0d 100644
--- a/src/components/site/ComponentGrid.tsx
+++ b/src/components/site/ComponentGrid.tsx
@@ -138,7 +138,13 @@ function ComponentThumb({ muted = false, slug }: { muted?: boolean; slug: string
/* Cards */
/* ------------------------------------------------------------------ */
-export function UpcomingComponentCard({ component }: { component: UpcomingComponent }) {
+export function UpcomingComponentCard({
+ component,
+ requestHref,
+}: {
+ component: UpcomingComponent
+ requestHref?: string
+}) {
return (
@@ -154,9 +160,21 @@ export function UpcomingComponentCard({ component }: { component: UpcomingCompon
{component.description}
-
- {component.target}
-
+
+
+ {component.target}
+
+ {requestHref ? (
+
+ Request
+
+ ) : null}
+
)
diff --git a/tests/e2e/frontend.e2e.spec.ts b/tests/e2e/frontend.e2e.spec.ts
index e5a07e0a..2a5eef87 100644
--- a/tests/e2e/frontend.e2e.spec.ts
+++ b/tests/e2e/frontend.e2e.spec.ts
@@ -7,6 +7,7 @@ import {
landingSections,
primaryInstallCommand,
terminalDemoLines,
+ upcomingComponents,
} from '../../src/lib/site'
const baseURL = `http://localhost:${process.env.E2E_PORT ?? '3100'}`
@@ -273,6 +274,27 @@ test.describe('Light shadcn frontend', () => {
await expect(page.locator('#hero-basic')).toBeHidden()
})
+ test('links upcoming components to prefilled request issues', async ({ page }) => {
+ const component = upcomingComponents.find((entry) => entry.slug === 'post-card')!
+
+ await page.goto(`${baseURL}/components?type=posts`)
+
+ const requestLink = page.getByRole('link', { name: 'Request' }).first()
+ await expect(requestLink).toBeVisible()
+ await expect(requestLink).toHaveAttribute(
+ 'href',
+ new RegExp(
+ `/issues/new\\?${[
+ 'area=New\\+component',
+ 'proposal=Ship\\+Post\\+Card\\+%28post-card%29\\+as\\+a\\+Payload\\+Components\\+post\\+component\\.',
+ 'template=feature_request\\.yml',
+ 'title=%5Bfeature%5D\\+post-card',
+ ].join('.*')}`,
+ ),
+ )
+ await expect(page.getByText(component.title).first()).toBeVisible()
+ })
+
test('exposes every landing section, the catalog teaser, and the footer', async ({ page }) => {
await page.goto(baseURL)