@warp-ds/elements 2.10.0-next.20 → 2.10.0-next.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/custom-elements.json +38 -0
  2. package/dist/docs/slider/api.md +16 -0
  3. package/dist/docs/slider/slider.md +16 -0
  4. package/dist/index.d.ts +8 -0
  5. package/dist/packages/checkbox-group/checkbox-group.js +6 -6
  6. package/dist/packages/checkbox-group/checkbox-group.js.map +2 -2
  7. package/dist/packages/checkbox-group/checkbox-group.test.js +93 -6
  8. package/dist/packages/combobox/combobox.test.js +101 -0
  9. package/dist/packages/radio-group/radio-group.js +1 -1
  10. package/dist/packages/radio-group/radio-group.js.map +2 -2
  11. package/dist/packages/radio-group/radio-group.test.js +78 -9
  12. package/dist/packages/select/locales/da/messages.mjs +1 -1
  13. package/dist/packages/select/locales/en/messages.mjs +1 -1
  14. package/dist/packages/select/locales/fi/messages.mjs +1 -1
  15. package/dist/packages/select/locales/nb/messages.mjs +1 -1
  16. package/dist/packages/select/locales/sv/messages.mjs +1 -1
  17. package/dist/packages/select/select.js +5 -5
  18. package/dist/packages/select/select.js.map +2 -2
  19. package/dist/packages/select/select.test.js +52 -0
  20. package/dist/packages/slider/locales/da/messages.mjs +1 -1
  21. package/dist/packages/slider/locales/en/messages.mjs +1 -1
  22. package/dist/packages/slider/locales/fi/messages.mjs +1 -1
  23. package/dist/packages/slider/locales/nb/messages.mjs +1 -1
  24. package/dist/packages/slider/locales/sv/messages.mjs +1 -1
  25. package/dist/packages/slider/react.d.ts +1 -1
  26. package/dist/packages/slider/slider.d.ts +8 -0
  27. package/dist/packages/slider/slider.js +52 -13
  28. package/dist/packages/slider/slider.js.map +3 -3
  29. package/dist/packages/slider/slider.react.stories.d.ts +1 -1
  30. package/dist/packages/slider/slider.stories.d.ts +2 -0
  31. package/dist/packages/slider/slider.stories.js +36 -0
  32. package/dist/packages/slider/slider.test.js +107 -0
  33. package/dist/packages/textarea/locales/da/messages.mjs +1 -1
  34. package/dist/packages/textarea/locales/en/messages.mjs +1 -1
  35. package/dist/packages/textarea/locales/fi/messages.mjs +1 -1
  36. package/dist/packages/textarea/locales/nb/messages.mjs +1 -1
  37. package/dist/packages/textarea/locales/sv/messages.mjs +1 -1
  38. package/dist/packages/textarea/textarea.d.ts +1 -0
  39. package/dist/packages/textarea/textarea.js +20 -20
  40. package/dist/packages/textarea/textarea.js.map +4 -4
  41. package/dist/packages/textarea/textarea.test.js +73 -0
  42. package/dist/packages/textfield/locales/da/messages.mjs +1 -1
  43. package/dist/packages/textfield/locales/en/messages.mjs +1 -1
  44. package/dist/packages/textfield/locales/fi/messages.mjs +1 -1
  45. package/dist/packages/textfield/locales/nb/messages.mjs +1 -1
  46. package/dist/packages/textfield/locales/sv/messages.mjs +1 -1
  47. package/dist/packages/textfield/textfield.js +11 -11
  48. package/dist/packages/textfield/textfield.js.map +2 -2
  49. package/dist/packages/textfield/textfield.test.js +71 -0
  50. package/dist/web-types.json +13 -2
  51. package/eik/index.js +11 -11
  52. package/package.json +1 -1
@@ -1,9 +1,14 @@
1
+ import { i18n } from "@lingui/core";
1
2
  import { userEvent } from "vitest/browser";
2
3
  import { html } from "lit";
3
4
  import { expect, test, vi } from "vitest";
4
5
  import { render } from "vitest-browser-lit";
5
6
  import "../affix/affix.js";
6
7
  import "./textfield.js";
