diff --git a/CHANGELOG.md b/CHANGELOG.md
index 58967e8f27..27bd0f357b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -29,6 +29,7 @@
- When an error modal is shown in spaces, ensure we scroll to the top so it can be seen by [@pngwn](https://github.com/pngwn) in [PR 4712](https://github.com/gradio-app/gradio/pull/4712)
- Update depedencies by [@pngwn](https://github.com/pngwn) in [PR 4675](https://github.com/gradio-app/gradio/pull/4675)
- Fixes `gr.Dropdown` being cutoff at the bottom by [@abidlabs](https://github.com/abidlabs) in [PR 4691](https://github.com/gradio-app/gradio/pull/4691).
+- Fix bug where `show_label` was hiding the entire component for `gr.Label` by [@freddyaboulton](https://github.com/freddyaboulton) in [PR 4713](https://github.com/gradio-app/gradio/pull/4713)
## Other Changes:
diff --git a/js/app/src/components/Label/Label.component.spec.ts b/js/app/src/components/Label/Label.component.spec.ts
new file mode 100644
index 0000000000..7e760a7588
--- /dev/null
+++ b/js/app/src/components/Label/Label.component.spec.ts
@@ -0,0 +1,138 @@
+import { test, expect } from "@playwright/experimental-ct-svelte";
+import type { Page, Locator } from "@playwright/test";
+import Label from "./Label.svelte";
+import { spy } from "tinyspy";
+
+import type { LoadingStatus } from "../StatusTracker/types";
+
+const loading_status: LoadingStatus = {
+ eta: 0,
+ queue_position: 1,
+ queue_size: 1,
+ status: "complete",
+ scroll_to_output: false,
+ visible: true,
+ fn_index: 0,
+ show_progress: "full"
+};
+
+test("gr.Label default value and label rendered with confidences", async ({
+ mount,
+ page
+}) => {
+ const component = await mount(Label, {
+ props: {
+ value: {
+ label: "Good",
+ confidences: [
+ { label: "Good", confidence: 0.9 },
+ { label: "Bad", confidence: 0.1 }
+ ]
+ },
+ label: "My Label",
+ show_label: true,
+ loading_status: loading_status
+ }
+ });
+ await expect(component).toContainText("My Label");
+ await expect(component.getByTestId("block-label")).toBeVisible();
+ await expect(page.getByTestId("label-output-value")).toContainText("Good");
+ await expect(page.getByTestId("Good-confidence-set")).toContainText("90");
+ await expect(page.getByTestId("Bad-confidence-set")).toContainText("10");
+});
+
+test("gr.Label hides label when show_label=false", async ({ mount, page }) => {
+ const component = await mount(Label, {
+ props: {
+ value: {
+ label: "Good",
+ confidences: [
+ { label: "Good", confidence: 0.9 },
+ { label: "Bad", confidence: 0.1 }
+ ]
+ },
+ label: "My Label",
+ show_label: false,
+ loading_status: loading_status
+ }
+ });
+ await expect(component.getByTestId("block-label")).toBeHidden();
+});
+
+test("gr.Label confidence bars not rendered without confidences", async ({
+ mount
+}) => {
+ const component = await mount(Label, {
+ props: {
+ value: {
+ label: "Good"
+ },
+ label: "My Label",
+ show_label: true,
+ loading_status: loading_status
+ }
+ });
+ await expect(component).toContainText("My Label");
+ expect(await component.getByTestId("Good-confidence-set").count()).toEqual(0);
+});
+
+test("gr.Label confidence bars trigger select event when clicked", async ({
+ mount,
+ page
+}) => {
+ const select = spy();
+ const component = await mount(Label, {
+ props: {
+ value: {
+ label: "Good",
+ confidences: [
+ { label: "Good", confidence: 0.9 },
+ { label: "Bad", confidence: 0.1 }
+ ]
+ },
+ label: "My Label",
+ show_label: true,
+ loading_status: loading_status
+ },
+ on: {
+ select: select
+ }
+ });
+ await expect(component).toContainText("My Label");
+ await component.getByTestId("Bad-confidence-set").click();
+ expect(select.callCount).toEqual(1);
+ expect(select.calls[0][0]).toEqual({ index: 1, value: "Bad" });
+});
+
+test("gr.Label triggers change event", async ({ mount, page }) => {
+ const change = spy();
+ const component = await mount(Label, {
+ props: {
+ value: {
+ label: "Good",
+ confidences: [
+ { label: "Good", confidence: 0.9 },
+ { label: "Bad", confidence: 0.1 }
+ ]
+ },
+ label: "My Label",
+ show_label: true,
+ loading_status: loading_status
+ },
+ on: {
+ change: change
+ }
+ });
+ await component.update({
+ props: {
+ value: {
+ label: "Good",
+ confidences: [
+ { label: "Good", confidence: 0.1 },
+ { label: "Bad", confidence: 0.9 }
+ ]
+ }
+ }
+ });
+ expect(change.callCount).toEqual(1);
+});
diff --git a/js/app/src/components/Label/Label.svelte b/js/app/src/components/Label/Label.svelte
index 82b91f3ae4..347f5e5a86 100644
--- a/js/app/src/components/Label/Label.svelte
+++ b/js/app/src/components/Label/Label.svelte
@@ -43,7 +43,7 @@