From f64614374d2107402103788ccea01fcf09742f96 Mon Sep 17 00:00:00 2001 From: clintcs <114178960+clintcs@users.noreply.github.com> Date: Wed, 3 Sep 2025 10:15:45 -0400 Subject: [PATCH 1/2] Add Select `multiple` attribute --- custom-elements.json | 40 ++ src/option.styles.ts | 26 +- src/option.test.interactions.ts | 38 ++ src/option.ts | 64 +++- src/select.stories.ts | 14 +- src/select.test.accessibility.multiple.ts | 102 +++++ src/select.test.accessibility.single.ts | 102 +++++ src/select.test.accessibility.ts | 54 --- src/select.test.forms.ts | 43 ++- src/select.test.keyboard.multiple.ts | 242 ++++++++++++ src/select.test.keyboard.single.ts | 78 ++++ src/select.test.keyboard.ts | 74 ---- src/select.test.miscellaneous.multiple.ts | 336 +++++++++++++++++ src/select.test.miscellaneous.single.ts | 309 +++++++++++++++ src/select.test.miscellaneous.ts | 213 ----------- src/select.test.mouse.multiple.ts | 435 ++++++++++++++++++++++ src/select.test.mouse.single.ts | 292 +++++++++++++++ src/select.test.mouse.ts | 296 ++------------- src/select.test.visuals.ts | 272 +++++++++----- src/select.ts | 178 ++++++--- 20 files changed, 2431 insertions(+), 777 deletions(-) create mode 100644 src/select.test.accessibility.multiple.ts create mode 100644 src/select.test.accessibility.single.ts create mode 100644 src/select.test.keyboard.multiple.ts create mode 100644 src/select.test.keyboard.single.ts create mode 100644 src/select.test.miscellaneous.multiple.ts create mode 100644 src/select.test.miscellaneous.single.ts create mode 100644 src/select.test.mouse.multiple.ts create mode 100644 src/select.test.mouse.single.ts diff --git a/custom-elements.json b/custom-elements.json index 221652bb0..9bda38762 100644 --- a/custom-elements.json +++ b/custom-elements.json @@ -5321,6 +5321,16 @@ "attribute": "id", "reflects": true }, + { + "kind": "field", + "name": "multiple", + "type": { + "text": "boolean" + }, + "default": "false", + "attribute": "multiple", + "reflects": true + }, { "kind": "field", "name": "privateActive", @@ -5391,6 +5401,12 @@ } ], "events": [ + { + "name": "click", + "type": { + "text": "Event" + } + }, { "name": "disabled", "type": { @@ -5457,6 +5473,14 @@ "readonly": true, "fieldName": "id" }, + { + "name": "multiple", + "type": { + "text": "boolean" + }, + "default": "false", + "fieldName": "multiple" + }, { "name": "privateActive", "fieldName": "privateActive" @@ -6768,6 +6792,15 @@ "attribute": "loading", "reflects": true }, + { + "kind": "field", + "name": "multiple", + "type": { + "text": "boolean" + }, + "attribute": "multiple", + "reflects": true + }, { "kind": "field", "name": "name", @@ -6940,6 +6973,13 @@ "default": "false", "fieldName": "loading" }, + { + "name": "multiple", + "type": { + "text": "boolean" + }, + "fieldName": "multiple" + }, { "name": "name", "type": { diff --git a/src/option.styles.ts b/src/option.styles.ts index 1f6992dd3..d77eff9e3 100644 --- a/src/option.styles.ts +++ b/src/option.styles.ts @@ -69,24 +69,32 @@ export default [ grid-template-columns: 1fr auto; } - &.selected { - grid-template-columns: 1fr auto; + &:not(.multiple) { + &.selected { + grid-template-columns: 1fr auto; - &.icon { - grid-template-columns: auto 1fr auto; + &.icon { + grid-template-columns: auto 1fr auto; - &.submenu { - grid-template-columns: auto 1fr auto auto; + &.submenu { + grid-template-columns: auto 1fr auto auto; + } } - } - &.submenu { - grid-template-columns: 1fr auto auto; + &.submenu { + grid-template-columns: 1fr auto auto; + } } } } } + .checkbox { + align-items: center; + column-gap: var(--glide-core-spacing-base-xs); + display: flex; + } + .label { overflow-x: hidden; text-overflow: ellipsis; diff --git a/src/option.test.interactions.ts b/src/option.test.interactions.ts index 360d96b5b..d72a8afeb 100644 --- a/src/option.test.interactions.ts +++ b/src/option.test.interactions.ts @@ -1,6 +1,7 @@ import { aTimeout, expect, fixture, html } from '@open-wc/testing'; import Option from './option.js'; import type Tooltip from './tooltip.js'; +import { click } from './library/mouse.js'; it('sets `ariaDisabled` when enabled programmatically', async () => { const host = await fixture