8
+ import { messages } from "./locales/en/messages.mjs";
9
+ // Initialize i18n with English locale for tests
10
+ i18n.load("en", messages);
11
+ i18n.activate("en");
7
12
  test("renders the textfield", async () => {
8
13
  const component = html `<w-textfield label="Test label"></w-textfield>`;
9
14
  const page = render(component);
@@ -150,3 +155,69 @@ test("submits the associated form when input has focus and user presses Enter",
150
155
  await userEvent.keyboard("{Enter}");
151
156
  expect(onSubmit).toHaveBeenCalled();
152
157
  });
158
+ test("renders optional indicator as 'Optional' without parentheses", async () => {
159
+ const page = render(html `<w-textfield label="Email" optional></w-textfield>`);
160
+ await expect.element(page.getByText("Optional")).toBeVisible();
161
+ expect(page.getByText("(optional)").query()).toBeNull();
162
+ });
163
+ test("does not render optional indicator when both required and optional are set", async () => {
164
+ const page = render(html `<w-textfield label="Email" required optional></w-textfield>`);
165
+ await expect.element(page.getByText("Email")).toBeVisible();
166
+ expect(page.getByText("Optional").query()).toBeNull();
167
+ });
168
+ test("includes optional indicator in the accessible name", async () => {
169
+ const page = render(html `<w-textfield label="Email" optional></w-textfield>`);
170
+ await expect
171
+ .element(page.getByRole("textbox", { name: /Email.*Optional/ }))
172
+ .toBeVisible();
173
+ });
174
+ test("removes optional indicator when required is added dynamically", async () => {
175
+ const page = render(html `<w-textfield
176
+ label="Email"
177
+ optional
178
+ data-testid="field"
179
+ ></w-textfield>`);
180
+ await expect.element(page.getByText("Optional")).toBeVisible();
181
+ const el = page.getByTestId("field").element();
182
+ el.required = true;
183
+ await el.updateComplete;
184
+ expect(page.getByText("Optional").query()).toBeNull();
185
+ });
186
+ test("shows optional indicator when required is removed dynamically", async () => {
187
+ const page = render(html `<w-textfield
188
+ label="Email"
189
+ required
190
+ optional
191
+ data-testid="field"
192
+ ></w-textfield>`);
193
+ expect(page.getByText("Optional").query()).toBeNull();
194
+ const el = page.getByTestId("field").element();
195
+ el.required = false;
196
+ await el.updateComplete;
197
+ await expect.element(page.getByText("Optional")).toBeVisible();
198
+ });
199
+ test("does not render optional indicator when there is no label", async () => {
200
+ const page = render(html `<w-textfield aria-label="Email" optional></w-textfield>`);
201
+ await expect.element(page.getByLabelText("Email")).toBeVisible();
202
+ expect(page.getByText("Optional").query()).toBeNull();
203
+ });
204
+ test("excludes optional indicator from accessible name when required suppresses it", async () => {
205
+ const page = render(html `<w-textfield label="Email" required optional></w-textfield>`);
206
+ const input = page.getByRole("textbox", { name: "Email" });
207
+ await expect.element(input).toBeVisible();
208
+ // Verify "Optional" is not part of the accessible name
209
+ expect(page.getByRole("textbox", { name: /Optional/ }).query()).toBeNull();
210
+ });
211
+ test("renders localized optional text based on document lang", async () => {
212
+ const originalLang = document.documentElement.lang;
213
+ document.documentElement.lang = "nb";
214
+ const page = render(html `<w-textfield
215
+ label="Email"
216
+ optional
217
+ data-testid="field"
218
+ ></w-textfield>`);
219
+ const el = page.getByTestId("field").element();
220
+ await el.updateComplete;
221
+ await expect.element(page.getByText("Valgfri")).toBeVisible();
222
+ document.documentElement.lang = originalLang;
223
+ });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "name": "@warp-ds/elements",
4
- "version": "2.10.0-next.19",
4
+ "version": "2.10.0-next.20",
5
5
  "description-markup": "markdown",
6
6
  "contributions": {
7
7
  "html": {
@@ -2269,6 +2269,11 @@
2269
2269
  "description": "Ensures a child slider thumb has a value before allowing the containing form to submit",
2270
2270
  "value": { "type": "boolean", "default": "false" }
2271
2271
  },
2272
+ {
2273
+ "name": "optional",
2274
+ "description": "Whether to show the optional indicator after the label.",
2275
+ "value": { "type": "boolean", "default": "false" }
2276
+ },
2272
2277
  {
2273
2278
  "name": "min",
2274
2279
  "description": "The minimum allowed value in the range inputs",
@@ -2356,6 +2361,11 @@
2356
2361
  "description": "Ensures a child slider thumb has a value before allowing the containing form to submit",
2357
2362
  "type": "boolean"
2358
2363
  },
2364
+ {
2365
+ "name": "optional",
2366
+ "description": "Whether to show the optional indicator after the label.",
2367
+ "type": "boolean"
2368
+ },
2359
2369
  {
2360
2370
  "name": "min",
2361
2371
  "description": "The minimum allowed value in the range inputs",
@@ -2400,7 +2410,8 @@
2400
2410
  "name": "labelFormatter",
2401
2411
  "description": "Formatter for the min and max labels below the range.",
2402
2412
  "type": "((slot: SliderSlot) => string) | undefined"
2403
- }
2413
+ },
2414
+ { "name": "_label" }
2404
2415
  ],
2405
2416
  "events": []
2406
2417
  }