diff --git a/.changeset/form-field-hint-prop.md b/.changeset/form-field-hint-prop.md
new file mode 100644
index 000000000..d6e07c620
--- /dev/null
+++ b/.changeset/form-field-hint-prop.md
@@ -0,0 +1,5 @@
+---
+"@shopware-ag/meteor-component-library": minor
+---
+
+Add an optional `hint` prop to all form fields for rendering a caption below the field. The existing `#hint` slot still works and takes precedence. Hint content now renders with a consistent info-icon style, which also applies to existing `#hint` slot usage.
diff --git a/packages/component-library/__snapshots__/components-colorpicker-interaction-tests--visual-test-hint-prop-snap.png b/packages/component-library/__snapshots__/components-colorpicker-interaction-tests--visual-test-hint-prop-snap.png
new file mode 100644
index 000000000..d81211aca
Binary files /dev/null and b/packages/component-library/__snapshots__/components-colorpicker-interaction-tests--visual-test-hint-prop-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-colorpicker-interaction-tests--visual-test-hint-slot-snap.png b/packages/component-library/__snapshots__/components-colorpicker-interaction-tests--visual-test-hint-slot-snap.png
new file mode 100644
index 000000000..fc22a96c6
Binary files /dev/null and b/packages/component-library/__snapshots__/components-colorpicker-interaction-tests--visual-test-hint-slot-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-email-field-interaction-tests--visual-test-hint-prop-snap.png b/packages/component-library/__snapshots__/components-email-field-interaction-tests--visual-test-hint-prop-snap.png
new file mode 100644
index 000000000..4501f1c83
Binary files /dev/null and b/packages/component-library/__snapshots__/components-email-field-interaction-tests--visual-test-hint-prop-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-email-field-interaction-tests--visual-test-hint-slot-snap.png b/packages/component-library/__snapshots__/components-email-field-interaction-tests--visual-test-hint-slot-snap.png
new file mode 100644
index 000000000..9e58c5991
Binary files /dev/null and b/packages/component-library/__snapshots__/components-email-field-interaction-tests--visual-test-hint-slot-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-mt-email-field-interaction-tests--visual-test-hint-snap.png b/packages/component-library/__snapshots__/components-mt-email-field-interaction-tests--visual-test-hint-snap.png
index dc7fc52d3..5c0344ab1 100644
Binary files a/packages/component-library/__snapshots__/components-mt-email-field-interaction-tests--visual-test-hint-snap.png and b/packages/component-library/__snapshots__/components-mt-email-field-interaction-tests--visual-test-hint-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-mt-number-field-interaction-tests--visual-test-hint-snap.png b/packages/component-library/__snapshots__/components-mt-number-field-interaction-tests--visual-test-hint-snap.png
index 0605eab7e..8fb1184d9 100644
Binary files a/packages/component-library/__snapshots__/components-mt-number-field-interaction-tests--visual-test-hint-snap.png and b/packages/component-library/__snapshots__/components-mt-number-field-interaction-tests--visual-test-hint-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-mt-password-field-interaction-tests--visual-test-hint-snap.png b/packages/component-library/__snapshots__/components-mt-password-field-interaction-tests--visual-test-hint-snap.png
index 0cef6ee1f..716013161 100644
Binary files a/packages/component-library/__snapshots__/components-mt-password-field-interaction-tests--visual-test-hint-snap.png and b/packages/component-library/__snapshots__/components-mt-password-field-interaction-tests--visual-test-hint-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-mt-radio-group-interaction-tests--visual-test-hint-snap.png b/packages/component-library/__snapshots__/components-mt-radio-group-interaction-tests--visual-test-hint-snap.png
index 683d6441f..3922bb688 100644
Binary files a/packages/component-library/__snapshots__/components-mt-radio-group-interaction-tests--visual-test-hint-snap.png and b/packages/component-library/__snapshots__/components-mt-radio-group-interaction-tests--visual-test-hint-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-mt-select-interaction-tests--visual-test-hint-snap.png b/packages/component-library/__snapshots__/components-mt-select-interaction-tests--visual-test-hint-snap.png
index 0d9ab407c..bd1b54a14 100644
Binary files a/packages/component-library/__snapshots__/components-mt-select-interaction-tests--visual-test-hint-snap.png and b/packages/component-library/__snapshots__/components-mt-select-interaction-tests--visual-test-hint-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-mt-text-field-interaction-tests--visual-test-character-count-with-hint-snap.png b/packages/component-library/__snapshots__/components-mt-text-field-interaction-tests--visual-test-character-count-with-hint-snap.png
index 8aa9b1216..f808c0eb3 100644
Binary files a/packages/component-library/__snapshots__/components-mt-text-field-interaction-tests--visual-test-character-count-with-hint-snap.png and b/packages/component-library/__snapshots__/components-mt-text-field-interaction-tests--visual-test-character-count-with-hint-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-mt-text-field-interaction-tests--visual-test-hint-snap.png b/packages/component-library/__snapshots__/components-mt-text-field-interaction-tests--visual-test-hint-snap.png
index 44605b7ac..f539a4067 100644
Binary files a/packages/component-library/__snapshots__/components-mt-text-field-interaction-tests--visual-test-hint-snap.png and b/packages/component-library/__snapshots__/components-mt-text-field-interaction-tests--visual-test-hint-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-mt-textarea-interaction-tests--visual-test-character-count-with-hint-snap.png b/packages/component-library/__snapshots__/components-mt-textarea-interaction-tests--visual-test-character-count-with-hint-snap.png
index d40c6eead..3ebd1555b 100644
Binary files a/packages/component-library/__snapshots__/components-mt-textarea-interaction-tests--visual-test-character-count-with-hint-snap.png and b/packages/component-library/__snapshots__/components-mt-textarea-interaction-tests--visual-test-character-count-with-hint-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-mt-textarea-interaction-tests--visual-test-hint-snap.png b/packages/component-library/__snapshots__/components-mt-textarea-interaction-tests--visual-test-hint-snap.png
index 22d4166ec..40477539b 100644
Binary files a/packages/component-library/__snapshots__/components-mt-textarea-interaction-tests--visual-test-hint-snap.png and b/packages/component-library/__snapshots__/components-mt-textarea-interaction-tests--visual-test-hint-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-mt-url-field-interaction-tests--visual-test-hint-snap.png b/packages/component-library/__snapshots__/components-mt-url-field-interaction-tests--visual-test-hint-snap.png
index c189b874d..39c6d6161 100644
Binary files a/packages/component-library/__snapshots__/components-mt-url-field-interaction-tests--visual-test-hint-snap.png and b/packages/component-library/__snapshots__/components-mt-url-field-interaction-tests--visual-test-hint-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-number-field-interaction-tests--visual-test-hint-prop-snap.png b/packages/component-library/__snapshots__/components-number-field-interaction-tests--visual-test-hint-prop-snap.png
new file mode 100644
index 000000000..f3260f9b5
Binary files /dev/null and b/packages/component-library/__snapshots__/components-number-field-interaction-tests--visual-test-hint-prop-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-number-field-interaction-tests--visual-test-hint-slot-snap.png b/packages/component-library/__snapshots__/components-number-field-interaction-tests--visual-test-hint-slot-snap.png
new file mode 100644
index 000000000..4b9f88798
Binary files /dev/null and b/packages/component-library/__snapshots__/components-number-field-interaction-tests--visual-test-hint-slot-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-password-field-interaction-tests--visual-test-hint-prop-snap.png b/packages/component-library/__snapshots__/components-password-field-interaction-tests--visual-test-hint-prop-snap.png
new file mode 100644
index 000000000..45eb05987
Binary files /dev/null and b/packages/component-library/__snapshots__/components-password-field-interaction-tests--visual-test-hint-prop-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-password-field-interaction-tests--visual-test-hint-slot-snap.png b/packages/component-library/__snapshots__/components-password-field-interaction-tests--visual-test-hint-slot-snap.png
new file mode 100644
index 000000000..2edcb8bc4
Binary files /dev/null and b/packages/component-library/__snapshots__/components-password-field-interaction-tests--visual-test-hint-slot-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-radio-group-interaction-tests--visual-test-hint-prop-snap.png b/packages/component-library/__snapshots__/components-radio-group-interaction-tests--visual-test-hint-prop-snap.png
new file mode 100644
index 000000000..2859483b8
Binary files /dev/null and b/packages/component-library/__snapshots__/components-radio-group-interaction-tests--visual-test-hint-prop-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-radio-group-interaction-tests--visual-test-hint-slot-snap.png b/packages/component-library/__snapshots__/components-radio-group-interaction-tests--visual-test-hint-slot-snap.png
new file mode 100644
index 000000000..aa8d5e1b4
Binary files /dev/null and b/packages/component-library/__snapshots__/components-radio-group-interaction-tests--visual-test-hint-slot-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-select-interaction-tests--visual-test-hint-prop-snap.png b/packages/component-library/__snapshots__/components-select-interaction-tests--visual-test-hint-prop-snap.png
new file mode 100644
index 000000000..877ae6dca
Binary files /dev/null and b/packages/component-library/__snapshots__/components-select-interaction-tests--visual-test-hint-prop-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-select-interaction-tests--visual-test-hint-slot-snap.png b/packages/component-library/__snapshots__/components-select-interaction-tests--visual-test-hint-slot-snap.png
new file mode 100644
index 000000000..ddcfd5019
Binary files /dev/null and b/packages/component-library/__snapshots__/components-select-interaction-tests--visual-test-hint-slot-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-slider-interaction-tests--visual-test-hint-prop-snap.png b/packages/component-library/__snapshots__/components-slider-interaction-tests--visual-test-hint-prop-snap.png
new file mode 100644
index 000000000..4cab36be2
Binary files /dev/null and b/packages/component-library/__snapshots__/components-slider-interaction-tests--visual-test-hint-prop-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-slider-interaction-tests--visual-test-hint-slot-snap.png b/packages/component-library/__snapshots__/components-slider-interaction-tests--visual-test-hint-slot-snap.png
new file mode 100644
index 000000000..22d226dc7
Binary files /dev/null and b/packages/component-library/__snapshots__/components-slider-interaction-tests--visual-test-hint-slot-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-text-field-interaction-tests--visual-test-hint-prop-snap.png b/packages/component-library/__snapshots__/components-text-field-interaction-tests--visual-test-hint-prop-snap.png
new file mode 100644
index 000000000..31910df33
Binary files /dev/null and b/packages/component-library/__snapshots__/components-text-field-interaction-tests--visual-test-hint-prop-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-text-field-interaction-tests--visual-test-hint-slot-snap.png b/packages/component-library/__snapshots__/components-text-field-interaction-tests--visual-test-hint-slot-snap.png
new file mode 100644
index 000000000..70915f4c2
Binary files /dev/null and b/packages/component-library/__snapshots__/components-text-field-interaction-tests--visual-test-hint-slot-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-textarea-interaction-tests--visual-test-hint-prop-snap.png b/packages/component-library/__snapshots__/components-textarea-interaction-tests--visual-test-hint-prop-snap.png
new file mode 100644
index 000000000..2b02f5e5f
Binary files /dev/null and b/packages/component-library/__snapshots__/components-textarea-interaction-tests--visual-test-hint-prop-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-textarea-interaction-tests--visual-test-hint-slot-snap.png b/packages/component-library/__snapshots__/components-textarea-interaction-tests--visual-test-hint-slot-snap.png
new file mode 100644
index 000000000..778984e66
Binary files /dev/null and b/packages/component-library/__snapshots__/components-textarea-interaction-tests--visual-test-hint-slot-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-unit-field-interaction-tests--visual-test-hint-prop-snap.png b/packages/component-library/__snapshots__/components-unit-field-interaction-tests--visual-test-hint-prop-snap.png
new file mode 100644
index 000000000..21377e753
Binary files /dev/null and b/packages/component-library/__snapshots__/components-unit-field-interaction-tests--visual-test-hint-prop-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-unit-field-interaction-tests--visual-test-hint-slot-snap.png b/packages/component-library/__snapshots__/components-unit-field-interaction-tests--visual-test-hint-slot-snap.png
new file mode 100644
index 000000000..807b960ba
Binary files /dev/null and b/packages/component-library/__snapshots__/components-unit-field-interaction-tests--visual-test-hint-slot-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-url-field-interaction-tests--visual-test-hint-prop-snap.png b/packages/component-library/__snapshots__/components-url-field-interaction-tests--visual-test-hint-prop-snap.png
new file mode 100644
index 000000000..34a0d2ba3
Binary files /dev/null and b/packages/component-library/__snapshots__/components-url-field-interaction-tests--visual-test-hint-prop-snap.png differ
diff --git a/packages/component-library/__snapshots__/components-url-field-interaction-tests--visual-test-hint-slot-snap.png b/packages/component-library/__snapshots__/components-url-field-interaction-tests--visual-test-hint-slot-snap.png
new file mode 100644
index 000000000..c659f3a71
Binary files /dev/null and b/packages/component-library/__snapshots__/components-url-field-interaction-tests--visual-test-hint-slot-snap.png differ
diff --git a/packages/component-library/src/components/_internal/mt-field-hint/mt-field-hint.spec.ts b/packages/component-library/src/components/_internal/mt-field-hint/mt-field-hint.spec.ts
new file mode 100644
index 000000000..af2871fb1
--- /dev/null
+++ b/packages/component-library/src/components/_internal/mt-field-hint/mt-field-hint.spec.ts
@@ -0,0 +1,34 @@
+import { render, screen } from "@testing-library/vue";
+import { describe, it, expect } from "vitest";
+import MtFieldHint from "./mt-field-hint.vue";
+
+describe("mt-field-hint", () => {
+ it("renders markup passed into the default slot", () => {
+ // ARRANGE
+ render(MtFieldHint, {
+ slots: {
+ default: 'Some hint',
+ },
+ });
+
+ // ASSERT
+ const slotContent = screen.getByTestId("custom-hint");
+ expect(slotContent).toBeVisible();
+ expect(slotContent.querySelector("strong")).toHaveTextContent("hint");
+ });
+
+ it("renders a decorative info icon that is hidden from assistive technology", () => {
+ // ARRANGE
+ const { container } = render(MtFieldHint, {
+ slots: {
+ default: "Some hint",
+ },
+ });
+
+ // ASSERT
+ // the icon is purely decorative, so it must be hidden from screen readers
+ const icon = container.querySelector(".mt-field-hint__icon");
+ expect(icon).toBeInTheDocument();
+ expect(icon).toHaveAttribute("aria-hidden", "true");
+ });
+});
diff --git a/packages/component-library/src/components/_internal/mt-field-hint/mt-field-hint.vue b/packages/component-library/src/components/_internal/mt-field-hint/mt-field-hint.vue
new file mode 100644
index 000000000..d53cad38e
--- /dev/null
+++ b/packages/component-library/src/components/_internal/mt-field-hint/mt-field-hint.vue
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/component-library/src/components/mt-colorpicker/mt-colorpicker.interactive.stories.ts b/packages/component-library/src/components/mt-colorpicker/mt-colorpicker.interactive.stories.ts
index 06bb2c521..b1be644db 100644
--- a/packages/component-library/src/components/mt-colorpicker/mt-colorpicker.interactive.stories.ts
+++ b/packages/component-library/src/components/mt-colorpicker/mt-colorpicker.interactive.stories.ts
@@ -1,6 +1,7 @@
import { within, userEvent, fireEvent } from "@storybook/test";
import { expect } from "@storybook/test";
+import MtColorpicker from "./mt-colorpicker.vue";
import meta, { type MtColorpickerMeta, type MtColorpickerStory } from "./mt-colorpicker.stories";
import { waitUntil } from "@/_internal/test-helper";
@@ -598,3 +599,34 @@ export const VisualTestColorpickerWithHelpText: MtColorpickerStory = {
expect(canvas.getByRole("tooltip")).toBeInTheDocument();
},
};
+
+export const VisualTestHintProp: MtColorpickerStory = {
+ name: "Should display hint via prop",
+ args: {
+ hint: "Hint via prop",
+ },
+ render: (args) => ({
+ components: { MtColorpicker },
+ setup: () => ({ args }),
+ template: ``,
+ }),
+ play: ({ canvasElement }) => {
+ const canvas = within(canvasElement);
+
+ expect(canvas.getByText("Hint via prop")).toBeDefined();
+ },
+};
+
+export const VisualTestHintSlot: MtColorpickerStory = {
+ name: "Should display hint via slot",
+ render: (args) => ({
+ components: { MtColorpicker },
+ setup: () => ({ args }),
+ template: `Hint via slot`,
+ }),
+ play: ({ canvasElement }) => {
+ const canvas = within(canvasElement);
+
+ expect(canvas.getByText("Hint via slot")).toBeDefined();
+ },
+};
diff --git a/packages/component-library/src/components/mt-colorpicker/mt-colorpicker.spec.ts b/packages/component-library/src/components/mt-colorpicker/mt-colorpicker.spec.ts
index 609d1e8e6..e453f5216 100644
--- a/packages/component-library/src/components/mt-colorpicker/mt-colorpicker.spec.ts
+++ b/packages/component-library/src/components/mt-colorpicker/mt-colorpicker.spec.ts
@@ -152,4 +152,45 @@ describe("mt-colorpicker", () => {
}),
);
});
+
+ it("displays a hint passed via the hint prop", () => {
+ // ARRANGE
+ render(MtColorpicker, {
+ props: {
+ modelValue: "#0fcff5",
+ hint: "Hint from prop",
+ },
+ });
+
+ // ASSERT
+ expect(screen.getByText("Hint from prop")).toBeVisible();
+ });
+
+ it("renders markup passed via the hint slot", () => {
+ // ARRANGE
+ render(MtColorpicker, {
+ props: {
+ modelValue: "#0fcff5",
+ },
+ slots: {
+ hint: 'Hint from slot',
+ },
+ });
+
+ // ASSERT
+ expect(screen.getByTestId("custom-hint")).toBeVisible();
+ expect(screen.getByTestId("custom-hint")).toHaveTextContent("Hint from slot");
+ });
+
+ it("does not render a hint when neither prop nor slot is provided", () => {
+ // ARRANGE
+ const { container } = render(MtColorpicker, {
+ props: {
+ modelValue: "#0fcff5",
+ },
+ });
+
+ // ASSERT
+ expect(container.querySelector(".mt-field-hint")).not.toBeInTheDocument();
+ });
});
diff --git a/packages/component-library/src/components/mt-colorpicker/mt-colorpicker.vue b/packages/component-library/src/components/mt-colorpicker/mt-colorpicker.vue
index d7201a647..d3e9bc5c4 100644
--- a/packages/component-library/src/components/mt-colorpicker/mt-colorpicker.vue
+++ b/packages/component-library/src/components/mt-colorpicker/mt-colorpicker.vue
@@ -235,6 +235,14 @@
+
+
+
+
+ {{ hint }}
+
+
+
@@ -244,6 +252,7 @@ import type { PropType } from "vue";
import { defineComponent } from "vue";
import { debounce } from "@/utils/debounce";
import MtBaseField from "../_internal/mt-base-field/mt-base-field.vue";
+import MtFieldHint from "../_internal/mt-field-hint/mt-field-hint.vue";
import MtFloatingUi from "../mt-floating-ui/mt-floating-ui.vue";
import MtText from "@/components/mt-text/mt-text.vue";
import { createFocusTrap } from "focus-trap";
@@ -257,6 +266,7 @@ export default defineComponent({
components: {
"mt-base-field": MtBaseField,
+ "mt-field-hint": MtFieldHint,
"mt-text": MtText,
"mt-floating-ui": MtFloatingUi,
"mt-button": MtButton,
@@ -291,6 +301,15 @@ export default defineComponent({
default: null,
},
+ /**
+ * Optional caption below the field. The `#hint` slot takes precedence when provided.
+ */
+ hint: {
+ type: String as PropType,
+ required: false,
+ default: null,
+ },
+
/**
* Change the output value which gets emitted and shown in the field.
* @values auto, hex, hsl, rgb
@@ -494,6 +513,10 @@ export default defineComponent({
},
},
+ showFieldHint(): boolean {
+ return !!this.$slots.hint || (this.hint != null && String(this.hint).trim() !== "");
+ },
+
integerAlpha: {
get(): number {
return Math.floor(this.alphaValue * 100);
diff --git a/packages/component-library/src/components/mt-email-field/mt-email-field.interactive.stories.ts b/packages/component-library/src/components/mt-email-field/mt-email-field.interactive.stories.ts
index 2c70eaf8f..361b441f1 100644
--- a/packages/component-library/src/components/mt-email-field/mt-email-field.interactive.stories.ts
+++ b/packages/component-library/src/components/mt-email-field/mt-email-field.interactive.stories.ts
@@ -1,6 +1,7 @@
import { within, userEvent, fn } from "@storybook/test";
import { expect } from "@storybook/test";
+import MtEmailField from "./mt-email-field.vue";
import meta, { type MtEmailFieldMeta, type MtEmailFieldStory } from "./mt-email-field.stories";
export default {
@@ -33,18 +34,6 @@ export const VisualTestSuffix: MtEmailFieldStory = {
},
};
-export const VisualTestHint: MtEmailFieldStory = {
- name: "Should display hint",
- args: {
- hint: "hint",
- },
- play: ({ canvasElement, args }) => {
- const canvas = within(canvasElement);
-
- expect(canvas.getByText(args.hint)).toBeDefined();
- },
-};
-
export const VisualTestDisabled: MtEmailFieldStory = {
name: "Should disable",
args: {
@@ -143,3 +132,34 @@ export const VisualTestUnlinkedInheritance: MtEmailFieldStory = {
modelValue: "test@shopware.com",
},
};
+
+export const VisualTestHintProp: MtEmailFieldStory = {
+ name: "Should display hint via prop",
+ args: {
+ hint: "Hint via prop",
+ },
+ render: (args) => ({
+ components: { MtEmailField },
+ setup: () => ({ args }),
+ template: ``,
+ }),
+ play: ({ canvasElement }) => {
+ const canvas = within(canvasElement);
+
+ expect(canvas.getByText("Hint via prop")).toBeDefined();
+ },
+};
+
+export const VisualTestHintSlot: MtEmailFieldStory = {
+ name: "Should display hint via slot",
+ render: (args) => ({
+ components: { MtEmailField },
+ setup: () => ({ args }),
+ template: `Hint via slot`,
+ }),
+ play: ({ canvasElement }) => {
+ const canvas = within(canvasElement);
+
+ expect(canvas.getByText("Hint via slot")).toBeDefined();
+ },
+};
diff --git a/packages/component-library/src/components/mt-email-field/mt-email-field.spec.ts b/packages/component-library/src/components/mt-email-field/mt-email-field.spec.ts
index 11b80df7d..b875ec1cd 100644
--- a/packages/component-library/src/components/mt-email-field/mt-email-field.spec.ts
+++ b/packages/component-library/src/components/mt-email-field/mt-email-field.spec.ts
@@ -568,4 +568,37 @@ describe("mt-email-field", () => {
screen.getByRole("textbox").getAttribute("aria-describedby"),
);
});
+
+ it("displays a hint passed via the hint prop", () => {
+ // ARRANGE
+ render(MtEmailField, {
+ props: {
+ hint: "Hint from prop",
+ },
+ });
+
+ // ASSERT
+ expect(screen.getByText("Hint from prop")).toBeVisible();
+ });
+
+ it("renders markup passed via the hint slot", () => {
+ // ARRANGE
+ render(MtEmailField, {
+ slots: {
+ hint: 'Hint from slot',
+ },
+ });
+
+ // ASSERT
+ expect(screen.getByTestId("custom-hint")).toBeVisible();
+ expect(screen.getByTestId("custom-hint")).toHaveTextContent("Hint from slot");
+ });
+
+ it("does not render a hint when neither prop nor slot is provided", () => {
+ // ARRANGE
+ const { container } = render(MtEmailField);
+
+ // ASSERT
+ expect(container.querySelector(".mt-field-hint")).not.toBeInTheDocument();
+ });
});
diff --git a/packages/component-library/src/components/mt-email-field/mt-email-field.vue b/packages/component-library/src/components/mt-email-field/mt-email-field.vue
index 5985be397..4a5c3bcb8 100644
--- a/packages/component-library/src/components/mt-email-field/mt-email-field.vue
+++ b/packages/component-library/src/components/mt-email-field/mt-email-field.vue
@@ -101,17 +101,20 @@
:style="{ gridArea: 'error' }"
/>
-