@odx/foundation 1.0.0-beta.90 → 1.0.0-beta.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { CanBeDisabled, CustomElement } from '../../lib/main.js';
2
- import { TemplateResult } from 'lit';
2
+ import { PropertyValues, TemplateResult } from 'lit';
3
3
  declare global {
4
4
  interface HTMLElementTagNameMap {
5
5
  'odx-card': OdxCard;
@@ -7,6 +7,8 @@ declare global {
7
7
  }
8
8
  declare const OdxCard_base: import('../../lib/main.js').Constructor<CanBeDisabled> & typeof CustomElement;
9
9
  export declare class OdxCard extends OdxCard_base {
10
+ interactive: boolean;
11
+ protected updated(_changedProperties: PropertyValues): void;
10
12
  protected render(): TemplateResult;
11
13
  }
12
14
  export {};
@@ -19,5 +19,6 @@ export declare class OdxSelect extends ListboxFormControl<OptionControl> {
19
19
  showDropdown(): void;
20
20
  hideDropdown(): void;
21
21
  protected render(): TemplateResult;
22
+ protected updated(props: PropertyValues<this>): void;
22
23
  }
23
24
  //# sourceMappingURL=select.d.ts.map
@@ -430,7 +430,7 @@ __decorateClass([
430
430
  ], _OdxAreaHeader.prototype, "size", 2);
431
431
  let OdxAreaHeader = _OdxAreaHeader;
432
432
 
433
- const styles$18 = ":host{--color-background: var(--odx-color-background-transparent-pressed);--color-foreground: inherit;--_border-radius: var(--odx-border-radius-circle);--_size: var(--odx-size-225);--_spacing: var(--odx-size-25);--_font-size: var(--odx-typography-font-size-3);display:flex;position:relative;flex:0 0 auto;flex-direction:column;place-content:center;place-items:center;transition:var(--odx-transition-default);transition-property:background-color,box-shadow;margin-block:var(--_spacing);border-radius:var(--_border-radius);background-color:var(--color-background);block-size:var(--_size);inline-size:var(--_size);overflow:clip;vertical-align:middle;color:var(--color-foreground);font-size:var(--_font-size);user-select:none}::slotted(img){position:absolute;inset:var(--odx-size-12);z-index:1;border-radius:var(--_border-radius);inline-size:calc(100% - var(--odx-size-25));pointer-events:none;object-fit:cover}::slotted(odx-icon){font-size:inherit}:host([shape=\"rectangle\"]){--_border-radius: var(--odx-border-radius-sm)}:host([variant=\"neutral\"]){--color-background: var(--odx-experience-color-secondary-rest)}:host([variant=\"primary\"]){--color-background: var(--odx-color-background-primary-rest);--color-foreground: var(--odx-color-foreground-inverse-static)}:host([size=\"sm\"]){--_size: var(--odx-size-150);--_spacing: 0;--_font-size: var(--odx-typography-font-size-1);::slotted(img){inset:var(--odx-size-px);inline-size:calc(100% - var(--odx-size-12))}}:host([size=\"lg\"]){--_size: var(--odx-size-300);--_spacing: 0;--_font-size: var(--odx-typography-font-size-5)}:host([size=\"xl\"]){--_size: var(--odx-size-400);--_spacing: 0;--_font-size: var(--odx-typography-font-size-7)}";
433
+ const styles$18 = ":host{--color-background: var(--odx-color-background-transparent-pressed);--color-foreground: inherit;--_border-radius: var(--odx-border-radius-circle);--_size: var(--odx-size-225);--_font-size: var(--odx-typography-font-size-3);display:flex;position:relative;flex:0 0 auto;flex-direction:column;place-content:center;place-items:center;transition:var(--odx-transition-default);transition-property:background-color,box-shadow;border-radius:var(--_border-radius);background-color:var(--color-background);block-size:var(--_size);inline-size:var(--_size);overflow:clip;vertical-align:middle;color:var(--color-foreground);font-size:var(--_font-size);user-select:none}::slotted(img){position:absolute;inset:var(--odx-size-12);z-index:1;border-radius:var(--_border-radius);inline-size:calc(100% - var(--odx-size-25));pointer-events:none;object-fit:cover}::slotted(odx-icon){font-size:inherit}:host([shape=\"rectangle\"]){--_border-radius: var(--odx-border-radius-sm)}:host([variant=\"neutral\"]){--color-background: var(--odx-experience-color-secondary-rest)}:host([variant=\"primary\"]){--color-background: var(--odx-color-background-primary-rest);--color-foreground: var(--odx-color-foreground-inverse-static)}:host([size=\"sm\"]){--_size: var(--odx-size-150);--_font-size: var(--odx-typography-font-size-1);::slotted(img){inset:var(--odx-size-px);inline-size:calc(100% - var(--odx-size-12))}}:host([size=\"lg\"]){--_size: var(--odx-size-300);--_font-size: var(--odx-typography-font-size-5)}:host([size=\"xl\"]){--_size: var(--odx-size-400);--_font-size: var(--odx-typography-font-size-7)}";
434
434
 
435
435
  const AvatarShape = pick(Shape, ["CIRCLE", "RECTANGLE"]);
436
436
  const AvatarSize = pick(Size, ["SM", "MD", "LG", "XL"]);
@@ -664,24 +664,42 @@ __decorateClass([
664
664
  ], _OdxButtonGroup.prototype, "variant", 2);
665
665
  let OdxButtonGroup = _OdxButtonGroup;
666
666
 
667
- const styles$12 = ":host{--_card-padding: var(--odx-size-150);display:grid;grid-template-areas:\"image image\" \"avatar avatar\" \"title header-actions\" \"content content\" \"footer footer\";grid-template-columns:1fr auto;place-content:flex-start;border-radius:var(--odx-border-radius-md);background-color:var(--odx-color-background-level-1);padding:var(--_card-padding);max-width:100%;overflow:clip}.header,.title{display:flex;place-items:center;margin-block-end:var(--odx-size-50);min-block-size:var(--odx-size-225);overflow:hidden}.title{grid-area:title}.header{grid-area:header-actions}.avatar{display:flex;grid-area:avatar;place-items:flex-end;margin-block-start:calc(-1 * var(--odx-size-50))}.image{position:relative;grid-area:image;margin:calc(-1 * var(--_card-padding));margin-block-end:var(--odx-size-150)}.image:after{position:absolute;inset:0;transition:var(--odx-transition-default);opacity:0;background-color:var(--odx-color-background-transparent-hover);content:\"\";pointer-events:none;backdrop-filter:blur(var(--odx-elevation-blur))}:host::part(content){grid-area:content}:host::part(footer){grid-area:footer}[part=image-container]+[part=avatar-container]{block-size:0}slot[name=image]::slotted(*){max-block-size:100%;max-inline-size:100%;pointer-events:none;object-fit:cover;aspect-ratio:16 / 9;user-select:none}slot[name=avatar]::slotted(*){margin:0}:host(:hover){cursor:pointer}:host(:hover) .image:after{opacity:1}";
667
+ const styles$12 = ":host{--_card-padding: var(--odx-size-150);display:grid;grid-template-areas:\"image image\" \"avatar avatar\" \"header header-actions\" \"content content\" \"footer footer\";grid-template-columns:1fr auto;place-content:flex-start;transition:var(--odx-transition-reduced);transition-property:box-shadow,transform,border-color;outline:var(--odx-focus-ring-outline);border:var(--odx-border-width-thin) solid transparent;border-radius:var(--odx-border-radius-md);background-color:var(--odx-color-background-level-1);padding:var(--_card-padding);max-width:100%;overflow:clip}.header,.header-actions{display:flex;gap:var(--odx-size-50);place-items:center;margin-block-end:var(--odx-size-50)}.header{grid-area:header}.header-actions{grid-area:header-actions}.avatar{display:flex;grid-area:avatar;place-items:flex-end;margin-block-start:calc(-1 * var(--odx-size-50))}.image{position:relative;grid-area:image;margin:calc(-1 * (var(--_card-padding) + var(--odx-border-width-thin)))}.image:after{position:absolute;inset:0;transition:var(--odx-transition-default);opacity:0;background-color:var(--odx-color-background-transparent-hover);content:\"\";pointer-events:none;backdrop-filter:blur(var(--odx-elevation-blur))}.content{display:inline-block;grid-area:content}.footer{grid-area:footer}.image+*{margin-block-start:var(--odx-size-250)}.image+.avatar{block-size:0}.avatar+*{margin-block-start:var(--odx-size-50)}slot[name=header]::slotted(odx-avatar){align-self:flex-start}slot[name=image]::slotted(*){max-block-size:100%;inline-size:100%;pointer-events:none;object-fit:cover;aspect-ratio:16 / 9;user-select:none}slot[name=avatar]::slotted(*){margin:0}:host([interactive]){border-color:var(--odx-color-stroke-neutral-subtle);cursor:pointer;user-select:none}:host([interactive]:hover:not(:active)){transform:translateY(calc(-1 * var(--odx-size-12)));border-color:transparent;box-shadow:var(--odx-shadow-level-1);.image:after{opacity:1}}:host([interactive]:active){transform:translateY(0)}:host(:focus-visible){outline-color:var(--odx-color-stroke-focus-outer)}";
668
668
 
669
- class OdxCard extends CanBeDisabled(CustomElement) {
669
+ const _OdxCard = class _OdxCard extends CanBeDisabled(CustomElement) {
670
+ constructor() {
671
+ super(...arguments);
672
+ this.interactive = false;
673
+ }
670
674
  static {
671
- customElement("odx-card", styles$12)(OdxCard);
675
+ customElement("odx-card", styles$12)(_OdxCard);
676
+ }
677
+ updated(_changedProperties) {
678
+ super.updated(_changedProperties);
679
+ if (this.disabled) return;
680
+ if (this.interactive) {
681
+ this.tabIndex = 0;
682
+ } else {
683
+ this.removeAttribute("tabindex");
684
+ }
672
685
  }
673
686
  render() {
674
687
  return html`
675
- ${optionalSlot(this, "header")}
688
+ ${optionalSlot(this, "header-actions")}
676
689
  ${optionalSlot(this, "image")}
677
690
  ${optionalSlot(this, "avatar")}
678
- ${optionalSlot(this, "title")}
679
- <div part="content">
691
+ ${optionalSlot(this, "header")}
692
+ <div class="content">
680
693
  <slot></slot>
681
694
  </div>
695
+ ${optionalSlot(this, "footer")}
682
696
  `;
683
697
  }
684
- }
698
+ };
699
+ __decorateClass([
700
+ property({ type: Boolean, reflect: true })
701
+ ], _OdxCard.prototype, "interactive", 2);
702
+ let OdxCard = _OdxCard;
685
703
 
686
704
  const styles$11 = ":host{--_indicator-space: var(--odx-size-12);--_indicator-size: calc(var(--odx-size-150) - var(--_indicator-space) * 2);--_indicator-color-background: var(--odx-color-background-control-rest);--_indicator-color-stroke: var(--odx-color-stroke-control-subtle);--_indicator-color-foreground: transparent;--_label-color-foreground: inherit;display:inline-flex;margin-block:var(--odx-size-37);border-radius:var(--odx-border-radius-controls);cursor:pointer;padding:var(--_indicator-space);user-select:none}:host,.indicator,.content{transition:var(--odx-transition-reduced)}.indicator{display:flex;flex-shrink:0;place-content:center;place-items:center;transition-property:background-color,border-color;outline:var(--odx-focus-ring-outline);outline-offset:var(--odx-focus-ring-offset);border:var(--odx-border-width-thin) solid var(--_indicator-color-stroke);border-radius:var(--odx-border-radius-controls);border-color:var(--_indicator-color-stroke);background-color:var(--_indicator-color-background);block-size:var(--_indicator-size);inline-size:var(--_indicator-size);color:var(--_indicator-color-foreground)}.label{display:inline-block}.content{transition-property:color;margin-block:calc(-1 * var(--_indicator-space));color:var(--_label-color-foreground)}:host(:not(:empty)) .indicator{margin-inline-end:var(--odx-size-75)}:host(:empty) .content{display:none}:host(:hover){--_indicator-color-stroke: var(--odx-color-stroke-control-hover);--_indicator-color-background: var(--odx-color-background-control-hover)}:host(:focus-visible) .indicator{outline-color:var(--odx-color-stroke-focus-outer)}:host(:is([checked],[indeterminate])){--_indicator-color-background: var(--odx-color-background-control-selected);--_indicator-color-foreground: var(--odx-color-foreground-inverse-static);--_indicator-color-stroke: var(--odx-color-stroke-control-selected)}:host(:is([checked],[indeterminate]):not(:is([readonly],[disabled])):hover){--_indicator-color-background: var(--odx-color-background-control-selected-hover)}:host([disabled]:not([readonly])){--_indicator-color-background: var(--odx-color-background-disabled-rest);--_indicator-color-stroke: var(--odx-color-background-disabled-rest);--_label-color-foreground: var(--odx-color-foreground-disabled-rest);cursor:not-allowed}:host([disabled]:not([readonly]):is([checked],[indeterminate])){--_indicator-color-background: var(--odx-color-background-disabled-selected);--_indicator-color-foreground: var(--odx-color-foreground-disabled-selected);--_indicator-color-stroke: var(--_indicator-color-background)}:host([readonly]){--_indicator-color-background: var(--odx-color-background-control-readonly);--_indicator-color-stroke: var(--odx-color-stroke-control-readonly);cursor:default}:host([readonly][checked]){--_indicator-color-foreground: var(--odx-color-foreground-rest)}";
687
705
 
@@ -1144,7 +1162,7 @@ const _OdxDropdown = class _OdxDropdown extends PopoverHost {
1144
1162
  }
1145
1163
  mountPopover(referenceElement) {
1146
1164
  super.mountPopover(referenceElement);
1147
- if (this.disabled || !referenceElement) return;
1165
+ if (!referenceElement) return;
1148
1166
  this.#updateAriaAttributes(referenceElement, this.id);
1149
1167
  referenceElement.addEventListener("click", this.#handleClick);
1150
1168
  referenceElement.addEventListener("keydown", this.#handleKeyboardEvent);
@@ -2745,7 +2763,7 @@ __decorateClass([
2745
2763
  ], _OdxNavigationItem.prototype, "selected", 2);
2746
2764
  let OdxNavigationItem = _OdxNavigationItem;
2747
2765
 
2748
- const styles$y = ":host{--_color-background: var(--odx-color-background-transparent);--_color-foreground: inherit;display:inline-flex;gap:var(--odx-size-75);place-items:center;transition:var(--odx-transition-reduced);transition-property:background-color,color;border-radius:var(--odx-border-radius-controls);background-color:var(--_color-background);cursor:pointer;padding:var(--odx-size-37) var(--odx-size-75);color:var(--_color-foreground);user-select:none}odx-checkbox{margin:0}.label{margin-inline-end:auto}:host(:hover){--_color-background: var(--odx-color-background-transparent-hover)}:host([odx-active]),:host(:active){--_color-background: var(--odx-color-background-transparent-pressed)}:host([selected]){--_color-background: var(--odx-color-background-transparent-selected)}:host([selected]:hover){--_color-background: var(--odx-color-background-transparent-selected-hover)}:host([disabled]){--_color-background: var(--odx-color-background-disabled-rest);--_color-foreground: var(--odx-color-foreground-disabled-rest);cursor:not-allowed;pointer-events:none}:host([selected][disabled]){--_color-background: var(--odx-color-background-disabled-selected);--_color-foreground: var(--odx-color-foreground-disabled-selected)}:host([selected][odx-active]),:host([selected]:active){--_color-background: var(--odx-color-background-transparent-selected-hover)}";
2766
+ const styles$y = ":host{--_color-background: var(--odx-color-background-transparent-rest);--_color-foreground: inherit;display:inline-flex;gap:var(--odx-size-75);place-items:center;transition:var(--odx-transition-reduced);transition-property:background-color,color;border-radius:var(--odx-border-radius-controls);background-color:var(--_color-background);cursor:pointer;padding:var(--odx-size-37) var(--odx-size-75);color:var(--_color-foreground);user-select:none}odx-checkbox{margin:0}.label{margin-inline-end:auto}:host(:hover:not([readonly])){--_color-background: var(--odx-color-background-transparent-hover)}:host([odx-active]:not([readonly])),:host(:active:not([readonly])){--_color-background: var(--odx-color-background-transparent-pressed)}:host([selected]){--_color-background: var(--odx-color-background-transparent-selected)}:host([selected]:hover:not([readonly])){--_color-background: var(--odx-color-background-transparent-selected-hover)}:host([disabled]){--_color-background: var(--odx-color-background-disabled-rest);--_color-foreground: var(--odx-color-foreground-disabled-rest);cursor:not-allowed;pointer-events:none}:host([readonly]){cursor:default}:host([selected][disabled]){--_color-background: var(--odx-color-background-disabled-selected);--_color-foreground: var(--odx-color-foreground-disabled-selected)}:host([selected][odx-active]:not([readonly])),:host([selected]:active:not([readonly])){--_color-background: var(--odx-color-background-transparent-selected-hover)}";
2749
2767
 
2750
2768
  class OdxOption extends OptionControl {
2751
2769
  static {
@@ -3226,7 +3244,7 @@ __decorateClass([
3226
3244
  ], _OdxSearchBar.prototype, "readonly", 2);
3227
3245
  let OdxSearchBar = _OdxSearchBar;
3228
3246
 
3229
- const styles$o = "@layer base{:host{--_color-background: var(--odx-color-background-control-rest);--_color-foreground: var(--odx-color-foreground-rest);--_color-stroke: var(--odx-color-stroke-control-rest);--_control-size: var(--odx-size-225);--_padding-block: var(--odx-size-37);--_padding-inline: var(--odx-size-50);display:block;border-radius:var(--odx-border-radius-controls);cursor:pointer;max-inline-size:320px;overflow:hidden;color:var(--_color-foreground)}.base{display:flex;gap:var(--_padding-block);align-items:center;transition:var(--odx-transition-reduced);transition-property:background-color,border-color;border:var(--odx-border-width-thin) solid transparent;border-bottom-color:var(--_color-stroke);background-color:var(--_color-background);padding-inline:var(--_padding-inline);block-size:var(--_control-size);min-width:200px;overflow:hidden;text-align:start;user-select:none;&:focus-visible{outline:var(--odx-focus-ring-outline);outline-color:var(--odx-color-stroke-focus-outer)}}.value{margin-inline-end:auto;font-weight:var(--odx-typography-font-weight-medium)}.indicator{font-size:var(--odx-typography-font-size-6)}[part~=dropdown]{--max-block-size: 320px}odx-chip{--_border-radius: var(--odx-border-radius-controls)}slot[name=placeholder]{color:var(--odx-color-foreground-rest-subtle);font-weight:var(--odx-typography-font-weight-normal)}}@layer state{:host(:hover){--_color-background: var(--odx-color-background-control-hover);--_color-stroke: var(--odx-color-stroke-control-hover)}:host([multiple]):has(odx-chip) .base{padding-inline-start:var(--_padding-block)}:host([disabled]:not([readonly])){--_color-foreground: var(--odx-color-foreground-disabled-rest);--_color-background: var(--odx-color-background-disabled-rest);--_color-stroke: var(--odx-color-stroke-disabled-rest);cursor:not-allowed;slot[name=placeholder]{color:var(---_color-foreground)}}:host([readonly]){--_color-background: var(--odx-color-background-control-readonly);--_color-stroke: var(--odx-color-stroke-control-readonly);cursor:default;odx-chip{--_color-background: var(--odx-color-foreground-disabled-rest)}.indicator{color:var(--odx-color-foreground-rest-subtle)}}}";
3247
+ const styles$o = "@layer base{:host{--_color-background: var(--odx-color-background-control-rest);--_color-foreground: var(--odx-color-foreground-rest);--_color-stroke: var(--odx-color-stroke-control-rest);--_control-size: var(--odx-size-225);--_padding-block: var(--odx-size-37);--_padding-inline: var(--odx-size-50);display:block;border-radius:var(--odx-border-radius-controls);cursor:pointer;inline-size:100%;max-inline-size:320px;overflow:hidden;color:var(--_color-foreground)}.base{display:flex;gap:var(--_padding-block);align-items:center;transition:var(--odx-transition-reduced);transition-property:background-color,border-color;border:var(--odx-border-width-thin) solid transparent;border-bottom-color:var(--_color-stroke);background-color:var(--_color-background);padding-inline:var(--_padding-inline);block-size:var(--_control-size);min-width:200px;overflow:hidden;text-align:start;user-select:none;&:focus-visible{outline:var(--odx-focus-ring-outline);outline-color:var(--odx-color-stroke-focus-outer)}}.value{margin-inline-end:auto;font-weight:var(--odx-typography-font-weight-medium)}.indicator{font-size:var(--odx-typography-font-size-6)}[part~=dropdown]{--max-block-size: 320px}odx-chip{--_border-radius: var(--odx-border-radius-controls)}slot[name=placeholder]{color:var(--odx-color-foreground-rest-subtle);font-weight:var(--odx-typography-font-weight-normal)}}@layer state{:host(:hover){--_color-background: var(--odx-color-background-control-hover);--_color-stroke: var(--odx-color-stroke-control-hover)}:host([multiple]):has(odx-chip) .base{padding-inline-start:var(--_padding-block)}:host([disabled]:not([readonly])){--_color-foreground: var(--odx-color-foreground-disabled-rest);--_color-background: var(--odx-color-background-disabled-rest);--_color-stroke: var(--odx-color-stroke-disabled-rest);cursor:not-allowed;slot[name=placeholder]{color:var(---_color-foreground)}}:host([readonly]){--_color-background: var(--odx-color-background-control-readonly);--_color-stroke: var(--odx-color-stroke-control-readonly);cursor:default;odx-chip{--_color-background: var(--odx-color-foreground-disabled-rest)}.indicator{color:var(--odx-color-foreground-rest-subtle)}}}";
3230
3248
 
3231
3249
  const _OdxSelect = class _OdxSelect extends ListboxFormControl {
3232
3250
  constructor() {
@@ -3234,14 +3252,15 @@ const _OdxSelect = class _OdxSelect extends ListboxFormControl {
3234
3252
  this.maxVisibleSelectedOptions = 2;
3235
3253
  this.#handleSlotChange = () => {
3236
3254
  super.handleSlotChange();
3237
- for (const option of this.options) {
3255
+ this.updateOptions((option) => {
3238
3256
  option.type = this.multiple ? "checkbox" : null;
3239
- }
3257
+ });
3240
3258
  };
3241
3259
  this.#handleBlur = () => {
3242
3260
  this.hideDropdown();
3243
3261
  };
3244
3262
  this.#handleToggleAll = (event) => {
3263
+ if (this.disabled || this.readonly) return;
3245
3264
  event.stopPropagation();
3246
3265
  event.preventDefault();
3247
3266
  this.value = this.value.length === this.options.length ? [] : this.options.map((option) => option.value);
@@ -3283,6 +3302,7 @@ const _OdxSelect = class _OdxSelect extends ListboxFormControl {
3283
3302
  }
3284
3303
  render() {
3285
3304
  const allSelected = this.value.length === this.options.length;
3305
+ const dropdownDisabled = this.disabled || this.readonly && this.selectedOptions.length === 0;
3286
3306
  return html`
3287
3307
  <div class="base" tabindex="0" aria-haspopup="listbox">
3288
3308
  <div class="value" odxPreventTextOverflow>
@@ -3298,17 +3318,25 @@ const _OdxSelect = class _OdxSelect extends ListboxFormControl {
3298
3318
  )}
3299
3319
  <odx-icon class="indicator" name="core::chevron-down"></odx-icon>
3300
3320
  </div>
3301
- <odx-dropdown part="dropdown" role="listbox" tabindex="-1" ?disabled=${this.disabled || this.readonly} match-reference-width>
3321
+ <odx-dropdown part="dropdown" role="listbox" ?disabled=${dropdownDisabled} match-reference-width>
3302
3322
  ${when(
3303
- this.multiple,
3323
+ !dropdownDisabled && this.multiple,
3304
3324
  () => html`
3305
- <odx-option type="checkbox" @click=${this.#handleToggleAll} ?selected=${allSelected} aria-hidden="true">Toggle all</odx-option>
3325
+ <odx-option type="checkbox" @click=${this.#handleToggleAll} ?readonly=${this.readonly} ?selected=${allSelected} aria-hidden="true">Toggle all</odx-option>
3306
3326
  `
3307
3327
  )}
3308
3328
  <slot @slotchange=${this.#handleSlotChange}></slot>
3309
3329
  </odx-dropdown>
3310
3330
  `;
3311
3331
  }
3332
+ updated(props) {
3333
+ super.updated(props);
3334
+ if (props.has("readonly")) {
3335
+ this.updateOptions((option) => {
3336
+ option.readonly = this.readonly;
3337
+ });
3338
+ }
3339
+ }
3312
3340
  #isClearable() {
3313
3341
  return !(this.disabled || this.readonly || this.required) && this.selectedOptions.length > 0;
3314
3342
  }
@@ -20,6 +20,6 @@ export declare abstract class ListboxFormControl<Option extends OptionControl> e
20
20
  protected handleSlotChange(): void;
21
21
  protected updateValue(option?: Option): void;
22
22
  protected willUpdate(props: PropertyValues<this>): void;
23
- protected updateSelection(): void;
23
+ protected updateOptions(updateFn: (option: Option) => void): void;
24
24
  }
25
25
  //# sourceMappingURL=listbox-form-control.d.ts.map
@@ -10,6 +10,7 @@ export declare abstract class OptionControl extends OptionControl_base implement
10
10
  get label(): string;
11
11
  value: string;
12
12
  selected: boolean;
13
+ readonly: boolean;
13
14
  type?: 'checkbox' | null;
14
15
  canActivate(): boolean;
15
16
  canSelect(): boolean;
package/dist/main.js CHANGED
@@ -467,6 +467,7 @@ class OptionControl extends CanBeDisabled(CustomElement) {
467
467
  this.role = null;
468
468
  this.value = "";
469
469
  this.selected = false;
470
+ this.readonly = false;
470
471
  }
471
472
  #label;
472
473
  set label(value) {
@@ -479,7 +480,7 @@ class OptionControl extends CanBeDisabled(CustomElement) {
479
480
  return !(this.disabled || this.hidden);
480
481
  }
481
482
  canSelect() {
482
- return this.canActivate();
483
+ return this.canActivate() && !this.readonly;
483
484
  }
484
485
  isActive() {
485
486
  return this.hasAttribute("odx-active") && !this.canActivate();
@@ -512,6 +513,9 @@ __decorateClass([
512
513
  __decorateClass([
513
514
  property({ type: Boolean, reflect: true, useDefault: true })
514
515
  ], OptionControl.prototype, "selected", 2);
516
+ __decorateClass([
517
+ property({ type: Boolean, reflect: true, useDefault: true })
518
+ ], OptionControl.prototype, "readonly", 2);
515
519
  __decorateClass([
516
520
  property()
517
521
  ], OptionControl.prototype, "type", 2);
@@ -612,7 +616,10 @@ class ListboxFormControl extends FormControl {
612
616
  willUpdate(props) {
613
617
  super.willUpdate(props);
614
618
  if (props.has("value")) {
615
- this.updateSelection();
619
+ this.updateOptions((option) => {
620
+ if (!option.canSelect()) return;
621
+ option.selected = this.multiple ? this.value.includes(option.value) : this.value === option.value;
622
+ });
616
623
  }
617
624
  if (props.has("multiple")) {
618
625
  this.#handleMultipleChange();
@@ -622,11 +629,9 @@ class ListboxFormControl extends FormControl {
622
629
  this.setValidity({ valueMissing: this.required && this.value.length === 0 }, this.selectedOptions[0]);
623
630
  }
624
631
  }
625
- updateSelection() {
626
- if (this.disabled || this.options.length === 0) return;
632
+ updateOptions(updateFn) {
627
633
  for (const option of this.options ?? []) {
628
- if (option.disabled) continue;
629
- option.selected = this.multiple ? this.value.includes(option.value) : this.value === option.value;
634
+ updateFn(option);
630
635
  }
631
636
  }
632
637
  #handleOptionSelection(option) {
@@ -635,9 +640,9 @@ class ListboxFormControl extends FormControl {
635
640
  }
636
641
  #handleMultipleChange() {
637
642
  const optionType = this.multiple ? "checkbox" : null;
638
- for (const option of this.options) {
643
+ this.updateOptions((option) => {
639
644
  option.type = optionType;
640
- }
645
+ });
641
646
  if (!this.multiple && this.selectedOptions[0]) {
642
647
  this.updateValue(this.selectedOptions[0]);
643
648
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@odx/foundation",
3
3
  "description": "A library of Web Component building blocks for ODX",
4
- "version": "1.0.0-beta.90",
4
+ "version": "1.0.0-beta.91",
5
5
  "author": "Drägerwerk AG & Co.KGaA",
6
6
  "license": "SEE LICENSE IN LICENSE",
7
7
  "homepage": "https://odx.draeger.com",