From c96c4b755a01b30a011f05012c5d785e8ccb8f1d Mon Sep 17 00:00:00 2001 From: Matt Rothenberg Date: Mon, 27 Apr 2026 08:45:04 -0400 Subject: [PATCH] feat(text): expand `as` prop to accept additional HTML text elements Add label, dt, dd, li, figcaption, legend, pre, code, em, strong, small, abbr, and time to the TextElement union. This unblocks downstream Stratus usage where Text needs to render as definition list terms, form labels, and code elements. - Widen internal ref from HTMLHeadingElement to HTMLElement (was already incorrect for span/p; now correct for all element types) - Add runtime tests for dt, dd, label, code, pre - Add type-spec positive cases for all 13 new elements - Update JSDoc to document the full set of accepted elements --- .changeset/text-expand-as-elements.md | 5 +++ .../kumo/src/components/text/text.test.tsx | 34 +++++++++++++++++++ packages/kumo/src/components/text/text.tsx | 27 ++++++++++++--- .../src/components/text/text.type-spec.tsx | 28 +++++++++++++++ 4 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 .changeset/text-expand-as-elements.md diff --git a/.changeset/text-expand-as-elements.md b/.changeset/text-expand-as-elements.md new file mode 100644 index 0000000000..c38c2a3da6 --- /dev/null +++ b/.changeset/text-expand-as-elements.md @@ -0,0 +1,5 @@ +--- +"@cloudflare/kumo": minor +--- + +Expand `Text` component's `as` prop to accept additional HTML text elements: `label`, `dt`, `dd`, `li`, `figcaption`, `legend`, `pre`, `code`, `em`, `strong`, `small`, `abbr`, and `time`. This unblocks downstream usage in Stratus where `Text` needs to render as definition list terms, labels, and code elements. diff --git a/packages/kumo/src/components/text/text.test.tsx b/packages/kumo/src/components/text/text.test.tsx index 749ba3458c..80c79dea7e 100644 --- a/packages/kumo/src/components/text/text.test.tsx +++ b/packages/kumo/src/components/text/text.test.tsx @@ -37,6 +37,40 @@ describe("Text", () => { expect(container.querySelector("h2")).toBeNull(); }); + it("renders as
when as='dt'", () => { + const { container } = render(Term); + expect(container.querySelector("dt")).toBeTruthy(); + expect(container.querySelector("p")).toBeNull(); + }); + + it("renders as
when as='dd'", () => { + const { container } = render(Definition); + expect(container.querySelector("dd")).toBeTruthy(); + }); + + it("renders as