From c413fdf4d8ce2c95acd94d28e36f2d0b8ac0b6c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Thu, 6 Feb 2025 13:06:08 +0100 Subject: [PATCH 01/15] Select reimplemented with new tokens --- packages/lib/src/index.ts | 2 +- packages/lib/src/select/Select.stories.tsx | 68 +- packages/lib/src/select/Select.test.tsx | 56 +- packages/lib/src/select/Select.tsx | 782 +++++++++------------ packages/lib/src/select/utils.ts | 43 +- 5 files changed, 387 insertions(+), 564 deletions(-) diff --git a/packages/lib/src/index.ts b/packages/lib/src/index.ts index fd0fc86ca5..3ded437d20 100644 --- a/packages/lib/src/index.ts +++ b/packages/lib/src/index.ts @@ -1,5 +1,5 @@ import "./styles/fonts.css"; -// import "./styles/variables.css"; +import "./styles/variables.css"; export { default as DxcAccordion } from "./accordion/Accordion"; export { default as DxcAccordionGroup } from "./accordion-group/AccordionGroup"; diff --git a/packages/lib/src/select/Select.stories.tsx b/packages/lib/src/select/Select.stories.tsx index 07f3ed7c32..366b1dcd46 100644 --- a/packages/lib/src/select/Select.stories.tsx +++ b/packages/lib/src/select/Select.stories.tsx @@ -6,7 +6,7 @@ import Title from "../../.storybook/components/Title"; import preview from "../../.storybook/preview"; import { disabledRules } from "../../test/accessibility/rules/specific/select/disabledRules"; import DxcFlex from "../flex/Flex"; -import HalstackContext, { HalstackProvider } from "../HalstackContext"; +import HalstackContext from "../HalstackContext"; import Listbox from "./Listbox"; import DxcSelect from "./Select"; import { Meta, StoryObj } from "@storybook/react"; @@ -219,17 +219,18 @@ const optionsWithEllipsis = [ { label: "Option 03111111111111111111111111111122222222", value: "3" }, ]; -const opinionatedTheme = { - select: { - selectedOptionBackgroundColor: "#fabada", - fontColor: "#333", - optionFontColor: "#a46ede", - hoverBorderColor: "#0095ff", - }, -}; - const Select = () => ( <> + + + <DxcSelect + label="Simple select" + helperText="Simple simple" + optional + options={single_options} + placeholder="Very simple" + /> + </ExampleContainer> <Title title="States" theme="light" level={2} /> <ExampleContainer pseudoState="pseudo-hover"> <Title title="Hovered" theme="light" level={4} /> @@ -361,36 +362,6 @@ const Select = () => ( </> ); -const Opinionated = () => ( - <> - <Title title="Opinionated theme" theme="light" level={2} /> - <ExampleContainer pseudoState="pseudo-hover"> - <Title title="Default" theme="light" level={4} /> - <HalstackProvider theme={opinionatedTheme}> - <DxcSelect label="Hovered" helperText="Helper text" placeholder="Placeholder" options={single_options} /> - </HalstackProvider> - </ExampleContainer> - <ExampleContainer pseudoState="pseudo-hover"> - <Title title="Hovered" theme="light" level={4} /> - <HalstackProvider theme={opinionatedTheme}> - <DxcSelect - label="Hovered" - helperText="Helper text" - options={single_options} - multiple - defaultValue={["1", "2"]} - /> - </HalstackProvider> - </ExampleContainer> - <ExampleContainer pseudoState="pseudo-hover" expanded> - <Title title="List opened" theme="light" level={4} /> - <HalstackProvider theme={opinionatedTheme}> - <DxcSelect label="Hovered" helperText="Helper text" options={icon_options_grouped_material} defaultValue="1" /> - </HalstackProvider> - </ExampleContainer> - </> -); - const SelectListbox = () => { const colorsTheme = useContext(HalstackContext); @@ -602,9 +573,7 @@ const DefaultGroupedOptionsSelect = () => ( const DefaultGroupedOptionsSelectOpinionated = () => ( <ExampleContainer expanded> <Title title="Grouped options simple select" theme="light" level={4} /> - <HalstackProvider theme={opinionatedTheme}> - <DxcSelect label="Label" options={group_options} defaultValue="9" placeholder="Choose an option" /> - </HalstackProvider> + <DxcSelect label="Label" options={group_options} defaultValue="9" placeholder="Choose an option" /> </ExampleContainer> ); @@ -685,15 +654,6 @@ export const Chromatic: Story = { }, }; -export const OpinionatedTheme: Story = { - render: Opinionated, - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - const combobox = canvas.getAllByRole("combobox")[2]; - combobox && await userEvent.click(combobox); - }, -}; - export const ListboxStates: Story = { render: SelectListbox, play: async ({ canvasElement }) => { @@ -724,7 +684,7 @@ export const MultipleSearchableWithValue: Story = { play: async ({ canvasElement }) => { const canvas = within(canvasElement); const combobox = canvas.getAllByRole("combobox")[0]; - combobox && await userEvent.click(combobox); + combobox && (await userEvent.click(combobox)); }, }; @@ -751,7 +711,7 @@ export const MultipleOptionsDisplayed: Story = { play: async ({ canvasElement }) => { const canvas = within(canvasElement); const combobox = canvas.getAllByRole("combobox")[0]; - combobox && await userEvent.click(combobox); + combobox && (await userEvent.click(combobox)); }, }; diff --git a/packages/lib/src/select/Select.test.tsx b/packages/lib/src/select/Select.test.tsx index 2da6718b04..9ea606466e 100644 --- a/packages/lib/src/select/Select.test.tsx +++ b/packages/lib/src/select/Select.test.tsx @@ -87,7 +87,6 @@ describe("Select component tests", () => { await userEvent.click(label); expect(document.activeElement).toEqual(select); }); - test("Renders with correct aria attributes when is in error state", () => { const { getByText, getByRole } = render( <DxcSelect label="Error label" error="Error message." options={singleOptions} /> @@ -100,7 +99,6 @@ describe("Select component tests", () => { expect(select.getAttribute("aria-invalid")).toBe("true"); expect(errorMessage.getAttribute("aria-live")).toBe("assertive"); }); - test("Renders with correct aria attributes", async () => { const { getByText, getByRole } = render( <DxcSelect label="test-select-label" placeholder="Example" options={singleOptions} /> @@ -120,7 +118,6 @@ describe("Select component tests", () => { expect(select.getAttribute("aria-controls")).toBe(list.id); expect(list.getAttribute("aria-multiselectable")).toBe("false"); }); - test("Renders with correct error aria label", () => { const { getByRole } = render( <DxcSelect ariaLabel="Example aria label" placeholder="Example" options={singleOptions} /> @@ -128,7 +125,6 @@ describe("Select component tests", () => { const select = getByRole("combobox"); expect(select.getAttribute("aria-label")).toBe("Example aria label"); }); - test("Single selection: Renders with correct default value", async () => { const { getByText, getByRole, getAllByRole, queryByRole, container } = render( <DxcSelect label="test-select-label" name="test" defaultValue="4" options={singleOptions} /> @@ -145,7 +141,6 @@ describe("Select component tests", () => { expect(getByText("Option 08")).toBeTruthy(); expect(submitInput?.value).toBe("8"); }); - test("Multiple selection: Renders with correct default value", async () => { const { getByText, getByRole, getAllByRole, queryByRole, container } = render( <DxcSelect @@ -167,7 +162,6 @@ describe("Select component tests", () => { expect(getByText("Option 02, Option 03, Option 04, Option 06")).toBeTruthy(); expect(submitInput?.value).toBe("4,2,6,3"); }); - test("Sends its value when submitted", async () => { const handlerOnSubmit = jest.fn((e) => { e.preventDefault(); @@ -194,7 +188,6 @@ describe("Select component tests", () => { options[2] && (await userEvent.click(options[2])); await userEvent.click(submit); }); - test("Searching for a value with an empty list of options passed doesn't open the listbox", async () => { const { container, getByRole, queryByRole } = render( <DxcSelect label="test-select-label" options={[]} searchable /> @@ -208,7 +201,6 @@ describe("Select component tests", () => { expect(queryByRole("listbox")).toBeFalsy(); expect(select.getAttribute("aria-expanded")).toBe("false"); }); - test("Disabled select - Cannot gain focus or open the listbox via click", async () => { const { getByRole, queryByRole } = render( <DxcSelect label="test-select-label" value={["1", "2"]} options={singleOptions} multiple disabled /> @@ -219,7 +211,6 @@ describe("Select component tests", () => { expect(queryByRole("listbox")).toBeFalsy(); expect(document.activeElement === select).toBeFalsy(); }); - test("Disabled select - Clear all options action must be shown but not clickable", async () => { const { getByRole, getByText } = render( <DxcSelect label="test-select-label" value={["1", "2"]} options={singleOptions} disabled searchable multiple /> @@ -227,7 +218,6 @@ describe("Select component tests", () => { await userEvent.click(getByRole("button")); expect(getByText("Option 01, Option 02")).toBeTruthy(); }); - test("Disabled select - Does not call onBlur event", async () => { const onBlur = jest.fn(); const { getByRole } = render( @@ -238,7 +228,6 @@ describe("Select component tests", () => { fireEvent.keyDown(getByRole("combobox"), { key: "Tab", code: "Tab", keyCode: 9, charCode: 9 }); expect(onBlur).not.toHaveBeenCalled(); }); - test("Disabled select - When the component gains the focus, the listbox does not open", () => { const { getByRole, queryByRole } = render( <DxcSelect label="test-select-label" value={["1", "2"]} options={singleOptions} disabled searchable multiple /> @@ -248,7 +237,6 @@ describe("Select component tests", () => { expect(queryByRole("listbox")).toBeFalsy(); expect(document.activeElement === select).toBeFalsy(); }); - test("Disabled select - Doesn't send its value when submitted", async () => { const handlerOnSubmit = jest.fn((e) => { e.preventDefault(); @@ -265,7 +253,6 @@ describe("Select component tests", () => { const submit = getByText("Submit"); await userEvent.click(submit); }); - test("Controlled - Single selection - Not optional constraint", async () => { const onChange = jest.fn(); const onBlur = jest.fn(); @@ -287,7 +274,6 @@ describe("Select component tests", () => { expect(onBlur).toHaveBeenCalled(); expect(onBlur).toHaveBeenCalledWith({ value: "1" }); }); - test("Controlled - Multiple selection - Not optional constraint", async () => { const onChange = jest.fn(); const onBlur = jest.fn(); @@ -319,7 +305,6 @@ describe("Select component tests", () => { expect(onBlur).toHaveBeenCalled(); expect(onBlur).toHaveBeenCalledWith({ value: [], error: "This field is required. Please, enter a value." }); }); - test("Controlled - Optional constraint", () => { const onChange = jest.fn(); const onBlur = jest.fn(); @@ -334,7 +319,6 @@ describe("Select component tests", () => { expect(onBlur).toHaveBeenCalledWith({ value: "" }); expect(select.getAttribute("aria-invalid")).toBe("false"); }); - test("Non-Grouped Options - Opens listbox and renders correctly or closes it with a click on select", async () => { const { getByText, getByRole, getAllByRole, queryByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} /> @@ -352,7 +336,6 @@ describe("Select component tests", () => { expect(queryByRole("listbox")).toBeFalsy(); expect(select.getAttribute("aria-expanded")).toBe("false"); }); - test("Non-Grouped Options - If an empty list of options is passed, the select is rendered but doesn't open the listbox", async () => { const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={[]} />); const select = getByRole("combobox"); @@ -360,7 +343,6 @@ describe("Select component tests", () => { expect(queryByRole("listbox")).toBeFalsy(); expect(select.getAttribute("aria-expanded")).toBe("false"); }); - test("Non-Grouped Options - Click in an option selects it and closes the listbox", async () => { const onChange = jest.fn(); const { getByText, getByRole, getAllByRole, queryByRole, container } = render( @@ -379,7 +361,6 @@ describe("Select component tests", () => { expect(options[2]?.getAttribute("aria-selected")).toBe("true"); expect(submitInput?.value).toBe("3"); }); - test("Non-Grouped Options - Optional renders an empty first option (selected by default) with the placeholder as its label", async () => { const onChange = jest.fn(); const { getByRole, getAllByRole, getAllByText } = render( @@ -407,7 +388,6 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); expect(select.getAttribute("aria-activedescendant")).toBe("option-0"); }); - test("Non-Grouped Options - Filtering options never affects the optional item until there are no coincidences", async () => { const { getAllByRole, getByText, queryByText, container } = render( <DxcSelect @@ -430,7 +410,6 @@ describe("Select component tests", () => { expect(queryByText("Placeholder example")).toBeFalsy(); expect(getByText("No matches found")).toBeTruthy(); }); - test("Non-Grouped Options: Arrow up key - Opens the listbox and visually focus the last option", () => { const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={singleOptions} />); const select = getByRole("combobox"); @@ -438,7 +417,6 @@ describe("Select component tests", () => { expect(queryByRole("listbox")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-19"); }); - test("Non-Grouped Options: Arrow up key - Puts the focus in last option when the first one is visually focused", () => { const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={singleOptions} />); const select = getByRole("combobox"); @@ -447,7 +425,6 @@ describe("Select component tests", () => { expect(queryByRole("listbox")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-19"); }); - test("Non-Grouped Options: Arrow down key - Opens the listbox and visually focus the first option", () => { const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={singleOptions} />); const select = getByRole("combobox"); @@ -455,7 +432,6 @@ describe("Select component tests", () => { expect(queryByRole("listbox")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-0"); }); - test("Non-Grouped Options: Arrow down key - Puts the focus in the first option when the last one is visually focused", () => { const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={singleOptions} />); const select = getByRole("combobox"); @@ -464,7 +440,6 @@ describe("Select component tests", () => { expect(queryByRole("listbox")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-0"); }); - test("Non-Grouped Options: Enter key - Selects the visually focused option and closes the listbox", async () => { const onChange = jest.fn(); const { getByText, getByRole, getAllByRole, queryByRole } = render( @@ -483,7 +458,6 @@ describe("Select component tests", () => { const options = getAllByRole("option"); expect(options[20]?.getAttribute("aria-selected")).toBe("true"); }); - test("Non-Grouped Options: Searchable - Displays an input for filtering the list of options", async () => { const onChange = jest.fn(); const { container, getByText, getByRole, getAllByRole, queryByRole } = render( @@ -503,7 +477,6 @@ describe("Select component tests", () => { const options = getAllByRole("option"); expect(options[7]?.getAttribute("aria-selected")).toBe("true"); }); - test("Non-Grouped Options: Searchable - Displays 'No matches found' when there are no filtering results", async () => { const onChange = jest.fn(); const { container, getByText, getByRole } = render( @@ -516,7 +489,6 @@ describe("Select component tests", () => { searchInput && (await userEvent.type(searchInput, "abc")); expect(getByText("No matches found")).toBeTruthy(); }); - test("Non-Grouped Options: Searchable - Clicking the select, when the list is open, clears the search value", async () => { const onChange = jest.fn(); const { container, getByText, getByRole, getAllByRole } = render( @@ -537,7 +509,6 @@ describe("Select component tests", () => { }); expect(searchInput?.value).toBe(""); }); - test("Non-Grouped Options: Searchable - Writing displays the listbox, if it was not open", async () => { const onChange = jest.fn(); const { container, getByRole, queryByRole } = render( @@ -551,7 +522,6 @@ describe("Select component tests", () => { searchInput && (await userEvent.type(searchInput, "2")); expect(getByRole("listbox")).toBeTruthy(); }); - test("Non-Grouped Options: Searchable - Key Esc cleans the search value and closes the options", async () => { const onChange = jest.fn(); const { container, getByRole, queryByRole } = render( @@ -564,7 +534,6 @@ describe("Select component tests", () => { expect(searchInput?.value).toBe(""); expect(queryByRole("listbox")).toBeFalsy(); }); - test("Non-Grouped Options: Searchable - While user types, a clear action is displayed for cleaning the search value", async () => { const onChange = jest.fn(); const { container, getByRole, getAllByRole, queryByRole } = render( @@ -580,7 +549,6 @@ describe("Select component tests", () => { expect(getAllByRole("option").length).toBe(20); expect(queryByRole("button")).toBeFalsy(); }); - test("Non-Grouped Options: Multiple selection - Displays a checkbox per option and enables the multi-selection", async () => { const onChange = jest.fn(); const { getByText, getAllByText, getByRole, getAllByRole, queryByRole, container } = render( @@ -603,7 +571,6 @@ describe("Select component tests", () => { expect(getByText("Option 11, Option 19")).toBeTruthy(); expect(submitInput?.value).toBe("11,19"); }); - test("Non-Grouped Options: Multiple selection - Clear action and selection indicator", async () => { const onChange = jest.fn(); const { getByText, queryByText, getByRole, getAllByRole, queryByRole } = render( @@ -628,7 +595,6 @@ describe("Select component tests", () => { expect(queryByText("3")).toBeFalsy(); expect(queryByRole("button")).toBeFalsy(); }); - test("Non-Grouped Options: Multiple selection - Optional option should not be added when the select is marked as multiple", async () => { const onChange = jest.fn(); const { getByText, getAllByText, getByRole, getAllByRole } = render( @@ -650,7 +616,6 @@ describe("Select component tests", () => { expect(onChange).toHaveBeenCalledWith({ value: ["1"] }); expect(getAllByText("Option 01").length).toBe(2); }); - test("Non-Grouped Options - If an options was previously selected when its opened (by key press), the visual focus appears always in the selected option", async () => { const { getByText, getByRole, getAllByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} /> @@ -672,7 +637,6 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); expect(getByText("Option 06")).toBeTruthy(); }); - test("Non-Grouped Options - If an options was previously selected when its opened (by click and key press), the visual focus appears always in the selected option", async () => { const { getByText, getByRole, getAllByRole, queryByRole } = render( <DxcSelect label="test-select-label" options={singleOptions} /> @@ -697,7 +661,6 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); expect(getByText("Option 17")).toBeTruthy(); }); - test("Grouped Options - Opens listbox and renders it correctly or closes it with a click on select", async () => { const { getByText, getByRole, getAllByRole, queryByRole } = render( <DxcSelect label="test-select-label" options={groupOptions} /> @@ -723,7 +686,6 @@ describe("Select component tests", () => { expect(queryByRole("list")).toBeFalsy(); expect(select.getAttribute("aria-expanded")).toBe("false"); }); - test("Grouped Options - If an empty list of options in a group is passed, the select is rendered but doesn't open the listbox", async () => { const { getByRole, queryByRole } = render( <DxcSelect @@ -741,7 +703,6 @@ describe("Select component tests", () => { expect(queryByRole("list")).toBeFalsy(); expect(select.getAttribute("aria-expanded")).toBe("false"); }); - test("Grouped Options - Click in an option selects it and closes the listbox", async () => { const onChange = jest.fn(); const { getByText, getByRole, getAllByRole, queryByRole, container } = render( @@ -760,7 +721,6 @@ describe("Select component tests", () => { expect(options[8]?.getAttribute("aria-selected")).toBe("true"); expect(submitInput?.value).toBe("oviedo"); }); - test("Grouped Options - Optional renders an empty first option (out of any group) with the placeholder as its label", async () => { const onChange = jest.fn(); const { getByRole, getAllByRole, getAllByText } = render( @@ -788,7 +748,6 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); expect(select.getAttribute("aria-activedescendant")).toBe("option-0"); }); - test("Grouped Options - Filtering options never affects the optional item until there are no coincidence", async () => { const { getByRole, getAllByRole, getByText, queryByText, container } = render( <DxcSelect @@ -809,7 +768,6 @@ describe("Select component tests", () => { expect(queryByText("Placeholder example")).toBeFalsy(); expect(getByText("No matches found")).toBeTruthy(); }); - test("Grouped Options: Arrow up key - Opens the listbox and visually focus the last option", () => { const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupOptions} />); const select = getByRole("combobox"); @@ -817,7 +775,6 @@ describe("Select component tests", () => { expect(queryByRole("list")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-17"); }); - test("Grouped Options: Arrow up key - Puts the focus in last option when the first one is visually focused", () => { const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupOptions} />); const select = getByRole("combobox"); @@ -826,7 +783,6 @@ describe("Select component tests", () => { expect(queryByRole("list")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-17"); }); - test("Grouped Options: Arrow down key - Opens the listbox and visually focus the first option", () => { const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupOptions} />); const select = getByRole("combobox"); @@ -834,7 +790,6 @@ describe("Select component tests", () => { expect(queryByRole("list")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-0"); }); - test("Grouped Options: Arrow down key - Puts the focus in the first option when the last one is visually focused", () => { const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupOptions} />); const select = getByRole("combobox"); @@ -843,7 +798,6 @@ describe("Select component tests", () => { expect(queryByRole("list")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-0"); }); - test("Grouped Options: Enter key - Selects the visually focused option and closes the listbox", async () => { const onChange = jest.fn(); const { getByText, getByRole, getAllByRole, queryByRole } = render( @@ -862,7 +816,6 @@ describe("Select component tests", () => { const options = getAllByRole("option"); expect(options[18]?.getAttribute("aria-selected")).toBe("true"); }); - test("Grouped Options: Searchable - Displays an input for filtering the list of options", async () => { const onChange = jest.fn(); const { container, getByText, getByRole, getAllByRole, queryByRole } = render( @@ -887,7 +840,6 @@ describe("Select component tests", () => { options = getAllByRole("option"); expect(options[17]?.getAttribute("aria-selected")).toBe("true"); }); - test("Grouped Options: Searchable - Displays 'No matches found' when there are no filtering results", async () => { const onChange = jest.fn(); const { container, getByText, getByRole } = render( @@ -900,7 +852,6 @@ describe("Select component tests", () => { searchInput && (await userEvent.type(searchInput, "very long string")); expect(getByText("No matches found")).toBeTruthy(); }); - test("Grouped Options: Multiple selection - Displays a checkbox per option and enables the multi-selection", async () => { const onChange = jest.fn(); const { getByText, getAllByText, getByRole, getAllByRole, queryByRole, container } = render( @@ -922,7 +873,6 @@ describe("Select component tests", () => { expect(getByText("Bilbao, Guadalquivir")).toBeTruthy(); expect(submitInput?.value).toBe("bilbao,guadalquivir"); }); - test("Grouped Options: Multiple selection - Clear action and selection indicator", async () => { const onChange = jest.fn(); const { getByText, queryByText, getByRole, getAllByRole, queryByRole } = render( @@ -947,7 +897,6 @@ describe("Select component tests", () => { expect(queryByText("4")).toBeFalsy(); expect(queryByRole("button")).toBeFalsy(); }); - test("Grouped Options: Multiple selection - Optional option should not be added when the select is marked as multiple", async () => { const onChange = jest.fn(); const { getByText, getAllByText, getByRole, getAllByRole } = render( @@ -969,7 +918,6 @@ describe("Select component tests", () => { expect(onChange).toHaveBeenCalledWith({ value: ["azul"] }); expect(getAllByText("Azul").length).toBe(2); }); - test("Grouped Options - If an options was previously selected when its opened (by key press), the visual focus appears always in the selected option", async () => { const { getByText, getByRole, getAllByRole } = render( <DxcSelect label="test-select-label" options={groupOptions} /> @@ -991,7 +939,6 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); expect(getByText("Verde")).toBeTruthy(); }); - test("Grouped Options - If an options was previously selected when its opened (by click and key press), the visual focus appears always in the selected option", async () => { const { getByText, getByRole, getAllByRole } = render( <DxcSelect label="test-select-label" options={groupOptions} /> @@ -1014,7 +961,6 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); expect(getByText("Azul")).toBeTruthy(); }); - test("Multiple selection and optional - Clear action cleans every selected option but does not display an error", async () => { const onChange = jest.fn(); const { getByRole, getAllByRole } = render( @@ -1032,4 +978,4 @@ describe("Select component tests", () => { await userEvent.click(clearSelectionButton); expect(onChange).toHaveBeenCalledWith({ value: [] }); }); -}); +}); \ No newline at end of file diff --git a/packages/lib/src/select/Select.tsx b/packages/lib/src/select/Select.tsx index b1cc105805..983ce3fa9b 100644 --- a/packages/lib/src/select/Select.tsx +++ b/packages/lib/src/select/Select.tsx @@ -12,16 +12,16 @@ import { useRef, useState, } from "react"; -import styled, { ThemeProvider } from "styled-components"; +import styled from "styled-components"; import { spaces } from "../common/variables"; -import { getMargin } from "../common/utils"; import DxcIcon from "../icon/Icon"; import { Tooltip, TooltipWrapper } from "../tooltip/Tooltip"; -import HalstackContext, { HalstackLanguageContext } from "../HalstackContext"; +import { HalstackLanguageContext } from "../HalstackContext"; import useWidth from "../utils/useWidth"; import Listbox from "./Listbox"; import { - canOpenOptions, + calculateWidth, + canOpenListbox, filterOptionsBySearchValue, getLastOptionIndex, getSelectedOption, @@ -31,6 +31,194 @@ import { notOptionalCheck, } from "./utils"; import SelectPropsType, { ListOptionType, RefType } from "./types"; +import DxcActionIcon from "../action-icon/ActionIcon"; +import DxcFlex from "../flex/Flex"; + +const SelectContainer = styled.div<{ + margin: SelectPropsType["margin"]; + size: SelectPropsType["size"]; +}>` + box-sizing: border-box; + display: flex; + flex-direction: column; + width: ${(props) => calculateWidth(props.margin, props.size)}; + ${(props) => props.size !== "fillParent" && `min-width:${calculateWidth(props.margin, props.size)}`}; + margin: ${(props) => (props.margin && typeof props.margin !== "object" ? spaces[props.margin] : "0px")}; + margin-top: ${(props) => + props.margin && typeof props.margin === "object" && props.margin.top ? spaces[props.margin.top] : ""}; + margin-right: ${(props) => + props.margin && typeof props.margin === "object" && props.margin.right ? spaces[props.margin.right] : ""}; + margin-bottom: ${(props) => + props.margin && typeof props.margin === "object" && props.margin.bottom ? spaces[props.margin.bottom] : ""}; + margin-left: ${(props) => + props.margin && typeof props.margin === "object" && props.margin.left ? spaces[props.margin.left] : ""}; + font-family: var(--typography-font-family); +`; + +const Label = styled.label<{ + disabled: SelectPropsType["disabled"]; + helperText: SelectPropsType["helperText"]; +}>` + color: var(${({ disabled }) => (disabled ? "--color-fg-neutral-medium" : "--color-fg-neutral-dark")}); + font-size: var(--typography-label-m); + font-weight: var(--typography-label-semibold); + ${({ helperText }) => !helperText && "margin-bottom: var(--spacing-gap-xs);"} + + > span { + color: var(--color-fg-neutral-stronger); + font-weight: var(--typography-label-regular); + } +`; + +const HelperText = styled.span<{ disabled: SelectPropsType["disabled"] }>` + color: var(--color-fg-neutral-stronger); + font-size: var(--typography-helper-text-s); + font-weight: var(--typography-helper-text-regular); + margin-bottom: var(--spacing-gap-xs); +`; + +const Select = styled.div<{ + disabled: SelectPropsType["disabled"]; + error: SelectPropsType["error"]; +}>` + position: relative; + display: flex; + align-items: center; + gap: var(--spacing-gap-s); + height: var(--height-m); + padding: var(--spacing-padding-none) var(--spacing-padding-xs); + border-radius: var(--border-radius-s); + border: var(--border-width-s) var(--border-style-default) var(--border-color-neutral-dark); + ${(props) => + props.error && + !props.disabled && + "border: var(--border-width-m) var(--border-style-default) var(--border-color-error-medium);"} + + ${(props) => + !props.disabled + ? ` + cursor: pointer; + &:hover { + border-color: var(${props.error ? "--border-color-error-strong;" : "--border-color-primary-strong"}); + } + &:focus-within { + outline-offset: -2px; + outline: var(--border-width-m) var(--border-style-default) var(--border-color-secondary-medium); + } + ` + : "background: var(--color-bg-neutral-lighter); border-color: var(--border-color-neutral-medium); cursor: not-allowed;"}; + + /* Collapse indicator */ + > span[role="img"] { + color: var(${({ disabled }) => (disabled ? "--color-fg-neutral-medium" : "--color-fg-neutral-dark")}); + font-size: var(--height-xxs); + } +`; + +const SelectionIndicator = styled.div<{ disabled: SelectPropsType["disabled"] }>` + box-sizing: border-box; + display: grid; + grid-template-columns: 1fr 1fr; + min-width: 48px; + min-height: var(--height-s); + border-radius: var(--border-radius-xs); + border: var(--border-width-s) var(--border-style-default) + var(${({ disabled }) => (disabled ? "--border-color-neutral-strong" : "--border-color-neutral-light")}); +`; + +const SelectionNumber = styled.span<{ disabled: SelectPropsType["disabled"] }>` + display: grid; + place-items: center; + background-color: ${({ disabled }) => (disabled ? "transparent" : "var(--color-bg-neutral-lighter)")}; + border-right: var(--border-width-s) var(--border-style-default) + var(${({ disabled }) => (disabled ? "--border-color-neutral-medium" : "--border-color-neutral-light")}); + color: var(${(props) => (props.disabled ? "--color-fg-neutral-medium" : "--color-fg-neutral-dark")}); + font-size: var(--typography-label-s); + font-weight: var(--typography-label-regular); + text-align: center; + user-select: none; + ${(props) => (props.disabled ? `cursor: not-allowed;` : `cursor: default;`)} +`; + +const ClearOptionsAction = styled.button` + display: grid; + place-items: center; + background-color: transparent; + border: none; + padding: var(--spacing-padding-none); + width: 100%; + font-size: var(--height-xxxs); + + &:focus-visible { + outline: none; + } + ${(props) => + !props.disabled + ? ` + color: var(--color-fg-neutral-dark); + cursor: pointer; + &:hover { + background-color: var(--color-bg-neutral-light); + } + &:active { + background-color: var(--color-bg-neutral-strong); + } + ` + : "color: var(--color-fg-neutral-medium); cursor: not-allowed;"} +`; + +const SearchableValueContainer = styled.div` + display: grid; + width: 100%; +`; + +const SelectedOption = styled.span<{ + disabled: SelectPropsType["disabled"]; + atBackground: boolean; +}>` + grid-area: 1 / 1 / 1 / 1; + color: var( + ${(props) => + props.disabled + ? "--color-fg-neutral-medium" + : props.atBackground + ? "--color-fg-neutral-strong" + : "--color-fg-neutral-dark"} + ); + font-size: var(--typography-label-m); + font-weight: var(--typography-label-regular); + user-select: none; + white-space: pre; + overflow: hidden; + text-overflow: ellipsis; +`; + +const SearchInput = styled.input` + grid-area: 1 / 1 / 1 / 1; + background: none; + border: none; + outline: none; + padding: var(--spacing-padding-none); + color: var(--color-fg-neutral-dark); + font-family: var(--typography-font-family); + font-size: var(--typography-label-m); + font-weight: var(--typography-label-regular); +`; + +const Error = styled.span` + display: flex; + align-items: center; + gap: var(--spacing-gap-xs); + color: var(--color-fg-error-medium); + font-size: var(--typography-helper-text-s); + font-weight: var(--typography-helper-text-regular, 400); + margin-top: var(--spacing-gap-xs); + + /* Error icon */ + > span[role="img"] { + font-size: var(--height-xxs); + } +`; const DxcSelect = forwardRef<RefType, SelectPropsType>( ( @@ -56,10 +244,8 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( }, ref ): JSX.Element => { - const selectId = `select-${useId()}`; - const selectLabelId = `label-${selectId}`; - const errorId = `error-${selectId}`; - const listboxId = `${selectId}-listbox`; + const id = `select-${useId()}`; + const [innerValue, setInnerValue] = useState(defaultValue ?? (multiple ? [] : "")); const [searchValue, setSearchValue] = useState(""); const [visualFocusIndex, changeVisualFocusIndex] = useState(-1); @@ -69,10 +255,9 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( const selectSearchInputRef = useRef<HTMLInputElement | null>(null); const width = useWidth(selectRef.current); - const colorsTheme = useContext(HalstackContext); const translatedLabels = useContext(HalstackLanguageContext); - const optionalItem = { label: placeholder, value: "" }; + const optionalItem = useMemo(() => ({ label: placeholder, value: "" }), [placeholder]); const filteredOptions = useMemo(() => filterOptionsBySearchValue(options, searchValue), [options, searchValue]); const lastOptionIndex = useMemo( () => getLastOptionIndex(options, filteredOptions, searchable, optional, multiple), @@ -84,7 +269,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( ); const openListbox = () => { - if (!isOpen && canOpenOptions(options, disabled)) { + if (!isOpen && canOpenListbox(options, disabled)) { changeIsOpen(true); } }; @@ -95,7 +280,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( } }; - const handleSelectChangeValue = useCallback( + const handleOnChangeValue = useCallback( (newOption: ListOptionType | undefined) => { if (newOption) { let newValue: string | string[]; @@ -120,8 +305,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( }, [multiple, value, innerValue, onChange, optional, translatedLabels] ); - - const handleSelectOnClick = () => { + const handleOnClick = () => { if (searchable) { selectSearchInputRef?.current?.focus(); } @@ -132,12 +316,12 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( openListbox(); } }; - const handleSelectOnFocus = (event: FocusEvent<HTMLInputElement>) => { + const handleOnFocus = (event: FocusEvent<HTMLInputElement>) => { if (!event.currentTarget.contains(event.relatedTarget) && searchable) { selectSearchInputRef?.current?.focus(); } }; - const handleSelectOnBlur = (event: FocusEvent<HTMLInputElement>) => { + const handleOnBlur = (event: FocusEvent<HTMLInputElement>) => { if (!event.currentTarget.contains(event.relatedTarget)) { closeListbox(); setSearchValue(""); @@ -153,7 +337,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( } } }; - const handleSelectOnKeyDown = (event: KeyboardEvent<HTMLDivElement>) => { + const handleOnKeyDown = (event: KeyboardEvent<HTMLDivElement>) => { switch (event.key) { case "Down": case "ArrowDown": @@ -207,35 +391,35 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( if (searchable) { if (filteredOptions.length > 0) { if (optional && !multiple && visualFocusIndex === 0 && groupsHaveOptions(filteredOptions)) { - handleSelectChangeValue(optionalItem); + handleOnChangeValue(optionalItem); } else if (isArrayOfOptionGroups(filteredOptions)) { if (groupsHaveOptions(filteredOptions)) { filteredOptions.some((groupOption) => { const groupLength = accLength + groupOption.options.length; if (groupLength > visualFocusIndex) { - handleSelectChangeValue(groupOption.options[visualFocusIndex - accLength]); + handleOnChangeValue(groupOption.options[visualFocusIndex - accLength]); } accLength = groupLength; return groupLength > visualFocusIndex; }); } } else { - handleSelectChangeValue(filteredOptions[visualFocusIndex - accLength]); + handleOnChangeValue(filteredOptions[visualFocusIndex - accLength]); } } } else if (optional && !multiple && visualFocusIndex === 0) { - handleSelectChangeValue(optionalItem); + handleOnChangeValue(optionalItem); } else if (isArrayOfOptionGroups(options)) { options.some((groupOption) => { const groupLength = accLength + groupOption.options.length; if (groupLength > visualFocusIndex) { - handleSelectChangeValue(groupOption.options[visualFocusIndex - accLength]); + handleOnChangeValue(groupOption.options[visualFocusIndex - accLength]); } accLength = groupLength; return groupLength > visualFocusIndex; }); } else { - handleSelectChangeValue(options[visualFocusIndex - accLength]); + handleOnChangeValue(options[visualFocusIndex - accLength]); } if (!multiple) { closeListbox(); @@ -247,6 +431,10 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( break; } }; + const handleOnMouseEnter = (event: MouseEvent<HTMLSpanElement>) => { + const text = event.currentTarget; + setHasTooltip(text.scrollWidth > text.clientWidth); + }; const handleSearchIOnChange = (event: ChangeEvent<HTMLInputElement>) => { setSearchValue(event.target.value); @@ -269,442 +457,170 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( } }; - const handleClearSearchActionOnClick = (event: MouseEvent<HTMLButtonElement>) => { - event.stopPropagation(); + const handleClearSearchActionOnClick = () => { setSearchValue(""); }; const handleOptionOnClick = useCallback( (option: ListOptionType) => { - handleSelectChangeValue(option); + handleOnChangeValue(option); if (!multiple) { closeListbox(); } setSearchValue(""); }, - [handleSelectChangeValue, closeListbox, multiple] + [handleOnChangeValue, closeListbox, multiple] ); - const handleOnMouseEnter = (event: MouseEvent<HTMLSpanElement>) => { - const text = event.currentTarget; - setHasTooltip(text.scrollWidth > text.clientWidth); - }; - return ( - <ThemeProvider theme={colorsTheme.select}> - <SelectContainer margin={margin} size={size} ref={ref}> - {label && ( - <Label - id={selectLabelId} + <SelectContainer margin={margin} size={size} ref={ref}> + {label && ( + <Label + id={`label-${id}`} + disabled={disabled} + onClick={() => { + selectRef?.current?.focus(); + }} + helperText={helperText} + > + {label} {optional && <span>{translatedLabels.formFields.optionalLabel}</span>} + </Label> + )} + {helperText && <HelperText disabled={disabled}>{helperText}</HelperText>} + <Popover.Root open={isOpen}> + <Popover.Trigger asChild type={undefined}> + <Select + id={id} disabled={disabled} - onClick={() => { - selectRef?.current?.focus(); - }} - helperText={helperText} + error={error} + onBlur={handleOnBlur} + onClick={handleOnClick} + onFocus={handleOnFocus} + onKeyDown={handleOnKeyDown} + ref={selectRef} + tabIndex={disabled ? -1 : tabIndex} + role="combobox" + aria-controls={isOpen ? `${id}-listbox` : undefined} + aria-disabled={disabled} + aria-expanded={isOpen} + aria-haspopup="listbox" + aria-labelledby={label ? `label-${id}` : undefined} + aria-activedescendant={visualFocusIndex >= 0 ? `option-${visualFocusIndex}` : undefined} + aria-invalid={!!error} + aria-errormessage={error ? `error-${id}` : undefined} + aria-required={!disabled && !optional} + aria-label={label ? undefined : ariaLabel} > - {label} {optional && <OptionalLabel>{translatedLabels.formFields.optionalLabel}</OptionalLabel>} - </Label> - )} - {helperText && <HelperText disabled={disabled}>{helperText}</HelperText>} - <Popover.Root open={isOpen}> - <Popover.Trigger asChild type={undefined}> - <Select - id={selectId} - disabled={disabled} - error={error} - onBlur={handleSelectOnBlur} - onClick={handleSelectOnClick} - onFocus={handleSelectOnFocus} - onKeyDown={handleSelectOnKeyDown} - ref={selectRef} - tabIndex={disabled ? -1 : tabIndex} - role="combobox" - aria-controls={isOpen ? listboxId : undefined} - aria-disabled={disabled} - aria-expanded={isOpen} - aria-haspopup="listbox" - aria-labelledby={label ? selectLabelId : undefined} - aria-activedescendant={visualFocusIndex >= 0 ? `option-${visualFocusIndex}` : undefined} - aria-invalid={!!error} - aria-errormessage={error ? errorId : undefined} - aria-required={!disabled && !optional} - aria-label={label ? undefined : ariaLabel} - > - {multiple && Array.isArray(selectedOption) && selectedOption.length > 0 && ( - <SelectionIndicator> - <SelectionNumber disabled={disabled}>{selectedOption.length}</SelectionNumber> - <Tooltip label={translatedLabels.select.actionClearSelectionTitle}> - <ClearOptionsAction - disabled={disabled} - onMouseDown={(event) => { - // Avoid input to lose focus when pressed - event.preventDefault(); - }} - onClick={handleClearOptionsActionOnClick} - tabIndex={-1} - aria-label={translatedLabels.select.actionClearSelectionTitle} - > - <DxcIcon icon="clear" /> - </ClearOptionsAction> - </Tooltip> - </SelectionIndicator> - )} - <TooltipWrapper condition={hasTooltip} label={getSelectedOptionLabel(placeholder, selectedOption)}> - <SearchableValueContainer> - <input - style={{ display: "none" }} - name={name} - disabled={disabled} - value={ - multiple - ? (Array.isArray(value) ? value : Array.isArray(innerValue) ? innerValue : []).join(",") - : (value ?? innerValue) - } - readOnly - aria-hidden="true" - /> - {searchable && ( - <SearchInput - value={searchValue} - disabled={disabled} - onChange={handleSearchIOnChange} - ref={selectSearchInputRef} - autoComplete="nope" - autoCorrect="nope" - size={1} - aria-labelledby={label ? selectLabelId : undefined} - /> - )} - {(!searchable || searchValue === "") && ( - <SelectedOption - disabled={disabled} - atBackground={ - (multiple ? (value ?? innerValue).length === 0 : !(value ?? innerValue)) || - (searchable && isOpen) - } - > - <SelectedOptionLabel onMouseEnter={handleOnMouseEnter}> - {getSelectedOptionLabel(placeholder, selectedOption)} - </SelectedOptionLabel> - </SelectedOption> - )} - </SearchableValueContainer> - </TooltipWrapper> - {!disabled && error && ( - <ErrorIcon> - <DxcIcon icon="filled_error" /> - </ErrorIcon> - )} - {searchable && searchValue.length > 0 && ( + {multiple && Array.isArray(selectedOption) && selectedOption.length > 0 && ( + <SelectionIndicator disabled={disabled}> + <SelectionNumber disabled={disabled}>{selectedOption.length}</SelectionNumber> <Tooltip label={translatedLabels.select.actionClearSelectionTitle}> - <ClearSearchAction + <ClearOptionsAction + disabled={disabled} onMouseDown={(event) => { - // Avoid input to lose focus + // Avoid input to lose focus when pressed event.preventDefault(); }} - onClick={handleClearSearchActionOnClick} + onClick={handleClearOptionsActionOnClick} tabIndex={-1} - aria-label={translatedLabels.select.actionClearSearchTitle} + aria-label={translatedLabels.select.actionClearSelectionTitle} > <DxcIcon icon="clear" /> - </ClearSearchAction> + </ClearOptionsAction> + </Tooltip> + </SelectionIndicator> + )} + <TooltipWrapper condition={hasTooltip} label={getSelectedOptionLabel(placeholder, selectedOption)}> + <SearchableValueContainer> + <input + type="hidden" + name={name} + disabled={disabled} + value={ + multiple + ? (Array.isArray(value) ? value : Array.isArray(innerValue) ? innerValue : []).join(",") + : (value ?? innerValue) + } + /> + {searchable && ( + <SearchInput + value={searchValue} + disabled={disabled} + onChange={handleSearchIOnChange} + ref={selectSearchInputRef} + autoComplete="nope" + autoCorrect="nope" + size={1} + aria-labelledby={label ? `label-${id}` : undefined} + /> + )} + {(!searchable || searchValue === "") && ( + <SelectedOption + disabled={disabled} + atBackground={ + (multiple ? (value ?? innerValue).length === 0 : !(value ?? innerValue)) || + (searchable && isOpen) + } + onMouseEnter={handleOnMouseEnter} + > + {getSelectedOptionLabel(placeholder, selectedOption)} + </SelectedOption> + )} + </SearchableValueContainer> + </TooltipWrapper> + <DxcFlex alignItems="center"> + {searchable && searchValue.length > 0 && ( + <Tooltip label={translatedLabels.select.actionClearSelectionTitle}> + <DxcActionIcon + icon="clear" + onClick={handleClearSearchActionOnClick} + tabIndex={-1} + title={translatedLabels.select.actionClearSearchTitle} + /> </Tooltip> )} - <CollapseIndicator disabled={disabled}> - <DxcIcon icon={isOpen ? "keyboard_arrow_up" : "keyboard_arrow_down"} /> - </CollapseIndicator> - </Select> - </Popover.Trigger> - <Popover.Portal> - <Popover.Content - sideOffset={4} - style={{ zIndex: "2147483647" }} - onOpenAutoFocus={(event) => { - // Avoid select to lose focus when the list is opened - event.preventDefault(); - }} - onCloseAutoFocus={(event) => { - // Avoid select to lose focus when the list is closed - event.preventDefault(); - }} - > - <Listbox - id={listboxId} - currentValue={value ?? innerValue} - options={searchable ? filteredOptions : options} - visualFocusIndex={visualFocusIndex} - lastOptionIndex={lastOptionIndex} - multiple={multiple} - optional={optional} - optionalItem={optionalItem} - searchable={searchable} - handleOptionOnClick={handleOptionOnClick} - styles={{ width }} - /> - </Popover.Content> - </Popover.Portal> - </Popover.Root> - {!disabled && typeof error === "string" && ( - <Error id={errorId} role="alert" aria-live={error ? "assertive" : "off"}> - {error} - </Error> - )} - </SelectContainer> - </ThemeProvider> + <DxcIcon icon={isOpen ? "keyboard_arrow_up" : "keyboard_arrow_down"} /> + </DxcFlex> + </Select> + </Popover.Trigger> + <Popover.Portal> + <Popover.Content + sideOffset={4} + style={{ zIndex: "2147483647" }} + onOpenAutoFocus={(event) => { + // Avoid select to lose focus when the list is opened + event.preventDefault(); + }} + onCloseAutoFocus={(event) => { + // Avoid select to lose focus when the list is closed + event.preventDefault(); + }} + > + <Listbox + id={`${id}-listbox`} + currentValue={value ?? innerValue} + options={searchable ? filteredOptions : options} + visualFocusIndex={visualFocusIndex} + lastOptionIndex={lastOptionIndex} + multiple={multiple} + optional={optional} + optionalItem={optionalItem} + searchable={searchable} + handleOptionOnClick={handleOptionOnClick} + styles={{ width }} + /> + </Popover.Content> + </Popover.Portal> + </Popover.Root> + {!disabled && typeof error === "string" && ( + <Error id={`error-${id}`} role="alert" aria-live={error ? "assertive" : "off"}> + {error && <DxcIcon icon="filled_error" />} + {error} + </Error> + )} + </SelectContainer> ); } ); -const sizes = { - small: "240px", - medium: "360px", - large: "480px", - fillParent: "100%", -}; - -const calculateWidth = (margin: SelectPropsType["margin"], size: SelectPropsType["size"]) => - size === "fillParent" - ? `calc(${sizes[size]} - ${getMargin(margin, "left")} - ${getMargin(margin, "right")})` - : size && sizes[size]; - -const SelectContainer = styled.div<{ - margin: SelectPropsType["margin"]; - size: SelectPropsType["size"]; -}>` - box-sizing: border-box; - display: flex; - flex-direction: column; - width: ${(props) => calculateWidth(props.margin, props.size)}; - ${(props) => props.size !== "fillParent" && `min-width:${calculateWidth(props.margin, props.size)}`}; - margin: ${(props) => (props.margin && typeof props.margin !== "object" ? spaces[props.margin] : "0px")}; - margin-top: ${(props) => - props.margin && typeof props.margin === "object" && props.margin.top ? spaces[props.margin.top] : ""}; - margin-right: ${(props) => - props.margin && typeof props.margin === "object" && props.margin.right ? spaces[props.margin.right] : ""}; - margin-bottom: ${(props) => - props.margin && typeof props.margin === "object" && props.margin.bottom ? spaces[props.margin.bottom] : ""}; - margin-left: ${(props) => - props.margin && typeof props.margin === "object" && props.margin.left ? spaces[props.margin.left] : ""}; - font-family: ${(props) => props.theme.fontFamily}; -`; - -const Label = styled.label<{ - disabled: SelectPropsType["disabled"]; - helperText: SelectPropsType["helperText"]; -}>` - color: ${(props) => (props.disabled ? props.theme.disabledColor : props.theme.labelFontColor)}; - font-size: ${(props) => props.theme.labelFontSize}; - font-style: ${(props) => props.theme.labelFontStyle}; - font-weight: ${(props) => props.theme.labelFontWeight}; - line-height: ${(props) => props.theme.labelLineHeight}; - cursor: default; - ${(props) => !props.helperText && `margin-bottom: 0.25rem`} -`; - -const OptionalLabel = styled.span` - font-weight: ${(props) => props.theme.optionalLabelFontWeight}; -`; - -const HelperText = styled.span<{ disabled: SelectPropsType["disabled"] }>` - color: ${(props) => (props.disabled ? props.theme.disabledColor : props.theme.helperTextFontColor)}; - font-size: ${(props) => props.theme.helperTextFontSize}; - font-style: ${(props) => props.theme.helperTextFontStyle}; - font-weight: ${(props) => props.theme.helperTextFontWeight}; - line-height: ${(props) => props.theme.helperTextLineHeight}; - margin-bottom: 0.25rem; -`; - -const Select = styled.div<{ - disabled: SelectPropsType["disabled"]; - error: SelectPropsType["error"]; -}>` - display: flex; - position: relative; - align-items: center; - height: calc(2.5rem - 2px); - padding: 0 0.5rem; - outline: none; - ${(props) => props.disabled && `background-color: ${props.theme.disabledInputBackgroundColor}`}; - box-shadow: 0 0 0 2px transparent; - border-radius: 4px; - border: 1px solid - ${(props) => (props.disabled ? props.theme.disabledInputBorderColor : props.theme.enabledInputBorderColor)}; - ${(props) => - props.error && - !props.disabled && - `border-color: transparent; - box-shadow: 0 0 0 2px ${props.theme.errorInputBorderColor}; - `} - ${(props) => (props.disabled ? "cursor: not-allowed;" : "cursor: pointer;")}; - - ${(props) => - !props.disabled && - ` - &:hover { - border-color: ${props.error ? "transparent" : props.theme.hoverInputBorderColor}; - ${props.error && `box-shadow: 0 0 0 2px ${props.theme.hoverInputErrorBorderColor};`} - } - &:focus-within { - border-color: transparent; - box-shadow: 0 0 0 2px ${props.theme.focusInputBorderColor}; - } - `}; -`; - -const SelectionIndicator = styled.div` - box-sizing: border-box; - display: grid; - grid-template-columns: 1fr 1fr; - min-width: 48px; - min-height: 24px; - border-radius: 2px; - border: 1px solid ${(props) => props.theme.selectionIndicatorBorderColor}; -`; - -const SelectionNumber = styled.span<{ disabled: SelectPropsType["disabled"] }>` - display: grid; - place-items: center; - border-right: 1px solid ${(props) => props.theme.selectionIndicatorBorderColor}; - user-select: none; - ${(props) => !props.disabled && `background-color: ${props.theme.selectionIndicatorBackgroundColor}`}; - color: ${(props) => (props.disabled ? props.theme.disabledColor : props.theme.selectionIndicatorFontColor)}; - font-size: ${(props) => props.theme.selectionIndicatorFontSize}; - font-style: ${(props) => props.theme.selectionIndicatorFontStyle}; - font-weight: ${(props) => props.theme.selectionIndicatorFontWeight}; - ${(props) => (props.disabled ? `cursor: not-allowed;` : `cursor: default;`)} -`; - -const ClearOptionsAction = styled.button` - display: grid; - place-items: center; - border: none; - padding: 0; - ${(props) => (props.disabled ? `cursor: not-allowed;` : `cursor: pointer;`)} - background-color: ${(props) => - props.disabled ? "transparent" : props.theme.enabledSelectionIndicatorActionBackgroundColor}; - color: ${(props) => - props.disabled ? props.theme.disabledColor : props.theme.enabledSelectionIndicatorActionIconColor}; - font-size: 16px; - width: 100%; - - :focus-visible { - outline: none; - } - ${(props) => - !props.disabled && - ` - &:hover { - background-color: ${props.theme.hoverSelectionIndicatorActionBackgroundColor}; - color: ${props.theme.hoverSelectionIndicatorActionIconColor}; - } - &:active { - background-color: ${props.theme.activeSelectionIndicatorActionBackgroundColor}; - color: ${props.theme.activeSelectionIndicatorActionIconColor}; - } - `} -`; - -const SearchableValueContainer = styled.div` - display: grid; - width: 100%; -`; - -const SelectedOption = styled.span<{ - disabled: SelectPropsType["disabled"]; - atBackground: boolean; -}>` - grid-area: 1 / 1 / 1 / 1; - display: inline-flex; - align-items: center; - height: calc(2.5rem - 2px); - padding: 0 0.5rem; - user-select: none; - overflow: hidden; - - color: ${(props) => - props.disabled - ? props.theme.disabledColor - : props.atBackground - ? props.theme.placeholderFontColor - : props.theme.valueFontColor}; - - font-family: ${(props) => props.theme.fontFamily}; - font-size: ${(props) => props.theme.valueFontSize}; - font-style: ${(props) => props.theme.valueFontStyle}; - font-weight: ${(props) => props.theme.valueFontWeight}; -`; - -const SelectedOptionLabel = styled.span` - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -`; - -const SearchInput = styled.input` - grid-area: 1 / 1 / 1 / 1; - height: calc(2.5rem - 2px); - background: none; - border: none; - outline: none; - padding: 0 0.5rem; - color: ${(props) => (props.disabled ? props.theme.disabledColor : props.theme.valueFontColor)}; - font-size: ${(props) => props.theme.valueFontSize}; - font-style: ${(props) => props.theme.valueFontStyle}; - font-weight: ${(props) => props.theme.valueFontWeight}; - line-height: 1.5em; -`; - -const ErrorIcon = styled.span` - display: flex; - flex-wrap: wrap; - align-content: center; - padding: 3px; - height: 18px; - width: 18px; - margin-left: 0.25rem; - color: ${(props) => props.theme.errorIconColor}; - font-size: 1.25rem; -`; - -const Error = styled.span` - min-height: 1.5em; - color: ${(props) => props.theme.errorMessageColor}; - font-size: 0.75rem; - line-height: 1.5em; - margin-top: 0.25rem; -`; - -const CollapseIndicator = styled.span<{ disabled: SelectPropsType["disabled"] }>` - display: grid; - place-items: center; - padding: 4px; - font-size: 16px; - margin-left: 0.25rem; - color: ${(props) => (props.disabled ? props.theme.disabledColor : props.theme.collapseIndicatorColor)}; -`; - -const ClearSearchAction = styled.button` - display: grid; - place-items: center; - min-height: 24px; - min-width: 24px; - margin-left: 0.25rem; - border: none; - border-radius: 2px; - padding: 0; - background-color: ${(props) => props.theme.actionBackgroundColor}; - color: ${(props) => props.theme.actionIconColor}; - font-size: 1rem; - cursor: pointer; - - &:hover { - background-color: ${(props) => props.theme.hoverActionBackgroundColor}; - color: ${(props) => props.theme.hoverActionIconColor}; - } - &:active { - background-color: ${(props) => props.theme.activeActionBackgroundColor}; - color: ${(props) => props.theme.activeActionIconColor}; - } -`; - export default DxcSelect; diff --git a/packages/lib/src/select/utils.ts b/packages/lib/src/select/utils.ts index 0b341504f7..45e6c1a42c 100644 --- a/packages/lib/src/select/utils.ts +++ b/packages/lib/src/select/utils.ts @@ -1,9 +1,22 @@ -import { ListOptionType, ListOptionGroupType } from "./types"; +import SelectPropsType, { ListOptionType, ListOptionGroupType } from "./types"; +import { getMargin } from "../common/utils"; + +const sizes = { + small: "240px", + medium: "360px", + large: "480px", + fillParent: "100%", +}; + +export const calculateWidth = (margin: SelectPropsType["margin"], size: SelectPropsType["size"]) => + size === "fillParent" + ? `calc(${sizes[size]} - ${getMargin(margin, "left")} - ${getMargin(margin, "right")})` + : size && sizes[size]; /** * Check if the value is not optional and is empty. */ -const notOptionalCheck = (value: string | string[], multiple: boolean, optional: boolean) => +export const notOptionalCheck = (value: string | string[], multiple: boolean, optional: boolean) => !optional && (multiple ? value.length === 0 : value === ""); /** @@ -15,25 +28,25 @@ const isOptionGroup = (option: ListOptionType | ListOptionGroupType): option is /** * Checks if the options are an array of groups. */ -const isArrayOfOptionGroups = (options: ListOptionType[] | ListOptionGroupType[]): options is ListOptionGroupType[] => +export const isArrayOfOptionGroups = (options: ListOptionType[] | ListOptionGroupType[]): options is ListOptionGroupType[] => options[0] != null && isOptionGroup(options[0]); /** * Checks if the groups have options. */ -const groupsHaveOptions = (options: ListOptionType[] | ListOptionGroupType[]) => +export const groupsHaveOptions = (options: ListOptionType[] | ListOptionGroupType[]) => isArrayOfOptionGroups(options) ? options.some((groupOption) => groupOption.options.length > 0) : true; /** * Checks if the listbox can be opened. */ -const canOpenListbox = (options: ListOptionType[] | ListOptionGroupType[], disabled: boolean) => +export const canOpenListbox = (options: ListOptionType[] | ListOptionGroupType[], disabled: boolean) => !disabled && options.length > 0 && groupsHaveOptions(options); /** * Filters the options by the search value. */ -const filterOptionsBySearchValue = ( +export const filterOptionsBySearchValue = ( options: ListOptionType[] | ListOptionGroupType[], searchValue: string ): ListOptionType[] | ListOptionGroupType[] => { @@ -57,7 +70,7 @@ const filterOptionsBySearchValue = ( /** * Returns the index of the last option, depending on several conditions. */ -const getLastOptionIndex = ( +export const getLastOptionIndex = ( options: ListOptionType[] | ListOptionGroupType[], filteredOptions: ListOptionType[] | ListOptionGroupType[], searchable: boolean, @@ -87,7 +100,7 @@ const getLastOptionIndex = ( /** * Return the current selection. */ -const getSelectedOption = ( +export const getSelectedOption = ( value: string | string[], options: ListOptionType[] | ListOptionGroupType[], multiple: boolean, @@ -145,21 +158,9 @@ const getSelectedOption = ( /** * Return the label or labels of the selected option(s), separated by commas. */ -const getSelectedOptionLabel = (placeholder: string, selectedOption: ListOptionType | ListOptionType[]) => +export const getSelectedOptionLabel = (placeholder: string, selectedOption: ListOptionType | ListOptionType[]) => Array.isArray(selectedOption) ? selectedOption.length === 0 ? placeholder : selectedOption.map((option) => option.label).join(", ") : (selectedOption.label ?? placeholder); - -export { - isOptionGroup, - isArrayOfOptionGroups, - notOptionalCheck, - groupsHaveOptions, - canOpenListbox as canOpenOptions, - filterOptionsBySearchValue, - getLastOptionIndex, - getSelectedOption, - getSelectedOptionLabel, -}; From 05a72eddfc4f7c8ae60e6751b7747251575c0b7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Thu, 6 Feb 2025 17:22:10 +0100 Subject: [PATCH 02/15] More styling updates to the Select --- .../components/select/code/SelectCodePage.tsx | 2 + packages/lib/src/select/ListOption.tsx | 186 ++++++++---------- packages/lib/src/select/Listbox.tsx | 102 +++++----- packages/lib/src/select/Select.tsx | 8 +- packages/lib/src/select/utils.ts | 51 ++--- 5 files changed, 160 insertions(+), 189 deletions(-) diff --git a/apps/website/screens/components/select/code/SelectCodePage.tsx b/apps/website/screens/components/select/code/SelectCodePage.tsx index cdeba01db9..9055180619 100644 --- a/apps/website/screens/components/select/code/SelectCodePage.tsx +++ b/apps/website/screens/components/select/code/SelectCodePage.tsx @@ -123,6 +123,8 @@ const sections = [ <b>options</b>: List of <Code>Option</Code> instances. </li> </ul> + <br /> + <strong>You can't mix regular options and grouped options in the same array.</strong> </td> <td>-</td> </tr> diff --git a/packages/lib/src/select/ListOption.tsx b/packages/lib/src/select/ListOption.tsx index e61c5f6cbb..b8d7a46d29 100644 --- a/packages/lib/src/select/ListOption.tsx +++ b/packages/lib/src/select/ListOption.tsx @@ -2,132 +2,72 @@ import styled from "styled-components"; import { OptionProps } from "./types"; import DxcCheckbox from "../checkbox/Checkbox"; import DxcIcon from "../icon/Icon"; -import { MouseEvent, useState } from "react"; +import { MouseEvent, useEffect, useRef, useState } from "react"; import { TooltipWrapper } from "../tooltip/Tooltip"; -const ListOption = ({ - id, - option, - onClick, - multiple, - visualFocused, - isGroupedOption = false, - isLastOption, - isSelected, -}: OptionProps): JSX.Element => { - const [hasTooltip, setHasTooltip] = useState(false); - - const handleOnMouseEnter = (event: MouseEvent<HTMLSpanElement>) => { - const text = event.currentTarget; - setHasTooltip(text.scrollWidth > text.clientWidth); - }; - - return ( - <TooltipWrapper condition={hasTooltip} label={option.label}> - <OptionItem - id={id} - onClick={() => { - onClick(option); - }} - visualFocused={visualFocused} - selected={isSelected} - role="option" - aria-selected={!multiple ? isSelected : undefined} - > - <StyledOption - visualFocused={visualFocused} - selected={isSelected} - last={isLastOption} - grouped={isGroupedOption} - multiple={multiple} - > - {multiple && ( - <div style={{ display: "flex", pointerEvents: "none" }}> - <DxcCheckbox checked={isSelected} tabIndex={-1} /> - </div> - )} - {option.icon && ( - <OptionIcon grouped={isGroupedOption} multiple={multiple}> - {typeof option.icon === "string" ? <DxcIcon icon={option.icon} /> : option.icon} - </OptionIcon> - )} - <OptionContent grouped={isGroupedOption} hasIcon={option.icon ? true : false} multiple={multiple}> - <OptionLabel onMouseEnter={handleOnMouseEnter}>{option.label}</OptionLabel> - {!multiple && isSelected && ( - <OptionSelectedIndicator> - <DxcIcon icon="done" /> - </OptionSelectedIndicator> - )} - </OptionContent> - </StyledOption> - </OptionItem> - </TooltipWrapper> - ); -}; - -const OptionItem = styled.li<{ visualFocused: OptionProps["visualFocused"]; selected: OptionProps["isSelected"] }>` - padding: 0 0.5rem; - box-shadow: inset 0 0 0 2px transparent; - ${(props) => props.visualFocused && `box-shadow: inset 0 0 0 2px ${props.theme.focusListOptionBorderColor};`} - ${(props) => props.selected && `background-color: ${props.theme.selectedListOptionBackgroundColor}`}; +const OptionItem = styled.li<{ + visualFocused: OptionProps["visualFocused"]; + selected: OptionProps["isSelected"]; +}>` + ${({ selected }) => selected && "background-color: var(--color-bg-secondary-lighter);"}; + padding: var(--spacing-padding-none) var(--spacing-padding-xs); cursor: pointer; &:hover { - ${(props) => - props.selected - ? `background-color: ${props.theme.selectedHoverListOptionBackgroundColor};` - : `background-color: ${props.theme.unselectedHoverListOptionBackgroundColor};`}; + background-color: var( + ${({ selected }) => (selected ? "--color-bg-secondary-lighter" : "--color-bg-neutral-light")} + ); } &:active { - ${(props) => - props.selected - ? `background-color: ${props.theme.selectedActiveListOptionBackgroundColor};` - : `background-color: ${props.theme.unselectedActiveListOptionBackgroundColor};`}; + background-color: var(${({ selected }) => (selected ? "--color-bg-secondary-medium" : "--color-bg-neutral-light")}); } + ${({ visualFocused }) => + visualFocused && + "outline: var(--border-width-m) var(--border-style-default) var(--border-color-secondary-medium); outline-offset: -2px;"} `; const StyledOption = styled.span<{ grouped: OptionProps["isGroupedOption"]; - multiple: OptionProps["multiple"]; - visualFocused: OptionProps["visualFocused"]; - selected: OptionProps["isSelected"]; last: OptionProps["isLastOption"]; + selected: OptionProps["isSelected"]; + visualFocused: OptionProps["visualFocused"]; }>` box-sizing: border-box; display: flex; align-items: center; - height: 32px; - padding: 4px 8px 4px 0; - ${(props) => props.grouped && props.multiple && `padding-left: 16px;`} + gap: var(--spacing-gap-s); + height: var(--height-m); + ${({ grouped }) => grouped && "padding-left: var(--spacing-padding-xs);"} ${(props) => - props.last || props.visualFocused || props.selected - ? `border-bottom: 1px solid transparent` - : `border-bottom: 1px solid ${props.theme.listOptionDividerColor}`}; + `border-bottom: var(--border-width-s) var(--border-style-default) + ${props.last || props.visualFocused || props.selected ? "transparent" : "var(--border-color-neutral-lighter)"};`}; `; -const OptionIcon = styled.span<{ grouped: OptionProps["isGroupedOption"]; multiple: OptionProps["multiple"] }>` - margin-left: ${(props) => (props.grouped && !props.multiple ? "16px" : "8px")}; +const OptionIcon = styled.span` display: grid; place-items: center; - color: ${(props) => props.theme.listOptionIconColor}; - font-size: 24px; + color: var(--color-fg-neutral-dark); + font-size: var(--height-xxs); + svg { - height: 24px; - width: 24px; + height: var(--height-xxs); + width: 16px; } `; -const OptionContent = styled.span<{ - grouped: OptionProps["isGroupedOption"]; - multiple: OptionProps["multiple"]; - hasIcon: boolean; -}>` - margin-left: ${(props) => (props.grouped && !props.multiple && !props.hasIcon ? "16px" : "8px")}; +const OptionContent = styled.span` display: flex; + align-items: center; + gap: var(--spacing-gap-s); justify-content: space-between; - gap: 0.25rem; width: 100%; overflow: hidden; + + /* Option selected icon */ + > span[role="img"] { + color: var(--color-fg-neutral-dark); + font-size: var(--height-xxs); + } `; const OptionLabel = styled.span` @@ -136,11 +76,53 @@ const OptionLabel = styled.span` white-space: nowrap; `; -const OptionSelectedIndicator = styled.span` - display: flex; - align-items: center; - color: ${(props) => props.theme.selectedListOptionIconColor}; - font-size: 16px; -`; +const ListOption = ({ + id, + isGroupedOption = false, + isLastOption, + isSelected, + multiple, + onClick, + option, + visualFocused, +}: OptionProps): JSX.Element => { + const [hasTooltip, setHasTooltip] = useState(false); + const checkboxRef = useRef<HTMLDivElement>(null); + + const handleOnMouseEnter = (event: MouseEvent<HTMLSpanElement>) => { + const text = event.currentTarget; + setHasTooltip(text.scrollWidth > text.clientWidth); + }; + + useEffect(() => { + if (checkboxRef.current) checkboxRef.current.style.pointerEvents = "none"; + }, []); + + return ( + <TooltipWrapper condition={hasTooltip} label={option.label}> + <OptionItem + aria-selected={!multiple ? isSelected : undefined} + id={id} + onClick={() => { + onClick(option); + }} + role="option" + selected={isSelected} + visualFocused={visualFocused} + > + <StyledOption grouped={isGroupedOption} selected={isSelected} visualFocused={visualFocused} last={isLastOption}> + {multiple && <DxcCheckbox checked={isSelected} tabIndex={-1} ref={checkboxRef} />} + {option.icon && ( + <OptionIcon>{typeof option.icon === "string" ? <DxcIcon icon={option.icon} /> : option.icon}</OptionIcon> + )} + <OptionContent> + <OptionLabel onMouseEnter={handleOnMouseEnter}>{option.label}</OptionLabel> + {!multiple && isSelected && <DxcIcon icon="done" />} + </OptionContent> + </StyledOption> + </OptionItem> + </TooltipWrapper> + ); +}; export default ListOption; diff --git a/packages/lib/src/select/Listbox.tsx b/packages/lib/src/select/Listbox.tsx index 2152df94d4..ba7622ddb9 100644 --- a/packages/lib/src/select/Listbox.tsx +++ b/packages/lib/src/select/Listbox.tsx @@ -6,6 +6,46 @@ import ListOption from "./ListOption"; import { groupsHaveOptions } from "./utils"; import { ListboxProps, ListOptionGroupType, ListOptionType } from "./types"; +const ListboxContainer = styled.ul` + box-sizing: border-box; + max-height: 304px; + overflow-y: auto; + margin: 0; + padding: var(--spacing-padding-xxs) var(--spacing-padding-none); + background-color: var(--color-absolutes-white); + border: var(--border-width-s) var(--border-style-default) var(--border-color-neutral-medium); + border-radius: var(--border-radius-s); + + box-shadow: var(--shadow-mid-x-position, 0px) var(--shadow-mid-y-position, 12px) var(--shadow-mid-blur, 12px) + var(--shadow-mid-spread, 0px) var(--shadow-light, rgba(209, 209, 209, 0.3)); + color: var(--color-fg-neutral-dark); + font-family: var(--typography-font-family); + font-size: var(--typography-label-m); + font-weight: var(--typography-label-regular); +`; + +const OptionsSystemMessage = styled.span` + display: flex; + align-items: center; + gap: var(--spacing-gap-s); + height: var(--height-m); + padding: var(--spacing-padding-none) var(--spacing-padding-m); + color: var(--color-fg-neutral-stronger); + + /* No matches found icon */ + > span[role="img"] { + font-size: var(--height-xxs); + } +`; + +const GroupLabel = styled.li` + display: flex; + align-items: center; + height: var(--height-m); + padding: var(--spacing-padding-none) var(--spacing-padding-m); + font-weight: var(--typography-label-semibold); +`; + const Listbox = ({ id, currentValue, @@ -67,11 +107,7 @@ const Listbox = ({ multiple={multiple} visualFocused={visualFocusIndex === globalIndex} isLastOption={lastOptionIndex === globalIndex} - isSelected={ - multiple - ? currentValue.includes(option.value) - : currentValue === option.value - } + isSelected={multiple ? currentValue.includes(option.value) : currentValue === option.value} /> ); } @@ -95,8 +131,6 @@ const Listbox = ({ }); }, [visualFocusIndex]); - const hasOptionGroups = options.some((option) => "options" in option && option.options.length > 0); - return ( <ListboxContainer id={id} @@ -107,16 +141,13 @@ const Listbox = ({ event.preventDefault(); }} ref={listboxRef} - aria-multiselectable={!hasOptionGroups ? multiple : undefined} + aria-multiselectable={multiple} style={styles} - role={hasOptionGroups ? "list" : "listbox"} - aria-label="List of options" + role="listbox" > {searchable && (options.length === 0 || !groupsHaveOptions(options)) ? ( <OptionsSystemMessage> - <NoMatchesFoundIcon> - <DxcIcon icon="search_off" /> - </NoMatchesFoundIcon> + <DxcIcon icon="search_off" /> {translatedLabels.select.noMatchesErrorMessage} </OptionsSystemMessage> ) : ( @@ -129,7 +160,6 @@ const Listbox = ({ onClick={handleOptionOnClick} multiple={multiple} visualFocused={visualFocusIndex === 0} - isGroupedOption={false} isLastOption={lastOptionIndex === 0} isSelected={multiple ? currentValue.includes(optionalItem.value) : currentValue === optionalItem.value} /> @@ -140,48 +170,4 @@ const Listbox = ({ ); }; -const ListboxContainer = styled.ul` - box-sizing: border-box; - max-height: 304px; - overflow-y: auto; - margin: 0; - padding: 0.25rem 0; - background-color: ${(props) => props.theme.listDialogBackgroundColor}; - border: 1px solid ${(props) => props.theme.listDialogBorderColor}; - border-radius: 0.25rem; - box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); - color: ${(props) => props.theme.listOptionFontColor}; - font-family: ${(props) => props.theme.fontFamily}; - font-size: ${(props) => props.theme.listOptionFontSize}; - font-style: ${(props) => props.theme.listOptionFontStyle}; - font-weight: ${(props) => props.theme.listOptionFontWeight}; - line-height: 24px; - cursor: default; -`; - -const OptionsSystemMessage = styled.span` - display: flex; - padding: 4px 16px; - color: ${(props) => props.theme.systemMessageFontColor}; - font-size: 0.875rem; - line-height: 1.715em; -`; - -const NoMatchesFoundIcon = styled.span` - display: flex; - flex-wrap: wrap; - align-content: center; - height: 16px; - width: 16px; - padding: 4px; - margin-right: 0.25rem; - font-size: 16px; -`; - -const GroupLabel = styled.li` - padding: 4px 16px; - font-weight: ${(props) => props.theme.listGroupLabelFontWeight}; - line-height: 1.715em; -`; - export default Listbox; diff --git a/packages/lib/src/select/Select.tsx b/packages/lib/src/select/Select.tsx index 983ce3fa9b..d1df0a968b 100644 --- a/packages/lib/src/select/Select.tsx +++ b/packages/lib/src/select/Select.tsx @@ -27,7 +27,7 @@ import { getSelectedOption, getSelectedOptionLabel, groupsHaveOptions, - isArrayOfOptionGroups, + isArrayOfGroupedOptions, notOptionalCheck, } from "./utils"; import SelectPropsType, { ListOptionType, RefType } from "./types"; @@ -188,9 +188,9 @@ const SelectedOption = styled.span<{ font-size: var(--typography-label-m); font-weight: var(--typography-label-regular); user-select: none; - white-space: pre; overflow: hidden; text-overflow: ellipsis; + white-space: pre; `; const SearchInput = styled.input` @@ -392,7 +392,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( if (filteredOptions.length > 0) { if (optional && !multiple && visualFocusIndex === 0 && groupsHaveOptions(filteredOptions)) { handleOnChangeValue(optionalItem); - } else if (isArrayOfOptionGroups(filteredOptions)) { + } else if (isArrayOfGroupedOptions(filteredOptions)) { if (groupsHaveOptions(filteredOptions)) { filteredOptions.some((groupOption) => { const groupLength = accLength + groupOption.options.length; @@ -409,7 +409,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( } } else if (optional && !multiple && visualFocusIndex === 0) { handleOnChangeValue(optionalItem); - } else if (isArrayOfOptionGroups(options)) { + } else if (isArrayOfGroupedOptions(options)) { options.some((groupOption) => { const groupLength = accLength + groupOption.options.length; if (groupLength > visualFocusIndex) { diff --git a/packages/lib/src/select/utils.ts b/packages/lib/src/select/utils.ts index 45e6c1a42c..6234230b58 100644 --- a/packages/lib/src/select/utils.ts +++ b/packages/lib/src/select/utils.ts @@ -20,25 +20,29 @@ export const notOptionalCheck = (value: string | string[], multiple: boolean, op !optional && (multiple ? value.length === 0 : value === ""); /** - * Checks if the option is a group. + * Checks if the option is a group (contains other options). */ const isOptionGroup = (option: ListOptionType | ListOptionGroupType): option is ListOptionGroupType => "options" in option && option.options != null; /** - * Checks if the options are an array of groups. + * Checks if the options are grouped options (groups and single options can't be mixed) */ -export const isArrayOfOptionGroups = (options: ListOptionType[] | ListOptionGroupType[]): options is ListOptionGroupType[] => +export const isArrayOfGroupedOptions = (options: ListOptionType[] | ListOptionGroupType[]): options is ListOptionGroupType[] => options[0] != null && isOptionGroup(options[0]); /** - * Checks if the groups have options. + * Checks if the groups have options. If the options parameter is not an array of grouped options, + * it will return true and not check nothing else. */ export const groupsHaveOptions = (options: ListOptionType[] | ListOptionGroupType[]) => - isArrayOfOptionGroups(options) ? options.some((groupOption) => groupOption.options.length > 0) : true; + isArrayOfGroupedOptions(options) ? options.some((groupOption) => groupOption.options.length > 0) : true; /** - * Checks if the listbox can be opened. + * Checks if the listbox can be opened. A listbox can be opened in three scenarios: + * - The listbox is not disabled. + * - The listbox has more than one single option. + * - The listbox has more than one group with options contained. */ export const canOpenListbox = (options: ListOptionType[] | ListOptionGroupType[], disabled: boolean) => !disabled && options.length > 0 && groupsHaveOptions(options); @@ -49,23 +53,20 @@ export const canOpenListbox = (options: ListOptionType[] | ListOptionGroupType[] export const filterOptionsBySearchValue = ( options: ListOptionType[] | ListOptionGroupType[], searchValue: string -): ListOptionType[] | ListOptionGroupType[] => { - if (options.length > 0) { - if (isArrayOfOptionGroups(options)) - return options.map((optionGroup) => { - const group = { - label: optionGroup.label, - options: optionGroup.options.filter((option) => - option.label.toUpperCase().includes(searchValue.toUpperCase()) - ), - }; - return group; - }); - else return options.filter((option) => option.label.toUpperCase().includes(searchValue.toUpperCase())); - } else { - return []; - } -}; +): ListOptionType[] | ListOptionGroupType[] => + options.length > 0 + ? isArrayOfGroupedOptions(options) + ? options.map((optionGroup) => { + const group = { + label: optionGroup.label, + options: optionGroup.options.filter((option) => + option.label.toUpperCase().includes(searchValue.toUpperCase()) + ), + }; + return group; + }) + : options.filter((option) => option.label.toUpperCase().includes(searchValue.toUpperCase())) + : []; /** * Returns the index of the last option, depending on several conditions. @@ -81,13 +82,13 @@ export const getLastOptionIndex = ( const reducer = (acc: number, current: ListOptionGroupType) => acc + (current.options.length ?? 0); if (searchable && filteredOptions.length > 0) { - if (isArrayOfOptionGroups(filteredOptions)) { + if (isArrayOfGroupedOptions(filteredOptions)) { last = filteredOptions.reduce(reducer, 0) - 1; } else { last = filteredOptions.length - 1; } } else if (options.length > 0) { - if (isArrayOfOptionGroups(options)) { + if (isArrayOfGroupedOptions(options)) { last = options.reduce(reducer, 0) - 1; } else { last = options.length - 1; From 589eda99830a0db34deeef1e24df0f04753f0cfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Fri, 7 Feb 2025 11:29:51 +0100 Subject: [PATCH 03/15] Testing updates Select --- packages/lib/src/select/Listbox.tsx | 5 ++-- packages/lib/src/select/Select.test.tsx | 32 ++++++++++++------------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/packages/lib/src/select/Listbox.tsx b/packages/lib/src/select/Listbox.tsx index ba7622ddb9..1cae0375c2 100644 --- a/packages/lib/src/select/Listbox.tsx +++ b/packages/lib/src/select/Listbox.tsx @@ -15,7 +15,6 @@ const ListboxContainer = styled.ul` background-color: var(--color-absolutes-white); border: var(--border-width-s) var(--border-style-default) var(--border-color-neutral-medium); border-radius: var(--border-radius-s); - box-shadow: var(--shadow-mid-x-position, 0px) var(--shadow-mid-y-position, 12px) var(--shadow-mid-blur, 12px) var(--shadow-mid-spread, 0px) var(--shadow-light, rgba(209, 209, 209, 0.3)); color: var(--color-fg-neutral-dark); @@ -133,6 +132,7 @@ const Listbox = ({ return ( <ListboxContainer + aria-multiselectable={multiple} id={id} onClick={(event) => { event.stopPropagation(); @@ -141,9 +141,8 @@ const Listbox = ({ event.preventDefault(); }} ref={listboxRef} - aria-multiselectable={multiple} - style={styles} role="listbox" + style={styles} > {searchable && (options.length === 0 || !groupsHaveOptions(options)) ? ( <OptionsSystemMessage> diff --git a/packages/lib/src/select/Select.test.tsx b/packages/lib/src/select/Select.test.tsx index 9ea606466e..4703f56dac 100644 --- a/packages/lib/src/select/Select.test.tsx +++ b/packages/lib/src/select/Select.test.tsx @@ -667,7 +667,7 @@ describe("Select component tests", () => { ); const select = getByRole("combobox"); await userEvent.click(select); - const listbox = getByRole("list"); + const listbox = getByRole("listbox"); expect(listbox).toBeTruthy(); expect(select.getAttribute("aria-expanded")).toBe("true"); expect(getByText("Colores")).toBeTruthy(); @@ -683,7 +683,7 @@ describe("Select component tests", () => { expect(groups[2]?.getAttribute("aria-labelledby")).toBe(groupLabels[2]?.id); expect(getAllByRole("option").length).toBe(18); await userEvent.click(select); - expect(queryByRole("list")).toBeFalsy(); + expect(queryByRole("listbox")).toBeFalsy(); expect(select.getAttribute("aria-expanded")).toBe("false"); }); test("Grouped Options - If an empty list of options in a group is passed, the select is rendered but doesn't open the listbox", async () => { @@ -700,7 +700,7 @@ describe("Select component tests", () => { ); const select = getByRole("combobox"); await userEvent.click(select); - expect(queryByRole("list")).toBeFalsy(); + expect(queryByRole("listbox")).toBeFalsy(); expect(select.getAttribute("aria-expanded")).toBe("false"); }); test("Grouped Options - Click in an option selects it and closes the listbox", async () => { @@ -714,7 +714,7 @@ describe("Select component tests", () => { let options = getAllByRole("option"); options[8] && (await userEvent.click(options[8])); expect(onChange).toHaveBeenCalledWith({ value: "oviedo" }); - expect(queryByRole("list")).toBeFalsy(); + expect(queryByRole("listbox")).toBeFalsy(); expect(getByText("Oviedo")).toBeTruthy(); await userEvent.click(select); options = getAllByRole("option"); @@ -772,7 +772,7 @@ describe("Select component tests", () => { const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupOptions} />); const select = getByRole("combobox"); fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); - expect(queryByRole("list")).toBeTruthy(); + expect(queryByRole("listbox")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-17"); }); test("Grouped Options: Arrow up key - Puts the focus in last option when the first one is visually focused", () => { @@ -780,14 +780,14 @@ describe("Select component tests", () => { const select = getByRole("combobox"); fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); - expect(queryByRole("list")).toBeTruthy(); + expect(queryByRole("listbox")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-17"); }); test("Grouped Options: Arrow down key - Opens the listbox and visually focus the first option", () => { const { getByRole, queryByRole } = render(<DxcSelect label="test-select-label" options={groupOptions} />); const select = getByRole("combobox"); fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); - expect(queryByRole("list")).toBeTruthy(); + expect(queryByRole("listbox")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-0"); }); test("Grouped Options: Arrow down key - Puts the focus in the first option when the last one is visually focused", () => { @@ -795,7 +795,7 @@ describe("Select component tests", () => { const select = getByRole("combobox"); fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); - expect(queryByRole("list")).toBeTruthy(); + expect(queryByRole("listbox")).toBeTruthy(); expect(select.getAttribute("aria-activedescendant")).toBe("option-0"); }); test("Grouped Options: Enter key - Selects the visually focused option and closes the listbox", async () => { @@ -810,7 +810,7 @@ describe("Select component tests", () => { fireEvent.keyDown(select, { key: "ArrowDown", code: "ArrowDown", keyCode: 40, charCode: 40 }); fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); expect(onChange).toHaveBeenCalledWith({ value: "ebro" }); - expect(queryByRole("list")).toBeFalsy(); + expect(queryByRole("listbox")).toBeFalsy(); expect(getByText("Ebro")).toBeTruthy(); await userEvent.click(select); const options = getAllByRole("option"); @@ -824,7 +824,7 @@ describe("Select component tests", () => { const select = getByRole("combobox"); const searchInput = container.querySelectorAll("input")[1]; await userEvent.click(select); - expect(getByRole("list")).toBeTruthy(); + expect(getByRole("listbox")).toBeTruthy(); searchInput && (await userEvent.type(searchInput, "ro")); expect(getAllByRole("presentation").length).toBe(2); expect(getAllByRole("option").length).toBe(5); @@ -833,7 +833,7 @@ describe("Select component tests", () => { let options = getAllByRole("option"); options[4] && (await userEvent.click(options[4])); expect(onChange).toHaveBeenCalledWith({ value: "ebro" }); - expect(queryByRole("list")).toBeFalsy(); + expect(queryByRole("listbox")).toBeFalsy(); expect(getByText("Ebro")).toBeTruthy(); expect(searchInput?.value).toBe(""); await userEvent.click(select); @@ -848,7 +848,7 @@ describe("Select component tests", () => { const select = getByRole("combobox"); const searchInput = container.querySelectorAll("input")[1]; await userEvent.click(select); - expect(getByRole("list")).toBeTruthy(); + expect(getByRole("listbox")).toBeTruthy(); searchInput && (await userEvent.type(searchInput, "very long string")); expect(getByText("No matches found")).toBeTruthy(); }); @@ -863,13 +863,13 @@ describe("Select component tests", () => { const options = getAllByRole("option"); options[10] && (await userEvent.click(options[10])); expect(onChange).toHaveBeenCalledWith({ value: ["bilbao"] }); - expect(queryByRole("list")).toBeTruthy(); + expect(queryByRole("listbox")).toBeTruthy(); expect(getAllByText("Bilbao").length).toBe(2); fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); fireEvent.keyDown(select, { key: "ArrowUp", code: "ArrowUp", keyCode: 38, charCode: 38 }); fireEvent.keyDown(select, { key: "Enter", code: "Enter", keyCode: 13, charCode: 13 }); expect(onChange).toHaveBeenCalledWith({ value: ["bilbao", "guadalquivir"] }); - expect(queryByRole("list")).toBeTruthy(); + expect(queryByRole("listbox")).toBeTruthy(); expect(getByText("Bilbao, Guadalquivir")).toBeTruthy(); expect(submitInput?.value).toBe("bilbao,guadalquivir"); }); @@ -886,13 +886,13 @@ describe("Select component tests", () => { options[13] && (await userEvent.click(options[13])); options[17] && (await userEvent.click(options[17])); expect(onChange).toHaveBeenCalledWith({ value: ["blanco", "oviedo", "duero", "ebro"] }); - expect(queryByRole("list")).toBeTruthy(); + expect(queryByRole("listbox")).toBeTruthy(); expect(getByText("Blanco, Oviedo, Duero, Ebro")).toBeTruthy(); expect(getByText("4", { exact: true })).toBeTruthy(); const clearSelectionButton = getByRole("button"); expect(clearSelectionButton.getAttribute("aria-label")).toBe("Clear selection"); await userEvent.click(clearSelectionButton); - expect(queryByRole("list")).toBeTruthy(); + expect(queryByRole("listbox")).toBeTruthy(); expect(queryByText("Blanco, Oviedo, Duero, Ebro")).toBeFalsy(); expect(queryByText("4")).toBeFalsy(); expect(queryByRole("button")).toBeFalsy(); From 029c43665c70cb75194ff391055de4b8945d0326 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Fri, 7 Feb 2025 12:37:33 +0100 Subject: [PATCH 04/15] Fixed Select tests --- packages/lib/src/action-icon/types.ts | 4 +++- packages/lib/src/select/Listbox.tsx | 2 +- packages/lib/src/select/Select.test.tsx | 3 +-- packages/lib/src/select/Select.tsx | 30 +++++++++++++------------ 4 files changed, 21 insertions(+), 18 deletions(-) diff --git a/packages/lib/src/action-icon/types.ts b/packages/lib/src/action-icon/types.ts index fec059254d..08ac678cbe 100644 --- a/packages/lib/src/action-icon/types.ts +++ b/packages/lib/src/action-icon/types.ts @@ -1,4 +1,5 @@ import { SVG } from "../common/utils"; +import { MouseEvent } from "react"; type Props = { /** @@ -15,8 +16,9 @@ type Props = { icon: string | SVG; /** * This function will be called when the user clicks the button. + * @param event The event source of the callback. */ - onClick?: () => void; + onClick?: (event: MouseEvent<HTMLButtonElement>) => void; /** * Value of the tabindex attribute. */ diff --git a/packages/lib/src/select/Listbox.tsx b/packages/lib/src/select/Listbox.tsx index 1cae0375c2..7139d4cbbc 100644 --- a/packages/lib/src/select/Listbox.tsx +++ b/packages/lib/src/select/Listbox.tsx @@ -69,7 +69,7 @@ const Listbox = ({ return ( option.options.length > 0 && ( <li key={groupId}> - <ul role="listbox" aria-labelledby={groupId} style={{ padding: 0 }}> + <ul role="group" aria-labelledby={groupId} style={{ padding: 0 }}> <GroupLabel role="presentation" id={groupId}> {option.label} </GroupLabel> diff --git a/packages/lib/src/select/Select.test.tsx b/packages/lib/src/select/Select.test.tsx index 4703f56dac..14dcd5e934 100644 --- a/packages/lib/src/select/Select.test.tsx +++ b/packages/lib/src/select/Select.test.tsx @@ -93,7 +93,6 @@ describe("Select component tests", () => { ); const select = getByRole("combobox"); const errorMessage = getByText("Error message."); - expect(errorMessage).toBeTruthy(); expect(select.getAttribute("aria-errormessage")).toBe(errorMessage.id); expect(select.getAttribute("aria-invalid")).toBe("true"); @@ -675,7 +674,7 @@ describe("Select component tests", () => { expect(getByText("Negro")).toBeTruthy(); expect(getByText("Ciudades españolas")).toBeTruthy(); expect(getByText("Madrid")).toBeTruthy(); - const groups = getAllByRole("listbox"); + const groups = getAllByRole("group"); expect(groups.length).toBe(3); const groupLabels = getAllByRole("presentation"); expect(groups[0]?.getAttribute("aria-labelledby")).toBe(groupLabels[0]?.id); diff --git a/packages/lib/src/select/Select.tsx b/packages/lib/src/select/Select.tsx index d1df0a968b..ef01d4c19d 100644 --- a/packages/lib/src/select/Select.tsx +++ b/packages/lib/src/select/Select.tsx @@ -223,34 +223,35 @@ const Error = styled.span` const DxcSelect = forwardRef<RefType, SelectPropsType>( ( { - label, - name = "", + ariaLabel = "Select", defaultValue, - value, - options, - helperText, - placeholder = "", disabled = false, + error, + helperText, + label, + margin, multiple = false, + name, + onBlur, + onChange, optional = false, + options, + placeholder = "", searchable = false, - onChange, - onBlur, - error, - margin, size = "medium", tabIndex = 0, - ariaLabel = "Select", + value, }, ref ): JSX.Element => { const id = `select-${useId()}`; + const [hasTooltip, setHasTooltip] = useState(false); const [innerValue, setInnerValue] = useState(defaultValue ?? (multiple ? [] : "")); + const [isOpen, changeIsOpen] = useState(false); const [searchValue, setSearchValue] = useState(""); const [visualFocusIndex, changeVisualFocusIndex] = useState(-1); - const [isOpen, changeIsOpen] = useState(false); - const [hasTooltip, setHasTooltip] = useState(false); + const selectRef = useRef<HTMLDivElement | null>(null); const selectSearchInputRef = useRef<HTMLInputElement | null>(null); @@ -457,7 +458,8 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( } }; - const handleClearSearchActionOnClick = () => { + const handleClearSearchActionOnClick = (event: MouseEvent<HTMLButtonElement>) => { + event.stopPropagation(); setSearchValue(""); }; From dfda12e76904c2eafd8ee2c7fe2affb8e96ce105 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Fri, 7 Feb 2025 15:07:08 +0100 Subject: [PATCH 05/15] More fixes to the Select accessibility --- packages/lib/src/select/ListOption.tsx | 1 + packages/lib/src/select/Listbox.tsx | 57 +++++++++---------- .../src/select/Select.accessibility.test.tsx | 13 +---- 3 files changed, 31 insertions(+), 40 deletions(-) diff --git a/packages/lib/src/select/ListOption.tsx b/packages/lib/src/select/ListOption.tsx index b8d7a46d29..913d3e60eb 100644 --- a/packages/lib/src/select/ListOption.tsx +++ b/packages/lib/src/select/ListOption.tsx @@ -102,6 +102,7 @@ const ListOption = ({ <TooltipWrapper condition={hasTooltip} label={option.label}> <OptionItem aria-selected={!multiple ? isSelected : undefined} + as={isGroupedOption ? "li" : "div"} id={id} onClick={() => { onClick(option); diff --git a/packages/lib/src/select/Listbox.tsx b/packages/lib/src/select/Listbox.tsx index 7139d4cbbc..19085ddbe9 100644 --- a/packages/lib/src/select/Listbox.tsx +++ b/packages/lib/src/select/Listbox.tsx @@ -6,17 +6,16 @@ import ListOption from "./ListOption"; import { groupsHaveOptions } from "./utils"; import { ListboxProps, ListOptionGroupType, ListOptionType } from "./types"; -const ListboxContainer = styled.ul` +const ListboxContainer = styled.div` box-sizing: border-box; max-height: 304px; overflow-y: auto; - margin: 0; padding: var(--spacing-padding-xxs) var(--spacing-padding-none); background-color: var(--color-absolutes-white); border: var(--border-width-s) var(--border-style-default) var(--border-color-neutral-medium); border-radius: var(--border-radius-s); - box-shadow: var(--shadow-mid-x-position, 0px) var(--shadow-mid-y-position, 12px) var(--shadow-mid-blur, 12px) - var(--shadow-mid-spread, 0px) var(--shadow-light, rgba(209, 209, 209, 0.3)); + box-shadow: var(--shadow-mid-x-position) var(--shadow-mid-y-position) var(--shadow-mid-blur) var(--shadow-mid-spread) + var(--shadow-light); color: var(--color-fg-neutral-dark); font-family: var(--typography-font-family); font-size: var(--typography-label-m); @@ -59,7 +58,7 @@ const Listbox = ({ styles, }: ListboxProps): JSX.Element => { const translatedLabels = useContext(HalstackLanguageContext); - const listboxRef = useRef<HTMLUListElement | null>(null); + const listboxRef = useRef<HTMLDivElement>(null); let globalIndex = optional && !multiple ? 0 : -1; @@ -68,31 +67,29 @@ const Listbox = ({ if ("options" in option) { return ( option.options.length > 0 && ( - <li key={groupId}> - <ul role="group" aria-labelledby={groupId} style={{ padding: 0 }}> - <GroupLabel role="presentation" id={groupId}> - {option.label} - </GroupLabel> - {option.options.map((singleOption) => { - globalIndex++; - return ( - <ListOption - key={`${id}-option-${singleOption.value}`} - id={`${id}-option-${globalIndex}`} - option={singleOption} - onClick={handleOptionOnClick} - multiple={multiple} - visualFocused={visualFocusIndex === globalIndex} - isGroupedOption - isLastOption={lastOptionIndex === globalIndex} - isSelected={ - multiple ? currentValue.includes(singleOption.value) : currentValue === singleOption.value - } - /> - ); - })} - </ul> - </li> + <ul role="group" aria-labelledby={groupId} style={{ padding: 0 }}> + <GroupLabel role="presentation" id={groupId}> + {option.label} + </GroupLabel> + {option.options.map((singleOption) => { + globalIndex++; + return ( + <ListOption + key={`${id}-option-${singleOption.value}`} + id={`${id}-option-${globalIndex}`} + option={singleOption} + onClick={handleOptionOnClick} + multiple={multiple} + visualFocused={visualFocusIndex === globalIndex} + isGroupedOption + isLastOption={lastOptionIndex === globalIndex} + isSelected={ + multiple ? currentValue.includes(singleOption.value) : currentValue === singleOption.value + } + /> + ); + })} + </ul> ) ); } else { diff --git a/packages/lib/src/select/Select.accessibility.test.tsx b/packages/lib/src/select/Select.accessibility.test.tsx index 9b374297f8..d9600d3220 100644 --- a/packages/lib/src/select/Select.accessibility.test.tsx +++ b/packages/lib/src/select/Select.accessibility.test.tsx @@ -1,15 +1,8 @@ import { render } from "@testing-library/react"; -import { axe, formatRules } from "../../test/accessibility/axe-helper"; +import { axe } from "../../test/accessibility/axe-helper"; import DxcFlex from "../flex/Flex"; import DxcSelect from "./Select"; -// TODO: REMOVE -import { disabledRules as rules } from "../../test/accessibility/rules/specific/select/disabledRules"; - -const disabledRules = { - rules: formatRules(rules), -}; - const iconSVG = ( <svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor"> <g> @@ -115,7 +108,7 @@ describe("Select component accessibility tests", () => { /> </DxcFlex> ); - const results = await axe(baseElement, disabledRules); + const results = await axe(baseElement); expect(results).toHaveNoViolations(); }); it("Should not have basic accessibility issues for group mode", async () => { @@ -150,7 +143,7 @@ describe("Select component accessibility tests", () => { /> </DxcFlex> ); - const results = await axe(baseElement, disabledRules); + const results = await axe(baseElement); expect(results).toHaveNoViolations(); }); }); From f8465c2d3dbec9af91c86de8ff95dbd6e55e0a4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Mon, 10 Feb 2025 13:58:17 +0100 Subject: [PATCH 06/15] preview updates --- packages/lib/.storybook/preview-head.html | 1 - packages/lib/.storybook/preview.tsx | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lib/.storybook/preview-head.html b/packages/lib/.storybook/preview-head.html index e28cb145ff..4e1ea405ff 100644 --- a/packages/lib/.storybook/preview-head.html +++ b/packages/lib/.storybook/preview-head.html @@ -2,7 +2,6 @@ rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,600;0,700;0,800;1,300;1,400;1,600;1,700;1,800&display=swap&family=Material+Symbols+Outlined:FILL@0..1" /> -<link rel="stylesheet" href="../src/styles/variables.css" /> <style> body { diff --git a/packages/lib/.storybook/preview.tsx b/packages/lib/.storybook/preview.tsx index 50171526b6..e535a40648 100644 --- a/packages/lib/.storybook/preview.tsx +++ b/packages/lib/.storybook/preview.tsx @@ -1,5 +1,6 @@ import type { Preview } from "@storybook/react"; import { disabledRules } from "../test/accessibility/rules/common/disabledRules"; +import "../src/styles/variables.css"; const preview: Preview = { parameters: { From 78a1d7bae4067ec7243fa00fd438ecd9122fac07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Tue, 11 Feb 2025 11:13:30 +0100 Subject: [PATCH 07/15] More select updates and fixes --- packages/lib/src/select/ListOption.tsx | 2 +- packages/lib/src/select/Listbox.tsx | 52 +++++++++--------- packages/lib/src/select/Select.stories.tsx | 63 ++++++++++++---------- packages/lib/src/select/Select.tsx | 41 +++++++------- packages/lib/src/select/types.ts | 1 + 5 files changed, 89 insertions(+), 70 deletions(-) diff --git a/packages/lib/src/select/ListOption.tsx b/packages/lib/src/select/ListOption.tsx index 913d3e60eb..8c88a72f9d 100644 --- a/packages/lib/src/select/ListOption.tsx +++ b/packages/lib/src/select/ListOption.tsx @@ -85,7 +85,7 @@ const ListOption = ({ onClick, option, visualFocused, -}: OptionProps): JSX.Element => { +}: OptionProps) => { const [hasTooltip, setHasTooltip] = useState(false); const checkboxRef = useRef<HTMLDivElement>(null); diff --git a/packages/lib/src/select/Listbox.tsx b/packages/lib/src/select/Listbox.tsx index 19085ddbe9..11cc375b4d 100644 --- a/packages/lib/src/select/Listbox.tsx +++ b/packages/lib/src/select/Listbox.tsx @@ -45,18 +45,19 @@ const GroupLabel = styled.li` `; const Listbox = ({ - id, + ariaLabelledBy, currentValue, - options, - visualFocusIndex, + handleOptionOnClick, + id, lastOptionIndex, multiple, optional, optionalItem, + options, searchable, - handleOptionOnClick, styles, -}: ListboxProps): JSX.Element => { + visualFocusIndex, +}: ListboxProps) => { const translatedLabels = useContext(HalstackLanguageContext); const listboxRef = useRef<HTMLDivElement>(null); @@ -67,25 +68,26 @@ const Listbox = ({ if ("options" in option) { return ( option.options.length > 0 && ( - <ul role="group" aria-labelledby={groupId} style={{ padding: 0 }}> - <GroupLabel role="presentation" id={groupId}> + <ul key={groupId} aria-labelledby={groupId} role="group" style={{ padding: 0 }}> + <GroupLabel id={groupId} role="presentation"> {option.label} </GroupLabel> {option.options.map((singleOption) => { globalIndex++; + const optionId = `${id}-option-${globalIndex}`; return ( <ListOption - key={`${id}-option-${singleOption.value}`} - id={`${id}-option-${globalIndex}`} - option={singleOption} - onClick={handleOptionOnClick} - multiple={multiple} - visualFocused={visualFocusIndex === globalIndex} + id={optionId} isGroupedOption isLastOption={lastOptionIndex === globalIndex} isSelected={ multiple ? currentValue.includes(singleOption.value) : currentValue === singleOption.value } + key={optionId} + multiple={multiple} + onClick={handleOptionOnClick} + option={singleOption} + visualFocused={visualFocusIndex === globalIndex} /> ); })} @@ -94,16 +96,17 @@ const Listbox = ({ ); } else { globalIndex++; + const optionId = `${id}-option-${globalIndex}`; return ( <ListOption - key={`${id}-option-${option.value}`} - id={`${id}-option-${globalIndex}`} - option={option} - onClick={handleOptionOnClick} - multiple={multiple} - visualFocused={visualFocusIndex === globalIndex} + id={optionId} isLastOption={lastOptionIndex === globalIndex} isSelected={multiple ? currentValue.includes(option.value) : currentValue === option.value} + key={optionId} + multiple={multiple} + onClick={handleOptionOnClick} + option={option} + visualFocused={visualFocusIndex === globalIndex} /> ); } @@ -129,6 +132,7 @@ const Listbox = ({ return ( <ListboxContainer + aria-labelledby={ariaLabelledBy} aria-multiselectable={multiple} id={id} onClick={(event) => { @@ -150,14 +154,14 @@ const Listbox = ({ optional && !multiple && ( <ListOption - key={`${id}-option-${optionalItem.value}`} id={`${id}-option-${0}`} - option={optionalItem} - onClick={handleOptionOnClick} - multiple={multiple} - visualFocused={visualFocusIndex === 0} isLastOption={lastOptionIndex === 0} isSelected={multiple ? currentValue.includes(optionalItem.value) : currentValue === optionalItem.value} + key={`${id}-option-${optionalItem.value}`} + multiple={multiple} + onClick={handleOptionOnClick} + option={optionalItem} + visualFocused={visualFocusIndex === 0} /> ) )} diff --git a/packages/lib/src/select/Select.stories.tsx b/packages/lib/src/select/Select.stories.tsx index 366b1dcd46..dbcdaae7c2 100644 --- a/packages/lib/src/select/Select.stories.tsx +++ b/packages/lib/src/select/Select.stories.tsx @@ -1,12 +1,9 @@ -import { useContext } from "react"; import { userEvent, within } from "@storybook/test"; -import { ThemeProvider } from "styled-components"; import ExampleContainer from "../../.storybook/components/ExampleContainer"; import Title from "../../.storybook/components/Title"; import preview from "../../.storybook/preview"; import { disabledRules } from "../../test/accessibility/rules/specific/select/disabledRules"; import DxcFlex from "../flex/Flex"; -import HalstackContext from "../HalstackContext"; import Listbox from "./Listbox"; import DxcSelect from "./Select"; import { Meta, StoryObj } from "@storybook/react"; @@ -363,10 +360,8 @@ const Select = () => ( ); const SelectListbox = () => { - const colorsTheme = useContext(HalstackContext); - return ( - <ThemeProvider theme={colorsTheme.select}> + <> <Title title="Listbox" theme="light" level={2} /> <ExampleContainer> <Title @@ -397,7 +392,9 @@ const SelectListbox = () => { <Title title="Listbox option states" theme="light" level={3} /> <ExampleContainer pseudoState="pseudo-hover"> <Title title="Hovered option" theme="light" level={4} /> + <label id="x8-label">Choose an option</label> <Listbox + ariaLabelledBy="x8-label" id="x8" currentValue="" options={one_option} @@ -413,7 +410,9 @@ const SelectListbox = () => { </ExampleContainer> <ExampleContainer pseudoState="pseudo-active"> <Title title="Active option" theme="light" level={4} /> + <label id="x9-label">Choose an option</label> <Listbox + ariaLabelledBy="x9-label" id="x9" currentValue="" options={one_option} @@ -429,7 +428,9 @@ const SelectListbox = () => { </ExampleContainer> <ExampleContainer> <Title title="Focused option" theme="light" level={4} /> + <label id="x10-label">Choose an option</label> <Listbox + ariaLabelledBy="x10-label" id="x10" currentValue="" options={one_option} @@ -445,7 +446,9 @@ const SelectListbox = () => { </ExampleContainer> <ExampleContainer pseudoState="pseudo-hover"> <Title title="Hovered selected option" theme="light" level={4} /> + <label id="x11-label">Choose an option</label> <Listbox + ariaLabelledBy="x11-label" id="x11" currentValue="1" options={single_options} @@ -461,7 +464,9 @@ const SelectListbox = () => { </ExampleContainer> <ExampleContainer pseudoState="pseudo-active"> <Title title="Active selected option" theme="light" level={4} /> + <label id="x12-label">Choose an option</label> <Listbox + ariaLabelledBy="x12-label" id="x12" currentValue="2" options={single_options} @@ -478,7 +483,9 @@ const SelectListbox = () => { <Title title="Listbox with icons" theme="light" level={3} /> <ExampleContainer> <Title title="Icons (SVGs)" theme="light" level={4} /> + <label id="x13-label">Choose an option</label> <Listbox + ariaLabelledBy="x13-label" id="x13" currentValue="3" options={icon_options} @@ -494,7 +501,9 @@ const SelectListbox = () => { </ExampleContainer> <ExampleContainer> <Title title="Grouped icons (Material Symbols)" theme="light" level={4} /> + <label id="x14-label">Choose an option</label> <Listbox + ariaLabelledBy="x14-label" id="x14" currentValue={"4"} options={icon_options_grouped_material} @@ -510,7 +519,9 @@ const SelectListbox = () => { </ExampleContainer> <ExampleContainer> <Title title="Grouped icons (Material)" theme="light" level={4} /> + <label id="x15-label">Choose an option</label> <Listbox + ariaLabelledBy="x15-label" id="x15" currentValue={["car", "motorcycle", "train"]} options={options_material} @@ -524,7 +535,7 @@ const SelectListbox = () => { styles={{ width: 360 }} /> </ExampleContainer> - </ThemeProvider> + </> ); }; @@ -612,27 +623,25 @@ const TooltipValue = () => ( ); const TooltipOption = () => { - const colorsTheme = useContext(HalstackContext); - return ( - <ThemeProvider theme={colorsTheme.select}> - <ExampleContainer expanded> - <Title title="List option has tooltip when it overflows" theme="light" level={4} /> - <Listbox - id="x8" - currentValue="1" - options={optionsWithEllipsis} - visualFocusIndex={-1} - lastOptionIndex={2} - multiple={false} - optional={false} - optionalItem={{ label: "Empty", value: "" }} - searchable={false} - handleOptionOnClick={() => {}} - styles={{ width: 360 }} - /> - </ExampleContainer> - </ThemeProvider> + <ExampleContainer expanded> + <Title title="List option has tooltip when it overflows" theme="light" level={4} /> + <label id="x1-label">Choose an option</label> + <Listbox + ariaLabelledBy="x1-label" + id="x1" + currentValue="1" + options={optionsWithEllipsis} + visualFocusIndex={-1} + lastOptionIndex={2} + multiple={false} + optional={false} + optionalItem={{ label: "Empty", value: "" }} + searchable={false} + handleOptionOnClick={() => {}} + styles={{ width: 360 }} + /> + </ExampleContainer> ); }; diff --git a/packages/lib/src/select/Select.tsx b/packages/lib/src/select/Select.tsx index ef01d4c19d..c43f6dfce3 100644 --- a/packages/lib/src/select/Select.tsx +++ b/packages/lib/src/select/Select.tsx @@ -73,7 +73,7 @@ const Label = styled.label<{ const HelperText = styled.span<{ disabled: SelectPropsType["disabled"] }>` color: var(--color-fg-neutral-stronger); font-size: var(--typography-helper-text-s); - font-weight: var(--typography-helper-text-regular); + /* font-weight: var(--typography-helper-text-regular); */ margin-bottom: var(--spacing-gap-xs); `; @@ -243,8 +243,12 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( value, }, ref - ): JSX.Element => { + ) => { const id = `select-${useId()}`; + const errorId = `error-${id}`; + const labelId = `label-${id}`; + const listboxId = `${id}-listbox`; + const selectInputId = `select-input-${id}`; const [hasTooltip, setHasTooltip] = useState(false); const [innerValue, setInnerValue] = useState(defaultValue ?? (multiple ? [] : "")); @@ -478,7 +482,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( <SelectContainer margin={margin} size={size} ref={ref}> {label && ( <Label - id={`label-${id}`} + id={labelId} disabled={disabled} onClick={() => { selectRef?.current?.focus(); @@ -492,26 +496,26 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( <Popover.Root open={isOpen}> <Popover.Trigger asChild type={undefined}> <Select - id={id} + aria-activedescendant={visualFocusIndex >= 0 ? `option-${visualFocusIndex}` : undefined} + aria-controls={isOpen ? listboxId : undefined} + aria-disabled={disabled} + aria-errormessage={error ? errorId : undefined} + aria-expanded={isOpen} + aria-haspopup="listbox" + aria-invalid={!!error} + aria-label={label ? undefined : ariaLabel} + aria-labelledby={label ? labelId : undefined} + aria-required={!disabled && !optional} disabled={disabled} error={error} + id={selectInputId} onBlur={handleOnBlur} onClick={handleOnClick} onFocus={handleOnFocus} onKeyDown={handleOnKeyDown} ref={selectRef} - tabIndex={disabled ? -1 : tabIndex} role="combobox" - aria-controls={isOpen ? `${id}-listbox` : undefined} - aria-disabled={disabled} - aria-expanded={isOpen} - aria-haspopup="listbox" - aria-labelledby={label ? `label-${id}` : undefined} - aria-activedescendant={visualFocusIndex >= 0 ? `option-${visualFocusIndex}` : undefined} - aria-invalid={!!error} - aria-errormessage={error ? `error-${id}` : undefined} - aria-required={!disabled && !optional} - aria-label={label ? undefined : ariaLabel} + tabIndex={disabled ? -1 : tabIndex} > {multiple && Array.isArray(selectedOption) && selectedOption.length > 0 && ( <SelectionIndicator disabled={disabled}> @@ -553,7 +557,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( autoComplete="nope" autoCorrect="nope" size={1} - aria-labelledby={label ? `label-${id}` : undefined} + aria-labelledby={label ? labelId : undefined} /> )} {(!searchable || searchValue === "") && ( @@ -599,7 +603,8 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( }} > <Listbox - id={`${id}-listbox`} + ariaLabelledBy={labelId} + id={listboxId} currentValue={value ?? innerValue} options={searchable ? filteredOptions : options} visualFocusIndex={visualFocusIndex} @@ -615,7 +620,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( </Popover.Portal> </Popover.Root> {!disabled && typeof error === "string" && ( - <Error id={`error-${id}`} role="alert" aria-live={error ? "assertive" : "off"}> + <Error id={errorId} role="alert" aria-live={error ? "assertive" : "off"}> {error && <DxcIcon icon="filled_error" />} {error} </Error> diff --git a/packages/lib/src/select/types.ts b/packages/lib/src/select/types.ts index 850746167e..921fbdcb19 100644 --- a/packages/lib/src/select/types.ts +++ b/packages/lib/src/select/types.ts @@ -181,6 +181,7 @@ export type OptionProps = { * Listbox from the select component. */ export type ListboxProps = { + ariaLabelledBy: string; id: string; currentValue: string | string[]; options: ListOptionType[] | ListOptionGroupType[]; From 6694bf8535a7cae211346a4be3f6ea2d508792ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Tue, 11 Feb 2025 16:53:47 +0100 Subject: [PATCH 08/15] Updates based on feedback from the designers --- packages/lib/src/select/ListOption.tsx | 13 ++++++------- packages/lib/src/select/Listbox.tsx | 8 +++++--- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/lib/src/select/ListOption.tsx b/packages/lib/src/select/ListOption.tsx index 8c88a72f9d..8bb2d66af4 100644 --- a/packages/lib/src/select/ListOption.tsx +++ b/packages/lib/src/select/ListOption.tsx @@ -9,17 +9,16 @@ const OptionItem = styled.li<{ visualFocused: OptionProps["visualFocused"]; selected: OptionProps["isSelected"]; }>` - ${({ selected }) => selected && "background-color: var(--color-bg-secondary-lighter);"}; padding: var(--spacing-padding-none) var(--spacing-padding-xs); cursor: pointer; - + ${({ selected }) => selected && "background-color: var(--color-bg-secondary-lighter);"}; &:hover { - background-color: var( - ${({ selected }) => (selected ? "--color-bg-secondary-lighter" : "--color-bg-neutral-light")} - ); + background-color: ${({ selected }) => + selected ? "var(--color-bg-secondary-medium)" : "var(--color-bg-neutral-light)"}; } &:active { - background-color: var(${({ selected }) => (selected ? "--color-bg-secondary-medium" : "--color-bg-neutral-light")}); + background-color: ${({ selected }) => + selected ? "var(--color-bg-secondary-medium)" : "var(--color-bg-neutral-light)"}; } ${({ visualFocused }) => visualFocused && @@ -37,7 +36,7 @@ const StyledOption = styled.span<{ align-items: center; gap: var(--spacing-gap-s); height: var(--height-m); - ${({ grouped }) => grouped && "padding-left: var(--spacing-padding-xs);"} + ${({ grouped }) => grouped && "padding-left: var(--spacing-padding-s);"} ${(props) => `border-bottom: var(--border-width-s) var(--border-style-default) ${props.last || props.visualFocused || props.selected ? "transparent" : "var(--border-color-neutral-lighter)"};`}; diff --git a/packages/lib/src/select/Listbox.tsx b/packages/lib/src/select/Listbox.tsx index 11cc375b4d..394b3ea060 100644 --- a/packages/lib/src/select/Listbox.tsx +++ b/packages/lib/src/select/Listbox.tsx @@ -5,13 +5,13 @@ import { HalstackLanguageContext } from "../HalstackContext"; import ListOption from "./ListOption"; import { groupsHaveOptions } from "./utils"; import { ListboxProps, ListOptionGroupType, ListOptionType } from "./types"; +import { scrollbarStyles } from "../styles/scroll"; const ListboxContainer = styled.div` box-sizing: border-box; max-height: 304px; - overflow-y: auto; padding: var(--spacing-padding-xxs) var(--spacing-padding-none); - background-color: var(--color-absolutes-white); + background-color: var(--color-bg-neutral-lightest); border: var(--border-width-s) var(--border-style-default) var(--border-color-neutral-medium); border-radius: var(--border-radius-s); box-shadow: var(--shadow-mid-x-position) var(--shadow-mid-y-position) var(--shadow-mid-blur) var(--shadow-mid-spread) @@ -20,6 +20,8 @@ const ListboxContainer = styled.div` font-family: var(--typography-font-family); font-size: var(--typography-label-m); font-weight: var(--typography-label-regular); + overflow-y: auto; + ${scrollbarStyles} `; const OptionsSystemMessage = styled.span` @@ -68,7 +70,7 @@ const Listbox = ({ if ("options" in option) { return ( option.options.length > 0 && ( - <ul key={groupId} aria-labelledby={groupId} role="group" style={{ padding: 0 }}> + <ul key={groupId} aria-labelledby={groupId} role="group" style={{ padding: 0, margin: 0 }}> <GroupLabel id={groupId} role="presentation"> {option.label} </GroupLabel> From 5cfd46547614f94f54c00b1d23cab3b9f736aebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Mon, 17 Feb 2025 09:23:48 +0100 Subject: [PATCH 09/15] Select updates --- packages/lib/src/select/Select.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/lib/src/select/Select.tsx b/packages/lib/src/select/Select.tsx index c43f6dfce3..4c092a3e44 100644 --- a/packages/lib/src/select/Select.tsx +++ b/packages/lib/src/select/Select.tsx @@ -449,16 +449,18 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( const handleClearOptionsActionOnClick = (event: MouseEvent<HTMLButtonElement>) => { event.stopPropagation(); + + const empty: string[] = []; if (value == null) { - setInnerValue([]); + setInnerValue(empty); } if (!optional) { onChange?.({ - value: [] as string[] as string & string[], + value: empty as string & string[], error: translatedLabels.formFields.requiredValueErrorMessage, }); } else { - onChange?.({ value: [] as string[] as string & string[] }); + onChange?.({ value: empty as string & string[] }); } }; From 666b76a9099fb6779f8a58e3bb44b2c6b6ec8f78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Fri, 28 Feb 2025 12:25:27 +0100 Subject: [PATCH 10/15] Updates based on feedback --- packages/lib/src/select/Select.tsx | 41 +++++++++++++++--------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/packages/lib/src/select/Select.tsx b/packages/lib/src/select/Select.tsx index 4c092a3e44..5885a13671 100644 --- a/packages/lib/src/select/Select.tsx +++ b/packages/lib/src/select/Select.tsx @@ -52,7 +52,6 @@ const SelectContainer = styled.div<{ props.margin && typeof props.margin === "object" && props.margin.bottom ? spaces[props.margin.bottom] : ""}; margin-left: ${(props) => props.margin && typeof props.margin === "object" && props.margin.left ? spaces[props.margin.left] : ""}; - font-family: var(--typography-font-family); `; const Label = styled.label<{ @@ -60,10 +59,12 @@ const Label = styled.label<{ helperText: SelectPropsType["helperText"]; }>` color: var(${({ disabled }) => (disabled ? "--color-fg-neutral-medium" : "--color-fg-neutral-dark")}); + font-family: var(--typography-font-family); font-size: var(--typography-label-m); font-weight: var(--typography-label-semibold); ${({ helperText }) => !helperText && "margin-bottom: var(--spacing-gap-xs);"} + /* Optional text */ > span { color: var(--color-fg-neutral-stronger); font-weight: var(--typography-label-regular); @@ -71,10 +72,11 @@ const Label = styled.label<{ `; const HelperText = styled.span<{ disabled: SelectPropsType["disabled"] }>` - color: var(--color-fg-neutral-stronger); - font-size: var(--typography-helper-text-s); - /* font-weight: var(--typography-helper-text-regular); */ margin-bottom: var(--spacing-gap-xs); + color: ${({ disabled }) => (disabled ? "var(--color-fg-neutral-medium)" : "var(--color-fg-neutral-stronger)")}; + font-family: var(--typography-font-family); + font-size: var(--typography-helper-text-s); + font-weight: var(--typography-helper-text-regular); `; const Select = styled.div<{ @@ -89,17 +91,15 @@ const Select = styled.div<{ padding: var(--spacing-padding-none) var(--spacing-padding-xs); border-radius: var(--border-radius-s); border: var(--border-width-s) var(--border-style-default) var(--border-color-neutral-dark); - ${(props) => - props.error && - !props.disabled && - "border: var(--border-width-m) var(--border-style-default) var(--border-color-error-medium);"} + ${({ disabled, error }) => + error && !disabled && "border: var(--border-width-m) var(--border-style-default) var(--border-color-error-medium);"} - ${(props) => - !props.disabled + ${({ disabled, error }) => + !disabled ? ` cursor: pointer; &:hover { - border-color: var(${props.error ? "--border-color-error-strong;" : "--border-color-primary-strong"}); + border-color: var(${error ? "--border-color-error-strong;" : "--border-color-primary-strong"}); } &:focus-within { outline-offset: -2px; @@ -110,20 +110,19 @@ const Select = styled.div<{ /* Collapse indicator */ > span[role="img"] { - color: var(${({ disabled }) => (disabled ? "--color-fg-neutral-medium" : "--color-fg-neutral-dark")}); + color: ${({ disabled }) => (disabled ? "var(--color-fg-neutral-medium)" : "var(--color-fg-neutral-dark)")}; font-size: var(--height-xxs); } `; const SelectionIndicator = styled.div<{ disabled: SelectPropsType["disabled"] }>` - box-sizing: border-box; display: grid; grid-template-columns: 1fr 1fr; min-width: 48px; min-height: var(--height-s); border-radius: var(--border-radius-xs); border: var(--border-width-s) var(--border-style-default) - var(${({ disabled }) => (disabled ? "--border-color-neutral-strong" : "--border-color-neutral-light")}); + ${({ disabled }) => (disabled ? "var(--border-color-neutral-strong)" : "var(--border-color-neutral-light)")}; `; const SelectionNumber = styled.span<{ disabled: SelectPropsType["disabled"] }>` @@ -131,13 +130,13 @@ const SelectionNumber = styled.span<{ disabled: SelectPropsType["disabled"] }>` place-items: center; background-color: ${({ disabled }) => (disabled ? "transparent" : "var(--color-bg-neutral-lighter)")}; border-right: var(--border-width-s) var(--border-style-default) - var(${({ disabled }) => (disabled ? "--border-color-neutral-medium" : "--border-color-neutral-light")}); - color: var(${(props) => (props.disabled ? "--color-fg-neutral-medium" : "--color-fg-neutral-dark")}); + ${({ disabled }) => (disabled ? "var(--border-color-neutral-medium)" : "var(--border-color-neutral-light)")}; + color: ${({ disabled }) => (disabled ? "var(--color-fg-neutral-medium)" : "var(--color-fg-neutral-dark)")}; font-size: var(--typography-label-s); font-weight: var(--typography-label-regular); text-align: center; user-select: none; - ${(props) => (props.disabled ? `cursor: not-allowed;` : `cursor: default;`)} + ${({ disabled }) => (disabled ? "cursor: not-allowed;" : "cursor: default;")} `; const ClearOptionsAction = styled.button` @@ -149,11 +148,11 @@ const ClearOptionsAction = styled.button` width: 100%; font-size: var(--height-xxxs); - &:focus-visible { + &:focus { outline: none; } - ${(props) => - !props.disabled + ${({ disabled }) => + !disabled ? ` color: var(--color-fg-neutral-dark); cursor: pointer; @@ -255,7 +254,7 @@ const DxcSelect = forwardRef<RefType, SelectPropsType>( const [isOpen, changeIsOpen] = useState(false); const [searchValue, setSearchValue] = useState(""); const [visualFocusIndex, changeVisualFocusIndex] = useState(-1); - + const selectRef = useRef<HTMLDivElement | null>(null); const selectSearchInputRef = useRef<HTMLInputElement | null>(null); From d9757170052eac88e262321fd5e3942c3799c7a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Fri, 28 Feb 2025 15:02:41 +0100 Subject: [PATCH 11/15] Select documentation --- apps/website/pages/components/select/code.tsx | 17 + .../website/pages/components/select/index.tsx | 24 +- .../components/select/specifications.tsx | 21 - .../website/pages/components/select/usage.tsx | 21 - .../components/select/SelectPageLayout.tsx | 5 +- .../select/overview/SelectOverviewPage.tsx | 257 ++++ .../examples/filterable.ts | 0 .../examples/multiple.ts} | 6 - .../examples/requiredOptional.ts | 0 .../select/overview/examples/single.ts | 31 + .../select/overview/images/select_anatomy.png | Bin 0 -> 68848 bytes .../select/specs/SelectSpecsPage.tsx | 1158 ----------------- .../images/option_item_states_multiple.png | Bin 41621 -> 0 bytes .../images/option_item_states_single.png | Bin 42407 -> 0 bytes .../select/specs/images/select_anatomy.png | Bin 43084 -> 0 bytes .../images/select_input_states_multiple.png | Bin 35158 -> 0 bytes .../images/select_input_states_single.png | Bin 33675 -> 0 bytes .../select/specs/images/select_specs.png | Bin 81182 -> 0 bytes .../select/usage/SelectUsagePage.tsx | 122 -- packages/lib/src/select/Select.stories.tsx | 25 +- packages/lib/src/select/Select.tsx | 6 +- packages/lib/src/select/types.ts | 2 + 22 files changed, 335 insertions(+), 1360 deletions(-) create mode 100644 apps/website/pages/components/select/code.tsx delete mode 100644 apps/website/pages/components/select/specifications.tsx delete mode 100644 apps/website/pages/components/select/usage.tsx create mode 100644 apps/website/screens/components/select/overview/SelectOverviewPage.tsx rename apps/website/screens/components/select/{usage => overview}/examples/filterable.ts (100%) rename apps/website/screens/components/select/{usage/examples/variants.ts => overview/examples/multiple.ts} (81%) rename apps/website/screens/components/select/{usage => overview}/examples/requiredOptional.ts (100%) create mode 100644 apps/website/screens/components/select/overview/examples/single.ts create mode 100644 apps/website/screens/components/select/overview/images/select_anatomy.png delete mode 100644 apps/website/screens/components/select/specs/SelectSpecsPage.tsx delete mode 100644 apps/website/screens/components/select/specs/images/option_item_states_multiple.png delete mode 100644 apps/website/screens/components/select/specs/images/option_item_states_single.png delete mode 100644 apps/website/screens/components/select/specs/images/select_anatomy.png delete mode 100644 apps/website/screens/components/select/specs/images/select_input_states_multiple.png delete mode 100644 apps/website/screens/components/select/specs/images/select_input_states_single.png delete mode 100644 apps/website/screens/components/select/specs/images/select_specs.png delete mode 100644 apps/website/screens/components/select/usage/SelectUsagePage.tsx diff --git a/apps/website/pages/components/select/code.tsx b/apps/website/pages/components/select/code.tsx new file mode 100644 index 0000000000..ee4d1db2c6 --- /dev/null +++ b/apps/website/pages/components/select/code.tsx @@ -0,0 +1,17 @@ +import Head from "next/head"; +import type { ReactElement } from "react"; +import SelectPageLayout from "screens/components/select/SelectPageLayout"; +import SelectCodePage from "screens/components/select/code/SelectCodePage"; + +const Code = () => ( + <> + <Head> + <title>Select Code — Halstack Design System + + + +); + +Code.getLayout = (page: ReactElement) => {page}; + +export default Code; diff --git a/apps/website/pages/components/select/index.tsx b/apps/website/pages/components/select/index.tsx index 80066efc7b..f957a7195d 100644 --- a/apps/website/pages/components/select/index.tsx +++ b/apps/website/pages/components/select/index.tsx @@ -1,21 +1,17 @@ import Head from "next/head"; import type { ReactElement } from "react"; import SelectPageLayout from "screens/components/select/SelectPageLayout"; -import SelectCodePage from "screens/components/select/code/SelectCodePage"; +import SelectOverviewPage from "screens/components/select/overview/SelectOverviewPage"; -const Index = () => { - return ( - <> - - Select — Halstack Design System - - - - ); -}; +const Index = () => ( + <> + + Select — Halstack Design System + + + +); -Index.getLayout = function getLayout(page: ReactElement) { - return {page}; -}; +Index.getLayout = (page: ReactElement) => {page}; export default Index; diff --git a/apps/website/pages/components/select/specifications.tsx b/apps/website/pages/components/select/specifications.tsx deleted file mode 100644 index c009fc2f1f..0000000000 --- a/apps/website/pages/components/select/specifications.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import Head from "next/head"; -import type { ReactElement } from "react"; -import SelectPageLayout from "screens/components/select/SelectPageLayout"; -import SelectSpecsPage from "screens/components/select/specs/SelectSpecsPage"; - -const Specifications = () => { - return ( - <> - - Select Specs — Halstack Design System - - - - ); -}; - -Specifications.getLayout = function getLayout(page: ReactElement) { - return {page}; -}; - -export default Specifications; diff --git a/apps/website/pages/components/select/usage.tsx b/apps/website/pages/components/select/usage.tsx deleted file mode 100644 index 31d0b44cb2..0000000000 --- a/apps/website/pages/components/select/usage.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import Head from "next/head"; -import type { ReactElement } from "react"; -import SelectPageLayout from "screens/components/select/SelectPageLayout"; -import SelectUsagePage from "screens/components/select/usage/SelectUsagePage"; - -const Usage = () => { - return ( - <> - - Select Usage — Halstack Design System - - - - ); -}; - -Usage.getLayout = function getLayout(page: ReactElement) { - return {page}; -}; - -export default Usage; diff --git a/apps/website/screens/components/select/SelectPageLayout.tsx b/apps/website/screens/components/select/SelectPageLayout.tsx index c8fbe8d076..425d0958c0 100644 --- a/apps/website/screens/components/select/SelectPageLayout.tsx +++ b/apps/website/screens/components/select/SelectPageLayout.tsx @@ -6,9 +6,8 @@ import { ReactNode } from "react"; const SelectPageHeading = ({ children }: { children: ReactNode }) => { const tabs = [ - { label: "Code", path: "/components/select" }, - { label: "Usage", path: "/components/select/usage" }, - { label: "Specifications", path: "/components/select/specifications" }, + { label: "Overview", path: "/components/select" }, + { label: "Code", path: "/components/select/code" }, ]; return ( diff --git a/apps/website/screens/components/select/overview/SelectOverviewPage.tsx b/apps/website/screens/components/select/overview/SelectOverviewPage.tsx new file mode 100644 index 0000000000..97579c7ac9 --- /dev/null +++ b/apps/website/screens/components/select/overview/SelectOverviewPage.tsx @@ -0,0 +1,257 @@ +import { DxcParagraph, DxcBulletedList, DxcFlex } from "@dxc-technology/halstack-react"; +import QuickNavContainer from "@/common/QuickNavContainer"; +import QuickNavContainerLayout from "@/common/QuickNavContainerLayout"; +import DocFooter from "@/common/DocFooter"; +import Example from "@/common/example/Example"; +import single from "./examples/single"; +import multiple from "./examples/multiple"; +import filterable from "./examples/filterable"; +import Image from "@/common/Image"; +import anatomy from "./images/select_anatomy.png"; + +const sections = [ + { + title: "Introduction", + content: ( + + The select component provides a structured way for users to{" "} + choose from a predefined list of options, streamlining decision-making in forms and interfaces. + It supports various configurations, including placeholder text, grouped options, and icons, allowing for better + usability and alignment with design needs. Designed for clarity and efficiency, it helps maintain a clean UI + while offering an intuitive selection process. + + ), + }, + { + title: "Anatomy", + content: ( + <> + Select's anatomy + + + Selection indicator (multiple): a visual marker, typically a checkmark, that shows which + items have been selected in the multi-select variant of the component. + + + Select all item: an option that allows users to select or deselect all available choices in + the multi-select variant of the component for efficiency. + + + List option: an individual selectable item within the dropdown list, representing a choice + available to the user. + + + List option checkbox: a checkbox placed next to each list option in a multi-select + dropdown, allowing users to select multiple items. + + + Icon: a small graphic or symbol that visually represents the list option, aiding quick + recognition of choices. + + + List option label: the text displayed next to an option in the listbox, providing a clear + description of the choice. + + + Label: a descriptive title for the select component, helping users understand its purpose + and context. + + + Helper text: additional guidance placed below the label to clarify how the user should + interact with the select component. + + + Select value(s): displays the currently selected options within the input area, allowing + users to see their selections at a glance. + + + Expand/collapse icon: a visual indicator that signals whether the dropdown list can be + expanded or collapsed. + + + Select container: the outer structure enclosing the select component, ensuring proper + spacing and alignment within the UI. + + + Select listbox: the dropdown box that appears when the select is expanded, containing all + available options. + + + List item selected indicator (single): a checkmark or highlight used to indicate which + option is currently selected in a single-selection dropdown. + + + List item (single): an individual selectable option in a single-selection dropdown, + allowing users to pick only one choice at a time. + + + + ), + }, + { + title: "Using selects", + content: ( + + The select component allows users to choose from a predefined list of options, making it a valuable input method + for collecting user-provided information. It is particularly useful in forms where users need + to submit structured data efficiently. Designed to handle more than four options, the select + component improves usability by reducing clutter and keeping the interface clean compared to radio buttons or + other selection methods. Depending on the use case, it can support both single and multiple selections, enabling + flexibility in data input. + + ), + subSections: [ + { + title: "Filtering", + content: ( + <> + + Filtering features are present in all variants of the select component, and it's a very useful attribute + of the component when dealing with long lists of options. + + + As the user types, the list dynamically narrows down to display only the matching results + , improving efficiency and ease of selection. The value updates when the user either types a string that + matches an existing option or manually selects one from the list. If no matches are found, a "No matches + found" message is displayed, providing clear feedback. + + + + ), + }, + { + title: "Required and optional", + content: ( + + The select component can be either optional or required, depending on the + context. When marked as optional, it includes a placeholder-like option that allows users + to leave the field empty if no selection is needed. On the other hand, if no optional label is present, the + field is considered required, meaning users must choose an option before proceeding. If a + required select is left empty, an error message stating "This field cannot be empty" should + appear when the component loses focus, ensuring users provide the necessary input before submitting a form. + + ), + }, + { + title: "Select vs dropdown", + content: ( + <> + + While both the select and dropdown components present a list of options, + they serve distinct purposes within an interface. The select component is primarily used + in forms to collect user input, allowing either single or multiple selections from a predefined set of + options. It is designed to replace traditional radio buttons or checkboxes when space efficiency is + needed, especially when dealing with long lists. Additionally, the select component can include a + filtering mechanism to help users find their desired option more easily. + + + On the other hand, the dropdown component is not meant for form inputs but rather for + displaying contextual actions or navigation links. It typically triggers a menu that offers options such + as commands, shortcuts, or external links, often enhancing interaction within a UI. Unlike the select, + dropdowns do not retain selected values within the component itself but instead execute an action upon + selection. + + + When deciding between the two, consider whether the component needs to collect and retain user input + (select) or provide quick access to actions and links (dropdown). + + + ), + }, + ], + }, + { + title: "Variants", + content: ( + + Depending on the number of items the user is able to select, our component can allow multiple or single + selection. + + ), + subSections: [ + { + title: "Single selection", + content: ( + <> + + Ideal for scenarios where a single, definitive choice is required, the single-selection allows users to + choose only one option from a predefined list. This variant is commonly used in forms + where users need to specify categories, pick a location, select a status, or choose from mutually + exclusive options like gender, payment methods, or subscription plans. It simplifies decision-making by + preventing multiple selections, ensuring clarity and accuracy in user inputs. + + + + ), + }, + { + title: "Multiple selection", + content: ( + <> + + The multiple-selection allows users to choose more than one option from a list, making it + perfect for scenarios where multiple selections are necessary. This variant is commonly used in filters, + permission settings, tag selection, and cases where users need to customize their choices, such as + selecting multiple product categories, preferred communication channels, or applicable document types. + + + To enhance usability, this variant includes a "Select all" feature within the listbox, + allowing users to quickly select all options at once. This functionality is especially useful in forms + with long lists, where multiple selections are likely to be valid, reducing the time and effort needed to + choose items individually. + + + + ), + }, + ], + }, + { + title: "Best practices", + content: ( + + + Use select for more than four options: if the number of choices is fewer, consider using + radio buttons (for single selection) or checkboxes (for multiple selection) to reduce user interaction effort. + + + Enable filtering for long lists: if the option list is extensive (around 15 or more items), + use the filterable variant to help users quickly find relevant choices. + + + Label optional fields clearly: when the select field is optional, ensure a placeholder option + is available to indicate that the field can be left empty. If it’s required, provide an error message when + left unselected. + + + Choose the right selection mode: use the single-selection variant when users need to pick + only one option. If multiple selections are needed, enable the multi-selection variant and consider including + the "select all" feature for better usability. + + + Keep option labels clear and concise: avoid overly long or ambiguous option labels. Each + choice should be easily scannable and self-explanatory. + + + Use placeholders wisely: a placeholder should provide guidance but not be mistaken for a + default selection. Be clear and concise when deciding which placeholder to set into the select. + + + Prevent excessive nesting: when grouping options into categories, keep the hierarchy simple + and easy to navigate to avoid overwhelming the user. + + + ), + }, +]; + +const SelectOverviewPage = () => ( + + + + + + +); + +export default SelectOverviewPage; diff --git a/apps/website/screens/components/select/usage/examples/filterable.ts b/apps/website/screens/components/select/overview/examples/filterable.ts similarity index 100% rename from apps/website/screens/components/select/usage/examples/filterable.ts rename to apps/website/screens/components/select/overview/examples/filterable.ts diff --git a/apps/website/screens/components/select/usage/examples/variants.ts b/apps/website/screens/components/select/overview/examples/multiple.ts similarity index 81% rename from apps/website/screens/components/select/usage/examples/variants.ts rename to apps/website/screens/components/select/overview/examples/multiple.ts index 02e77e65e6..3ceef9c8fe 100644 --- a/apps/website/screens/components/select/usage/examples/variants.ts +++ b/apps/website/screens/components/select/overview/examples/multiple.ts @@ -11,12 +11,6 @@ const code = `() => { return ( - { + const options = [ + { label: "Option 01", value: "1" }, + { label: "Option 02", value: "2" }, + { label: "Option 03", value: "3" }, + { label: "Option 04", value: "4" }, + ]; + + return ( + + + + + + ); +}`; + +const scope = { + DxcSelect, + DxcFlex, + DxcInset, +}; + +export default { code, scope }; diff --git a/apps/website/screens/components/select/overview/images/select_anatomy.png b/apps/website/screens/components/select/overview/images/select_anatomy.png new file mode 100644 index 0000000000000000000000000000000000000000..ce1fc758858f3b7825dd41ef0188a7eaff55dd35 GIT binary patch literal 68848 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

