From 8ad110f73b6e57c47e4cd4abac76ccb55accfb0a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com>
Date: Wed, 18 Mar 2026 18:30:06 -0500
Subject: [PATCH] test
---
packages/i18n/strings/en.json | 3 +-
.../website-ue/src/components/ApiEntry.astro | 35 ++++++++++
.../website-ue/src/components/ApiGroup.astro | 31 +--------
.../src/components/ApiTester/index.module.css | 11 ++++
.../src/components/ApiTester/index.tsx | 66 +++++++++++++++++++
.../src/components/Section/index.tsx | 2 +-
packages/website-ue/src/hooks/useLocale.tsx | 2 +-
.../src/pages/api/avatars/[id].json.ts | 5 +-
8 files changed, 122 insertions(+), 33 deletions(-)
create mode 100644 packages/website-ue/src/components/ApiEntry.astro
create mode 100644 packages/website-ue/src/components/ApiTester/index.module.css
create mode 100644 packages/website-ue/src/components/ApiTester/index.tsx
diff --git a/packages/i18n/strings/en.json b/packages/i18n/strings/en.json
index ffecd6cd3..c2d2587c3 100644
--- a/packages/i18n/strings/en.json
+++ b/packages/i18n/strings/en.json
@@ -121,6 +121,7 @@
"json": "JSON methods",
"pb": "Protocol Buffer methods",
"media": "Media methods",
- "no_docs": "This method has no documentation."
+ "no_docs": "This method has no documentation.",
+ "test": "Test"
}
}
diff --git a/packages/website-ue/src/components/ApiEntry.astro b/packages/website-ue/src/components/ApiEntry.astro
new file mode 100644
index 000000000..1a3d6c447
--- /dev/null
+++ b/packages/website-ue/src/components/ApiEntry.astro
@@ -0,0 +1,35 @@
+---
+import type { CollectionEntry } from "astro:content";
+import { api } from "../core/api/dynamic";
+import { ApiTester } from "./ApiTester";
+import { Code } from "./Code";
+import { Heading } from "./Heading";
+import { MarkdownCustom } from "./MarkdownCustom";
+
+interface Props {
+ locale: string;
+ api: CollectionEntry<"api">;
+}
+
+const { locale, api: apiData } = Astro.props;
+const strings = await api.strings(locale);
+const hasSlugs = apiData.id.includes("[");
+---
+
+
+
+
+
+ {apiData.id}
+
+
+
+
+
+
diff --git a/packages/website-ue/src/components/ApiGroup.astro b/packages/website-ue/src/components/ApiGroup.astro
index 7e8b9ff8b..c795061a7 100644
--- a/packages/website-ue/src/components/ApiGroup.astro
+++ b/packages/website-ue/src/components/ApiGroup.astro
@@ -1,9 +1,6 @@
---
import type { CollectionEntry } from "astro:content";
-import { api } from "../core/api/dynamic";
-import { Code } from "./Code";
-import { Heading } from "./Heading";
-import { MarkdownCustom } from "./MarkdownCustom";
+import ApiEntry from "./ApiEntry.astro";
interface Props {
locale: string;
@@ -11,34 +8,10 @@ interface Props {
}
const { apis, locale } = Astro.props;
-const strings = await api.strings(locale);
---
-
-
{
apis
.sort((a, b) => a.id.localeCompare(b.id))
- .map((api) => (
-
-
- {api.id}
-
-
-
-
- ))
+ .map((api) => )
}
diff --git a/packages/website-ue/src/components/ApiTester/index.module.css b/packages/website-ue/src/components/ApiTester/index.module.css
new file mode 100644
index 000000000..039b69a69
--- /dev/null
+++ b/packages/website-ue/src/components/ApiTester/index.module.css
@@ -0,0 +1,11 @@
+.tester {
+ display: flex;
+ align-items: center;
+ gap: var(--space-4);
+
+ .slug {
+ display: flex;
+ align-items: center;
+ gap: var(--space-3);
+ }
+}
diff --git a/packages/website-ue/src/components/ApiTester/index.tsx b/packages/website-ue/src/components/ApiTester/index.tsx
new file mode 100644
index 000000000..70a43512f
--- /dev/null
+++ b/packages/website-ue/src/components/ApiTester/index.tsx
@@ -0,0 +1,66 @@
+import { useState } from "react";
+import {
+ LocaleProvider,
+ type LocaleAcceptorProps,
+} from "../../hooks/useLocale";
+import { useStrings } from "../../hooks/useStrings";
+import { Button } from "../Button";
+import { Link } from "../Link";
+import { TextField } from "../TextField";
+import styles from "./index.module.css";
+
+interface Props {
+ path: string;
+}
+
+const slugPattern = /\[\w+\]/g;
+
+function Content({ path }: Props) {
+ const strings = useStrings();
+
+ const slugs = (path.match(slugPattern) ?? []).map((slug) =>
+ slug.slice(1, -1),
+ );
+ const [values, setValues] = useState(() => {
+ const values: Record = {};
+
+ for (const slug of slugs) {
+ values[slug] = "";
+ }
+
+ return values;
+ });
+
+ const href = Object.entries(values).reduce(
+ (href, [slug, value]) => href.replace(`[${slug}]`, value),
+ `/api/${path}`,
+ );
+
+ return (
+
+ {slugs.map((slug) => (
+
+ {slug}:{" "}
+ {
+ setValues((state) => ({ ...state, [slug]: event.target.value }));
+ }}
+ />
+
+ ))}
+
+
+
+
+
+ );
+}
+
+export function ApiTester({ path, locale }: Props & LocaleAcceptorProps) {
+ return (
+
+
+
+ );
+}
diff --git a/packages/website-ue/src/components/Section/index.tsx b/packages/website-ue/src/components/Section/index.tsx
index 6776d44e9..4566a535c 100644
--- a/packages/website-ue/src/components/Section/index.tsx
+++ b/packages/website-ue/src/components/Section/index.tsx
@@ -5,7 +5,7 @@ import styles from "./index.module.css";
export interface SectionProps extends ComponentProps<"div"> {
first?: boolean;
- gap: Space;
+ gap?: Space;
}
export function Section({
diff --git a/packages/website-ue/src/hooks/useLocale.tsx b/packages/website-ue/src/hooks/useLocale.tsx
index 7d6b7c839..4fcff19b2 100644
--- a/packages/website-ue/src/hooks/useLocale.tsx
+++ b/packages/website-ue/src/hooks/useLocale.tsx
@@ -28,5 +28,5 @@ export function useLocale() {
}
export interface LocaleAcceptorProps {
- locale: string | undefined;
+ locale: string;
}
diff --git a/packages/website-ue/src/pages/api/avatars/[id].json.ts b/packages/website-ue/src/pages/api/avatars/[id].json.ts
index aaa2de685..342b8d0d7 100644
--- a/packages/website-ue/src/pages/api/avatars/[id].json.ts
+++ b/packages/website-ue/src/pages/api/avatars/[id].json.ts
@@ -10,7 +10,10 @@ export const getStaticPaths = (async () => {
}) satisfies GetStaticPaths;
/**
- * Returns data on an avatar based on its id. @see avatars/list.json for a list of all avatar ids.
+ * Returns data on an avatar based on its id. @see avatars/list.json for a list
+ * of all avatar ids.
+ *
+ * @type avatar
*/
export async function GET({ params }: APIContext) {
const avatar = await api.avatar(params.id);