Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions docs/assets/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@

These assets show the current GitHub Profile Generator interface. They were captured in English on October 23, 2026, using the light theme and fictional data from the [demo project](../examples/demo-profile.project.json). They contain no credentials, real account data or activity queries. Activity card examples use local decorative samples when shown.

| Asset | Content |
| -------------------------------------------------------- | ------------------------------------------------------------------------------- |
| [editor-overview.jpg](editor-overview.jpg) | Technology order controls and aligned compact tags in the live README preview. |
| [activity-contributions.jpg](activity-contributions.jpg) | Contribution editing, ordinary links, and a public image in the README preview. |
| [activity-card-layout.jpg](activity-card-layout.jpg) | One/two card row choices and their live GFM table layout using local samples. |
| [project-files.jpg](project-files.jpg) | The current project JSON import dialog and its local review safeguards. |
| [readme-import-review.jpg](readme-import-review.jpg) | Detected Markdown sections and conversion notices before confirming an import. |
The activity layout captures use the fictional `example-dev` label and local decorative cards. They do not search GitHub or load account data.

| Asset | Content |
| -------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| [editor-overview.jpg](editor-overview.jpg) | Technology order controls and aligned compact tags in the live README preview. |
| [activity-contributions.jpg](activity-contributions.jpg) | Contribution editing with multiple ordinary links and a public image in the README preview. |
| [activity-card-layout.jpg](activity-card-layout.jpg) | Activity/contribution order, one/two card row choices, and local layout samples. |
| [project-files.jpg](project-files.jpg) | The current project JSON import dialog and its local review safeguards. |
| [readme-import-review.jpg](readme-import-review.jpg) | Detected Markdown sections and conversion notices before confirming an import. |

The main README uses static screenshots and written instructions so the product flow stays available without animation.

Expand Down
Binary file modified docs/assets/activity-card-layout.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/activity-contributions.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 7 additions & 6 deletions docs/examples/demo-profile.project.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@
{
"id": "demo-contribution-docs",
"title": "Idea Garden contributor guide",
"description": "I improved the setup guide and added a visual walkthrough so new contributors can find their first task.",
"description": "I improved the setup guide and added a visual walkthrough so new contributors can find their first task.\n\nThe project collects practical web development ideas.",
"url": "",
"links": [
{
Expand All @@ -104,6 +104,11 @@
"id": "demo-contribution-change",
"label": "Change summary",
"url": "https://example.com/ideas/guide-update"
},
{
"id": "demo-contribution-repository",
"label": "Project repository",
"url": "https://github.com/example/idea-garden"
}
],
"images": [
Expand All @@ -112,11 +117,7 @@
"url": "https://raw.githubusercontent.com/juanNH/ReadmeGenerator/dev/docs/assets/idea-garden-demo.svg",
"alt": "Idea Garden dashboard with a saved idea card and a short resource list"
}
],
"repository": {
"url": "https://github.com/example/idea-garden",
"description": "A small collection of practical web development ideas."
}
]
},
{
"id": "demo-contribution-community",
Expand Down
12 changes: 10 additions & 2 deletions src/modules/contributions/contributions-form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,11 @@ export function ContributionsForm({
{t("activity.cardColumns.help")}
</p>
</div>
<div role="group" aria-label={t("activity.cardColumns.label")} className="flex gap-2">
<div
role="group"
aria-label={t("activity.cardColumns.label")}
className="flex flex-wrap gap-2"
>
{([1, 2] as const).map((columns) => (
<Button
key={columns}
Expand All @@ -266,7 +270,11 @@ export function ContributionsForm({
{t("activity.contentOrder.help")}
</p>
</div>
<div role="group" aria-label={t("activity.contentOrder.label")} className="flex gap-2">
<div
role="group"
aria-label={t("activity.contentOrder.label")}
className="flex flex-wrap gap-2"
>
{(["activity-first", "contributions-first"] as const).map((contentOrder) => (
<Button
key={contentOrder}
Expand Down
3 changes: 2 additions & 1 deletion src/server/github/responses.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,12 @@ describe("public activity routes", () => {
it("accepts only local SVG variants and supported locales", () => {
expect(
parseCardRequest("Octocat", "calendar.svg", new URL("https://app.example.com?locale=es")),
).toEqual({ username: "octocat", card: "calendar", locale: "es" });
).toEqual({ username: "octocat", card: "calendar", locale: "es", cardColumns: 1 });
expect(parseCardRequest("octocat", "summary.svg", new URL("https://app.example.com"))).toEqual({
username: "octocat",
card: "summary",
locale: "en",
cardColumns: 1,
});
expect(parseCardRequest("octocat", "other.svg", new URL("https://app.example.com"))).toBeNull();
expect(
Expand Down
27 changes: 14 additions & 13 deletions tests/e2e/activity-contributions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ test("featured GitHub contributions are explicitly copied once and remain editab
await expect(page.getByRole("button", { name: "Download README", exact: true })).toBeEnabled();
});

test("manual contributions support ordered links, public images, repository previews, and reordering", async ({
test("manual contributions support multiple links, public images, and reordering", async ({
page,
}) => {
await stubActivity(page);
Expand Down Expand Up @@ -370,6 +370,13 @@ test("manual contributions support ordered links, public images, repository prev
.fill("Temporary link");
await page.getByRole("button", { name: "Remove link 2", exact: true }).click();
await expect(linkLabels).toBeFocused();
await page.getByRole("button", { name: "Add link", exact: true }).click();
await expect(linkLabels.nth(1)).toBeFocused();
await linkLabels.nth(1).fill("Project repository");
await page
.getByRole("textbox", { name: "Link URL", exact: true })
.nth(1)
.fill("https://github.com/example/guide");
await page.getByText("Images", { exact: true }).click();
await page.getByRole("button", { name: "Add image", exact: true }).click();
const imageUrls = page.getByRole("textbox", { name: "Image URL", exact: true });
Expand All @@ -384,13 +391,6 @@ test("manual contributions support ordered links, public images, repository prev
await expect(imageUrls.nth(1)).toBeFocused();
await page.getByRole("button", { name: "Remove image 2", exact: true }).click();
await expect(imageUrls).toBeFocused();
await page.getByRole("button", { name: "Add repository preview", exact: true }).click();
await page
.getByRole("textbox", { name: "Repository URL", exact: true })
.fill("https://github.com/example/guide");
await page
.getByRole("textbox", { name: "Repository description", exact: true })
.fill("A community guide.");
await addManualContribution(page, "Community response");
await page.getByRole("button", { name: "Move Community response up", exact: true }).click();

Expand All @@ -405,18 +405,19 @@ test("manual contributions support ordered links, public images, repository prev
label: "Contributor guide",
url: "https://example.com/contributing",
},
{
id: expect.any(String),
label: "Project repository",
url: "https://github.com/example/guide",
},
]);
expect(saved.data.contributions.items[1]?.images?.[0]).toMatchObject({
url: "https://images.example.com/guide.png",
alt: "Updated contributor guide",
});
expect(saved.data.contributions.items[1]?.repository).toEqual({
url: "https://github.com/example/guide",
description: "A community guide.",
});
const preview = page.getByRole("article", { name: "README preview", exact: true });
await expect(preview).toContainText("Community response");
await expect(preview).toContainText("example/guide");
await expect(preview).toContainText("Project repository");
await expect(preview.locator("img")).toHaveCount(1);
await expect(page.getByRole("button", { name: "Download README", exact: true })).toBeEnabled();
});
Expand Down
Loading