Skip to content

Commit 156ebb0

Browse files
feat(OnyxTextarea): Implement OnyxTextarea success state (#2142)
<!-- Is your PR related to an issue? Then please link it via the "Relates to #" below. Else, remove it. --> Relates to #573 Implemented success styles for OnyxTextarea ## Checklist - [x] The added / edited code has been documented with [JSDoc](https://jsdoc.app/about-getting-started) - [x] All changes are documented in the documentation app (folder `apps/docs`) - [x] If a new component is added, at least one [Playwright screenshot test](https://github.com/SchwarzIT/onyx/actions/workflows/playwright-screenshots.yml) is added - [x] A changeset is added with `npx changeset add` if your changes should be released as npm package (because they affect the library usage) --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent b91275e commit 156ebb0

File tree

9 files changed

+81
-10
lines changed

9 files changed

+81
-10
lines changed

.changeset/cuddly-gorillas-raise.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"sit-onyx": minor
3+
---
4+
5+
feat(OnyxTextarea): Implement success state styles

packages/sit-onyx/src/components/OnyxInput/OnyxInput.stories.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,6 @@ export const CustomError: Story = {
158158

159159
/**
160160
* This example shows an input with a success message.
161-
* Will only be shown after user interaction.
162161
*/
163162
export const SuccessInput: Story = {
164163
args: {

packages/sit-onyx/src/components/OnyxInput/OnyxInput.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ const errorClass = useErrorClass(showError);
7979
v-custom-validity
8080
:placeholder="props.placeholder"
8181
class="onyx-input__native"
82-
:class="{ 'onyx-input__native--success': successMessages }"
8382
:type="props.type"
8483
:required="props.required"
8584
:autocapitalize="props.autocapitalize"

packages/sit-onyx/src/components/OnyxTextarea/OnyxTextarea.ct.tsx

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,35 @@ test.describe("Screenshot tests", () => {
9898
},
9999
});
100100

101+
executeMatrixScreenshotTest({
102+
name: "Textarea (success)",
103+
columns: ["default"],
104+
rows: ["default", "hover", "focus"],
105+
// TODO: remove when contrast issues are fixed in https://github.com/SchwarzIT/onyx/issues/410
106+
disabledAccessibilityRules: ["color-contrast"],
107+
component: () => (
108+
<OnyxTextarea
109+
style="width: 12rem"
110+
label="Test label"
111+
success={{ shortMessage: "Test success message", longMessage: "Test long success message" }}
112+
/>
113+
),
114+
beforeScreenshot: async (component, page, column, row) => {
115+
const input = component.getByLabel("Test label");
116+
const formElementUtils = createFormElementUtils(page);
117+
118+
await component.evaluate((element) => {
119+
element.style.padding = `0 5rem 3rem 2rem`;
120+
});
121+
122+
if (row === "hover") {
123+
await input.hover();
124+
await formElementUtils.triggerTooltipVisible("message");
125+
}
126+
if (row === "focus") await input.focus();
127+
},
128+
});
129+
101130
executeMatrixScreenshotTest({
102131
name: "Textarea (skeleton)",
103132
columns: DENSITIES,
@@ -441,3 +470,31 @@ test("should show error message after interaction", async ({ mount, makeAxeBuild
441470
// ASSERT
442471
expect(accessibilityScanResults.violations).toEqual([]);
443472
});
473+
474+
test("should show correct message", async ({ mount }) => {
475+
const message = { shortMessage: "Test short message" };
476+
const successMessage = { shortMessage: "Test success short message" };
477+
const component = await mount(
478+
<OnyxTextarea label="Label" required success={successMessage} message={message} />,
479+
);
480+
481+
const messageElement = component.getByText("Test short message");
482+
const successMessageElement = component.getByText("Test success short message");
483+
const errorMessageElement = component.getByText("Required");
484+
const input = component.getByLabel("Label");
485+
486+
// ASSERT
487+
await expect(messageElement).toBeHidden();
488+
await expect(successMessageElement).toBeVisible();
489+
490+
//ACT
491+
await input.click();
492+
await input.fill("x");
493+
await input.fill("");
494+
await input.blur();
495+
496+
// ASSERT
497+
await expect(messageElement).toBeHidden();
498+
await expect(successMessageElement).toBeHidden();
499+
await expect(errorMessageElement).toBeVisible();
500+
});

packages/sit-onyx/src/components/OnyxTextarea/OnyxTextarea.stories.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,20 @@ export const CustomError: Story = {
127127
},
128128
};
129129

130+
/**
131+
* This example shows a textarea with a success message.
132+
*/
133+
export const SuccessMessage: Story = {
134+
args: {
135+
...Default.args,
136+
success: {
137+
shortMessage: "Example success message",
138+
longMessage: "This text might inform the users that the text is valid.",
139+
},
140+
modelValue: "Test success value",
141+
},
142+
};
143+
130144
/**
131145
* This example shows a textarea with custom autosize settings (min=2 rows, max=12 rows).
132146
* You can also disable the max rows so the textarea can grow unlimited.

packages/sit-onyx/src/styles/mixins/input.scss

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,6 @@
4646
padding: $vertical-padding var(--onyx-density-sm);
4747
height: calc(1lh + 2 * #{$vertical-padding});
4848

49-
&:has(#{$base-selector}__native--success:enabled:focus) {
50-
--outline-color: var(--onyx-color-base-success-200);
51-
--selection-color: var(--onyx-color-base-success-200);
52-
--focus-border-color: var(--onyx-color-base-success-500);
53-
--hover-border-color: var(--onyx-color-base-success-400);
54-
}
55-
5649
&:has(#{$base-selector}__native:read-write:hover) {
5750
--border-color: var(--hover-border-color, var(--onyx-color-base-primary-400));
5851
}
@@ -92,8 +85,12 @@
9285
}
9386

9487
@include success(#{$base-selector}__native) {
95-
--border-color: var(--onyx-color-base-success-500);
9688
--message-display: none;
89+
--border-color: var(--onyx-color-base-success-500);
90+
--outline-color: var(--onyx-color-base-success-200);
91+
--selection-color: var(--onyx-color-base-success-200);
92+
--focus-border-color: var(--onyx-color-base-success-500);
93+
--hover-border-color: var(--onyx-color-base-success-400);
9794
}
9895

9996
@include invalid(#{$base-selector}__native) {

0 commit comments

Comments
 (0)