bJqG+XArfQ=R(BDXs$cHF&?vRapWfSY zI3?$yc_~{-SYysT?by!Qu*z<7s*;tp-^Zg@8eUo@+e8V3tj%>}6dnAlM?Sv3gVxAv zT^ms!U*n3j&F*dRvM!J_3pr;J_C!y_SbaES$N2AcX^%l#&Z~nW(Zibk??v9sw?C+q=IeoW0;_%MDxNJ4Yo@|C?wg77S^|}{CwT{+A{p} z9Nje)L!%|>5JVdS9o$hMzt`(F1Tsybj>D1yKvnwwGKMw0N>5^tqql#H+fZ(QI(8 z`7h9#ez)*=#~;PFqB;TkUw6Ln>(1cu5EO9{8QV_;VzAvNKqEj@-m_LRBurJIhI|w@ z%gMVyCXS;>87T}&$=?$yKooD(GfSoe+prZA{rNv?D2bTCHz$Ydgxmx76rN*L*5=^) z8RRK@;lRiW%|M<=^D4Uyz=^&7$Oh1s^SRC1#Gt0PaYOM-zRP1xpx-8EdtozsN2+z| zKBaZBt#)mQ%Qm2>Hh$Kr2LtoG9`=Hdw`~A_BhZ|am55ylo8;&-I_+6d@e}CnQNsjW zP>1W44tVZt-)cAubYS&QT?Vb%4p?xl?uAeH4J%7aEPcQP2JifMRMT}oEflCbBlkkx z?bfc!N8YVp1d1V!>_Q9Yw@svH?QneD@_qIse_mM9qj{8{xzSouAI;;P2Iyopi^>XO|nhO%NZkP+_Hp1Q;im+nS)#AuAq!j%&+Nee)%4!`g`vg9{d}Y4P^Ce zO%OTt^}4Pj@~`^c8WXPMJz$S=Ytmba%`+R%!AU3C{fO;Fx4B`WRzDb_pc1JAF5AKm=7(Ul41ZSOp)?o{b0w8TE#lDPobryDo@#X)rd>0WN8=Wra>{YB#u4)DF_2)g(;E?+_$ zV8xJNWL5u7=+m8m4wA^!F6Bex>7^%xU~REu$`?tY3%CCcnF-2GV0oH7=^GS3@=Tt5 zf==>CP2PMQGmbw~E7Kef#dZmrOctyWXa912Ut5lK+q zSsGvMv!VF!emW6h&^KL&-c=sB!852wjMFo}b>OBp2&%>ei1p|E8c`iX)@2dxKD*Rr zi4J(BMHB`S4c?KlkPO%<6L@TJV$?moTgGI0>J$1UQ}|g}yn{~!@96z(zgaXlXCcyf zrs6mNXR$oqvP1ECPVM$kGZW!t*Ph{>eO9gY4aI>|6&6MU<4-@;=&(l6c(sa8?e>6~ zyH#yFU`ada*Axn+8j+-31c&qz;k_45_+R3Un8`vmpnt9yf$=)0i#ziwV19G|Oxk`} zdS39o)~Aqxw_-DQ5j%xr{&mUL6t87d(bdpLSOrc}hEM;IBe@jvW4 z8$P#rRsE}uSLlc)tIsgSrndd3tT2+gm+llYWva4hUNu&2<))%CoM1c%;t%s4FQA5P zm`Kz=k}R=Z|8Yn-TTkzPpNb&trVz(bgpe-wXvDH1tXl@25ppLuaC3tAQdDiYIJ}^; zwu-BLDngom)FZ0i0TZ+=_iRSJMp}&_7MMVOusArV51KaJfI!!;xDUF?T<<)xZDc?h zA2@mO6=vY`dEzS?LG=&J`Alcw0IDqE>Wr&+ZLUU~op@%bf~~g%{py>%;(v2*HDr0m zpOVLyZ8@+xE>;BZExuwC{zhXTacxg!l=~+-n=`y^2YGOXmwpfq@EY;@=`bB>@a>ze z^E|W46wt-RYf}xLZkfKGufIC>2F5ib@M0aCr`E)}sej~Ttb|sv|I(E0gR_TfT}xFT zVG0^QzNyW`H)?ArpZuti$qiT(^?2h;fcrh@Y1Cx8C6MLkUo;;#-kGQ51JP}z>Dx_( z9)7p@j?*ic3akfpRxVo~1|Zlnl~_oiJd3!}!B!hi*~#f?eT3Sr{~n0HS|RTL{2eA7Oz!dN5;MmjpL{Xm zPA{aaUK#(h-RXJ6mFVg!yK?@OBuzl6?L9LXd#oHq@}_L85bBP7Ar1u)EThT+sQe-Y zZ{!Hbzsee0IFEt}Q((9Xmq5YoQzs)X{bt-U57&A`q3_lBa7N39OAV)>Wf#p)YI|@9 zbX<-FI*^2r6GREdi0}gV^5FM03`bDB7UB>=2>9S|9CgOuD;{7gTagBEVJ9vY^1P^j z*(qZ{sae{r|J5TrVih#PvB(M2zZ|F6|JR~|&vr8nY!eJX)FX?1m^O+6>O_uamG*k@ zZEh}<$8;OcZmuRg&*K$4)XlCOaQuaqgHP1Q$)sC5Crx8mkQ&nwN2(e@R}}Dm0{0wKhDhQ0Icq=;4eMtvcetq z8`;v`FiB+DYIe(m&8yvQo8A!yo7D_q{*9b)-Bp63!ci0e&~kXr0zB?fA@#mz*eQJb zvuS^vg30$eqTdfh!EJh*lpaiOkM((uzopI4E;@$*2^R-70s6E|sJmVA)we6F$DJ zv#!`NFz#6~TAWiR9*E5an>}V!@qch~wT1`aZvl4PvfBEGxGOnJT`kVAG^E=!j~&fUhOp+$ zzPCmfZ~ghp-FLppoQ<84I9-j?l2c5`MVhlF@emFV%Gm9DPAV=n~XSHGM z-Pb&SD_6?k26EhSImiov9Z=R`op-9je6y>wEFFS&>WSx@j+>CO9x_W`min3 zp|`5{205&}`3)C_J@15#{o``imq&*!9x(Y$=PY8SlcQor0` zCO^jHxTw+iuJkYo;7t+{T%Q59DJcrxqxV}qmiLkJXLb9j@J^CY~(jKVUW|wrFSi z2|U)v?7|D!5ThO4nN`aPf;SQ#0-G{o5 zBIN>?Y#s{lUrNB7UhBz?o=Bea@}6AXR7sEcOE2THh-KIpXXpO9>b=CWRk+|EHNHEt zutsO71cur_i3_sAsu|yk=k_Mv3Eh#{?HUmJz|t-sG{1=KSiD6DTvKqqG-k5#A2*L8 z0K9M2blkdZjhH6cw={OVS3PD+iabzU?vm!S`%J7aXlh2NJFXxpff9zLC^Re8kAERK zkKb}-b6>nAlw)4+8!-E%PNMF`M)+P+2__-k@1{H{w#xbTP)J|W+PVVzSF@Z*p#{2L zmaE%nR{?P6twf8|Ydw~C=p=d1uTmx`i?RXpAz#A~tG+um#Eq*K;z?C&+#Pvg)^a74 z0;&tEWS0)|ND*$mC7*+KX>M!6ZW2OWH#hG{q$!g7%SI`S7m7+%wp);|StC}9=i!xO z?uT=-f0NEtnIhp;VWm_R>bBJCkNsyVQ@)_3$Rn+?5%<++Al@va|LYaVEIo!7jW3XYH z{dZZs`3^Re%uf-hGDi>K*(f{sZsJ0SXd!;(nhR(S3vR9LoHFW^&+4 ze+WHJv$5UD2QGW6PFYo(WC?!uR;4>EbByO;^`y&uU45=}c9%=o@Z&3Sg)^wlu*}Le zGezQo^4szcTOKD{SXB)IatRMhAt(wa=Dc>y2);B_>+k3F5%mpI2T^X!s4vT%4PK8k zHH^$nkZ(j)3htDnb2qKMJgVWoHO|C9Tk2Q!VfS zYL=Pc!6^32-OKL7&}&JK<)sDg=hisa(q`W~oK&sJMS%miDdfM^@d=gi5V3v`N)kvx ze1PbCGb4Cv(08rXzN_Gn)kU>t?+5`-^t-;(OMo*jPEX{~FNJNX&-Lbp?2(h~Y8Pu) zX0IUKs+~!dOXyu3L~>udM%r>%Hp7sxjg>z2*bMz9cMHV#QD4N&^S) zs92dID=98%Ehfd{3JZyX6u$Dy9)C86kq()Bn7QzEF`=mPJQC30eI3MJ0Q0sp$M)(b zbz|_$aPja!$ssim?EReCe9d2}y!$OZ%PydiETPAp7Un(qdGga%Lj6u*$&yScYGV@< zx|-(uJt&tO(NR1Ef-KhkhhCrNS5-vr0Zlx&fecs#QB^9`!S3JWFL6_H<;m&YxMP>2 zb2QJ*eMsh}^L#qn8qU~I^-4zL=}yTyp9t|;TY`3f3SNw0WR9Rdxiy{?^J2Lnaxi{7 zrNpJXau3gT5*3vWgc9tg(y6bdzs`gX+J%Hz^Ag4a+n0+A&BH(LrWvIN?R?KdRSlK= zm607zj8vYy= z^4e?A0R7iYK(rHqe|0?^NQKKRHrh%PE2z8)F+s{gKq}5xy8i4R=z2ZkW~A{ zG{Iqbu6JHGN$rTooWmBE0jW{(dgj!yEmN%1H2pufaR zxmP<6Rn8KaTp=!-*Br#XDZ!^IZ{t?lri9|X2F>}jSwFRm`8}H@qU=4#e{eR{Yjy5C ziwih`e@42BGcJ|-CVN)47#LnPNcURaCZoHGP(YC)K>qdM>Q&gIg6>5j%(^udTPZyJ z;LI8YjR-X9cKGpbF`bdl>+=3h1_jz3n+~?>kXK_;;C8_& zQubQB4@`E)zH7d~=i44esLM^8dyZy}Ra>m%FYq9l6BH}m2MHwOGks{b;pLHy9}WRM z8)5cht%W#j<=)iQ0_+fXB1WNx-&pH!YKTaZF=NH)^wlSuRt9C)J*%`O8(A(n(40+viYtEnxY%cP!zQZ`$~WRx+%;)*sCfE#*EvldLGtIt58N@> z)wvU+9*Wjw-bJshYXXP#lm=I-!WFzi4BV}M^t1&~_N-j11UTyrZiP*!%uDpf$h|w8 zviQJ!soz7+Grg}-E|qS&P)TW*&iS&G$`WMYQ-V=h&qeN~^w0u>SrBQsXwDI>6@Kl= zg+CT7%m^t=#cV`d{SBzlr)21d{MANmL5o*bN%g4sdsRn$S*NG;y(E)~g-1&j(gQZ4 zN??^1mbmNlec0Kl!|_X{7Kiz4odF2;XF^NS9j8CAE?HQicz6}B%)^Nt;VGs^_KNH} z+Se!_%$O`xrh-M3KW{wE^xs$(iY>>)lQc5Tt)|}GF%5SRQ#{G?CPC$dH@AC+O6_^S zZb-UQBY^d+2ZAtGa4)gtOEPE#py6hx8sySKluUrNzT+ANzOyS;aOK|a-VTRc3G&T{ z@nMtQ&X*SUe!68H67p&liM3t{+L9@czUS@CJ4(v>Rxee<$Vb60eT?)$@U-Zncjb{a!XJWLZV#=#k1hgSUvD|U@D$B~3<~dufU56_ zaank~k3-Yp*Uxs%PHGu2RG81I;rZ!h-f{%?eae=^F)1UXt4rs(@0 zquf1YU&!p|!|A(WkxZ;>^DiHuR)(i32o|$ern(EEvP*aR%68vsZwdOas&v}5k3M_8 z{lq?fOjJ07=xaK26ohIQcEdUZhp#%QJb)NLYxz)d(Z7iTE9I|8ERdC-wp=lt)}%i-1Q>268Q(M!YVm^oeU2v z0$k;3Me{wwR~~!KFIBCJnBp=e>9Gg7#q}tjBiBM!B@)C4sxS*9O>;%*)$-^42b7o_ zT29Y{I3drXDBNS*J7zwZ)letYY6B`)&H(R*3c6S3waW?9^u3^L_zDxd7=^E-DZ*9n;W} zTOzG3>&bq(6!z`#u-56NPfncl(Y8krXCv_DZ}|eSkMPfRFK-T4Ip`c1>26O`;PO`{ zuPx{q3vi>_7w#B27Yk>y%`b`$wg*e4GX=o6yM{nT8&D-r1%_DEmy|QP7NeX}hvK); z0pqii_K`dH(TCQwYtbxT`F*5Cp}21eHZq{>+`az8`ajc$-t5;K&oLn$*4@~%OGw1l z#E+I@sw^qg18$->+lpA7XK2j2$CL(7J_@3M1+DO2bdxS^B&hvR%M;#kGGe4`P_0;B9?VjA};OM z__3>B2@;@u*5o(+0Ppyp1DeXXwEg;^~qG@u|m16!>p;9FYaw1;uZqsQ7iCUhzs#gYL=f zAF{yRUnwb(*iOp1+pg#;`e~Sa$IqN7%Q(5*s$4HKe$hPe`()EOY8?o+hD;f#`1V{K4hl4M1E&YR^b)j+pFE_5W~#9>mGiEcS`>2;Df~ClKHv-cR4%0 zw)sHMkVeT;PxDS%uoMivALsWof)1>*>eb|_?`ar6Fg!mFB5vUyIXv!V`yEv zrLVdY@G3n6O>-8qH+hul#dv-GF*?7f$8x)|%Y>z2k>|vO+Z)qwuUGzBSkH#o(xt}He`P|CYq0Ul{E4w}&`m617 z2+{lTaw&_H#ei6`zJ)o&bicSD_Yak&xDfCv_fcySoxhCQA3k!Pv%&C9>*i|&IXb{d znTxY7*J5+#7Yi+_>3j;Rc2!0GpT~e5L|`yfNVa`f$D0k&>vgw)qbGH`pTx9@J34UY zLi=gA)+WA42MOWZeBXPrCYk#mB>v6*!s?!RE>h0rY$j69$Jk&Sm$xFVf{1EdKf@5G zds4d$K5W3;clL;f5R5gsr#U#&kYZkrD1o=Ae9j?}^faP6yta3c=Df;QvG3x3%pUXM z1<#NAW;yFYt09aE-J@Gux}5tk3a8n%ZkeACNY&N?>DC{u{YD3H1yYw5c(Q&F=7$xm z3&t#NyO0KTDYS^x4c>2 zSL}i-l6~08b2q!hm-hvB_2bsxxFfzvxYML6doICXzw=pJh%i`7 z{#qJS^^s9CcJh_AqLNe?L`OdQ2%KjAJ>jLWKL9l^cdJ7 z{nGdHZmKmq5(C&(Pu6B!x!$+oGj!Ng>i!Km*Io9Rl5(b+cj$x06ifSP7cj#Z`SvU> z2(Bz1HUZ3gt-{x_&caP;WY8V}WkO&*4V!I*k*0V~Rg=aG)N94peW&i=6-oJEz10*m} z_U8)V&WekNgfHoMeRiOkQsBNPZ7GP~OH-8Fu-?7-c5`Z=DHxm|a@cFZJk1cmb=6<@ z@yVAU{!G-bc+UdR%4^oYvB*G6Fw#Sd&7VLbxBpLwA-?}F8;$?hmo)16{`yBa{+oS- zH}G`OX{A&#z;2f00)r4>Vvz;8Nu)^oZb94CLPFb5k%nl@w9jw;_x(ZZfnWaX$oN4o zw&VKL->CQ6U(7bNRsOrtLNiTXE7-RD(!!tDey#XMo|C9ip0yUOrl*uOM)k%Qct<87q=O7c5UIBHcj{NN! z3CMfk3K4*j2f4-cz?@ZF3G|F$d2|hSq~S05u=bB@8<=kU;m_EX4vrs1z=OPk}1$}(-Cly~S1RhG!bI#=E5 z)flufBL*~`v3JF7qZ8g23~xr3Exl^FtD@maVUwscwQ$TuO34T)&81v%N)JPErK^+` z${J@Md%GAm^SBJad|c@9K&;mxXh+lBpyY8kOL^Ba_=|JXdS+CE!E&nl;9VU$D+W}} zNyK|5vGHZ$5X_z$j;2+2vqx#9&K_bt)EU=`nA>&+O8p(Kn=+qga>{4kG#dR9=_}N4 zyg;=K1>O-&35>G{$z$*Q`4>GX3QrMtWr{5=cll!byaBFByMYnH^uR0ydf*PRoxFL| zDr_sY?fRqB!hteFWkr<&?#QzZF+t(>@dTz7;H_|sJCYC&v^;2XK0osVpLi9iwzR7S zd1`TBbTZP!YRG%QMB!uE$rI~|V_t*$N~@g-jCO?a@@Lq9 zp7VntHMDe z1*;J2;1Xxp?mNG^?z82`D7!4&A8b!xmFNeyY#S2G`)cYZeZVxV8-?~#`ibBOQaDW| zt&_EBx2eGs3_KAh|5#g+p)Y6B%D&}Y>To71rr|11ESjG|n>?l%O)`9p87;y~Cp?a1 zpKdmt1^%!`tv|(O6GZ3%yR|yi?q(bAzN1&`84bbSZNzwB5#YNw%@LgH33lSsy2&Td ztC%->8V+j!Y3JTsc+f6?z7T{7kuIaOXZeUUcuth0rbpp_tIp1k>pSseCQZtPL&!ET zM`P{;nnP2DPj>+(+rTSUpswgxx+EVn>8A)6JK&~O#QPAg1-=PoNa&rX+0m>WK#cpE!+_q&a{_&n*9a#0zOms86AamS@kFYUt z^k^gQALogK`_2=OJ>~<-=8H14(LMg>?SVM-ItS-FD!Itoh@YtFxEgtY4Ar(^*A&3O zWSFury2yzM^k$#%cLAMNXsJI1DI$$GP&u?{_#7tR8sbVGKMFb?x{PYG!n2n*(A;D$ zI+v(izr2r@HP;-^;G!Wk{Zr-?GXH}`4_GZF|Z^Lj+P(+Aby4Y=NW})pi%(~5~wH}*o*2% z%F4?8<(9@XauTTD?PnB1@CC~JNlP++sdt8f!Gwj8`@@?IrKzXFKZOmDay>r%TCh|s z_c+P0_3$7Hx$2%V;F-6+1Q1=EF4l*z-qhwy4l|Fr<~KZQBQv2h@jrMyr~$8s9yNS_ zbS3p$GhXCTS23aL!)Sd}9uw8h-8%bije+Lc{mD$~ugmQ^v_rjn0|+0-CqQQSf-llT zA+e$H1jtL*7l0^STC6}R715zP!M z8!d&AEr6NSg9LIyW#dV?#0N~^Gga)QBNz1vD69>C>RD=YHAcH74t5-qZ5BB5FDHNq?_oKjkvMwJ^SZ_M7R?BN?Wd#O zrKe&Yb+!L?0SL<4x4vsQbsP*uw@+WOGGd~^cb>q#qgZ*2%48g%SXMW=Lt&0Q`)8Y~ zv!XSPg@>l_0l9WbN87_6-XA=BDpq7?53DE_uS6aO?mDE&u$s+wG2rsydZGtsI}8#H zisZnOj1?Lw_SGM{LlMsabHcEbe&_l+z~7!=1{46m5!T}pRlVqT?1)TP@v*?|=)Mz? z_6+X?E$gogZM-=;Zg$yGins{Ox8mZQN6+cvaA?!q@Q`H-_TVWp-(zAa!S`$bXQZJ} za#MYi>+w;i9$6}Q-o~i1jL>U(tDK*zWm7kH*7eR?FDI*s2g#ogxnR#*q4`Y2GP*WK zp`&V8^E9N7VEyX=!4@)a31lA$FX763vU3eB5VXxd0Xo^CyPsM31&_~iY98YSYUVef z^jwbByCCdoJ%mA6Eb)9_;;p)Y-L)Erz|3iW$DftmOgu^t2ed`X;1iHoI0p@8JeoseR77FLo%E!$6Q;|1rO? zmMQs~*o8Qo&-J(~YF$kFXG4*M2L%&MO)B-v8(BLQP6igt7wkh!D)L@{rj-y^Zot9a z*eF^vS^Q#i2+=(iyCIffKQ#(zm4kT_v0*M5Qxde@YW2}5aa~6v7wx0z0FP_HFnvUne*C5FoV}QiX zd(HxAPO_N5_IoZC-MdCo&oEEH1j z|ELkl<3J}{+9ydja8Ca_$>{bM{s!9mG|4jv!2b2?{jL6+?gTdZ|Kpc{-gHgFvtNi!dd()flwc&y<;5$e8`t% z6nEF^A-N~*V1M7;DU$xW*p^s~lm_P|*jktG%mVbp(J}#NaTNTJW?3d_@Z`vj#TcL|t_H=)jPudI)!!EehI$MJD&Kz&H5l;@F&=y?Q+2?3a0&P>CoBf&9T){j@U6N zLg}SuGH@Ol-tIr^yr>J3xYe-BF3GA#BCLn@batX~rsMK7EPEQ*52~)t-__3nCDek0 zq-1VvNI#%7K&f9e75QyBetcMLy?8FOK1cGV-Sg<*)V2r%VCiO~^D7#oDyl`5LBs&awlsIRNt=G=Qpru1C$FEvaN3Wh`Pghp~zMNpXpy}n02|dl$dHNj? zpDyQ)2ze}ST3?59MZ@m@WO>K-v%F*fmF4whH~lNin|s)8%l>W=S?(!)2t!NtZuh|F zLu#d$w~BBjTfp@rpQB^}nqm%OF1r@@K?N!Iy^muhyTR1q=dRC}6u;U)mp|eX0A~)4 z!UI4yWw0HBg_-Ok8lCcSFwJD@ulbvURpSf)rJpCNp`fjZ{*e0JCr zu1cb5|6CEPZ+m9Ct*gy-ou*%Kb%JAR$OA}(;cYs_phrB^lc=oFvQc}oOG2A?c@Gk? zU}J0onSTKC2K^99xbv>-mx*`NhFNkLfFO~HdG{;B{L9jpbtU&pxuopN`FF6JgK==I) zRJRo59+_>|6mU_S`OA#BShs3X?4LYT6eYYEVn}7M_{o*Da&`s@)WIht!?>@-uMJ;r``_<)}eD;n2+zcsx3FlfYFM68oIXG0If^WgAkf!mX!t)|!A zdv(NUkUIfo!?0w>w)wfQe?!coiX^3Ku2xGw(xG5!i8%=8>06cmXcM=r(c{XHo$#x| zpocLSR3&3RT~Qlk(gy&=$1(p_UA{g(l`5LruI8l5i7u@dZ$<9RiMTnoyX^&P;3opp z?douq*<#+YDqrU;=mh$tl08dN6WS+n#tZ{eIZPR=QZ3};_@Jr$p_x6@!KR_`y7U4i zZQ1qKs(kLOCSM6OTlP(W!~(Qi9!xg>lcyh>{g!z;M<4)_T}_V$ui|<%KZW4_a4a7j zK0v4x60l@ZP{?n0H;KJ!QX*dIWH4*Ukk6i`>?51zHc`>xCVQpBZD{c8@?b!imk%zS z(3=(K8R!dmsiUhd;{3)hmBZ* ziTaYDUxl#$>MFoMUXtGVWQH_`6ko7PHpW)Fq))WCM8d%dKV3vwR{sIhKIr3N8P-$Y zatA%MF#zoAo!$+_Z1hOZ(&F!iybyrgyxQp=lVgaFK>xT<5!Rly?i1y>cfS814$VL-932Oo3}AYYp7omwx3Ny1A`=E%lLu=VU6 z?(-M+t+Qh<0gZsH8mmXK@*uPP6_-Ow%!wHGEHM;Q7f2Z;;a?udbZx)~U*kBx*td#= zfMMv4Oq;055}4Y?Mh+BVz~84fyc znMc*$(^bWWV)!B^AvSkM?=MbKg+p$sX#%o?cY+`Ajq{bw_5rIyk*OH*sS6&G(JS{g zwrZANyMoqp)D63EXRvLUjjt2k(c7wzZ?F1yW*?_2gX&~gR}A-wWG37XR{nl#h9Gq4 z%)(fgaEgWJ&#^T^{SI*^ELsF1bi7NN!~VN{;70yX{@sp~MW2)k+j{>t0x9AXi>8pw zxT?oBN_$K9-F7Fc%f`RBD;-9Fob49v-G%u=QQa5*$Y{gI4cQjk=3Jz-vz;-z1unzj z$*DEAXy6S#^JJWx6a*Ff*55tkrHQjRZNk{An?H{-@2PV1t1m zA~#&j13~uGofa;!*!38Bh84U~_ZdLa-3NeM9K(BddQ55Cr)>aEa`&;{ZdV|J-VXj0 zci`C`y!*2Rzn=K*vd|yjk`8Pj%k3*izBVPcOl?2h7o!=}u_C~nTbuU;YJUh8BuFni zlTZMQ5kU}p)UZKf!XQ8y)G@?*R6D!Reqg#We!Qnvs)#3~0Cpt_Z^aU)ZYU(fBJA_Q z)2Q4>nQJ-l|8}eM(FN_yMg!85gRHoTrVHQhHxlw};wetPknbm08t#MJdksH}S50ui z6IIcWi(G>g{kMNygbQRf0X+1`ADm7+;h`ZiU|y~t6pD6_ri zI|n=zMlH*=K_{pFmCOc| zle`uDx%RAB>*_Um>b!$m{On?(XTJo~^3FdDm>($D*v`vhsc`r>q3e0VM=`TUv?2?n zyb$2~fFjfp5MHA9MR2Ma-GNn_$raq6+VU)e1z^!oy35zW{pEgGxpUNe_H?Z+c}$z} zcY~gtX|xi zaZoAt$GCF2{wgXdtV+7_4+XOvKO$vTECnJi;4m@&inJs+I&p6~Vke%Je6*ZbdleV>1f&+>ep z<-YId-tVhBBH1*sbv>Jwl`)kx$jwY!1oqH_QVt1z9Ra!h8B5CYH=+;IT7cum5#jd- zZkUL=4XC&#Qd|{^#CD`y1&nJi2}KM>s9Lt>#-XQR7*F>DkJvIH4N`)<@cI8K z50{a)z3ZFJK3Y$bT5?FlkwED|*crhHxy0yjr0{q*~x&=KM1x4dW9l4&}%X;RSDpbZ0g| zCX+3CFPwA~T$tdo1{b!tXz&*_sFUqq|Fev}BTipz-42cc+5?CQcYg#dv7l`a+;*sI z3<97nE(Bz-`uG2UejVI{SS&rR6Hm8hzct{Ttt?>R)|Mm={(|=F_~z&c2}XkV`*CjS zzP{EVy-&kF7T1+_RBBrO(U;@3{KW;o4IlJ=in%Ie_V!8(=FUj=Wm)gh%BcF?)?;&XiWOS%0Y5|B&i0sAr{A^*o zJ+KC_LB?V}IlpabutKE4zb_KNh_**<2#Pdp|1tnZ@sL9+%w4Mj8e5)dSofcH&t`}Y37IZU^<@`b1JXC7RbTH0zhE)bhg7Q&7*wk^nOIgJt=BrYxM0M>pZ%`~6ZW zyTdJX#V?;v483mK+#gR^Y#;lIOL-Yu;N#JdUHH>=?L~9{YM&ZLOL_V;yQ4@JLM@zH z=Bmk;jug5;Q6B|1-!a9gpt%*lAX&b6;^_yW^==mB)u#XJldvo+BqK5Lr*<#UA3r&X zo_@Q?lEnPrHTFhUz8(9(i|2^Hfq5|%e>>EP-^^a|(BmSq6>ws69FNQExMAR!3WP z^-&+aJYRUcnWgTkL+G~&)?cL+ODRJO5i1X{t_KT}?7Sq{Ak0_X_*drf_EraL1rE=_ zPodcG_`=WgnW7abRWrkKPvs)cjm=;A;xib$9#BnZRrDP}kd}h_VT=sf{xBYDoo4OY zpFQUfGzP?QP!><5N_0HnDyE!HouFQ>Z7e=BBDnvHyvD*empSt)@n#I2k{aAYF5DwH z>}7VwR|WxM2m#HUY1;!+G`z`+wttJ@AI=b+Ym{jp^duUp8HEy*y0obuuC4+r@PLee zyF>hSu2>I({XQ+LCEi|ZJKKQ!vPWGXx*sCb#&s8EQiYGTQ%|2?c)8i1=0}!rH)HWzZpoY)B)e7`L^mS8Bk8l<=sd zFk>t=ba`05=u@ozF}< zQs&BpcTh)epmfxujufB^V`7uHd-89a+^DZv(=lQ+^IHkuM!G2(M{2zFrxsXzg}>Ny|L&@j`7ASF(b7ebusWl7Za<%e! z_G?oov6wMsq)c&Skq8Mj+b$k+JVN-r%|mf#m-OM>Ujj`6j0uxZ-=<$#WY{y3qe;B+ z$nuOWV%HP{Ms0mu5S=MH*`$X{z4A>uoFF)i>^JEWlMSRrblLT~s416AEcBi3ysn+1 ztEZ2UFAAc-7n#q>`>8&|i*+LFpTFORyL(&2*an#g==-eKsupxQ3;NOY)QSv%FRtOB z#%IS0&e8R?a9Q@e9hVoIRXkHG7<%`+^TB4twRuha%l7u>{@N3o^Oe-iV2ZnxCbXQf zz@0$v8EA@_p_uB_eU(6j=kIZ?o_}MuafHZ8mdAS{Y@9zf(Y^1S@UMOWuk#JQE~PS3 z{g#Gr!hUgWMoyj0D`kmZGbL$M4Gb}A`4r?y@)E4qNEzQ6uKGpwp?+EU7NS#pd!ypG z(j@xYz6SD*J`whkPijY>GKOHG7Bmx)@8Gk(ccM~hx8xMWHcz^!Zo)vS0l>vCGSh)0Ubyyn|tJ2ynU$|!&xPEXyxUM@Apgml9(3O8*JoWbM zYOsj)^MXUfcJCsd+BEa`tPixYkX<}^^1%UQS>YN7Dg_R|lkZd@qu#Dv>WCPx6s%jd zM@hjH5+h&d$3~A)PbkzKenT?!^ErM-J+w|V6D zEKbo7Ody<7O?&-xAN^Q+;bjz?iZe@qq=w>gMm=}hprzOI0{Kr*_MYDD>d7GD z=iP9WrIiqS2kNcsS_hd*R&OiaFWzxy`ZQii`5MzQ3u`4=AoJjVTY! zvqt+1f#b%(|658;78qh6?Q^yxopi@`i#eFM3=*1~IY_zR0-{|{HNnA7m6~c@9Qe@i z8|oT4us&eHkDfew_~h>B=0r2;RAygk3vTwtZObH_K99r^>z@0+e|pZv()lcIF@2u(N0G>p7{{*> zQ+L}<8DheZnS=cG>CdE3oPg$|*8&ca<+pOXU2igooz(>R8w^-3gEu^H7tNUuu8QMo zSQwwdiON?VxU>@UQYhzUWmtF?#LhvRa|-ZAY1ad~kbwG?vZO-^-HRuZCGgBTp7T8rPK;r% z_TRfpX;v^7AL--u(d4Rm=eed?kftJtzHSv@T7gh_7wm(~Idq|4!OE}Qgzty4W>o2q zw8z;M(Y>FuDY>Q+%L6+2Dec?phv^eZG@Y`3RM65FzLJfnokb7pbb6Km`eZTxK^FlJs6AIkSM*5br0IGMyeUm>Z zQHY&&tVpB%!Z&jPF*l`qT4}-`=G*$Zf~Vo>_xMqrH4D#E?3*cedTa0KDar7ODXGa_ z^kG%_pxA}x33|T1?5F}GPV7_Pa*&`#3$?bDVt_@^O|2J3edN)-f!?agcO!Y`U^|HX}O>{1I0 zSNbh#Y<5WpR3ZdvIqrpa@KIjCG=-*~fysosvNbA(;C zxMu2xuP>T8olSVSFX6|*tck?58GiSoTZy!V(XN&;9aLksS(lSsTbtum=FQ+RR zGl6|n2e+wvJH$nY1QLiFh z+fic?S&aGCbYUT5fC4oQOBQKWAB5L?Na}bG{gGZc;@Rz3D%PNchI)o6gQUiaQ`R-^ zsSAVjBf8GLI3>o0UnE+Y7+$H+hBjl^wNU3M%>A5ZCz*IoRyX_lCfq=XHD+F>fzGA*> z`-anDaFXtE-Vx5WrklP~if;SXj^SCa=Wpj-=#$%BL88$A-hCU$Dxv~L1c=QAIELA- z#~Bopsf4b-hTIaCqC`NK$FaO<`k-U#9Gk4W832Rb@4$#_masquQIKQ+NWFZ}`EJf( z8M>Z91GQ2)VTxW$F#nO-0EqFkwS;D10_UjRWV0OU3bhO8p&md5%(yvJcZUAo&twgr z;}I8{>PQwtt(K;SW~T(o02d~O6t9UTK95sj{_@Z~L`8sr^#I@)NZ52g#{T%t5zKyA zg2bXFYrsCnAqEs3+fp_(fu*$N{@526E)nQ7Q0{D22?~XpaPF#Cc}5-(5Igh4W@E=lgd_s5@!FzCnDeG3aYf)<&i z{!$j6QW0qXx7%-n99|)ZgcN@3OjJ|Q0x7Qt8)v{*Pj-RaKC8H04a(?x??|+Z&(|B5 z97t+miwps02r~6Rd@{%Vf!}!~5=eG$zpPS-4Ip`Rg92(X68Hr;rUtL>;X5ez6N^ef z`(mP{AQeV^rKiJg+gG)q0BE~w_vGZ{S6X8;DaAf)qkUqK^z1~6sOY1$U14B1yI0o6 zXB~*pccLH%bgm%%wK=mCv_e&Y0b&zB;9a1mg}0#Z=M zl~|zvsE26)YwBR*Bx5~IJ1;5fqpOAz1I+> zgU}@imfqVsS*<|T%pVzbGua!Q9)lY7nT0H3XQ#Z$uGlxIY6tH?{HS6jNb&4zL{*gr zo$HYxNPYod_RU+S2oJBa?y#9@1(_Ua&sv5wL~In01;L3WR$LFUR-A}D5XT0uch9-0XRKf)F{{`2>MK0lc zpWMgSm$4sKJqxcQA`<_V{D^30K1@+A;DJV>0(s*JHdMTpBUV_1-W&{df{9+*NJ7?x zHY5WhbJ_15vM3tVE6gw*NTaC{aJ^*t-Q*$>+-$aI&cL0Ljk>Cm)$T{*uN^y}IsVIm z+-DTSBHd5$L2c+lo2QZtoH!(wc+-rWS1V>sZm1Z9-h6%5YibUDc8*gOcIuSx`yYOT zPi}OC)^UBhOG$uYKZeP*G+fUZB_PW+2@_p z%^cl;&>;Z4^8K~mp10$teS>p=9w^2+B4aff)QUSpBZVUdx#IKLs$dl1PCsRqik7fyr$ zO#?-un={!6k)g@eA+OaRPPJ2+5){2yw5f@8Iz*zXgNI>0P{e}t<0thF)Kh%vaNb?9 z8Fx7c&fQU^Yoc&82&eQ&fKUYf@b1Q?ns!kT$28%LS9L|#kmkd=p(;JCM`D`RIrK9t zZqH|9{Y2~fcp!Ml0g+02f*Tc&Tm|oG!dHFy5Jl+d$+|2oN68ZbkToI(c9wR6CNjalEIw7MkSaldJ|Ts(({_ za)XVAdW0Cb96h)*muY#H6ztEVf*yJ5JeVQ*!{A=pDd3xtV~%^6Sz_8*_sB*hmqXNS z!<4nkk|3La`$v7iL}g5Ci?s}1-atCs)SaN0YQw%-Wz#0p$PGrFBAo?wuWsaEzd+}W zZ3RHItnOlwvKqv%3tUH4AEyvo`WB)mym>vtbAQp_bRO3bwe%@ytPfC z+lo;NMs)1%`Bj~)m^E=gawD=b^YjNdmG5Xl>o)-c;OgaOeHW2ke7*86yJE37Iz2j| z0I&K=U^-BYWab8WzCRpd0{6k(B0;#g09kS5Jl`FLT_guV?%WH!JBE;LHWFL`?Z4;g z{;!$8|L(z$!@y27xVWUy5FDc;0%EC@T!za|Bj*PxnpxI_xya2Ea;SFH-L<=sA4(dm z4;)muBkCWz22B!{V6`JgC^nrb<7{O~AkPd3Qh&Wms}SJ{q%N60ts2j{(7+n?Y#RuB zJq6(jEKLUheN=&{CCZnid!G(Bf43Z4Jo9H}DN$W1nkM%v)=RBCEv^E(2X;`sxww|kiaL_M}l)Vk1` z6`dcv=yFFLZEgB_sBB-)I&==fR9cf@Fu(^KwDDu*hsWO-4j28?b)@1~m7S$=0y+L+ zmxshfQNevf2mPLhC;0qig4_``+K<7wk6tzlrli~njju9?BYXStk~1AUJ;wn>)g-iz zW3T!O3SFz{-3ug1okKG%JNM(E`<6BHY-7LF^&#zYgo6tk8WQXcuypF(v|D*7ZXtq; zEQlg7>cY>Hc9!KnSeDoq(k4Yyc!r-~Z(&65PIrl*yL&2c164&Dzzzn>fBkC)pu`C5 z^HYxdJwc09)R7sxYO>qddcat*KHr6xGb-CV;-jbr)8n*L{Sg*{J=du_G2qT_v9EFU z`fk=Au8CsY6YXs>B$fupjQw!Ida@&oEUPP3Y-(JI7WmYte+=;^fPEiGtSL-wC)&H6Cf88m@kcwIC~ z$M&ls^5nHToATc845AT$!=8b~B|;c>l9H@ucEscra04y4TLC|d7OC5KGN;pF1Ke}O zXLg|62T-}AdlGR3QS5V``puhnPY$(XfZ>kpeXDmpxzc;_EAzAR&+LmnJKI;?#d#Ra zvfLrB#Q&kdx6ccOaq-u+C1vkyKIrMYqAQCHtQ{N<|4t}(n(?rtsfA5bH3DukDB7Ky z4Zn8Y?=&0auHH-AiZ(L_5*6&^r#y5f4nO^Lu20^yqNyA)NL(7#u$@^P*Jp(ibv@_v zrk0bl@h`S?&*uBh{0DGz4{`)d8d1ie4rmD%^#v9>J22Fd{g=JC5g2kF&)Bg!$=I^}k zpRe~zDRG(c$mZ?8n^f$*x~mO4rBE1|gd~4%T@BPORIT;Du2`F!p&CB>Z?MuTXd!g4 zBUR+$N};LKA-80#8H8^Oh1whoQ>Ok^W8IDoIpfUoR>$pCTyz77bA2O-ESU0B=HJNE2&n%vMm<&hKp~*1qWbwp(eE9Eh=-bGMnx@~$dMe= zB6wEj6&dsE=7CN*kup;X%+kdE@S=@=_+XF~p7|9*_|hu5jdievm`w7i3LyKXJ|LXMdGpib3LvEPC$C+{)K`}tEqJH6iNg(mcMI!zv zefZ6gm^CD3wzUmK)~guf6Yw^h?q>zC;Kmdgl6p9Rt+l8Q ziEX~i2;0t_){lb@&(P^IaEO<@YK#;)&3|g=09yeORJL*?PjE(+&dv)a;_5`PWeinT z==ECGWbsmEfB1`?b2Jcmmninx#Rd?yW1a}aXp3C@S=LlHaFrk^`$}Se)3Y5=fdZAE zkP4#Jw3sf8c|r8y6omGC@3^`tHl=vEORiXJVxZq)wilzkL&Kl|w5=BM8?f_kw`1r2 zpL`s^>TI|FlQYDB9^7L7V6gw*SL8p-^PlC}LZp8>5d8-z{=Wo@@y%T|hG}H~nk%)? OmS5Hf;V9>AAN>~*F$Z-3 literal 0 HcmV?d00001 diff --git a/apps/website/screens/components/select/specs/SelectSpecsPage.tsx b/apps/website/screens/components/select/specs/SelectSpecsPage.tsx deleted file mode 100644 index f4097973b6..0000000000 --- a/apps/website/screens/components/select/specs/SelectSpecsPage.tsx +++ /dev/null @@ -1,1158 +0,0 @@ -import { DxcParagraph, DxcBulletedList, DxcTable, DxcFlex, DxcLink } from "@dxc-technology/halstack-react"; -import Link from "next/link"; -import Image from "@/common/Image"; -import QuickNavContainer from "@/common/QuickNavContainer"; -import QuickNavContainerLayout from "@/common/QuickNavContainerLayout"; -import Figure from "@/common/Figure"; -import DocFooter from "@/common/DocFooter"; -import Code from "@/common/Code"; -import selectSingleSpecsStates from "./images/select_input_states_single.png"; -import selectMultipleSpecsStates from "./images/select_input_states_multiple.png"; -import selectSingleOptionState from "./images/option_item_states_single.png"; -import selectMultipleOptionState from "./images/option_item_states_multiple.png"; -import selectAnatomy from "./images/select_anatomy.png"; -import selectSpecs from "./images/select_specs.png"; - -const sections = [ - { - title: "Specifications", - content: ( -

- Select design specifications -
- ), - }, - { - title: "States", - subSections: [ - { - title: "Select input", - content: ( - <> - - States are defined for select component based on the interactions that the user can reproduce. The states - are: enabled, hover, focus, active,{" "} - error and disabled: - -
- Select states -
- - ), - }, - { - title: "Multiple selection", - content: ( - <> - Allows the user to select more than one option from the list. -
- Multiple selection select states -
- - ), - }, - { - title: "List options", - content: ( - - To indicate which items are selected and which not, the select-multiple variant integrates a checkbox - pairing with each option from the dropdown. - - ), - subSections: [ - { - title: "Single", - content: ( -
- Single select states -
- ), - }, - { - title: "Multiple", - content: ( -
- Multiple select states -
- ), - }, - ], - }, - ], - }, - { - title: "Anatomy", - content: ( - <> - Select anatomy - - Label - Helper text - Selection indicator (multiple) - List dialog - Action - Clear - Collapse indicator - List option - Divider - List option label - List option icon - List option checkbox (multiple) - Select value - List item selected indicator - - - ), - }, - { - title: "Design tokens", - subSections: [ - { - title: "Color", - content: ( - - - - Component token - Element - Core token - Value - - - - - - labelFontColor - - Label - - color-black - - #000000 - - - - helperTextFontColor - - Helper text - - color-black - - #000000 - - - - errorMessageColor - - Error message - - color-red-700 - - #d0011b - - - - valueFontColor - - Value - - color-black - - #000000 - - - - placeholderFontColor - - Value - - color-grey-800-a - - #000000b3 - - - - disabledColor - - All:disabled - - color-grey-500 - - #999999 - - - - listDialogBackgroundColor - - List dialog - - color-white - - #ffffff - - - - listDialogBorderColor - - List dialog - - color-grey-400 - - #bfbfbf - - - - listOptionFontColor - - List option - - color-black - - #000000 - - - - listOptionIconColor - - List item icon - - color-black - - #000000 - - - - listOptionDividerColor - - Divider - - color-grey-200 - - #e6e6e6 - - - - unselectedHoverListOptionBackgroundColor - - List option:hover unselected - - color-grey-100 - - #f2f2f2 - - - - unselectedActiveListOptionBackgroundColor - - List option:active unselected - - color-grey-200 - - #e6e6e6 - - - - selectedListOptionBackgroundColor - - List option selected - - color-blue-100 - - #e6f4ff - - - - selectedHoverListOptionBackgroundColor - - List option:hover selected - - color-blue-200 - - #cceaff - - - - selectedActiveListOptionBackgroundColor - - List option:active selected - - color-blue-300 - - #99d5ff - - - - selectedListOptionIconColor - - List option selected indicator - - color-blue-900 - - #003c66 - - - - focusListOptionBorderColor - - List option:hover selected - - color-blue-600 - - #0095ff - - - - systemMessageFontColor - - System message - - color-grey-700 - - #666666 - - - - ), - subSections: [ - { - title: "Input", - content: ( - - - - Component token - Element - Core token - Value - - - - - - enabledInputBorderColor - - Border:enabled - - color-black - - #000000 - - - - hoverInputBorderColor - - Border:hover - - color-purple-500 - - #a46ede - - - - focusInputBorderColor - - Border:focus - - color-blue-600 - - #0095ff - - - - errorInputBorderColor - - Border:error - - color-red-700 - - #d0011b - - - - hoverInputErrorBorderColor - - Border:hover on error - - color-red-600 - - #fe0123 - - - - disabledInputBorderColor - - Border:disabled - - color-grey-500 - - #999999 - - - - disabledInputBackgroundColor - - Background:disabled - - color-grey-100 - - #f2f2f2 - - - - errorIconColor - - Error icon - - color-red-700 - - #d0011b - - - - collapseIndicatorColor - - Collapse indicator - - color-black - - #000000 - - - - ), - }, - { - title: "Selection indicator", - content: ( - - - - Component token - Element - Core token - Value - - - - - - selectionIndicatorFontColor - - Selection indicator value - - color-black - - #000000 - - - - selectionIndicatorBorderColor - - Selection indicator - - color-grey-400 - - #bfbfbf - - - - selectionIndicatorBackgroundColor - - Selection indicator - - color-grey-50 - - #fafafa - - - - enabledSelectionIndicatorActionBackgroundColor - - Selection indicator - - color-transparent - - transparent - - - - hoverSelectionIndicatorActionBackgroundColor - - Selection indicator:hover - - color-grey-100 - - #f2f2f2 - - - - activeSelectionIndicatorActionBackgroundColor - - Selection indicator:active - - color-grey-300 - - #cccccc - - - - enabledSelectionIndicatorActionIconColor - - Selection indicator icon - - color-black - - #000000 - - - - hoverSelectionIndicatorActionIconColor - - Selection indicator icon:hover - - color-black - - #000000 - - - - activeSelectionIndicatorActionIconColor - - Selection indicator icon:active - - color-black - - #000000 - - - - ), - }, - { - title: "Clear action", - content: ( - - - - Component token - Element - Core token - Value - - - - - - actionBackgroundColor - - Action - - color-transparent - - transparent - - - - hoverActionBackgroundColor - - Action:hover - - color-grey-100 - - #f2f2f2 - - - - activeActionBackgroundColor - - Action:active - - color-grey-300 - - #cccccc - - - - actionIconColor - - Action icon - - color-black - - #000000 - - - - hoverActionIconColor - - Action icon:hover - - color-black - - #000000 - - - - activeActionIconColor - - Action icon:active - - color-black - - #000000 - - - - ), - }, - ], - }, - { - title: "Typography", - content: ( - - - - Component token - Element - Core token - Value - - - - - - fontFamily - - All - - font-family-sans - - Open Sans - - - - labelFontSize - - Label - - font-scale-02 - - 0.875rem / 14px - - - - labelFontWeight - - Label - - font-weight-semibold - - 600 - - - - labelFontStyle - - Label - - font-style-normal - - normal - - - - labelLineHeight - - Label - - font-leading-loose-01 - - 1.715em - - - - optionalLabelFontWeight - - Label optional - - font-weight-regular - - 400 - - - - valueFontSize - - Value - - font-scale-03 - - 1rem / 16px - - - - valueFontWeight - - Value - - font-weight-regular - - 400 - - - - valueFontStyle - - Value - - font-style-normal - - normal - - - - valueLineHeight - - Value - - font-leading-normal - - 1.5em - - - - helperTextFontSize - - Helper text - - font-scale-01 - - 0.75rem / 12px - - - - helperTextFontWeight - - Helper text - - font-weight-regular - - 400 - - - - helperTextFontStyle - - Helper text - - font-style-normal - - normal - - - - helperTextLineHeight - - Helper text - - font-leading-normal - - 1.5em - - - - listOptionFontSize - - List option - - font-scale-02 - - 0.875rem / 14px - - - - listOptionFontWeight - - List option - - font-weight-regular - - 400 - - - - listOptionFontStyle - - List option - - font-style-normal - - normal - - - - listGroupLabelFontWeight - - List group item - - font-weight-semibold - - 600 - - - - ), - }, - { - title: "Border", - content: ( - - - - Property - Element - Core token - Value - - - - - - border - - Input container - - border-width-1 - - 1px - - - - border - - Input container - - border-style-solid - - solid - - - - border - - Input container:focus - - border-width-1 - - 1px - - - - border - - Input container:focus - - border-style-solid - - solid - - - - box-shadow - - Input container:focus - - - 0 0 0 2px - - - - box-shadow - - Input container:error - - - 0 0 0 2px - - - - box-shadow - - List dialog - - shadow-default - - 0 4px 6px -1px rgba(0,0,0,0.1) - - - - border-radius - - Input - - border-radius-medium - - 0.25rem / 4px - - - - border-radius - - Selection indicator / Clear action - - border-radius-small - - 0.125rem / 2px - - - - ), - }, - { - title: "Spacing", - content: ( - <> - - The select component input share the same spacing tokens as the{" "} - - text input - - . - - - - - Property - Element - Core token - Value - - - - - - padding-left - - List dialog - - spacing-8 - - 0.5rem / 8px - - - - padding-right - - List dialog - - spacing-8 - - 0.5rem / 8px - - - - margin-top - - List dialog content - - spacing-4 - - 0.25rem / 4px - - - - margin-bottom - - List dialog content - - spacing-4 - - 0.25rem / 4px - - - - padding-top - - List option - - spacing-4 - - 0.25rem / 4px - - - - padding-bottom - - List option - - spacing-4 - - 0.25rem / 4px - - - - - ), - }, - { - title: "Width", - content: ( - - - - Width - Value - - - - - - small - - 240px - - - - medium - - 360px - - - - large - - 480px - - - - fillParent - - 100% - - - - ), - }, - { - title: "Margin", - content: ( - <> - - - - Margin - Value - - - - - - xxsmall - - 6px - - - - xsmall - - 16px - - - - small - - 24px - - - - medium - - 36px - - - - large - - 48px - - - - xlarge - - 64px - - - - xxlarge - - 100px - - - - - These values can be applied independently to each side of the component: top,{" "} - bottom, left and right. - - - ), - }, - ], - }, - { - title: "Accessibility", - subSections: [ - { - title: "WCAG 2.2", - content: ( - - - Understanding WCAG 2.2 -{" "} - - SC 3.2.2: On Input - - - - ), - }, - { - title: "WAI-ARIA 1.2", - content: ( - - - WAI-ARIA practices 1.2 -{" "} - - 3.8 Combobox - - - - WAI-ARIA practices 1.2 -{" "} - - 3.14 Listbox - - - - WAI-ARIA examples 1.2 -{" "} - - Editable Combobox without Autocomplete Example - - - - ), - }, - ], - }, -]; - -const SelectSpecsPage = () => { - return ( - - - - - - - ); -}; - -export default SelectSpecsPage; diff --git a/apps/website/screens/components/select/specs/images/option_item_states_multiple.png b/apps/website/screens/components/select/specs/images/option_item_states_multiple.png deleted file mode 100644 index ae0253f65b4a078be9ce11824a7094f7a1d5391e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41621 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 diff --git a/apps/website/screens/components/select/specs/images/option_item_states_single.png b/apps/website/screens/components/select/specs/images/option_item_states_single.png deleted file mode 100644 index 2c0fa9592f49da49f28d8432f6281289bbf71d1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42407 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 diff --git a/apps/website/screens/components/select/specs/images/select_anatomy.png b/apps/website/screens/components/select/specs/images/select_anatomy.png deleted file mode 100644 index db5c78bd7b2c2ef5cf77602d9c52c96daec862b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43084 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

w 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 ZPZvU8Ng-M%XpIGbGW(ZdNMC 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 diff --git a/apps/website/screens/components/select/specs/images/select_input_states_single.png b/apps/website/screens/components/select/specs/images/select_input_states_single.png deleted file mode 100644 index 642545add6cdcc2d76f94b26b93ef671bb9ab683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33675 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 CKFB!$ diff --git a/apps/website/screens/components/select/specs/images/select_specs.png b/apps/website/screens/components/select/specs/images/select_specs.png deleted file mode 100644 index ae1f21aff59452c3a9556d5b9ccafd85db04c8bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81182 zcmeFZcT`jB_AZ=+NDoC6lp0h(r767=nkXQsC`c2L-a9A|x}YLWksb)rl`6f9s30{I z=>Zg}p-J!DH@f#Z`~1GW#~t4t_rH5!3{(==de^MaeCC{adP7qcLCH)Bfj|(~t}5Sx zK#pM{5E21$Qt+GQ)(m~{2i#Th+HG?1HDUQEJNz{& z>^$sR0r#bPuHu9!=%?9p&dOC%beFm5>B-E_q(2}HB)Jy*434Qh=M;2_H{#f>Q}cOBo^u{?KIdRui_KHp2(796HTR9{{FH%hRmNUl+gPfR z5qj6tL-s4~0i%fm1PZ4^{oN0wMF1&mHeO|j4MvXihy2YC|FbAa$J4)kiTL)YClILH znY@J)|8xg`NTTcC-TBw=kn~X4tn%HV3x9Lt--m&U%>3P{e*F%01_sAHEqbT@4-W@{ z!mK*~>0FQiWjHyO!NffKA08Y6E}l&Ck1swYr$h04Xw{_uTe*U#BgaaT{k_n^i^u7a z{+hwBFlYWruyiO_n!i^Fc=U5;P!J3`ue8cP2^Q%;&H7L0qPwc>50RqR@p$%6f&~hf z{HJsMSKcGW^!rr&39d$ilILM* z$H=itFN>it3JSX+!FTIy(Yj-TY!mT8Dj}W>bFNnv$;>K#T_plCV5|v;)2+}WCnio1 z@odk9_ZyO!NyWExE0h2%X(FQ-1Cq+a_NPp^-Q;TfUT4-QAMP1N=gRi>C=LgJyZ+Gj zCpgMAzq-fy7xzP51QON0Of3R~o^?79i&l@I+Zj#cinzY~bo8LSMSe?)?rOuxnboDx zGb|mp)zk}oLLb^+coZHTq^mH~UPL>N8Jxk(d)#Nk{(=R=R89v|c_>H#GlhtVNXu)L zFtfg#n|IipCqIYx6dKD96`2Hyh>G4RqZL#9Q(QLuKwP%Y5uqq9DCTGF5WKCaoqAS) z8&%&G+-1CQW|eC#RbY3w*PAxDZ$yqx?>=n$rN(`G%j@H|Y7ZAg#v8t0jdr)#T&FDQ z$Y3XfS+D=cNuV51@31Y;*n2##Go7zu8HF!kpFM_DQ;LWYg(yXbg_C8I!G`FN{+*vC zx?5k9&pw}$U*O&7m#rBh#Tm5QGF->nF|i1Z2(fioc&smoD|aqjT;=Gnx4g~tDax0K zU%!$&9pqmLx2HS*9Ml3PA&C)Z{868QT!qE%i&PW=YkJJ)C6yu-@K{>CBu>?XX~=|K zxw5_e-jY4LvczW}dlD=DMiX_1*{xEIW}gy#`xsfZX~PVnNPED9IT&azLm6mJjWo~# z8RZ-Bl!3=Xg2byoPw$=0*Nb}fK2_AGE}=e$v+(E|I;+?=yOFLhR*VZIiP^hsrW4xZ zFDsGKvX54G4wuCdL{{cn`A3yrHG5 zeZkW6zyi}DgO`b4nNL^VWxaK=k^Y>&?_j&nVVCTg=0y9_6J%7x$^~T(Eoew)BS+FH zz8CaQ5qC^s_1pj1Q{(BVS7H%v_-N|Y>TG&sIcYmHitySU>n_V8GLqP7P;M7pkKSu- zPY|9Ob?th^bnl@;2rb8$zIY-;>f`<5i+>bF8CL*a7gbVFqU6Vx#JYc8^XwpjG| zQc_&Q<$$#v?%Vxj46)wi-&h&sw&reoolgt7=$S-zy4v#2%#-H@#2Tj<7*P1*XbdvS zGXM!K4f!Hfvh%ZMb()Bicm}=I3Vk_bO!l^(r)Ya}#E}AAKvaW;@^!;2H(dSNG(*TZA0<7Cy(yr2iO&I93ZS-NLbm**URuZ!bFf z8N>=23n+!sxU-8r+`@adL}AZn z&2oj7S>y?%I>fXy4dfmc5G009@#sH={9gu#SQ4ni&*^nyE&TsU7~q-zouU4y^-


z>}I{dHi`uF?E&w;RwDZR9(`ez&m3Jw@0e`q=K)4fEv9APOcb<|8k z+ezljKJPBu(jmw!6^Nn%I&_uDaijQa{{GJ36#539_xpQ;@@~~(Ox0m+rB;Sxc0X<7 z_nOrb9yr|-ZJ-p*>zj}NdYmc->}RW`kQf?Hf0QP?Qf|f!Id^4=cn|rHZghXW$1m&q z{Uaw5L}~P>(*XLDsws4sl|YFn{g$G(3x?&+?szTE=AS@=PsPx~@R6id!i$iPhEC0DwC!;f=( z6HHFqbtz73gRtDSJgu;2(BMj9Jv~@Y?oizLb6V87!a{5bsv-`yc zTlAtJO|IeVvzw&FN<@!F!VLYWgm7*Q0TZyM5X4!3n$Ay&e=7A4rVBNEOa!vijFXxz|`9voQTqm^BcT06L)okau|!!het;0tf@A(%pw z&dA!B`8J35La`8t+?FhR8*PFOd?4f75BP$N20Sbr#O$k+IXG?*8G#mc{ArSx|!aYVXGK8%!^>g?tpt>qib9dhcy6_Po^wFD^Ju7(K- zu#_@jl=+_|*ylL1VxY=~s9gzhMsY ztcZaJ_RU2Yi>EzTnzl?RY#6iHEO|U$Zl5%3%O<;mV?lXa%GYd}x7k{u>`C1Aq@W_% z(tp_X#|tP3TQ>KeA`%L1&~iJtr-i+?a2#0H`C$L?jjziaipcJ3a7u2vbN)KVJ&Wv~ zet_d%DOw<6nn-cJ1j2$1%L@h+(?W1o&2J;>0|r@r1;6V=$=|>xKrz`RarMY3N9b7Ol()~EkuL~TYr?VXAeH~yxsTJ4gLIQ7sv!sdn}NY) z*J%x&!3|PeVcllp8d9Og>M6p2v8f+jUO05R)fZY?Q0R`?;0!F!yON2vZjo{M(b7LO zTw>9291Tg!*R|(}va-F&^S)I8K*|7OSrAPz1ciwL?y`VFnCw4UWi{B+C1!>{&w^YA z?|#H#vK#m4w_v+uAZ)}aJb!M&6TRVGr`a)G1l%7A@-;Q}@$1UJqiDb&cq-F$Ggb0) zXMe{Djkklm#5m#iJ5KB{y$&Tmp^98e^@PoSPnKQ>rOk_zPxf|`?QDmnVV_PS{RNf= zdtLuL2l28XoY6?snvfZbO9%cnEZca=K6FmKINfQ7`l=_o(~qyVWq0L3UV-k6BS zvw7|&7u1@}&@vw0_kJ!vxE;h_<5zTYMV!Ux3KqcHy#4y=Eq4z;D86lT#?bgUUY$C9mVcT79}+3o&A%0LVV+PMFpY4# zZh1bQA!72fl18Dl-Zsgl_6*x$jL`}3dg-Y>OK>PzGAkX zI?_2`V6QI03?qjF+0k755+T_NQr`FGXd(u+o>m9p@*}vtwK(EixwV zS%fcZc=`O*m4x!QCpUs>=$wfeejf;d&7A;@ z_e>@3jSPrCGmqTnSpImvj5}DxYa;v=>FP}S@U zmaxHzCGza8y4?&MowUAk=fCL8d9keT7R}#@W{MMQOZ9k~CzpHE*Ihy1ZwCjmkdtqL zK|Aais5NgO%^++Wj7|-Uwu7!T#Pn&V_I`PHZp$l6O5K$Hd?M<}mZ`pr>4NF^;4Xsd z6E}Gg8ODLI6$?9J(FmuPaD7UFJ>nBO%DZ)qh7shPY!IoWnjh;-=^;OI$h1yuk*W6$ ztZ7^y2W}W}9%g8qK3mKWyTC;L(^sP@Tv%MZ?FoajoVSU4#lt-#ty={uYs5G9QO@#N z)v24mN;p>cOb?gK#={&!1V1QWcz+%5YJ9Fj#X-=m)Wr7nm_knmYndE0M@54BbUmkw znq~C2Y4%oq0nWpTT=NnM#y{=k#;E|h<>rX}gqDxuiBsNw=B*AlOiM3ile4Kn0_?~a z&>4Cb`*AJF?BT2ZQ$tq5`O4TQz)MwFH)J-ec9f!x>$NFkm8 z@3D7X{#GJ@Zl83eI*t306M5!lYJ&* z#d9r{HfvCBfS|4FPY}t5!{(TPDIA^Z{$O*=?aF#0-lA14vfLX-hTGq)yS1GchQNv^ zEGKAbVV33VbbrWdvmXFLpx!*?NkK`DXkWc~XbYEWjG}{)n=zrox!&7tMJHrCsCma! z)zUp_N?N_}WtHp9vkJSKaemC^Mi427CWOr=<}L%U<|l?Q3Pqs9VxrQW;Viz(1Go58 zdVeW|>Z3D86U}3dgq;TG>)eL)?9;$SSbd!vT26AK%EMyE;> zRnW#v6_vd4OtiOqlApFoxfXAP_l=~;DSO^LWpRY2p^!TPbkvPGjv~u8zYanYQWM(n zzGZnsV&p?T_?HDyUm}C?KWtrtB0RM8vOr9JgiKo64Br`|zyi8|4>f zrXbD%vGvE*4XC4)E$$%@0d-PoKe3Xl@})MpVFXhX0c3?-+!Pn zE+F)&-D%0Z_0g=*a(WND!Sza`>lBf6ek+wb+?vUEJxEK9EdQaDCJ2TPip;txk*rz)q5i(;a)omKPu(3cQ{>uSP332SyP3ddAFWM)0o9>ko%dF( zsBM4CE8Tk+BIS0iY~SZWO9k}F^an~5O7iDw&D$8~Mk)&1lO?q~Ww#6;eS6Ggw!QK# z-&~p;+msxf7e+i5NX@y7z*CEZumIsW?E33&x6Wdp?s*U z`~2;ypPyMUh5t}lTN)9BEIU~_{b{7$=K-}p0$%G)d_GgzKHul1Qmg< zGg2UQU7&w5DTR4afTM=H@PhJVB#r-m^To$qYH22Gj+?iybiZTSrBigIpg|N^CX&%s zt2^zt_~6H5Rvs>*qnkA17gNmHf@Ogit80+Z^}~Zb^TXJ^AAgqGmeMsORtH{yu*xr_ zWf9W=xLbnfemR$1tGfb+&s7MUnUfw!39IKOm`?4~rSMSg2BMbWinSbJ>2R`vuu+VH z8#xqy>kNt_B8D2?fqJhBIz!s$IACm#yIy(S%_Vi~P0JkWonlwa8L=DE1xx_{C+9Ep z_5_W+r$h&?dmCYc8X0QScbP2h)qGiCRPzi2wI{J$9;kM7gyd&RGxFWV6_8!OejSeU zooprihFr)fHliDSC&!kMD5(?EpdCPvmbSH4_RgRZ3X|U4nXkgs85Za+?RG2;v>n4m zio~(=ZLi;p-qKf&5I4gmMt-aIRMCmQA*FF40=NkrfhD71J#U%p z93uQukIA5GNOn?>WEROKQEorNE$h8$$Mc1H*5{xF$MPF;Q1a7#KR8w4!L+N9w)P9) z6!e~cCw@2l&sl&|=MwKe1WxcF6$UA#w0e>cE$wvBbfEy|Bi01S8zu8Cmqz-T79w9& z!<*Hn<-5u-!?owH0Mv@^Smq2)SB;GQIoT{-lCz-@ynECbL?%ok^~E(1ebyg!5fmE< zTi&v-Ft2ZtBX1o4Z9r!iHoiB@9~Sqv+ZI%X&?^x^(F)O&5JI4rOf;lCLGP{?s4Fll z!MXlVeleODsW0OPAA-9MYm!1j^wvshG0nb#pywD{c^j65-om%=3giSkQl`5%sBy~<#aOYJ!OW7 zzXd2<{{Wcn6tg8l77d&(RzcU6Y2;UGpBpC?xqo$t=8d@cxRd#cqnKwJdTVyrqxdtl zw8m9S=4bF)d$^#_H>%Z7g1$Ga-R8d6*7_cJ&5bw6L*4AVg8S2rycf${);h#1BzHl$ zT=GFrz0&Q^y~D}~h3^A6dl3APEx-+gzid-hE0t)t;(nv{ImX>TyYG_6P42}`=gu2-}Zb~Peg zXajr)V{RBYS{Q^<6e|H&T`6n%baDt`2lN!onOkzu3*vR>;> zfwmaY#d|5<4v}F zBXhLB*14U#lP$M#;k2;Db5_^(%L-k$`jwDzus9=+1S0PbDqB;6G3&tGAahd$pdIo6 zvg09zm4QqHyqw<#^1T9`U(@xIh&%Ggw~gcv?scijTl2t*DF=I4%0FHKiO^!XJanBD zx90h*a-bWnNzCLib46vZ-9y|xwLh2=4oSYb$43M|l+S9sVkn9&^j@F#NOP#NuwBVD z$tBHXUbQ)ur!ZHyHAV=|75mtC={AR)?1PWwJn{We10mhjDWrMT`zxXHZij`?oF(-j zD}HFuBTEC8>0#43g4aTXq7?#LCOa%l6`&m@{tN%>b54vKv;%-Uv_+Mc@Rr;Ep2fVPcboM?OU;p6tauH*h)bE`c5jKEaMr&(^y~ee z!u^nfw~aG^4;dB6>qF|1m`D@uHuT@u4Km+)Z7#P!ZOM{2pJ%(3XN4#g4K5Fu&A9e5 zS+8;IbiYT#RK&)hY2=q6TDemfZi?W;kwk- z{-e0fV4CrkYef#Lxy54Xq3DB@LkGrXJE?jxQMQf;sS=T7?8&tIG8r3QQTfJdrHlc= z@X<{11qG$p~*Sj?97WD_fPzuE+5g>MoaFzmHZ zEjN6Oz}n}MNvjVPgdXzh6Qer-0q$E&818fjvtmt?4Zdi! zxK_b|j&nKhyV^!U9eQI)`s%p-UhCuf>N?C*HW7as7Y*AxOF^Xg6o^!d-Uq2ifXM9H zrPDE5*!oVMcA+u4LOA5`$4&6Ok?CrwJv=Lgj_g+2Rgm3_Yv&#wG))(8LQUJk_A=5O zd3b`ae|ML4&?jMoS;8zkwS46WkIHLDvVJm(;Y1vO5D&l5 zXOf+?K@dA1_R~#!3DU!{6Wh@{)kh|03KJ&TEI!Q8<3G4pf+&vGa_tDxMiaPgRRcrb zy@FjwV9NS}5!l6sw#SuAsM|sFuXuH(rsQkOGB)nMid9Q{!%y*gO3E(W2H$**2h+z~ zK(_eScw~{VRKIr&Cw7j80ToAhyB9wkp~fLXhYH=hY`*A2&ZqZIxqh>(P}0)|=zOz1 z1lO?pweUx~a93V+6C8J^x0n+q$^e*?)1qXG6K9ErJd4od2L!dTvFbquOBC79eh(oMsg;v~C+VMn z{xe%b6dUpe1Hf6o=x0M1D8w2O{|X{8{+<5)5PeH=o+=PQ8MpHBQYCk7`BQy&=Q{m7 zxvTC{QhrzRn?(L(6a2;9Iu_QOw`6BU~d$ z?QT5fNjdMmx!?@Cjzgg*hE1)9DEZUU!V0oWGV!$AB?rZ#S?*|jp>O__tXpa`ySLpB zh}6~bMJby%i@2dd{Rm}CQyY#2B^ciR4(&nps03UxYcmxh^@Zc!W;n__pt7*{6hL_U zKrug)-Zgts4vvV3C(7Tm*mM{FFaW|mM5MYe-j%Qv}mE)Ub3sTKQ z=I0$C-VWBiW!2G{`Q#Z_klCP#lE z#rIDbD4EKB9%n!!VwjlQkNVU*?aFw8bb06NUt|?=e;F=G?+7?2$#* zOk?}G_WPqV6N9GMUDk@KRNU$wIdytof5PTQaT+y(pQny-fv&T8j&izAx6iH2dg9&V z)})|rIE4qYe-M~00FwcxqTj!>%$ibK6@vMokamsyBhkWz&(|m+Ie~=--ygDPJGRhn zu}p1saENyd+h4vC{j&Y#SKavc`b_8#)dHIv+8X&Xh}O9Vg8$(Ld-NS{pF=P4==AH>;eOt#KkT)6y=pHsrg4e6 z)tFo8lvX5%#Lk_vwYcWj*`C<{DfT-q^i;@&IumI+;&XmvLkSw!*RnM=Xze`KCfW7# zvZwcyq(QfClhDc_D`<{PY9L-ezklj{+2LNySse1U+A7NKs1Cj7G57Ut+*+B@al-7=0+QcR zQF(j&-89jMp--tVn@a`~Cqmk1QWNxWp^2v(UV6oRAY4)hMZ;*##_x8_2o0N5A4M=; z6x;SSsQh2;7}-NmE-M=oa>h!<{Wm*(J(k;I2XI9row4PG45(1agu6_C#O61@YgS10 z8?kr4*hK$A2((m?o);NK33PFrnk4+m9qcVgzHmZzLiLBG_Yc2y-jYP{r{8p_v9}0W z*I>9+0~%~VVZ+^{4Dp2m z&_T-oqJuzzR?9KjzjU?7?m5WH=LFunOF2KF@kg0~+qVQSAl+fFV6&3b0RhZn-W*a^ zmMSBQi5j^GqwG;7^0>s~YzCVNyYv>*CH$YhVeTxFfqS##@8Fnm`hiNe;v=i4%TG_) zpuiceawCRHEGuF=ae7~t5^)~#;6(U>p89oB>2!m?G=3I6VLzn+kqubu*hdWmwqG?P zf*`OvzZF^3xbgbgu7)dM1vY!j5;PzQE541A^T=csS z!96Bw&cWM3syQ=KrG>lUyavNbMs_R`zyYx;2Q+ zO26q*))zP~`080eq}*lYlBm4*W2P^S2fQo*VsVD8j1>a*ideCV(-pzQ{QHMGt`Vv5 zYp;oN<#A@+{MErGBB~4>IH;fG$5!i?VG1l3YJ<6bSV3Ruc_Ot5jty2bK)=*J80k;sw| zxnI>nKRrE#iObG5Dh1uRVd6O273BS6x0q3T_;;r_-7QeAt;EJ~BmBcXRjcVHRqC$04(u>R|}9V4wb zBfJK`=1cOt?)-3!edaUu^2}R-_h1yT=OUnR`lHi~c8=rZT^3e99QJU?G$%w_ExJTd z9KXmnb$H*|PwNQ3`d!X?cH~+qO{sv%y{&?-0sDiM_f31kEdyCP^?I#Fj;ot%$D23q zI9v`W7EtwFUw|x^9a660MzC#&kq%#t-C8`n+t}k6uB78~`vS+1V~YDq#Ew=RJ6V{| zQTmHpv;$_STnMbLXh!ht403W$Nw5&)oGqoIPM^$lj6dShgO^UXjZ`P|nF1ADF{j z5EQVE)oLi#Dqo*HXWG0s-u+_H_(3TnFpe2nyE~9Fi;ZME-5HkjtClf znJz@1Nfq_%ilM@~>y(D{dK7c60a7~!-~7dba^{M#Q6h7Xo}{gnWikxP1CODK85fm* zFtcdwrsk|Ma);6|o8um(^fvRaag$2+zGbg%>$QN1f%-dm`~~O3XC}tvNL(=xrX@M( zOcnXT@zxfjv;0_sXM8Ac{1r)pM=*(|ux<0!%1d3K~yIgn@@?7H>@XxNF?ZioFOg==2z%#>0lT zOn2{pz)~$Y2dWjbg9o1w#L}{sE;paA`L_ItnLI-QRECIj6bs!f>i+WCj@6o@i}+2w zrI+ppLDRg;i!Z;1>TFfBCniX@k9M#5C$MZJRR#D-b;&mn2tL-a>NG<;^ zwMq2b%x0-)kESj*e$yoxHu7pZEXWb_KO7KOS(k)kt}j~he`*9&SHQ8?{Z0|p=!uYb zXTXVWT!I!99%FH;PSOJrp`C^eA^7b5csx&`pSf$vY<4YL&?-i_qZb`{S1DhX&Ce$P zYkhxWwKm~JYQyWJefvkMW_d9Vp9bi>o+luTetP{VfEq0^#TiS|Ad;?I7V023EuaG zP}ndjUN8*Q0hn)F%}yvixd67}VFX&^M=!Ufp}gW7uX(SP^x|J*J*ZOw!X0G6n&fDm z+;gfOv1+uOc0wDNW;dn_!~!#GMimgcnG)P9Wl+k8-ldzTIcPG<>PZb!ekaB?95FLFVq}!qC|o9s8GKb>8aPj)}Wgd?3=>0Bzi+r48q;_77pPOdRSu zt9hvlQ(d&LjXrRYT=lM-{k+Zr5JL{JsPS>OF5wg5I8h*#dsD~ghElT{m&B&u`Be~_ zm^?9-{B=Khgu{0kb!BG_+VkdQEsWHh`x-&8s3vUul5P0OtWR12z`cxp#T(Fso-{;|ot}3`3WcUWC+qj=or!DUkJ5aMq~% zc@Zf7V}I$rs(GX+L5$SBBZwX6?PECobidDjPuu6Z&pR63Qx)WIOlvzQoStxuxC*wt zXiv!Kx|#Z-(+_QSXOG9f;8}P$F(bWr&--dV`su7ZcR{$sfJF9d z8qfbM&dGq{wYd!PS6s0^arKism>vz!Cbe%(c%SI!dzTcwc|zMGz1Za`!to12%_(NA z`Ibw@dVR`^vqWO)wx6s-cg$(+1|hBpIUn=XJhXRRvM*lp)z*=MQgg$r&bh>raeX(k zfOXJS$#&GRqKD>O`(f-Pr&tSQgnhYq{kTX%0@7L#g&4()r@=y8SAW8Ip<)4r^ z<}>jEN2Y0RgYvdr7~dYv7qTBNZH1Oz=pC=#@9vA~pQ_X(s~6AM$A5l$v7SWkaDQ#a51!B40=f7a>?Ta{{7k$1TXp@ zyVdjJduAJHm>*>0yhm%C^60ngBaMblZ33gK3GW@XJf4Cg{cRS1T%pf5^^+WdQ=ZB; zs67fIhC|{4P-LRmjos?qA>+1$-cZuB=lp4=KkEObqSJ(W+ir!Xaw6~O!tR6bi3i8t z`%W%0(e2rDG!x|GZ&u6cQeq9J>*i_;IF3_R_98+Z)NhO0tJ69gC)flla}GAOSMKs7KRmQ4FY=Z>3n; zV<(?5qqGClu{<<*@an&2g>u1Qx#p)!IC6L^aqP^3nEW<~ELf_n>J^anZ>l>1v$9vV zrX|j0_#bCYU>0BwLrD@Rv8mv<_~_>QmriU2Wf6hTHS!p$Ck9#d>~l8|;u|z&=p2HG zFji^koe<3WIJmtuI*rsVF(jrObS+{5KqM|RoD6seTqXGwdB$Dj?IL<@dEfm>4r%Y| z=|tNH!)I%L)r9mpCs3h?XnTT4ElrI*xG2<3hzI7af+hWZyn*{s5@3Ge$1QNYDpnn- zJ18Jn7>$%sX9VgvmxS-p-gsN5g}nUF>9&880DS@nLu9xp|3Pg z-T;F457LY)IZNjWIrzw+)e?A&>IaqacA(GCFyj~^<8q2HP#6a~xeTa*xxUKHVcV(c zBu59=^%2Jg{LXGGZ(*MHTM4`AV~O%7cBZ7yu#7V#=w;;vqYt+Bl*eo@SA=lz2^FhO z*Ib8Sb~rOg$TMysZ766!^rhhqS0r{PZUmm?J*y&3p98i&I=%#;o*h%f4=?sc{?9Ix z))U=(k5nA0=eQHZ9q-xGws)`cW52E1JI3x-9t5pI*CRcitc#_s4b(gpVUM{MsTebH zcdMYqv?J5GFLMspYFgfrC%lD-)|LvRmX~>Hs+LZF^)0FoGCap5itUxEEd?!r9svM! zH|bxa$+rQ>-aB3l1IF}37*Iq`X@7K+r2j8F-vB#$y_;rl-hGu&6DySfCPFnZQeWr(x7{Q&Fp0eih9adWv!_#c`?Afz zwt`Fh<>tO+v+0(ylXt7tGhCG}EW|gIpdklE6e51M7FTo=f7X7f-F%{#t;G|ay~Q5S zd60ir-K30kv?3m|_u{OwoF(k0ky|R^`rTc8x^4eJ5p>-=&WIaf?x)|Dcw{qzk-?6`9?+bUqYTY@PV%)oj@PqtR7nEhAZ zxxHGz(|pOfnSN`CmKkKjq2pIU`HA+c8>&?;e+i2aU#_^4u=T;?OmpnPnIn@i+M~u% zqglhX4&}&i7Ozz~)_jvemJEg@zJvsvp!%p6I9aXg=)g1|OQ(vh z%zL>`Gu}o?1EJ(tvnY1@@`GRo4civmCMzQ?5*;Jo?IsSXqXEe6txSbd(s#_I!*u$Q zxrKA>c8DN%og&ig)T8|wjJHFZ)T;q&uh$So8_)qbH}sx6iEw z^s;MzP_i7m=K!0RYWPxc;tZjy-WQh{c35LbzK9olC5ruu?pWI7U>~GCDdN-ri4=Ew z=Mrc1S}NuYT{_W)i~^P9u_;34<X^c+KZ(@+KuEnfGR02eT*1rwrJ}3zn)00#)lh z>MH8NY+!T6Wd`F}Ucc3wzA#p2aJXT7^mQ&y0PxO3U=sbAK-4pc{y3GO__tN$ns`C| zK-qHmxae{~;iY9i_o{)I`n?PaOvCMqu5&&IwU4x9MKK%~84qe-AC-Zzs)9O6Rb^xm zDjB-|YU}W&;|{_;o-|dkVc(^u=vI&!BG`V1=0HEl2oZ}9i`^*_PPVstQ&NC0c`b_T zryC}HEfsXd@|d^f-I0S>>3-8lS#H2R-_N=6l@wpzp|Cg4R`fT$Inb@xtgP`U4f#2~ z)9Gop`s0fx#xWK~q$vx>xmQ8lzH7-x;EPb|u(S3Y3UL{kV_BRVQOSxw-C5U8ZD=%& z7Gd#xoA8s~tv|mLrs-t8(`8{@nQPx+%OW?DiblL{dyGpU$BJ6{c0U}E_vpK&?$|EO zrMuqb|B7R$nq>C5Z+z5*^@jp_a(=opcqjtPVXH@|)k>6f&06!W>UkZotgR(G)h=|n zS<%4X7AF`N%gEpsuVQRa`>=SeE=?)4wI%xONV{0Sw5-UeN9fSl^4tJ%24fVxh419E z!vx5hex{yjI&cX)z>fJwRd_7wOD>l7CZnmDMOv(1))&?s9qwg1j@QF+Xb= zzOnOGdFX(=hMU+r=qgUOqx$J~s|f|Ry;25|KsgQDp9GU#=yz2kLvTw)`r>?^e2!5p zX6NeARKvQ<^`IwEUT8S`c4Q=BPyx))G?(g3eb%es0e!^SA9ff(I>rpBcqP(3+P|4O zLTbNw-{6)~g@J{IIOy-rdYE3HBQx-5iv2!ou}NRL9zvRPnV(-U*1_3scCS0ncx^e> zc-esgRnugNCVwli={-g#<<2Eht2r+_(k?PkjrX8-W5aa&UeS#X2z@%cm{wg$Vztb- zT`8yW#F}*o0n?-V1tCPZB*0+YEWBQ7vdUI>&DFpJRO0>l2Iixc&OL*Jv%&59<)&ba ztkcMP_uGLIt?Z9>DUU7*8sgZsyELXd&og!|ZyLcOM%-Vh(V3IOH{(us4Rdd8l{=0v z#nApNNP7G;GaSG(mw-}G7C21GxmHXtbp+E$PY$W)5cb>l!nv-vO+rbZ9b6VHpj>4*BuHK%K8y~t6+bur`jPi z^Hz?HdZ1MmjX}EpmNS@|DT{3&AJ%Os9~r=-x2Ul8S6R6MRMy?PT*mfF&I+i0TJ+cI!b|)k^f$1xJNs&F)(7|F8EF83U+VoFa z(fLk>ik1d%|I1p->alE%oi8lG(pnt#3qq`UkYZ0$xa0T?fbIrBE=e z=Qt?u`v!p}?3*ZJG?{3^Q1^+Dp1;uz$|oW2gwUKyJQ={wNNA41dwhSZEj z4c0i|Aj1aPdQFRy5z+-l5}?xA7BNu)W3DLV9cbxdYCT!6Wm>Jn7)e|W)s1moZ(}N{ z#`HvKY6d6EIP#BRkBP0~{GJl>N`M5(tUT*p;;fS6dceb_#E)asq?nTn`Pp_`lYrUC z)d;B|Ev-OE+3sW|Ik>>A_?vI$9y)W`c#j%5)|G9TJgF{NQss!SYTCe}`7JXR=W`C- zGnsM!(V_j!@m^-(4dCy`k1`W}?t5k>hsa(1Gtq^A!X$o;bP+^8q8>Yme zW;K4^+w#spV^N}BdwD`GHJ0~r*RT~^(D*`bUY;mf8-@g=x-^<>+E8WeYocud&Zo17 zkPQBExBuNqTKWB=S^$bQFNBMb;+`GPfQNoEB^8ke3ng?ls9~^rLuP-i42T<&+4cwdWj?!e+0sWtDjZTdWyzwq z5zMXCBszE4+z8q6`JlUQ+*c9m&fBjh$i2mGGu#WU)+CUe+TeVk)V`Rg5F7Df zMr}m*4HVNz%MeIcOam+XRbnlI_-Kci$yASP-I+-pANG-E7#8#|@A{70QuFv3JFx~i8q?PJM$)F0g6j+i&WRZUJ@9x5ddoCQP5n8&|@PIv&sNWN$@nrIwmpPC! z#PM_n|Lm2f;1j79A_%A|v3RoN;r8#p^pLn_Npe&g^O;BPC&f%ARv0@_V8ok^@z4*Y z<*fY{!jdfgMdZg4zQ&V4LRtqcWfuob;YN@T`p9E%u|k@bzi-nP5Bh$(72fe@pd#`j zz-F^i7uB3*@uq?ap_Id4n5UL#7S8+VL{X2MoSJ#~uJAjkikLhX<{pv4L2&DK(s_T{ z^R&|!MFwI+n{il+g-ReQ8d5!a{*G|i&=SupE{WGE&rY+q#nbc zk`?;u{P#~`#Q9H6VKVAd6EevwyM)3xu$QU^Ji59dq|qxb-a#77hMtym$#@P{^2%!T zOZ1EfZgEr_qv=37;?+EoEa{rOA#$$&(j$O1^9ddCm(x2)XzP53x$(=wT{36EB&&zw zjvRWo)RfylVy)d2u+&kB5U=7~f*l7chjv1)(WmmreeJ&09&5yf!Z?n+h9#GY)4Up# z6Tt#Sz*qvvQVX(w4{G1eeGFDe*`)Oy;6kkWHcwd1tt-FuT|czCAl@`w=Sbv=EG&L} z3-1wc^cdXcJQ0{l`xls$@UlOPlK4eRqX0~0R(FCs?5lz~ z7e26FJfi^!YfBO}&sDA{Wr_$Nip&aez{9bz=*Mz^se(#IS%f==+rQvbloK_e^@w;P zT!>4e=N+Ip%+FbofpwDOV8`a;M>X;cJ#eXxbfpnWLAr~B=WBJUA-^|~-t}pid@qdbj~A5J=ShN9ZT&S&0)vsv&^k6_$A@B6|cD`&y1p^@9DztA+l? z?=er0v(8OrngcooX#>HO14`vXb}^v3tpY~DCO*50RHXl-L*+0%e*gsCCg$r*TV- z*2~`0cl4*loLA4xjcBI!-rf!S0q5y7Q4h&%TPZ(i_eD6J)mb1|GBEsj0uWMk3P@Tm zi8F4g*Xdh=fcDt0M9clqc@M_6R)jxM_>e!O0N*>0x_Zb^faYQr9Ea@o7T|`!z|z$V zl@_2E=SHQBz+%QSb4cB)%dCl?ST+Gx(WYZi$Tc9e1P()``YD*^)uP9KL5_S_dWbT%E71wQLJ#cEi>pMPW`53 zCTfZEGjE8jRcClU-PI&;_TekRo5%^E&1tt^TWvhxGaTf-Bc7v%;lGtO@}!3yTrLK} zB_SkgD8d-vLgb;C01t)T>rx&Y<5}&mP_9mz(JlVf56V!zKjVEy_0aGKx%SwjnW;Hz zCVue5fMbKYwN=Y@LYYZDoDVs+iJW@ABRg`@&QIrYXxyrlTr$VLj}zL;yH2Kfz1eAq zu$Vd?_q9;|f~6*h{?6{MLQ{Y-waf{rL*o|<^kAb2Eb&L(Jr>|akzA#0wvnoGxF{1% zwcG#pB+1DQ|fd+Yuft5Esu!L-Ags?mQH(}YAW9cO(7 zqucqx$sMy~C>gbM-ru*oU1E0R3k9A$hhlceKakdH+rM=Kin+((%{uyRW8?FT!z=6F ztUL9-^~-Bv&qEd0lGp=20vl%FnTC+x7A%_ZJYx_mCS8&$So5ZMfo~RB@uX(_qs};U zIdL`c85h_ZG;%U1u^Zy*v3!_rxS7B_DB^csXb%ys)WMfx5(@Y)|70c5b$w9)UG%Io zIY;ErUsHa(M^c>=wax;XyI`~L5kx`;<_lZ9{{ANqgA?DrS^DViKxTr6YM$gJVP!wg zig>NZEOLpW>3gn6^pjiFp6L4N{<{|UF0Zv7q}_?`3RN4>LST;SGjGCm+;>1cH{KRYr+h(tgbTBBwo4JxElUxd4?N~ zBJK)qmrE|0D_8V1fK?~Fy~TCEBdh4oL2Bc@X!oPR0QbO(KvDYh84yt{mE?jOGoZfC z&{-m8OV^)z5Sv!8*+9fYlj@{&gP5|~$|7lYAduSedYuk>J>VG~sn) zkC5hztbDCr!fGM(?O8=@r+06aCLuIs8pol~tb?((~u1jkGs}CMEP#kM2cWxNTqW_bK{Jb>T_w(iF2zbCS6awF=mD^4mOg zqW&HcUhSM;*^={r$sP!t>3|x0BuV^ikw#?Cu}GArlG}v^EEs2e2QE!rGEnvvxI>euYNPF;@kJZL0uL0w{pw@-RdKn1w_)FHLF) zPwvXMhkA(R707Y|O5x=%stU7&^v{B;a%)jBgS~xGB7=>Hl7xf50q2DZh2|8aIvs9q z?ggEjCy27M(GWMS%&s6e3ASa>(!+ZMTMNzMiE3~+fO5VdPWHcJ0rS`G3+VSFzFkHs zXNA)hl<0E`0i{xHj;T^l8&SyjRDb9_=~Y@SRay zD1aV-)<3nCCk0IdGj3_zc5~}$8FanLVtUPQiC(flcu4u7i(`GPj&mfj~X_%%v2&{k|slB z4jUCk(kL^LF+=9eQ#2Y}&%P^N8&%!*7qL&gx!x~1poIp=#`=X+kS-#?#E zub$ZNeZTK}t!rKDTGx%ZaP6P1YYw34Ivu(ppI%LLy;n-O(#cS+$%fmR!tp3r=W*#@~Np8Nf;<(We*N#CRld}gmnFV@#yD)Y{J34QU- zL_@kUo=QYbGIM<;&r`dYp072vjozlIE+&CbF3G;60iUn}p|mP4j$w z=QU6Xi*in;Qsy-k6@O9N7`}c2*F7f1h-Jaf&AnOR2_YsKzTp^l9|}BgxP1B>F&8#l zj5*2e&5z}v#s}<&GA115^rkB1cHaqIi~@#qte;TZEL;fOnb&uVzsq~?A&fa#z;$kpbs?&X65 zPwUad*F;)Yq%*POR`=QH$A#Cs_5gJp2?|CTn@T7cx+(g*Yd=H?s4Y$PU2BS$Hg;() zfskW@B&xgOt9ir1U{5J!f0wvL#}x5H?$Y_2H+EUP};Vl^1UG)>`jvTo{^y3p-? zsc1h?;q~Ih3x2}Njg03>OF&FsgLy%Xp4t%3Ll;ss9xDb=N(U2MyoPoUgnHD~;InvdOk00D7Bl1Uqnc4qcZ zwpqEioY4Sf&y5M|z7l6gGkT)vjjzYqj=5#SSXhp8!H@fFV)4^mGhO8@bWbI1d-sDu zkP0z<2&$@jFv*CY9=}ecX4zKu*(udS>|9$}uogp8GtF_5XAQg-E-m*jRg5;I zcVu4)xGLM$J#|6NSI_y=r6w8oV>ZtssecH8a#*WWvsh2osnmg(JUjdhrvG@9NE!j; zkDx+9AI=mVeigt{r63tiR8ohB7t1pjHcbcv#xn3hA0v?;f@y z@tSy-BBu%u5rk3K?|$ zpY4SCKC`^VW{BAx&SpRgHDHHv@W|4;j+baU!LNCmNII{u0OghH8eJny4r>fF9t$zf)aU(`JKNr@ z!l}PLhl4535D`+R7r~4Z0nDQfF>ND9pHe!N`@8~yIWL47Wn}yH$133`dE%pmuI%Hc!NjiKSUG{R0+V#K9+ zKcA&u$Fsz0QfK`P(sHv#_F`xSB#?BiGAij_=;joO0!ygmGjYSvGj^HKu+~gx*sJ&Y z>Iq^19gM7WXC5)BsSD#(j+Y^H2fa3_{RpSX6fC2_GhnsqMP)I9S3*JI8azBu+Q7)P z9<1I0ZXV=V<&5+IuG&Pr}<#)3; zxhR|~WN_fJ07dePxY$_#^d=b;YSF$)?GF)TQUy;dr%m%Z%~L#0%p9ez(~eW!C{3S4mGWqiy`ItKN*-O++bC-=2YcEF)$={Z`0eo#;T9Tu$}L1IIn+BE_BpV>4R4;U zBn%%Ge~Z*5vty~1g8qp5$qeXs2bV0;1<8sZbkfVi5!Co05_9e@CW3Dc zw7+}*w7&&>tjQWqi#?Hy>Et>>oIg@E(zb6VTkLtIv+051cHh;VEJlV`m71G5bsSo} zG7$(;>HKtHi8QZUSh6EPCW`EuY{Z(r*uAxFV)7-u)@Btxt$|I36ApvK(Z*zU#Ts^^n`q$%mvk%pRqso{B_wK zTi2zYJt@&)jz7OpDK#aS)nw3RbjD=gyhU9i5R=2{q5f04^ZT3wi*LuxNSk&NnFw*b z^Wl!~nZNw}gWB5)xqtHPspb~hJ{=s*m2wFPrAaOS>Z}n@9eoQ{D0jk8jBS1Uo!hS) zrUyD}VxIA6=Hv88=aJzg8W-;h&bGMH3w^U=94D&{>F};oy$5v6loP$Dyj~T%Bqt>$ zHKva{oE7(3_@tE}5JSAsC_dbQcUzeF)YR#cI2GJI_Ty+n2i1UElmo-v7OzJhSUQHs zFISvQs?%xy^l!yvFPk5>W(!9B+uah@iS;(-$_)q1f*i9#ADfPp^SAc>@<=4z}85;qN7!D>m z2QY|(dYD32JspF8xHuj!T4_Qu%A%>F--Q<3 zt3Y|T4;F0-61$`1bEnilo`MOSenn&!kc3z9iiNo1U`BTs2k|n~_kT1Y z`c1G3Y*8}j8Q;QmYJtaR9)M1c-fgYX=($(c3}e}veat^vS{PYcll25+yI}}LRjwxe z8EH!9v^Vz4c`>3(eMM`)^mldb>GX-{QWjI!TlDxoZu*Pc5_i1ry%`?Pu**N5JUsv> zh$zb$8oYH2RR}PISkudp$748U*h73#gxACId?UN@c#vQl0zP*ouG2yh`_4FUNu=h- ziofBM_jHS++GYjSAy~1jEe%YkYfbS6>RediUjM=!@7`1bNA@3x!6lPg+d{>hdFA!f zg{mN!PVQOfRSuGJ#uwTR2$|G|IIoC;$V%dwD%$9=Bm4p|bk)JP?jBlqaE`IeRlO)( zJib}%g(PKcS3}8|OK7xCev2Xp85# z{kV!eY1^#4M7|7ctPRL2=IS5y?a8ge2u2igN4D%*Sb26*^CDj<9K$IKBM! z-tgBgH}Y#<_DSAnJ7YwQm8@qnYJX66EP6mK5D^(U>jVAXoD*ivPbTv$-}sU?ZGxOh z0bh-oK-13U?XY#5Y@0rxzYWb3>d;AYZ2tNp^+>f}R@|&W0cD~5;hf&tPJQ}ES3ZnU z(Xz>MTH1zCz-Ie77_js$V0~mX_igJrl0M4^%lHq6SDQp!UuJKTb9vjw7GAfNQmF;V z2Nu5-T^p6G&$DdP1pA2XKue^!*;}xa9c0v^4hhO-Cl9b9k+bcUg8F7#86EISxFCvc z960kFN~g~k1gnR37o??!;?9#Pl3B>PyzqUOg#jgO1iLhvO4DY=Q#y61ge~%EB1#>I zhi|a9n@|$R1^pb&3EHv!G^9@3Qbie~2rg?W{NTgkSh3P_ot{N>JwYSRY!xe1nzPyp^xh$Bg zo9d4ZRRiA9rj*r&j{+B;bPzs9(;BTnLZfq29jFS3^CFlTVWa z$!33%jY(yyyl10x2kGnyW(Y*#C*vwcP@AXunc9E@uVyGzL%z>gP!v5*T8UFNG%R;_ zo=M5X#erD{b$)+gcl*u@JJ@j+;1*bD9{qm|J{?pZ6?R&R`zz*aS1&b9CdO3HlR zh_;>mzF-)V#~^_m#3uy7FUUQVq*jH83&4{bM;8q&F67Z8Ixc7c&uKp@6#WBOuzp{+ zND8+sNjfbdM|)jc?#nwI+9%Uw_U}fYObr-Bz!%&KQ&D?~lOVm9%ouajcYQXcVn3ai z>?tVPUMQSw2*`43$yykg-Z0Mc{P{BU!+Pb^u;)hDz<0;>EJI=?gZp^E-7JsJQDT9& z+u)b=n_oTmcP!&geCpChbb6{5T^!d7T4@4JiGrV5P)PC-$aWM1%us9+3ihM0-L0y=Xheg zZ6pnTVRbswt@>s;@X!MSI9bNJ-?n-R42$kvmW|${BX|# zU7!fp?lvGFbEpq%rMicPC~P+s;iZh?_-B-L=L*kS9R&%J5OTDMhk4Ococ?R@gj|r& z=cHcEzchlQvpESP2Q4&ny9SFRkO`FEWW75XW?=t-{^>gztf}GeI$Guocn$AGqFb=7 zmfIA4f)mj2*L%W|P%)~4!arv|Oc=>?Q1*sUT*Sn!@C3j_0z&=)$RpeMm6+mc!o}liR!5zH6D_}U z(6$fh5Sy%71T>tKdQgUMk|7E73O$eP+|@3|zI~il483trx96DA6~(&j?MUr4VCC6I`x2C+9?wg zzFd48%x}iQ#N?yFLCEO;G)!GdZKs=7v2DN#rABSW1%16|n@njJDg=G~{n3zO5-;^MG4NP;I!1%{Uxb(ZIcD9jUZn<|Kc-2aX;X%z1RGC$=^2&4C zW5Chuvh|g8#n%azHcK!0ahW9(2hBOZy$UQ;S^Ls&0xqt9-bDQ2&QgQ@0%2s%HI^$ ze(OyNs~|=?{XYy=M@%iaY+GN@?dHU4b*sF2NRMV zL(nY2DS$)q)YxHV2z=Z_s=^M3A!2bb2wr1? zz#k=*|9JB26Tk1QIIV3#&fNb6#Kq5W(&{8O)uYIw+h&E4c&EAvc)1+dP^L;Qh^pPX zmjE2Zp_Bk``Tu!ued@3;SbgcTn$0g|#e^%hK54xHsR;bZuK#SPrfU1yb~27}KOck} z4Vu5h4df?e^$p`o<(OY&BRrE|**TBjab~QmKs*go-4>6(Y61kD1e9JnYT0v-3=>pUV{U2OTBH$mvcIN4ZuUc z*Joo*!}q%vHYwx4Bz<(fT%bK@N|5W8taFO^{*J#vn!4 zTD*Wak1jqD02`Z#k*^*sg2SgvTKPAnk|+u66IK?-KpM{`<78n?u>O(1Zw~QRo-Y;i zf?Tl09T%GF!Wnu=* z*4t%a{HI~tPl^UbnVqBJGIc+$z#Q)cB6wYNIDzX-wAT8V*x$SRWp1KEa$I`ldVTm} zOG^!0~)nBn*9$ zb14(w$vVNpUS_vAsT#}A*~X&aVJsoOb`-~b)FRBW^hF0xyL`9%EuHGHl(<^nW_iZC z6gXm=*MNitZbj%N_dL_J%ga?cqu+`F_Pml!lz)}m>)!IgL2)BgE8i>Z0XTo4<`MQd zsxU7q7O3!W!rG1R3f@R8UnMPkl|Hw=A-8kC!`_n=uc>MS7DwHg?|U;w%Ab|~8oCEd ztERY%aktWQyx5m9lRcz#QNN6W21QvC4%llF;>rAz4p=@9I)Xj9?J8IN_IT6t^z0uD ze>5*=Ona3u5Dzc*FLirllrOE!8FYSnF`Aw~rI6*3aK^i-(e=nS%-wD8F8L2psd(=} zCM?GmKbvq)ELqmVTM{3IS7ctpls=wPdS^{>>Wv@ynFM(c3%88m%H+hL_CuG`?K|e% zy8Xa=@bp=YN2Y1z2K_1BP zQY)q;1k-ae3+5)3-U+Z1?=+S;derH&xc*qi$m-Ixq@8GIVXSpshT;#PrW-m7&TOdJ z zlsyGu{GxF?3Z4%@^>dETqC^qz4zKQ0?u%>aw4`BzBeSx<9o$COzzx}glQzv+^2e9z z;A>!OII?&iQ8I8zgAv(vkDugUl)l_}iBg5!cio1C0X6+BerfsDuI2)&{?~^oAHZiM zWAsQJqd(LvuyG~}XM%obg&N{VV_khJseWZls~CdjXm|`Gv`twFe+>RKTUNyG7fbVQ zhwY=?xB;iOGsy)xa{jVmY7~U`{>C;YfThd?@(gl~s{H9o6Na|oZGQd&BfQ*d4yy_` zC+Iod*$E1<`B@Pu3^PAM+lPEZhUWI4GoqygoOv6it|N-Av}Dfk&obx82y$dXe(sM4 zQ%{ggX0c_^XOhUMQ`7I3pPNOfl-1|BtI}K7TC}B8LBy4!YuA?GKkJJfN17nCvlR;6ci3YcXJr4US z#8#CCd+`z?(`4!(j;cZj^hI&8He9@M+*;h)R~Ak^z3}#Sb^>JCNP#DAZ}qgs_ycuX zhhSJvX_aPuTX~>8{EVnw|FOAN#Yq)I)gs`f7g={lvfz4tFtCZfYxlFYvsdP`1xk9$fZ6R3&`x(n+jp+w>=Q@T*Za z-4&Y-q@m`$Fn3l_dCeZfk**x^OGVP*f=*ga~y z;%_@yj`k>%ThKX+A2rA^y+gZOB3*7QzwbTbqF$R_6h)FOa}q=${xUPE~(NQZhFp+2AFRHStJHI~kedKH5oWu5A+NKR`!b zy1m?faiBQ@uCq}DVH`EubTeN?j$$sNS3=i$G>GyOi94G50w#yBWY3Fsx;Uv84qV34 zGoc5quD z0EV0}S{A=un744}%%=yiy^U`l-DIh>eAx+I`nqP3n{%#*#aYgz;o|wF-m+(t%cO7b zgj60&fsSMGry((!h9dOtz9N7Y*D{}6cCsu@$r_&V&(AiZ8CjRk$e3%#eeL=9Xg+|k z8_x|06nAu)DFbm=w}QzHPcHtQp?)YDGC@3HA`R7LQbk>N|D6FzJesO_E`F&i)bQ0v zNSR=7Q`0|TMn)!(`yLP4d-V^i#Kxe6%?ZHv<{rj6aQt?X=m^&~y#mm(`d)oId}s?< zChj(gOiO+3AmeRd+^OlcNH~c`mb7r5>tdk=om23%K_D0&OIsUgNO8G89usczC zvqK~}hB~pu_)!t1-#k)FKESbw!$h$9^`3cKoyTB>Q?bvLHwknz)D)(KBEPTbO-{Ko}gsJ37&^2V?xmQd9&TA^W@Dh zpN7I~dMjNeZ;nibp0EmtL$U~WbaML-;WqvNm<%3Gao{5^K8OrL|NS9ZrY}ss9>ZaW zK`xDw2-B}J%OdB5DjP2&w-a^ern6En*ltQLc|a^caWVEdo*urgGcH99^N|TqXX3G& z=lg#eCeTRqj2oVfoo1CaY`Ri}3hTNEUvF=hsa|dNOv}SkHe_SRdZ*T7>2I6bVVWkVHUV5wc!jvhJ6KqHQms1=L~;kkWbQL}qRXv*$H0f1 zvJt3+wezhWUk7mtCG9RAWc!OEA1JRr>NG%#sxNW2`F4E%bI!GUFm8GY43;immi?wz zW;Yg99rag~M<)&%*^`XWSf6xDP=|64gf02_yg=1>{EM z>m^F~yRgug-o3EId}YL5@K;_vu%Pu$Eg{t8e%|JpJNIS>a4~%M(wgEK_aFYfuT@Wz zWPF(eV)M*?S-7i-MQW9N{7jt0DNwsB%k6_Qd%R6WM^{%_pS$w}yL%{b$TcCH);02= z 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 diff --git a/apps/website/screens/components/select/usage/SelectUsagePage.tsx b/apps/website/screens/components/select/usage/SelectUsagePage.tsx deleted file mode 100644 index 164adfed99..0000000000 --- a/apps/website/screens/components/select/usage/SelectUsagePage.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { DxcParagraph, DxcBulletedList, DxcFlex, DxcTable } from "@dxc-technology/halstack-react"; -import QuickNavContainer from "@/common/QuickNavContainer"; -import QuickNavContainerLayout from "@/common/QuickNavContainerLayout"; -import DocFooter from "@/common/DocFooter"; -import Example from "@/common/example/Example"; -import variants from "./examples/variants"; -import requiredOptional from "./examples/requiredOptional"; -import filterable from "./examples/filterable"; -import HeaderDescriptionCell from "@/common/HeaderDescriptionCell"; - -const sections = [ - { - title: "Usage", - content: ( - <> - Considerations about the select usage: - - - A dialog element should allow the user to select one option from a list. - - - If the list of options is short (4 or less), use checkboxes instead of the select component. - - - The select component should always display a label different from any name in the option list. - - Use a pre-selected good default where possible. - Use progressive disclosure between linked select components. - - If more than one option is applicable, use the multi-select variant. - - - - ), - }, - { - title: "Variants", - content: ( - <> - - - - - Variant - Description - - - - - - Single - - Allows the user to select one option from a list - - - - Multiple - - Allows the user to select multiple options from a list - - - - - ), - }, - { - title: "Filter", - content: ( - <> - - - Both select variants can be filterable. - - Use the filter when the number of items in the optionList is extremely long (± 15 elements). - - - This list will be reduced to show only the matches as the user types. - - - The value will change when the user types a string that matches an option from the list or pick one - manually. - - - When the search does not match any result, a "No matches found" message will be displayed. - - - - ), - }, - { - title: "Required and optional", - content: ( - <> - - - - When labeled as optional, the select will display an option matching the placeholder to allow leaving it - empty. - - When no optional label appears, the select is required. - - If the select was left empty, the required should display the error "This field can not be empty" when the - select loses the focus. - - - - ), - }, -]; - -const SelectUsagePage = () => { - return ( - - - - - - - ); -}; - -export default SelectUsagePage; diff --git a/packages/lib/src/select/Select.stories.tsx b/packages/lib/src/select/Select.stories.tsx index dbcdaae7c2..ad95531104 100644 --- a/packages/lib/src/select/Select.stories.tsx +++ b/packages/lib/src/select/Select.stories.tsx @@ -218,17 +218,11 @@ const optionsWithEllipsis = [ const Select = () => ( <> + <ExampleContainer> - <Title title="Simple select" theme="light" level={2} /> - <DxcSelect - label="Simple select" - helperText="Simple simple" - optional - options={single_options} - placeholder="Very simple" - /> + <Title title="Default" theme="light" level={4} /> + <DxcSelect options={single_options} /> </ExampleContainer> - <Title title="States" theme="light" level={2} /> <ExampleContainer pseudoState="pseudo-hover"> <Title title="Hovered" theme="light" level={4} /> <DxcSelect label="Hovered" options={single_options} /> @@ -239,11 +233,18 @@ const Select = () => ( </ExampleContainer> <ExampleContainer> <Title title="Disabled" theme="light" level={4} /> - <DxcSelect label="Disabled" placeholder="Placeholder" disabled options={single_options} /> + <DxcSelect + label="Label" + placeholder="Placeholder" + helperText="Helper text" + optional + disabled + options={single_options} + /> </ExampleContainer> <ExampleContainer> <Title title="Disabled with value" theme="light" level={4} /> - <DxcSelect label="Disabled with value" disabled options={single_options} defaultValue="1" /> + <DxcSelect label="Label" disabled helperText="Helper text" optional options={single_options} defaultValue="1" /> </ExampleContainer> <ExampleContainer> <Title title="Error" theme="light" level={4} /> @@ -268,7 +269,7 @@ const Select = () => ( <Title title="Anatomy" theme="light" level={2} /> <ExampleContainer> <Title title="Label, placeholder and helper text" theme="light" level={4} /> - <DxcSelect label="Label" options={single_options} helperText="Helper text" placeholder="Placeholder" /> + <DxcSelect label="Label" options={single_options} helperText="Helper text" placeholder="Placeholder" optional /> </ExampleContainer> <Title title="Variants" theme="light" level={2} /> <ExampleContainer> diff --git a/packages/lib/src/select/Select.tsx b/packages/lib/src/select/Select.tsx index 5885a13671..40693d4220 100644 --- a/packages/lib/src/select/Select.tsx +++ b/packages/lib/src/select/Select.tsx @@ -58,7 +58,7 @@ const Label = styled.label<{ disabled: SelectPropsType["disabled"]; helperText: SelectPropsType["helperText"]; }>` - color: var(${({ disabled }) => (disabled ? "--color-fg-neutral-medium" : "--color-fg-neutral-dark")}); + color: ${({ disabled }) => (disabled ? "var(--color-fg-neutral-medium)" : "var(--color-fg-neutral-dark)")}; font-family: var(--typography-font-family); font-size: var(--typography-label-m); font-weight: var(--typography-label-semibold); @@ -66,7 +66,7 @@ const Label = styled.label<{ /* Optional text */ > span { - color: var(--color-fg-neutral-stronger); + color: ${({ disabled }) => (disabled ? "var(--color-fg-neutral-medium)" : "var(--color-fg-neutral-stronger)")}; font-weight: var(--typography-label-regular); } `; @@ -99,7 +99,7 @@ const Select = styled.div<{ ? ` cursor: pointer; &:hover { - border-color: var(${error ? "--border-color-error-strong;" : "--border-color-primary-strong"}); + border-color: ${error ? "var(--border-color-error-strong)" : "var(--border-color-primary-strong)"}; } &:focus-within { outline-offset: -2px; diff --git a/packages/lib/src/select/types.ts b/packages/lib/src/select/types.ts index 921fbdcb19..873a1ca444 100644 --- a/packages/lib/src/select/types.ts +++ b/packages/lib/src/select/types.ts @@ -11,6 +11,7 @@ export type ListOptionGroupType = { */ options: ListOptionType[]; }; + export type ListOptionType = { /** * Element used as the icon that will be placed before the option label. @@ -130,6 +131,7 @@ type SingleSelect = CommonProps & { */ onBlur?: (val: { value: string; error?: string }) => void; }; + type MultipleSelect = CommonProps & { /** * If true, the select component will support multiple selected options. From f4b693d646f7243b67d5ccfdd887ce6d3f1edffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Mon, 3 Mar 2025 13:48:47 +0100 Subject: [PATCH 12/15] Alphabetically sorted props --- .../components/select/code/SelectCodePage.tsx | 189 ++++++------------ 1 file changed, 58 insertions(+), 131 deletions(-) diff --git a/apps/website/screens/components/select/code/SelectCodePage.tsx b/apps/website/screens/components/select/code/SelectCodePage.tsx index 9055180619..8be891b618 100644 --- a/apps/website/screens/components/select/code/SelectCodePage.tsx +++ b/apps/website/screens/components/select/code/SelectCodePage.tsx @@ -33,99 +33,41 @@ const sections = [ </thead> <tbody> <tr> - <td>defaultValue</td> + <td>ariaLabel</td> <td> - <TableCode>string | string[]</TableCode> + <TableCode>string</TableCode> </td> - <td>Initial value of the select, only when it is uncontrolled.</td> - <td>-</td> - </tr> - <tr> - <td>value</td> <td> - <TableCode>string | string[]</TableCode> + Specifies a string to be used as the name for the select element when no <Code>label</Code> is provided. </td> <td> - Value of the select. If undefined, the component will be uncontrolled and the value will be managed - internally by the component. + <TableCode>'Select'</TableCode> </td> - <td>-</td> </tr> <tr> - <td>label</td> + <td>defaultValue</td> <td> - <TableCode>string</TableCode> + <TableCode>string | string[]</TableCode> </td> - <td>Text to be placed above the select.</td> + <td>Initial value of the select, only when it is uncontrolled.</td> <td>-</td> </tr> <tr> - <td>name</td> + <td>disabled</td> <td> - <TableCode>string</TableCode> + <TableCode>boolean</TableCode> </td> + <td>If true, the component will be disabled.</td> <td> - Name attribute of the input element. This attribute will allow users to find the component's value during - the submit event. In this event, the component's value will always be a regular string, for both single - and multiple selection modes, being a single option value in the first case and more than one value when - multiple selection is available, separated by commas. + <TableCode>false</TableCode> </td> - <td>-</td> </tr> <tr> + <td>error</td> <td> - <DxcFlex direction="column" gap="0.25rem" alignItems="baseline"> - <StatusBadge status="required" /> - options - </DxcFlex> - </td> - <td> - <TableCode>{"Option[] | ({ label: string, options: Option[] })[]"}</TableCode> - <p> - being <Code>Option</Code> the following type: - </p> - <ExtendedTableCode>{optionsType}</ExtendedTableCode> - <p> - and <Code>Icon</Code>: - </p> - <TableCode>{`React.ReactNode & React.SVGProps<SVGSVGElement>`}</TableCode> - </td> - <td> - An array of objects representing the selectable options. Each object has the following properties - depending on whether it is a regular option or a group: <br /> - <br /> - <strong>Option</strong> - <ul> - <li> - <b>label</b>: Label of the option to be shown in the select's listbox. - </li> - <li> - <b>value</b>: Value of the option. It should be unique and not an empty string, which is reserved to - the empty option added by <Code>optional</Code> prop. - </li> - <li> - <b>icon</b>:{" "} - <DxcLink newWindow href="https://fonts.google.com/icons"> - Material Symbol - </DxcLink>{" "} - name or SVG element used as the icon for the option. When using Material Symbols, replace spaces with - underscores. By default they are outlined if you want it to be filled prefix the symbol name with{" "} - <Code>"filled_"</Code>. - </li> - </ul> - <strong>Grouped options</strong> - <br /> - <ul> - <li> - <b>label</b>: Label of the group to be shown in the select's listbox. - </li> - <li> - <b>options</b>: List of <Code>Option</Code> instances. - </li> - </ul> - <br /> - <strong>You can't mix regular options and grouped options in the same array.</strong> + <TableCode>string</TableCode> </td> + <td>Handles the error message and appearance of the select component.</td> <td>-</td> </tr> <tr> @@ -137,108 +79,103 @@ const sections = [ <td>-</td> </tr> <tr> - <td>placeholder</td> + <td>label</td> <td> <TableCode>string</TableCode> </td> - <td>Text to be put as placeholder of the select.</td> + <td>Text to be placed above the select.</td> <td>-</td> </tr> <tr> - <td>searchable</td> - <td> - <TableCode>boolean</TableCode> - </td> - <td>If true, enables search functionality.</td> + <td>margin</td> <td> - <TableCode>false</TableCode> + <TableCode>'xxsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'xxlarge' | Margin</TableCode> </td> + <td>Size of the margin to be applied to the component.</td> + <td>-</td> </tr> <tr> <td>multiple</td> <td> <TableCode>boolean</TableCode> </td> + <td>If true, the select supports multiple selected options.</td> <td> - If true, the select component will support multiple selected options. In that case, value will be an array - of strings with each selected option value. + <TableCode>false</TableCode> </td> + </tr> + <tr> + <td>name</td> <td> - <TableCode>false</TableCode> + <TableCode>string</TableCode> </td> + <td>Name attribute of the input element.</td> + <td>-</td> </tr> <tr> - <td>disabled</td> + <td>onBlur</td> <td> - <TableCode>boolean</TableCode> + <TableCode>{"(val: { value: string | string[]; error?: string }) => void"}</TableCode> </td> - <td>If true, the component will be disabled.</td> + <td>Called when the select loses focus.</td> + <td>-</td> + </tr> + <tr> + <td>onChange</td> <td> - <TableCode>false</TableCode> + <TableCode>{"(val: { value: string | string[]; error?: string }) => void"}</TableCode> </td> + <td>Called when the user selects an option.</td> + <td>-</td> </tr> <tr> <td>optional</td> <td> <TableCode>boolean</TableCode> </td> - <td> - If true, the select will be optional, showing '(Optional)' next to the label and adding a default first - option with an empty string as value and the placeholder (if defined) as its label. Otherwise, the field - will be considered required and an error will be passed as a parameter to the <Code>onBlur</Code> and{" "} - <Code>onChange</Code> functions if an option wasn't selected. - </td> + <td>If true, the select will be optional, adding a default empty option.</td> <td> <TableCode>false</TableCode> </td> </tr> <tr> - <td>onChange</td> <td> - <TableCode>{"(val: { value: string | string[]; error?: string }) => void"}</TableCode> + <DxcFlex direction="column" gap="0.25rem" alignItems="baseline"> + <StatusBadge status="required" /> + options + </DxcFlex> </td> <td> - This function will be called when the user selects an option. An object including the new value (or - values) and the error (if the value selected is not valid) will be passed to this function. If there is no - error, <Code>error</Code> will not be defined. + <TableCode>{"Option[] | ({ label: string, options: Option[] })[]"}</TableCode> </td> + <td>Array of objects representing the selectable options.</td> <td>-</td> </tr> <tr> - <td>onBlur</td> - <td> - <TableCode>{"(val: { value: string | string[]; error?: string }) => void"}</TableCode> - </td> + <td>placeholder</td> <td> - This function will be called when the select loses the focus. An object including the value (or values) - and the error (if the value selected is not valid) will be passed to this function. If there is no error,{" "} - <Code>error</Code> will not be defined. + <TableCode>string</TableCode> </td> + <td>Text to be put as placeholder of the select.</td> <td>-</td> </tr> <tr> - <td>error</td> - <td> - <TableCode>string</TableCode> - </td> + <td>ref</td> <td> - If it is a defined value and also a truthy string, the component will change its appearance, showing the - error below the select component. If the defined value is an empty string, it will reserve a space below - the component for a future error, but it would not change its look. In case of being undefined or null, - both the appearance and the space for the error message would not be modified. + <TableCode>{"React.Ref<HTMLDivElement>"}</TableCode> </td> + <td>Reference to the component.</td> <td>-</td> </tr> <tr> - <td>margin</td> + <td>searchable</td> <td> - <TableCode>'xxsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'xxlarge' | Margin</TableCode> + <TableCode>boolean</TableCode> </td> + <td>If true, enables search functionality.</td> <td> - Size of the margin to be applied to the component. You can pass an object with 'top', 'bottom', 'left' and - 'right' properties in order to specify different margin sizes. + <TableCode>false</TableCode> </td> - <td>-</td> </tr> <tr> <td>size</td> @@ -263,23 +200,13 @@ const sections = [ </td> </tr> <tr> - <td>ref</td> + <td>value</td> <td> - <TableCode>{"React.Ref<HTMLDivElement>"}</TableCode> + <TableCode>string | string[]</TableCode> </td> - <td>Reference to the component.</td> + <td>Value of the select, or undefined if uncontrolled.</td> <td>-</td> </tr> - <tr> - <td>ariaLabel</td> - <td> - <TableCode>string</TableCode> - </td> - <td> - Specifies a string to be used as the name for the select element when no <Code>label</Code> is provided. - </td> - <td>'Select'</td> - </tr> </tbody> </DxcTable> ), From 01f6dbc42aa1259744c7f0507ad5eb65d0e14100 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Mon, 3 Mar 2025 13:56:45 +0100 Subject: [PATCH 13/15] Corrected alphabetically sorted props --- .../components/select/code/SelectCodePage.tsx | 109 +++++++++++++++--- 1 file changed, 92 insertions(+), 17 deletions(-) diff --git a/apps/website/screens/components/select/code/SelectCodePage.tsx b/apps/website/screens/components/select/code/SelectCodePage.tsx index 8be891b618..1efe9a124c 100644 --- a/apps/website/screens/components/select/code/SelectCodePage.tsx +++ b/apps/website/screens/components/select/code/SelectCodePage.tsx @@ -67,7 +67,12 @@ const sections = [ <td> <TableCode>string</TableCode> </td> - <td>Handles the error message and appearance of the select component.</td> + <td> + If it is a defined value and also a truthy string, the component will change its appearance, showing the + error below the select component. If the defined value is an empty string, it will reserve a space below + the component for a future error, but it would not change its look. In case of being undefined or null, + both the appearance and the space for the error message would not be modified. + </td> <td>-</td> </tr> <tr> @@ -91,7 +96,10 @@ const sections = [ <td> <TableCode>'xxsmall' | 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge' | 'xxlarge' | Margin</TableCode> </td> - <td>Size of the margin to be applied to the component.</td> + <td> + Size of the margin to be applied to the component. You can pass an object with 'top', 'bottom', 'left' and + 'right' properties in order to specify different margin sizes. + </td> <td>-</td> </tr> <tr> @@ -99,7 +107,10 @@ const sections = [ <td> <TableCode>boolean</TableCode> </td> - <td>If true, the select supports multiple selected options.</td> + <td> + If true, the select component will support multiple selected options. In that case, value will be an array + of strings with each selected option value. + </td> <td> <TableCode>false</TableCode> </td> @@ -109,7 +120,12 @@ const sections = [ <td> <TableCode>string</TableCode> </td> - <td>Name attribute of the input element.</td> + <td> + Name attribute of the input element. This attribute will allow users to find the component's value during + the submit event. In this event, the component's value will always be a regular string, for both single + and multiple selection modes, being a single option value in the first case and more than one value when + multiple selection is available, separated by commas. + </td> <td>-</td> </tr> <tr> @@ -117,7 +133,11 @@ const sections = [ <td> <TableCode>{"(val: { value: string | string[]; error?: string }) => void"}</TableCode> </td> - <td>Called when the select loses focus.</td> + <td> + This function will be called when the select loses the focus. An object including the value (or values) + and the error (if the value selected is not valid) will be passed to this function. If there is no error,{" "} + <Code>error</Code> will not be defined. + </td> <td>-</td> </tr> <tr> @@ -125,7 +145,11 @@ const sections = [ <td> <TableCode>{"(val: { value: string | string[]; error?: string }) => void"}</TableCode> </td> - <td>Called when the user selects an option.</td> + <td> + This function will be called when the user selects an option. An object including the new value (or + values) and the error (if the value selected is not valid) will be passed to this function. If there is no + error, <Code>error</Code> will not be defined. + </td> <td>-</td> </tr> <tr> @@ -133,7 +157,12 @@ const sections = [ <td> <TableCode>boolean</TableCode> </td> - <td>If true, the select will be optional, adding a default empty option.</td> + <td> + If true, the select will be optional, showing '(Optional)' next to the label and adding a default first + option with an empty string as value and the placeholder (if defined) as its label. Otherwise, the field + will be considered required and an error will be passed as a parameter to the <Code>onBlur</Code> and{" "} + <Code>onChange</Code> functions if an option wasn't selected. + </td> <td> <TableCode>false</TableCode> </td> @@ -147,8 +176,51 @@ const sections = [ </td> <td> <TableCode>{"Option[] | ({ label: string, options: Option[] })[]"}</TableCode> + <p> + being <Code>Option</Code> the following type: + </p> + <ExtendedTableCode>{optionsType}</ExtendedTableCode> + <p> + and <Code>Icon</Code>: + </p> + <TableCode>{`React.ReactNode & React.SVGProps<SVGSVGElement>`}</TableCode> + </td> + <td> + An array of objects representing the selectable options. Each object has the following properties + depending on whether it is a regular option or a group: <br /> + <br /> + <strong>Option</strong> + <ul> + <li> + <b>label</b>: Label of the option to be shown in the select's listbox. + </li> + <li> + <b>value</b>: Value of the option. It should be unique and not an empty string, which is reserved to + the empty option added by <Code>optional</Code> prop. + </li> + <li> + <b>icon</b>:{" "} + <DxcLink newWindow href="https://fonts.google.com/icons"> + Material Symbol + </DxcLink>{" "} + name or SVG element used as the icon for the option. When using Material Symbols, replace spaces with + underscores. By default they are outlined if you want it to be filled prefix the symbol name with{" "} + <Code>"filled_"</Code>. + </li> + </ul> + <strong>Grouped options</strong> + <br /> + <ul> + <li> + <b>label</b>: Label of the group to be shown in the select's listbox. + </li> + <li> + <b>options</b>: List of <Code>Option</Code> instances. + </li> + </ul> + <br /> + <strong>You can't mix single and grouped options in the same array.</strong> </td> - <td>Array of objects representing the selectable options.</td> <td>-</td> </tr> <tr> @@ -159,14 +231,6 @@ const sections = [ <td>Text to be put as placeholder of the select.</td> <td>-</td> </tr> - <tr> - <td>ref</td> - <td> - <TableCode>{"React.Ref<HTMLDivElement>"}</TableCode> - </td> - <td>Reference to the component.</td> - <td>-</td> - </tr> <tr> <td>searchable</td> <td> @@ -199,12 +263,23 @@ const sections = [ <TableCode>0</TableCode> </td> </tr> + <tr> + <td>ref</td> + <td> + <TableCode>{"React.Ref<HTMLDivElement>"}</TableCode> + </td> + <td>Reference to the component.</td> + <td>-</td> + </tr> <tr> <td>value</td> <td> <TableCode>string | string[]</TableCode> </td> - <td>Value of the select, or undefined if uncontrolled.</td> + <td> + Value of the select. If undefined, the component will be uncontrolled and the value will be managed + internally by the component. + </td> <td>-</td> </tr> </tbody> From 94ae6722d335200962b7a9827c44a7f508caf5f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Wed, 12 Mar 2025 09:45:57 +0100 Subject: [PATCH 14/15] Select updates based on feedback --- apps/website/pages/components/select/code.tsx | 2 +- .../components/select/code/SelectCodePage.tsx | 18 ++++++++---------- packages/lib/src/select/Select.stories.tsx | 16 ---------------- 3 files changed, 9 insertions(+), 27 deletions(-) diff --git a/apps/website/pages/components/select/code.tsx b/apps/website/pages/components/select/code.tsx index ee4d1db2c6..2e06ea6312 100644 --- a/apps/website/pages/components/select/code.tsx +++ b/apps/website/pages/components/select/code.tsx @@ -6,7 +6,7 @@ import SelectCodePage from "screens/components/select/code/SelectCodePage"; const Code = () => ( <> <Head> - <title>Select Code — Halstack Design System + Select code — Halstack Design System diff --git a/apps/website/screens/components/select/code/SelectCodePage.tsx b/apps/website/screens/components/select/code/SelectCodePage.tsx index 1efe9a124c..2f33c502b0 100644 --- a/apps/website/screens/components/select/code/SelectCodePage.tsx +++ b/apps/website/screens/components/select/code/SelectCodePage.tsx @@ -313,15 +313,13 @@ const sections = [ }, ]; -const SelectCodePage = () => { - return ( - - - - - - - ); -}; +const SelectCodePage = () => ( + + + + + + +); export default SelectCodePage; diff --git a/packages/lib/src/select/Select.stories.tsx b/packages/lib/src/select/Select.stories.tsx index ad95531104..b41bd121d6 100644 --- a/packages/lib/src/select/Select.stories.tsx +++ b/packages/lib/src/select/Select.stories.tsx @@ -582,13 +582,6 @@ const DefaultGroupedOptionsSelect = () => (
); -const DefaultGroupedOptionsSelectOpinionated = () => ( - - - <DxcSelect label="Label" options={group_options} defaultValue="9" placeholder="Choose an option" /> - </ExampleContainer> -); - const MultipleGroupedOptionsSelect = () => ( <ExampleContainer expanded> <Title title="Grouped options multiple select" theme="light" level={4} /> @@ -707,15 +700,6 @@ export const GroupOptionsDisplayed: Story = { }, }; -export const GroupOptionsDisplayedOpinionated: Story = { - render: DefaultGroupedOptionsSelectOpinionated, - play: async ({ canvasElement }) => { - const canvas = within(canvasElement); - const select = canvas.getByRole("combobox"); - await userEvent.click(select); - }, -}; - export const MultipleOptionsDisplayed: Story = { render: MultipleSelect, play: async ({ canvasElement }) => { From 2921c74afb6d43d17b957490719bc04b8d98d651 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Iv=C3=A1n=20G=C3=B3mez=20Pinta?= <44321109+GomezIvann@users.noreply.github.com> Date: Wed, 12 Mar 2025 10:23:05 +0100 Subject: [PATCH 15/15] Closing tags --- apps/website/screens/components/select/SelectPageLayout.tsx | 2 +- apps/website/screens/components/select/code/SelectCodePage.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/website/screens/components/select/SelectPageLayout.tsx b/apps/website/screens/components/select/SelectPageLayout.tsx index 425d0958c0..c0fa6e7e24 100644 --- a/apps/website/screens/components/select/SelectPageLayout.tsx +++ b/apps/website/screens/components/select/SelectPageLayout.tsx @@ -18,7 +18,7 @@ const SelectPageHeading = ({ children }: { children: ReactNode }) => { <DxcParagraph> The select component allows users to make single or multiple selections from a pre-defined list of options. </DxcParagraph> - <TabsPageHeading tabs={tabs}></TabsPageHeading> + <TabsPageHeading tabs={tabs} /> </DxcFlex> </PageHeading> {children} diff --git a/apps/website/screens/components/select/code/SelectCodePage.tsx b/apps/website/screens/components/select/code/SelectCodePage.tsx index 2f33c502b0..d714c257f4 100644 --- a/apps/website/screens/components/select/code/SelectCodePage.tsx +++ b/apps/website/screens/components/select/code/SelectCodePage.tsx @@ -316,7 +316,7 @@ const sections = [ const SelectCodePage = () => ( <DxcFlex direction="column" gap="4rem"> <QuickNavContainerLayout> - <QuickNavContainer sections={sections} startHeadingLevel={2}></QuickNavContainer> + <QuickNavContainer sections={sections} startHeadingLevel={2} /> </QuickNavContainerLayout> <DocFooter githubLink="https://github.com/dxc-technology/halstack-react/blob/master/apps/website/screens/components/select/code/SelectCodePage.tsx" /> </DxcFlex>