@odx/foundation 1.0.0-beta.0 → 1.0.0-beta.2

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.
package/dist/cdk.js CHANGED
@@ -245,12 +245,12 @@ const PopoverHost = dedupeMixin((superClass) => {
245
245
  return PopoverPlacementOptions({ placement: this.placement ?? PopoverPlacement.BOTTOM });
246
246
  }
247
247
  connectedCallback() {
248
- super.connectedCallback?.();
248
+ super.connectedCallback();
249
249
  this.popover ??= "auto";
250
250
  this.#connectObserver();
251
251
  }
252
252
  disconnectedCallback() {
253
- super.disconnectedCallback?.();
253
+ super.disconnectedCallback();
254
254
  this.#disconnectObserver();
255
255
  }
256
256
  mountPopover(referenceElement) {
@@ -9,6 +9,7 @@ declare global {
9
9
  declare const OdxAccordionHeader_base: import('../../lib/main.js').Constructor<CanBeExpanded> & typeof CustomElement;
10
10
  export declare class OdxAccordionHeader extends OdxAccordionHeader_base {
11
11
  #private;
12
+ static shadowRootOptions: ShadowRootInit;
12
13
  get panel(): OdxAccordionPanel | null;
13
14
  connectedCallback(): void;
14
15
  protected render(): TemplateResult;
@@ -1,17 +1,15 @@
1
- import { CanBeDisabled, CustomElement } from '../../lib/main.js';
1
+ import { CustomElement } from '../../lib/main.js';
2
2
  import { PropertyValues } from 'lit';
3
3
  declare global {
4
4
  interface HTMLElementTagNameMap {
5
5
  'odx-accordion': OdxAccordion;
6
6
  }
7
7
  }
8
- declare const OdxAccordion_base: import('../../lib/main.js').Constructor<CanBeDisabled> & typeof CustomElement;
9
- export declare class OdxAccordion extends OdxAccordion_base {
8
+ export declare class OdxAccordion extends CustomElement {
10
9
  #private;
11
10
  private controls;
12
11
  multiple: boolean;
13
12
  constructor();
14
13
  protected updated(props: PropertyValues): void;
15
14
  }
16
- export {};
17
15
  //# sourceMappingURL=accordion.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { CustomElement } from '../../lib/main.js';
2
- import { TemplateResult } from 'lit';
2
+ import { PropertyValues } from 'lit';
3
3
  import { AvatarSize, AvatarVariant, OdxAvatar } from '../avatar/index.js';
4
4
  declare global {
5
5
  interface HTMLElementTagNameMap {
@@ -7,8 +7,9 @@ declare global {
7
7
  }
8
8
  }
9
9
  export declare class OdxAvatarGroup extends CustomElement implements Pick<OdxAvatar, 'size' | 'variant'> {
10
+ avatars: OdxAvatar[];
10
11
  size?: AvatarSize;
11
12
  variant?: AvatarVariant;
12
- protected render(): TemplateResult;
13
+ protected updated(props: PropertyValues<this>): void;
13
14
  }
14
15
  //# sourceMappingURL=avatar-group.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { CanBeDisabled, CustomElement } from '../../lib/main.js';
2
2
  import { PropertyValues } from 'lit';
3
- import { ButtonSize, ButtonVariant } from '../button/index.js';
3
+ import { ButtonSize, ButtonVariant, OdxButton } from '../button/index.js';
4
4
  declare global {
5
5
  interface HTMLElementTagNameMap {
6
6
  'odx-button-group': OdxButtonGroup;
@@ -8,13 +8,13 @@ declare global {
8
8
  }
9
9
  declare const OdxButtonGroup_base: import('../../lib/main.js').Constructor<CanBeDisabled> & typeof CustomElement;
10
10
  export declare class OdxButtonGroup extends OdxButtonGroup_base {
11
- private buttons;
12
- private allButtons;
11
+ protected buttons: OdxButton[];
12
+ constructor();
13
13
  block: boolean;
14
14
  connected: boolean;
15
15
  vertical: boolean;
16
- size?: ButtonSize | null;
17
- variant?: ButtonVariant | null;
16
+ size?: ButtonSize;
17
+ variant?: ButtonVariant;
18
18
  protected updated(props: PropertyValues<this>): void;
19
19
  }
20
20
  export {};
@@ -9,8 +9,10 @@ declare global {
9
9
  declare const OdxListItem_base: import('../../lib/main.js').Constructor<CanBeSelected> & import('../../lib/main.js').Constructor<CanBeExpanded> & typeof BaseButton;
10
10
  export declare class OdxListItem extends OdxListItem_base {
11
11
  #private;
12
+ compact: boolean;
12
13
  muted: boolean;
13
14
  withControl: boolean;
15
+ withExpandedIndicator: boolean;
14
16
  constructor();
15
17
  isExpandable(): boolean;
16
18
  connectedCallback(): void;
@@ -5,7 +5,6 @@ declare global {
5
5
  }
6
6
  }
7
7
  export declare class OdxList extends CustomElement {
8
- compact: boolean;
9
8
  connectedCallback(): void;
10
9
  }
11
10
  //# sourceMappingURL=list.d.ts.map
@@ -1,18 +1,19 @@
1
- import { CustomElement } from '../../lib/main.js';
1
+ import { CanBeDisabled, CustomElement } from '../../lib/main.js';
2
2
  import { TemplateResult } from 'lit';
3
3
  declare global {
4
4
  interface HTMLElementTagNameMap {
5
5
  'odx-table-checkbox-cell': OdxTableCheckboxCell;
6
6
  }
7
7
  }
8
- export declare class OdxTableCheckboxCell extends CustomElement {
8
+ declare const OdxTableCheckboxCell_base: import('../../lib/main.js').Constructor<CanBeDisabled> & typeof CustomElement;
9
+ export declare class OdxTableCheckboxCell extends OdxTableCheckboxCell_base {
9
10
  #private;
10
11
  private control;
11
12
  checked: boolean;
12
- disabled: boolean;
13
13
  indeterminate: boolean;
14
14
  connectedCallback(): void;
15
15
  click(): void;
16
16
  protected render(): TemplateResult;
17
17
  }
18
+ export {};
18
19
  //# sourceMappingURL=table-checkbox-cell.d.ts.map
@@ -1,14 +1,14 @@
1
- import { CustomElement } from '../../lib/main.js';
1
+ import { CanBeDisabled, CustomElement } from '../../lib/main.js';
2
2
  import { PropertyValues, TemplateResult } from 'lit';
3
3
  declare global {
4
4
  interface HTMLElementTagNameMap {
5
5
  'odx-table-row': OdxTableRow;
6
6
  }
7
7
  }
8
- export declare class OdxTableRow extends CustomElement {
8
+ declare const OdxTableRow_base: import('../../lib/main.js').Constructor<CanBeDisabled> & typeof CustomElement;
9
+ export declare class OdxTableRow extends OdxTableRow_base {
9
10
  #private;
10
11
  private checkboxCells;
11
- disabled: boolean;
12
12
  selected: boolean;
13
13
  selectable: boolean;
14
14
  value: string;
@@ -16,4 +16,5 @@ export declare class OdxTableRow extends CustomElement {
16
16
  protected render(): TemplateResult;
17
17
  protected willUpdate(changes: PropertyValues<this>): void;
18
18
  }
19
+ export {};
19
20
  //# sourceMappingURL=table-row.d.ts.map
@@ -1,4 +1,4 @@
1
- import { CanBeExpanded, CustomElement, getUniqueId, toAriaBooleanAttribute, customElement, CanBeDisabled, getKeyboardEventInfo, SharedResizeObserver, optionalAttr, requestUpdateOnAriaChange, createIntersectionObserver, createMutationObserver, getElementFromEvent, WithLoadingState, getAssignedElements, optionalSlot, CheckboxGroupFormControl, CheckboxFormControl, toggleAttribute, parseDate, searchTextContent, waitForAnimations, FormControl, forwardEvent, CanBeSelected, FocusTrapController, OptionControl, toPx, RadioGroupFormControl, SelectFormControl, emptySlotFallbackFix, NumberControl } from '@odx/foundation';
1
+ import { CanBeExpanded, CustomElement, getUniqueId, toAriaBooleanAttribute, customElement, requestUpdateOnAriaChange, fromAriaBooleanAttribute, getKeyboardEventInfo, CanBeDisabled, SharedResizeObserver, optionalAttr, createIntersectionObserver, createMutationObserver, getElementFromEvent, DisabledContextProvider, WithLoadingState, getAssignedElements, optionalSlot, CheckboxGroupFormControl, CheckboxFormControl, toggleAttribute, parseDate, searchTextContent, waitForAnimations, FormControl, forwardEvent, CanBeSelected, FocusTrapController, OptionControl, toPx, RadioGroupFormControl, SelectFormControl, emptySlotFallbackFix, NumberControl } from '@odx/foundation';
2
2
  import { html, isServer, unsafeCSS, nothing, css } from 'lit';
3
3
  import { queryAssignedElements, property, query, queryAll, state } from 'lit/decorators.js';
4
4
  import { signal, computed, effect, SignalWatcher } from '@lit-labs/preact-signals';
@@ -12,7 +12,7 @@ import { g as clamp, R as RovingTabindexController, r as round, i as debounce, m
12
12
  import { styleMap } from 'lit/directives/style-map.js';
13
13
  import { createContext, consume, provide } from '@lit/context';
14
14
 
15
- const styles$1b = ":host{--_color-background: var(--odx-palette-transparent);--_color-foreground: var(--odx-color-foreground-base);display:flex;user-select:none;place-items:center;cursor:pointer;gap:var(--odx-size-50);min-block-size:var(--odx-size-225);border-radius:var(--odx-border-radius-controls);background-color:var(--_color-background);margin-block:var(--odx-size-37);padding-block:var(--odx-size-25);padding-inline:var(--odx-size-50);color:var(--_color-foreground);transition:var(--odx-transition-default);transition-property:background-color,color,outline-color;outline:var(--odx-focus-ring-outline)}.indicator{--size: var(--odx-size-150);display:block;margin-inline-start:auto;aspect-ratio:1;transition:var(--odx-transition-slow);transition-property:transform}:host(:not([aria-disabled=\"true\"]):hover){--_color-background: var(--odx-color-transparent-hover)}:host(:not([aria-disabled=\"true\"]):active){--_color-background: var(--odx-color-transparent-pressed)}:host([aria-disabled=\"true\"]){--_color-foreground: var(--odx-color-disabled-foreground);cursor:default}:host([aria-expanded=\"true\"]){.indicator{transform:rotateX(180deg)}}:host(:focus-visible){outline-color:var(--odx-focus-ring-color)}";
15
+ const styles$1b = ":host{display:block}";
16
16
 
17
17
  var __defProp$1m = Object.defineProperty;
18
18
  var __getOwnPropDesc$1m = Object.getOwnPropertyDescriptor;
@@ -41,24 +41,24 @@ let OdxAccordionHeader = class extends CanBeExpanded(CustomElement) {
41
41
  }
42
42
  connectedCallback() {
43
43
  this.tabIndex = 0;
44
- super.connectedCallback?.();
44
+ super.connectedCallback();
45
45
  this.id ||= getUniqueId(this.localName);
46
46
  this.role ||= "button";
47
47
  }
48
48
  render() {
49
49
  return html`
50
- <div class="label">
51
- <odx-text ?emphasized=${this.expanded}>
50
+ <odx-list-item role="presentation" part="base" compact ?disabled=${this.disabled} with-expanded-indicator>
51
+ <slot name="prefix" slot="prefix"></slot>
52
+ <odx-text class="content" ?emphasized=${this.expanded}>
52
53
  <slot></slot>
53
54
  </odx-text>
54
- <slot name="suffix"></slot>
55
- </div>
56
- <odx-icon class="indicator" name="core::chevron-down" aria-hidden="true"></odx-icon>
55
+ <slot name="suffix" slot="suffix"></slot>
56
+ </odx-list-item>
57
57
  `;
58
58
  }
59
59
  willUpdate(props) {
60
60
  super.willUpdate?.(props);
61
- if (props.has("_contextDisabled") || props.has("disabled") || props.has("expanded")) {
61
+ if (props.has("disabled") || props.has("expanded")) {
62
62
  __privateMethod$h(this, _OdxAccordionHeader_instances, handleExpandedChange_fn).call(this);
63
63
  }
64
64
  }
@@ -68,14 +68,18 @@ handleExpandedChange_fn = function() {
68
68
  if (!this.panel) return;
69
69
  this.ariaExpanded = toAriaBooleanAttribute(this.expanded);
70
70
  this.setAttribute("aria-controls", this.panel.id);
71
- this.panel.ariaHidden = toAriaBooleanAttribute(this.isContextDisabled() || !this.expanded);
71
+ this.panel.ariaHidden = toAriaBooleanAttribute(this.disabled || !this.expanded);
72
72
  this.panel.setAttribute("aria-labelledby", this.id);
73
73
  };
74
+ OdxAccordionHeader.shadowRootOptions = {
75
+ ...CustomElement.shadowRootOptions,
76
+ delegatesFocus: true
77
+ };
74
78
  OdxAccordionHeader = __decorateClass$1m([
75
79
  customElement("odx-accordion-header", [styles$1b])
76
80
  ], OdxAccordionHeader);
77
81
 
78
- const styles$1a = ":host{display:grid;grid-template-rows:1fr;transition:var(--odx-transition-slow)}odx-separator{margin:0}.container{overflow:hidden}.content{padding:var(--odx-size-50);padding-block-start:var(--odx-size-12);transition:var(--odx-transition-slow);transition-property:opacity,transform,visibility}:host(:last-of-type) odx-separator{display:none}:host([aria-hidden=\"true\"]){grid-template-rows:0fr;.content{opacity:0;transform:translateY(var(--odx-size-25));visibility:hidden}}:host ::slotted(*){display:block;background-color:transparent}";
82
+ const styles$1a = "@layer base{:host{display:block}odx-separator{margin:0}.content{padding:var(--odx-size-50);padding-block-start:var(--odx-size-12)}:host(:last-of-type) odx-separator{display:none}::slotted(odx-accordion){margin-block:calc(-1 * var(--odx-size-37));margin-inline-end:calc(-1 * var(--odx-size-50))}}";
79
83
 
80
84
  var __defProp$1l = Object.defineProperty;
81
85
  var __getOwnPropDesc$1l = Object.getOwnPropertyDescriptor;
@@ -89,26 +93,27 @@ var __decorateClass$1l = (decorators, target, key, kind) => {
89
93
  };
90
94
  let OdxAccordionPanel = class extends CustomElement {
91
95
  connectedCallback() {
92
- super.connectedCallback?.();
96
+ super.connectedCallback();
93
97
  this.id ||= getUniqueId(this.localName);
94
98
  this.role ||= "region";
95
99
  }
96
100
  render() {
97
101
  return html`
98
- <div class="container">
102
+ <odx-toggle-content ?expanded=${!fromAriaBooleanAttribute(this.ariaHidden)}>
99
103
  <div class="content">
100
104
  <slot></slot>
101
105
  </div>
102
- </div>
106
+ </odx-toggle-content>
103
107
  <odx-separator></odx-separator>
104
108
  `;
105
109
  }
106
110
  };
107
111
  OdxAccordionPanel = __decorateClass$1l([
112
+ requestUpdateOnAriaChange(["ariaHidden"]),
108
113
  customElement("odx-accordion-panel", [styles$1a])
109
114
  ], OdxAccordionPanel);
110
115
 
111
- const styles$19 = ":host{display:block}:host-context(odx-accordion-panel){margin-block:calc(-1 * var(--odx-size-37));margin-inline-end:calc(-1 * var(--odx-size-50))}";
116
+ const styles$19 = ":host{display:block}";
112
117
 
113
118
  var __defProp$1k = Object.defineProperty;
114
119
  var __getOwnPropDesc$1k = Object.getOwnPropertyDescriptor;
@@ -127,7 +132,7 @@ var __accessCheck$v = (obj, member, msg) => member.has(obj) || __typeError$v("Ca
127
132
  var __privateGet$q = (obj, member, getter) => (__accessCheck$v(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
128
133
  var __privateAdd$v = (obj, member, value) => member.has(obj) ? __typeError$v("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
129
134
  var _handleClick$7, _handleExpand, _handleCollapse, _handleKeyDownEvent;
130
- let OdxAccordion = class extends CanBeDisabled(CustomElement) {
135
+ let OdxAccordion = class extends CustomElement {
131
136
  constructor() {
132
137
  super();
133
138
  this.multiple = false;
@@ -166,11 +171,6 @@ let OdxAccordion = class extends CanBeDisabled(CustomElement) {
166
171
  }
167
172
  updated(props) {
168
173
  super.updated(props);
169
- if (props.has("disabled")) {
170
- for (const control of this.controls) {
171
- control._contextDisabled = this.disabled;
172
- }
173
- }
174
174
  if (props.has("multiple") && !this.multiple) {
175
175
  const firstExpandedControl = this.controls.find((control) => control.expanded);
176
176
  for (const control of this.controls) {
@@ -233,7 +233,7 @@ let OdxActionGroup = class extends CanBeDisabled(CustomElement) {
233
233
  });
234
234
  }
235
235
  connectedCallback() {
236
- super.connectedCallback?.();
236
+ super.connectedCallback();
237
237
  SharedResizeObserver.observe(
238
238
  this,
239
239
  () => {
@@ -583,7 +583,7 @@ const AreaHeaderVariant = {
583
583
  DEFAULT: "default"
584
584
  };
585
585
 
586
- const styles$14 = ":host{display:flex;padding-inline:var(--odx-size-25);width:min-content}::slotted(odx-avatar){flex:0 0 auto;z-index:1;border:var(--odx-border-width-thin) solid var(--odx-color-separator)}::slotted(odx-avatar:not(:first-of-type)){margin-inline-start:calc(-.33 * var(--_size))}:host(:is([size=\"lg\"],[size=\"xl\"])){gap:var(--odx-size-50)}";
586
+ const styles$14 = "@layer base{:host{--_size: var(--odx-size-225);--_spacing: var(--odx-size-25);--_font-size: var(--odx-typography-font-size-3)}:host{--_color-background: var(--odx-experience-color-secondary-rest);--_color-foreground: inherit;--_border-radius: 50%;display:flex;flex-direction:column;place-content:center;place-items:center;position:relative;user-select:none;vertical-align:middle;overflow:clip;flex:0 0 auto;block-size:var(--_size);inline-size:var(--_size);margin-block:var(--_spacing);font-size:var(--_font-size);border-radius:var(--_border-radius);background-color:var(--_color-background);color:var(--_color-foreground);transition:var(--odx-transition-default);transition-property:background-color,outline-color,box-shadow}:host([variant=\"rectangle\"]){--_border-radius: var(--odx-border-radius-sm)}:host([size=\"sm\"]){--_size: var(--odx-size-150);--_spacing: 0;--_font-size: var(--odx-typography-font-size-1)}:host([size=\"lg\"]){--_size: var(--odx-size-300);--_spacing: var(--odx-size-37);--_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)}::slotted(img){object-fit:cover;position:absolute;inset:0;z-index:1;pointer-events:none}::slotted(odx-icon){font-size:inherit}}";
587
587
 
588
588
  var __defProp$1e = Object.defineProperty;
589
589
  var __getOwnPropDesc$1e = Object.getOwnPropertyDescriptor;
@@ -595,22 +595,33 @@ var __decorateClass$1e = (decorators, target, key, kind) => {
595
595
  if (kind && result) __defProp$1e(target, key, result);
596
596
  return result;
597
597
  };
598
- let OdxAvatarGroup = class extends CustomElement {
598
+ let OdxAvatar = class extends CustomElement {
599
599
  render() {
600
600
  return html`<slot></slot>`;
601
601
  }
602
602
  };
603
603
  __decorateClass$1e([
604
604
  property({ reflect: true })
605
- ], OdxAvatarGroup.prototype, "size", 2);
605
+ ], OdxAvatar.prototype, "size", 2);
606
606
  __decorateClass$1e([
607
607
  property({ reflect: true })
608
- ], OdxAvatarGroup.prototype, "variant", 2);
609
- OdxAvatarGroup = __decorateClass$1e([
610
- customElement("odx-avatar-group", [styles$14])
611
- ], OdxAvatarGroup);
608
+ ], OdxAvatar.prototype, "variant", 2);
609
+ OdxAvatar = __decorateClass$1e([
610
+ customElement("odx-avatar", [styles$14])
611
+ ], OdxAvatar);
612
612
 
613
- const styles$13 = "@layer base{:host{--_size: var(--odx-size-225);--_spacing: var(--odx-size-25);--_font-size: var(--odx-typography-font-size-3)}:host{--_color-background: var(--odx-experience-color-secondary-rest);--_color-foreground: inherit;--_border-radius: 50%;display:flex;flex-direction:column;place-content:center;place-items:center;position:relative;user-select:none;vertical-align:middle;overflow:clip;flex:0 0 auto;block-size:var(--_size);inline-size:var(--_size);margin-block:var(--_spacing);font-size:var(--_font-size);border-radius:var(--_border-radius);background-color:var(--_color-background);color:var(--_color-foreground);transition:var(--odx-transition-default);transition-property:background-color,outline-color,box-shadow}:host-context(odx-avatar-group[variant=\"rectangle\"]),:host([variant=\"rectangle\"]){--_border-radius: var(--odx-border-radius-sm)}:host-context(odx-avatar-group[size=\"sm\"]),:host([size=\"sm\"]){--_size: var(--odx-size-150);--_spacing: 0;--_font-size: var(--odx-typography-font-size-1)}:host-context(odx-avatar-group[size=\"lg\"]),:host([size=\"lg\"]){--_size: var(--odx-size-300);--_spacing: var(--odx-size-37);--_font-size: var(--odx-typography-font-size-5)}:host-context(odx-avatar-group[size=\"xl\"]),:host([size=\"xl\"]){--_size: var(--odx-size-400);--_spacing: 0;--_font-size: var(--odx-typography-font-size-7)}:host-context(odx-navigation-item),:host-context(odx-button){--_color-background: var(--odx-color-transparent-pressed);--_size: var(--odx-size-200);--_font-size: var(--odx-typography-font-size-3);--_spacing: calc(var(--odx-size-75) - var(--odx-size-px));margin:0 calc(-1 * var(--_spacing))}:host-context(odx-button[size=\"sm\"]){--_size: var(--odx-size-125);--_font-size: var(--odx-typography-font-size-1);--_spacing: calc(var(--odx-size-37) + var(--odx-size-px))}:host-context(odx-button[size=\"lg\"]){--_size: var(--odx-size-250);--_font-size: var(--odx-typography-font-size-5);--_spacing: calc(var(--odx-size-75) + var(--odx-size-px))}:host-context(odx-navigation-item[size=\"lg\"]){--_size: var(--odx-size-200);--_font-size: var(--odx-typography-font-size-5);--_spacing: calc(var(--odx-size-50))}::slotted(img){object-fit:cover;position:absolute;inset:0;z-index:1;pointer-events:none}::slotted(odx-icon){font-size:inherit}}";
613
+ const AvatarSize = {
614
+ SM: "sm",
615
+ MD: "md",
616
+ LG: "lg",
617
+ XL: "xl"
618
+ };
619
+ const AvatarVariant = {
620
+ CIRCLE: "circle",
621
+ RECTANGLE: "rectangle"
622
+ };
623
+
624
+ const styles$13 = ":host{display:flex;padding-inline:var(--odx-size-25);width:min-content}::slotted(odx-avatar){flex:0 0 auto;z-index:1;border:var(--odx-border-width-thin) solid var(--odx-color-separator)}::slotted(odx-avatar:not(:first-of-type)){margin-inline-start:calc(-.33 * var(--_size))}:host(:is([size=\"lg\"],[size=\"xl\"])){gap:var(--odx-size-50)}";
614
625
 
615
626
  var __defProp$1d = Object.defineProperty;
616
627
  var __getOwnPropDesc$1d = Object.getOwnPropertyDescriptor;
@@ -622,31 +633,29 @@ var __decorateClass$1d = (decorators, target, key, kind) => {
622
633
  if (kind && result) __defProp$1d(target, key, result);
623
634
  return result;
624
635
  };
625
- let OdxAvatar = class extends CustomElement {
626
- render() {
627
- return html`<slot></slot>`;
636
+ let OdxAvatarGroup = class extends CustomElement {
637
+ updated(props) {
638
+ super.updated?.(props);
639
+ if (props.has("size") || props.has("variant")) {
640
+ for (const avatar of this.avatars) {
641
+ avatar.size = this.size;
642
+ avatar.variant = this.variant;
643
+ }
644
+ }
628
645
  }
629
646
  };
647
+ __decorateClass$1d([
648
+ queryAssignedElements({ selector: OdxAvatar.selector })
649
+ ], OdxAvatarGroup.prototype, "avatars", 2);
630
650
  __decorateClass$1d([
631
651
  property({ reflect: true })
632
- ], OdxAvatar.prototype, "size", 2);
652
+ ], OdxAvatarGroup.prototype, "size", 2);
633
653
  __decorateClass$1d([
634
654
  property({ reflect: true })
635
- ], OdxAvatar.prototype, "variant", 2);
636
- OdxAvatar = __decorateClass$1d([
637
- customElement("odx-avatar", [styles$13])
638
- ], OdxAvatar);
639
-
640
- const AvatarSize = {
641
- SM: "sm",
642
- MD: "md",
643
- LG: "lg",
644
- XL: "xl"
645
- };
646
- const AvatarVariant = {
647
- CIRCLE: "circle",
648
- RECTANGLE: "rectangle"
649
- };
655
+ ], OdxAvatarGroup.prototype, "variant", 2);
656
+ OdxAvatarGroup = __decorateClass$1d([
657
+ customElement("odx-avatar-group", [styles$13])
658
+ ], OdxAvatarGroup);
650
659
 
651
660
  const styles$12 = "@layer base{@keyframes pulse{0%{box-shadow:0 0 0 0 var(--_color-background)}70%{box-shadow:0 0 0 var(--odx-size-37) transparent}to{box-shadow:0 0 0 0 transparent}}:host{--_color-background: var(--odx-experience-color-secondary-rest);--_color-foreground: var(--odx-experience-color-secondary-foreground);--_block-size: var(--odx-size-100);display:inline-block;pointer-events:none;vertical-align:middle}.content{--_font-size: var(--odx-typography-font-size-1);block-size:var(--_block-size);line-height:var(--_block-size);min-inline-size:var(--_block-size);border-radius:var(--odx-border-radius-circle);background-color:var(--_color-background);color:var(--_color-foreground);cursor:default;user-select:none;font-weight:var(--odx-typography-font-weight-medium);padding-inline:var(--odx-size-25);text-align:center}}@layer variant{:host([variant=\"primary\"]){--_color-background: var(--odx-color-primary-rest);--_color-foreground: var(--odx-color-foreground-light)}:host([variant=\"neutral\"]){--_color-background: var(--odx-experience-color-secondary-rest);--_color-foreground: var(--odx-experience-color-secondary-foreground)}:host([variant=\"accent\"]){--_color-background: var(--odx-color-highlight-rest);--_color-foreground: var(--odx-color-foreground-light)}:host([variant=\"success\"]){--_color-background: var(--odx-color-success-rest);--_color-foreground: var(--odx-color-foreground-dark)}:host([variant=\"warning\"]){--_color-background: var(--odx-color-warning-rest);--_color-foreground: var(--odx-color-foreground-dark)}:host([variant=\"danger\"]){--_color-background: var(--odx-color-danger-rest);--_color-foreground: var(--odx-color-foreground-light)}:host([compact]){--_block-size: var(--odx-size-75);.content{inline-size:var(--_block-size);padding:0;margin:var(--odx-size-12)}}:host([pulse]){.content{animation:pulse 1.25s infinite}}}";
652
661
 
@@ -840,16 +849,18 @@ var __decorateClass$19 = (decorators, target, key, kind) => {
840
849
  const buttonSelector = ":is(odx-button, odx-icon-button)";
841
850
  let OdxButtonGroup = class extends CanBeDisabled(CustomElement) {
842
851
  constructor() {
843
- super(...arguments);
852
+ super();
844
853
  this.block = false;
845
854
  this.connected = false;
846
855
  this.vertical = false;
856
+ new DisabledContextProvider(this);
847
857
  }
848
858
  updated(props) {
849
859
  super.updated?.(props);
850
- if (props.has("_contextDisabled") || props.has("disabled")) {
851
- for (const button of /* @__PURE__ */ new Set([...this.buttons, ...this.allButtons])) {
852
- button._contextDisabled = this.isContextDisabled();
860
+ if (props.has("size") || props.has("variant")) {
861
+ for (const button of this.buttons) {
862
+ button.size = this.size;
863
+ button.variant = this.variant;
853
864
  }
854
865
  }
855
866
  }
@@ -857,9 +868,6 @@ let OdxButtonGroup = class extends CanBeDisabled(CustomElement) {
857
868
  __decorateClass$19([
858
869
  queryAssignedElements({ selector: buttonSelector, flatten: true })
859
870
  ], OdxButtonGroup.prototype, "buttons", 2);
860
- __decorateClass$19([
861
- queryAll(buttonSelector)
862
- ], OdxButtonGroup.prototype, "allButtons", 2);
863
871
  __decorateClass$19([
864
872
  property({ type: Boolean, reflect: true })
865
873
  ], OdxButtonGroup.prototype, "block", 2);
@@ -953,7 +961,7 @@ __decorateClass$18([
953
961
  property({ type: Number, attribute: "line-clamp" })
954
962
  ], BaseButton.prototype, "lineClamp", 2);
955
963
 
956
- const styles$Z = "@layer base{.base{font-weight:var(--odx-typography-font-weight-medium)}}@layer variant{:host([block]){display:flex}:host-context(odx-input),:host-context(odx-button-group[size=\"sm\"]),:host([size=\"sm\"]){--_block-size: var(--odx-size-150);--_padding-inline: var(--odx-size-50);--_font-size: var(--odx-typography-font-size-1);--_icon-size: var(--odx-typography-font-size-4);--_margin-block: 0}:host-context(odx-button-group[size=\"lg\"]),:host([size=\"lg\"]){--_block-size: var(--odx-size-300);--_padding-inline: var(--odx-size-100);--_font-size: var(--odx-typography-font-size-4);--_icon-size: var(--odx-typography-font-size-6);--_margin-block: 0}:host-context(odx-button-group[variant=\"primary\"]),:host([variant=\"primary\"]){--_color-background: var(--odx-color-primary-rest);--_color-background-hover: var(--odx-color-primary-hover);--_color-background-pressed: var(--odx-color-primary-pressed);--_color-foreground: var(--odx-color-foreground-inverse)}:host-context(odx-button-group[variant=\"highlight\"]),:host([variant=\"highlight\"]){--_color-background: var(--odx-color-highlight-rest);--_color-background-hover: var(--odx-color-highlight-hover);--_color-background-pressed: var(--odx-color-highlight-pressed);--_color-foreground: var(--odx-color-foreground-inverse)}:host,:host-context(odx-button-group[variant=\"secondary\"]),:host([variant=\"secondary\"]){--_color-background: var(--odx-experience-color-secondary-rest);--_color-background-hover: var(--odx-experience-color-secondary-hover);--_color-background-pressed: var(--odx-experience-color-secondary-pressed);--_color-foreground: var(--odx-experience-color-secondary-foreground)}:host-context(odx-input),:host-context(odx-button-group[variant=\"ghost\"]),:host([variant=\"ghost\"]){--_color-background: var(--odx-color-transparent);--_color-foreground: var(--odx-color-foreground-base);--_color-background-hover: var(--odx-color-transparent-hover);--_color-background-pressed: var(--odx-color-transparent-pressed)}:host-context(odx-button-group[variant=\"danger\"]),:host([variant=\"danger\"]){--_color-background: var(--odx-color-danger-rest);--_color-background-hover: var(--odx-color-danger-hover);--_color-background-pressed: var(--odx-color-danger-pressed);--_color-foreground: var(--odx-color-foreground-light)}:host-context(odx-input){--_icon-size: var(--odx-typography-font-size-5)}}";
964
+ const styles$Z = "@layer base{.base{font-weight:var(--odx-typography-font-weight-medium)}}@layer variant{:host([block]){display:flex}:host([size=\"sm\"]){--_block-size: var(--odx-size-150);--_padding-inline: var(--odx-size-50);--_font-size: var(--odx-typography-font-size-1);--_icon-size: var(--odx-typography-font-size-4);--_margin-block: 0}:host([size=\"lg\"]){--_block-size: var(--odx-size-300);--_padding-inline: var(--odx-size-100);--_font-size: var(--odx-typography-font-size-4);--_icon-size: var(--odx-typography-font-size-6);--_margin-block: 0}:host([variant=\"primary\"]){--_color-background: var(--odx-color-primary-rest);--_color-background-hover: var(--odx-color-primary-hover);--_color-background-pressed: var(--odx-color-primary-pressed);--_color-foreground: var(--odx-color-foreground-inverse)}:host([variant=\"highlight\"]){--_color-background: var(--odx-color-highlight-rest);--_color-background-hover: var(--odx-color-highlight-hover);--_color-background-pressed: var(--odx-color-highlight-pressed);--_color-foreground: var(--odx-color-foreground-inverse)}:host,:host([variant=\"secondary\"]){--_color-background: var(--odx-experience-color-secondary-rest);--_color-background-hover: var(--odx-experience-color-secondary-hover);--_color-background-pressed: var(--odx-experience-color-secondary-pressed);--_color-foreground: var(--odx-experience-color-secondary-foreground)}:host([variant=\"ghost\"]){--_color-background: var(--odx-color-transparent);--_color-foreground: var(--odx-color-foreground-base);--_color-background-hover: var(--odx-color-transparent-hover);--_color-background-pressed: var(--odx-color-transparent-pressed)}:host([variant=\"danger\"]){--_color-background: var(--odx-color-danger-rest);--_color-background-hover: var(--odx-color-danger-hover);--_color-background-pressed: var(--odx-color-danger-pressed);--_color-foreground: var(--odx-color-foreground-light)}}";
957
965
 
958
966
  var __defProp$17 = Object.defineProperty;
959
967
  var __getOwnPropDesc$17 = Object.getOwnPropertyDescriptor;
@@ -1067,7 +1075,7 @@ OdxCard = __decorateClass$16([
1067
1075
  customElement("odx-card", [styles$Y])
1068
1076
  ], OdxCard);
1069
1077
 
1070
- const styles$X = "@layer base{:host{display:flex}::slotted(odx-checkbox-group){margin-inline-start:var(--odx-size-75)}}@layer variant{:host(:not([variant=\"inline\"])){flex-direction:column}:host([variant=\"list\"]) ::slotted(:is(odx-checkbox,odx-switch):last-of-type){border-block-end:none}}";
1078
+ const styles$X = "@layer base{:host{display:flex}::slotted(odx-checkbox-group){margin-inline-start:var(--odx-size-75)}}@layer variant{:host(:not([variant=\"inline\"])){flex-direction:column}:host([variant=\"list\"]) ::slotted(:is(odx-checkbox,odx-switch):last-of-type){border-block-end:none}:host([variant=\"list\"]) ::slotted(:is(odx-checkbox,odx-switch)){border-block-end:var(--odx-border-width-thin) solid var(--odx-color-separator);padding:var(--odx-size-75);margin:0;inline-size:auto}}";
1071
1079
 
1072
1080
  var __defProp$15 = Object.defineProperty;
1073
1081
  var __getOwnPropDesc$15 = Object.getOwnPropertyDescriptor;
@@ -1122,7 +1130,7 @@ const CheckboxGroupVariant = {
1122
1130
  LIST: "list"
1123
1131
  };
1124
1132
 
1125
- const styles$W = "@layer base{:host{--_indicator-space: var(--odx-size-12);--_indicator-size: calc(var(--odx-size-150) - var(--_indicator-space) * 2);--_indicator-color-background: var(--odx-color-selection-control-fill);--_indicator-color-stroke: var(--odx-color-selection-control-stroke);--_indicator-color-foreground: var(--odx-palette-transparent);--_label-color-foreground: var(--odx-color-text);cursor:pointer;display:inline-flex;margin:var(--odx-size-37) var(--odx-size-75);user-select:none;border-radius:var(--odx-border-radius-controls);padding:var(--_indicator-space)}:host,.indicator,.content{transition:var(--odx-transition-reduced)}.indicator{display:flex;place-content:center;place-items:center;block-size:var(--_indicator-size);inline-size:var(--_indicator-size);flex-shrink:0;border-radius:var(--odx-border-radius-controls);background-color:var(--_indicator-color-background);border:var(--odx-border-width-thin) solid var(--_indicator-color-stroke);border-color:var(--_indicator-color-stroke);color:var(--_indicator-color-foreground);outline:var(--odx-focus-ring-outline);outline-offset:var(--odx-focus-ring-offset);transition-property:background-color,border-color,outline-color}.label{display:inline-block}.content{color:var(--_label-color-foreground);margin-block:calc(-1 * var(--_indicator-space));transition-property:color}:host(:empty) .content{display:none}:host(:not(:empty)) .indicator{margin-inline-end:var(--odx-size-75)}:host-context(odx-checkbox-group[variant=\"list\"]){border-block-end:var(--odx-border-width-thin) solid var(--odx-color-separator);padding:var(--odx-size-75);margin:0;inline-size:auto}}@layer state{:host(:not(:empty)) .indicator{margin-inline-end:var(--odx-size-75)}:host(:empty) .content{display:none}:host(:hover){--_indicator-color-stroke: var(--odx-color-selection-control-stroke-hover);--_indicator-color-background: var(--odx-color-selection-control-fill-hover)}:host(:focus-visible) .indicator{outline-color:var(--odx-focus-ring-color)}:host(:is([aria-checked=\"true\"],[aria-checked=\"mixed\"])){--_indicator-color-background: var(--odx-color-selection-control-fill-selected);--_indicator-color-foreground: var(--odx-color-foreground-light);--_indicator-color-stroke: var(--odx-color-selection-control-stroke-selected)}:host(:is([aria-checked=\"true\"],[aria-checked=\"mixed\"]):not(:is([aria-disabled],[aria-readonly])):hover){--_indicator-color-background: var(--odx-color-selection-control-fill-selected-hover)}:host([aria-disabled=\"true\"]){--_indicator-color-background: var(--odx-color-disabled-fill);--_indicator-color-foreground: var(--odx-palette-transparent);--_indicator-color-stroke: var(--odx-selection-control-color-border-disabled);--_label-color-foreground: var(--odx-color-disabled-foreground);cursor:not-allowed}:host([aria-disabled=\"true\"]:is([aria-checked=\"true\"],[aria-checked=\"mixed\"])){--_indicator-color-background: var(--odx-color-disabled-fill-selected);--_indicator-color-foreground: var(--odx-color-disabled-foreground-selected);--_indicator-color-stroke: var(--_indicator-color-background)}:host([aria-readonly=\"true\"]){--_indicator-color-background: var(--odx-color-selection-control-fill-readonly);--_indicator-color-stroke: var(--odx-color-input-control-stroke-readonly);cursor:default}:host([aria-readonly=\"true\"]:is([aria-checked=\"true\"],[aria-checked=\"mixed\"])){--_indicator-color-foreground: var(--odx-color-foreground-base)}}";
1133
+ const styles$W = "@layer base{:host{--_indicator-space: var(--odx-size-12);--_indicator-size: calc(var(--odx-size-150) - var(--_indicator-space) * 2);--_indicator-color-background: var(--odx-color-selection-control-fill);--_indicator-color-stroke: var(--odx-color-selection-control-stroke);--_indicator-color-foreground: var(--odx-palette-transparent);--_label-color-foreground: var(--odx-color-text);cursor:pointer;display:inline-flex;margin:var(--odx-size-37) var(--odx-size-75);user-select:none;border-radius:var(--odx-border-radius-controls);padding:var(--_indicator-space)}:host,.indicator,.content{transition:var(--odx-transition-reduced)}.indicator{display:flex;place-content:center;place-items:center;block-size:var(--_indicator-size);inline-size:var(--_indicator-size);flex-shrink:0;border-radius:var(--odx-border-radius-controls);background-color:var(--_indicator-color-background);border:var(--odx-border-width-thin) solid var(--_indicator-color-stroke);border-color:var(--_indicator-color-stroke);color:var(--_indicator-color-foreground);outline:var(--odx-focus-ring-outline);outline-offset:var(--odx-focus-ring-offset);transition-property:background-color,border-color,outline-color}.label{display:inline-block}.content{color:var(--_label-color-foreground);margin-block:calc(-1 * var(--_indicator-space));transition-property:color}:host(:empty) .content{display:none}:host(:not(:empty)) .indicator{margin-inline-end:var(--odx-size-75)}}@layer state{:host(:not(:empty)) .indicator{margin-inline-end:var(--odx-size-75)}:host(:empty) .content{display:none}:host(:hover){--_indicator-color-stroke: var(--odx-color-selection-control-stroke-hover);--_indicator-color-background: var(--odx-color-selection-control-fill-hover)}:host(:focus-visible) .indicator{outline-color:var(--odx-focus-ring-color)}:host(:is([aria-checked=\"true\"],[aria-checked=\"mixed\"])){--_indicator-color-background: var(--odx-color-selection-control-fill-selected);--_indicator-color-foreground: var(--odx-color-foreground-light);--_indicator-color-stroke: var(--odx-color-selection-control-stroke-selected)}:host(:is([aria-checked=\"true\"],[aria-checked=\"mixed\"]):not(:is([aria-disabled],[aria-readonly])):hover){--_indicator-color-background: var(--odx-color-selection-control-fill-selected-hover)}:host([aria-disabled=\"true\"]){--_indicator-color-background: var(--odx-color-disabled-fill);--_indicator-color-foreground: var(--odx-palette-transparent);--_indicator-color-stroke: var(--odx-selection-control-color-border-disabled);--_label-color-foreground: var(--odx-color-disabled-foreground);cursor:not-allowed}:host([aria-disabled=\"true\"]:is([aria-checked=\"true\"],[aria-checked=\"mixed\"])){--_indicator-color-background: var(--odx-color-disabled-fill-selected);--_indicator-color-foreground: var(--odx-color-disabled-foreground-selected);--_indicator-color-stroke: var(--_indicator-color-background)}:host([aria-readonly=\"true\"]){--_indicator-color-background: var(--odx-color-selection-control-fill-readonly);--_indicator-color-stroke: var(--odx-color-input-control-stroke-readonly);cursor:default}:host([aria-readonly=\"true\"]:is([aria-checked=\"true\"],[aria-checked=\"mixed\"])){--_indicator-color-foreground: var(--odx-color-foreground-base)}}";
1126
1134
 
1127
1135
  var __defProp$14 = Object.defineProperty;
1128
1136
  var __getOwnPropDesc$14 = Object.getOwnPropertyDescriptor;
@@ -1329,7 +1337,7 @@ let OdxCircularProgressBar = class extends CustomElement {
1329
1337
  this.setAttributes();
1330
1338
  }
1331
1339
  disconnectedCallback() {
1332
- super.disconnectedCallback?.();
1340
+ super.disconnectedCallback();
1333
1341
  SharedResizeObserver.unobserve(this);
1334
1342
  }
1335
1343
  render() {
@@ -1468,7 +1476,7 @@ let OdxDropdown = class extends PopoverHost(CanBeDisabled(CustomElement)) {
1468
1476
  });
1469
1477
  }
1470
1478
  connectedCallback() {
1471
- super.connectedCallback?.();
1479
+ super.connectedCallback();
1472
1480
  this.id ||= getUniqueId("odx-dropdown");
1473
1481
  }
1474
1482
  mountPopover(referenceElement) {
@@ -1555,7 +1563,7 @@ let OdxFormField = class extends CustomElement {
1555
1563
  return this.elements.find((element) => element.hasAttribute(FORM_FIELD_CONTROL_SELECTOR));
1556
1564
  }
1557
1565
  connectedCallback() {
1558
- super.connectedCallback?.();
1566
+ super.connectedCallback();
1559
1567
  }
1560
1568
  render() {
1561
1569
  const isValid = this.control?.checkValidity();
@@ -1823,7 +1831,7 @@ var __decorateClass$V = (decorators, target, key, kind) => {
1823
1831
  };
1824
1832
  let OdxHeaderActions = class extends CustomElement {
1825
1833
  connectedCallback() {
1826
- super.connectedCallback?.();
1834
+ super.connectedCallback();
1827
1835
  this.slot = "actions";
1828
1836
  }
1829
1837
  };
@@ -1900,7 +1908,7 @@ let OdxHeader = class extends CustomElement {
1900
1908
  });
1901
1909
  }
1902
1910
  connectedCallback() {
1903
- super.connectedCallback?.();
1911
+ super.connectedCallback();
1904
1912
  this.role = "banner";
1905
1913
  }
1906
1914
  render() {
@@ -2337,7 +2345,7 @@ OdxLineClamp = __decorateClass$M([
2337
2345
  customElement("odx-line-clamp", [styles$I])
2338
2346
  ], OdxLineClamp);
2339
2347
 
2340
- const styles$H = "@layer base{:host{--indent-level: 0;--_block-size: var(--odx-size-300);--_padding-block: var(--odx-size-75);--_padding-inline: var(--odx-size-50);--_margin-icon: 0;display:flex;flex-direction:column;max-inline-size:100%;block-size:auto;place-items:initial}.base,.spinner{padding-inline-start:calc(var(--odx-size-50) + var(--indent-level) * var(--odx-size-200))}.spinner{padding-inline-end:var(--odx-size-100)}.base{block-size:var(--_block-size);text-align:start;place-content:flex-start;outline-offset:calc(-1 * var(--odx-focus-ring-offset));z-index:1;line-height:var(--odx-typography-line-height-2)}.base:after{display:block;block-size:var(--odx-size-px);background-color:var(--odx-color-separator);position:absolute;inset:auto var(--odx-size-37) -1px;transition:var(--odx-transition-reduced);transition-property:opacity;z-index:0}:host(:is(:not(:last-of-type),[expanded]):not(:is([aria-current],[aria-disabled=\"true\"]))) .base:after{content:\"\"}.content{margin-inline-end:auto}.expand-control::part(icon){transition:var(--odx-transition-reduced);transition-property:transform}}@layer state{:host(:not([muted]):hover):after{opacity:0}:host([muted]:not([aria-disabled=\"true\"])){--_color-background-hover: var(--_color-background);--_color-background-pressed: var(--_color-background);cursor:default}:host([aria-current]){--_color-background: var(--odx-color-selected);--_color-background-hover: var(--odx-color-selected-hover)}:host([aria-current][aria-disabled=\"true\"]){--_color-background: var(--odx-color-disabled-fill-selected);--_color-background-hover: var(--_color-background);--_color-background-pressed: var(--_color-background);--_color-foreground: var(--odx-color-disabled-foreground-selected);cursor:not-allowed}:host([aria-expanded=\"true\"]){.expand-control::part(icon){transform:rotate(180deg)}}::slotted(odx-list){--item-indent-level: calc(var(--indent-level) + 1)}}";
2348
+ const styles$H = "@layer base{:host{--indent-level: 0;--_block-size: var(--odx-size-300);--_padding-block: var(--odx-size-75);--_padding-inline: var(--odx-size-50);--_margin-icon: 0;display:flex;flex-direction:column;max-inline-size:100%;block-size:auto;place-items:initial}.base,.spinner{padding-inline-start:calc(var(--odx-size-50) + var(--indent-level) * var(--odx-size-200))}.spinner{padding-inline-end:var(--odx-size-100)}.base{block-size:var(--_block-size);text-align:start;place-content:flex-start;outline-offset:calc(-1 * var(--odx-focus-ring-offset));z-index:1;line-height:var(--odx-typography-line-height-2)}.base:after{display:block;block-size:var(--odx-size-px);background-color:var(--odx-color-separator);position:absolute;inset:auto var(--odx-size-37) -1px;transition:var(--odx-transition-reduced);transition-property:opacity;z-index:0}:host(:is(:not(:last-of-type),[expanded]):not(:is([aria-current],[aria-disabled=\"true\"]))) .base:after{content:\"\"}.content{margin-inline-end:auto}.base>*{--odx-focus-ring-offset: 0}[part=control]::part(icon){transition:var(--odx-transition-reduced);transition-property:transform}}@layer variant{:host(:not([compact])){::slotted(odx-icon){margin-inline:var(--odx-size-37)}}:host([compact]){--_block-size: var(--odx-size-225);[part=control]{--_icon-size: var(--odx-size-150)}}}@layer state{:host(:not([muted]):hover):after{opacity:0}:host([muted]:not([aria-disabled=\"true\"])){--_color-background-hover: var(--_color-background);--_color-background-pressed: var(--_color-background);cursor:default}:host([aria-current]){--_color-background: var(--odx-color-selected);--_color-background-hover: var(--odx-color-selected-hover)}:host([aria-current][aria-disabled=\"true\"]){--_color-background: var(--odx-color-disabled-fill-selected);--_color-background-hover: var(--_color-background);--_color-background-pressed: var(--_color-background);--_color-foreground: var(--odx-color-disabled-foreground-selected);cursor:not-allowed}:host([aria-expanded=\"true\"]){[part=control]::part(icon){transform:rotate(180deg)}}::slotted(odx-list){--item-indent-level: calc(var(--indent-level) + 1)}}";
2341
2349
 
2342
2350
  var __defProp$L = Object.defineProperty;
2343
2351
  var __getOwnPropDesc$L = Object.getOwnPropertyDescriptor;
@@ -2359,8 +2367,10 @@ var _handleClick$4;
2359
2367
  let OdxListItem = class extends CanBeSelected(CanBeExpanded(BaseButton)) {
2360
2368
  constructor() {
2361
2369
  super();
2370
+ this.compact = false;
2362
2371
  this.muted = false;
2363
2372
  this.withControl = false;
2373
+ this.withExpandedIndicator = false;
2364
2374
  __privateAdd$h(this, _handleClick$4, (event) => {
2365
2375
  const expandControl = this.shadowRoot?.querySelector(this.withControl ? ".expand-control" : ".base");
2366
2376
  if (!getElementFromEvent(event, (node) => node === expandControl)) return;
@@ -2375,11 +2385,11 @@ let OdxListItem = class extends CanBeSelected(CanBeExpanded(BaseButton)) {
2375
2385
  }
2376
2386
  }
2377
2387
  isExpandable() {
2378
- return !this.isContextDisabled() && !this.loading && this.querySelectorAll('[slot="expand"]').length > 0;
2388
+ return !this.disabled && !this.loading && this.querySelectorAll('[slot="expand"]').length > 0;
2379
2389
  }
2380
2390
  connectedCallback() {
2381
2391
  super.connectedCallback();
2382
- this.role = "listitem";
2392
+ this.role ||= "listitem";
2383
2393
  }
2384
2394
  render() {
2385
2395
  const expandSlot = html`<slot name="expand"></slot>`;
@@ -2397,9 +2407,9 @@ let OdxListItem = class extends CanBeSelected(CanBeExpanded(BaseButton)) {
2397
2407
  return html`
2398
2408
  ${super.renderContent(false)}
2399
2409
  ${when(
2400
- this.isExpandable(),
2410
+ this.withExpandedIndicator || this.isExpandable(),
2401
2411
  () => html`
2402
- <odx-icon-button class="expand-control" icon="core::chevron-down" variant="ghost" ?inert=${!this.withControl}>
2412
+ <odx-icon-button part="control" icon="core::chevron-down" size=${this.compact ? "sm" : "md"} variant="ghost" ?disabled=${this.disabled} ?inert=${!this.withControl}>
2403
2413
  </odx-icon-button>
2404
2414
  `
2405
2415
  )}
@@ -2416,17 +2426,23 @@ let OdxListItem = class extends CanBeSelected(CanBeExpanded(BaseButton)) {
2416
2426
  }
2417
2427
  };
2418
2428
  _handleClick$4 = new WeakMap();
2429
+ __decorateClass$L([
2430
+ property({ type: Boolean, reflect: true })
2431
+ ], OdxListItem.prototype, "compact", 2);
2419
2432
  __decorateClass$L([
2420
2433
  property({ type: Boolean, reflect: true })
2421
2434
  ], OdxListItem.prototype, "muted", 2);
2422
2435
  __decorateClass$L([
2423
- property({ type: Boolean, reflect: true, attribute: "with-control" })
2436
+ property({ type: Boolean, attribute: "with-control" })
2424
2437
  ], OdxListItem.prototype, "withControl", 2);
2438
+ __decorateClass$L([
2439
+ property({ type: Boolean, attribute: "with-expanded-indicator" })
2440
+ ], OdxListItem.prototype, "withExpandedIndicator", 2);
2425
2441
  OdxListItem = __decorateClass$L([
2426
2442
  customElement("odx-list-item", [BaseButton.styles, styles$H])
2427
2443
  ], OdxListItem);
2428
2444
 
2429
- const styles$G = "@layer base{:host{display:block;--item-indent-level: 0}::slotted(odx-list-item){--indent-level: var(--item-indent-level)}}@layer variant{:host([compact]){::slotted(odx-list-item){--_block-size: var(--odx-size-225)}}}";
2445
+ const styles$G = "@layer base{:host{display:block;--item-indent-level: 0}::slotted(odx-list-item){--indent-level: var(--item-indent-level)}}";
2430
2446
 
2431
2447
  var __defProp$K = Object.defineProperty;
2432
2448
  var __getOwnPropDesc$K = Object.getOwnPropertyDescriptor;
@@ -2439,18 +2455,11 @@ var __decorateClass$K = (decorators, target, key, kind) => {
2439
2455
  return result;
2440
2456
  };
2441
2457
  let OdxList = class extends CustomElement {
2442
- constructor() {
2443
- super(...arguments);
2444
- this.compact = false;
2445
- }
2446
2458
  connectedCallback() {
2447
- super.connectedCallback?.();
2459
+ super.connectedCallback();
2448
2460
  this.role = "list";
2449
2461
  }
2450
2462
  };
2451
- __decorateClass$K([
2452
- property({ type: Boolean, reflect: true })
2453
- ], OdxList.prototype, "compact", 2);
2454
2463
  OdxList = __decorateClass$K([
2455
2464
  customElement("odx-list", [styles$G])
2456
2465
  ], OdxList);
@@ -2485,7 +2494,7 @@ let OdxLoadingOverlay = class extends WithLoadingState(CustomElement) {
2485
2494
  return this.parentElement ?? this;
2486
2495
  }
2487
2496
  disconnectedCallback() {
2488
- super.disconnectedCallback?.();
2497
+ super.disconnectedCallback();
2489
2498
  this.hideOverlay();
2490
2499
  }
2491
2500
  async updated(props) {
@@ -2601,7 +2610,7 @@ let OdxLogo = class extends CustomElement {
2601
2610
  this.compact = false;
2602
2611
  }
2603
2612
  connectedCallback() {
2604
- super.connectedCallback?.();
2613
+ super.connectedCallback();
2605
2614
  this.ariaLabel ||= "Dräger";
2606
2615
  this.ariaRoleDescription ||= "Logo";
2607
2616
  this.role = "img";
@@ -2770,7 +2779,7 @@ let OdxMainMenu = class extends CustomElement {
2770
2779
  }
2771
2780
  }
2772
2781
  connectedCallback() {
2773
- super.connectedCallback?.();
2782
+ super.connectedCallback();
2774
2783
  this.popover = "auto";
2775
2784
  }
2776
2785
  toggle() {
@@ -2836,7 +2845,7 @@ let OdxMenuItem = class extends BaseButton {
2836
2845
  `;
2837
2846
  }
2838
2847
  connectedCallback() {
2839
- super.connectedCallback?.();
2848
+ super.connectedCallback();
2840
2849
  this.role ||= "menuitem";
2841
2850
  }
2842
2851
  renderOverlay() {
@@ -2931,7 +2940,7 @@ let OdxMenu = class extends PopoverHost(CustomElement) {
2931
2940
  return Array.from(this.querySelectorAll(MENU_ITEMS_SELECTOR));
2932
2941
  }
2933
2942
  connectedCallback() {
2934
- super.connectedCallback?.();
2943
+ super.connectedCallback();
2935
2944
  this.role ||= "menu";
2936
2945
  }
2937
2946
  mountPopover(referenceElement) {
@@ -3034,7 +3043,7 @@ let OdxModal = class extends CustomElement {
3034
3043
  }
3035
3044
  }
3036
3045
  connectedCallback() {
3037
- super.connectedCallback?.();
3046
+ super.connectedCallback();
3038
3047
  this.id ||= getUniqueId("odx-modal");
3039
3048
  }
3040
3049
  async show() {
@@ -3278,7 +3287,7 @@ const PageLayout = {
3278
3287
  WIDE: "wide"
3279
3288
  };
3280
3289
 
3281
- const styles$s = "@layer base{:host{display:block}}";
3290
+ const styles$s = "@layer base{:host{display:block}odx-icon-button::part(anchor){outline-offset:0}}";
3282
3291
 
3283
3292
  var __defProp$t = Object.defineProperty;
3284
3293
  var __getOwnPropDesc$t = Object.getOwnPropertyDescriptor;
@@ -3338,11 +3347,15 @@ let OdxPagination = class extends IsLocalized(CustomElement) {
3338
3347
  return html`
3339
3348
  <odx-stack align="center" gap="xs" justify="end">
3340
3349
  <span>${this.t("odx.pagination.summary", this.paginationContext)}</span>
3341
- <odx-icon-button ?disabled=${!hasPreviousPage} icon="core::chevron-left-end" variant="ghost" @click=${() => this.firstPage()}></odx-icon-button>
3342
- <odx-icon-button ?disabled=${!hasPreviousPage} icon="core::chevron-left" variant="ghost" @click=${() => this.previousPage()}></odx-icon-button>
3350
+ <odx-button-group ?disabled=${!hasPreviousPage} connected variant="ghost">
3351
+ <odx-icon-button icon="core::chevron-left-end" @click=${() => this.firstPage()}></odx-icon-button>
3352
+ <odx-icon-button icon="core::chevron-left" @click=${() => this.previousPage()}></odx-icon-button>
3353
+ </odx-button-group>
3343
3354
  <span>${this.t("odx.pagination.pageCount.default", this.paginationContext)}</span>
3344
- <odx-icon-button ?disabled=${!hasNextPage} icon="core::chevron-right" variant="ghost" @click=${() => this.nextPage()}></odx-icon-button>
3345
- <odx-icon-button ?disabled=${!hasNextPage} icon="core::chevron-right-end" variant="ghost" @click=${() => this.lastPage()}></odx-icon-button>
3355
+ <odx-button-group ?disabled=${!hasNextPage} connected variant="ghost">
3356
+ <odx-icon-button icon="core::chevron-right" @click=${() => this.nextPage()}></odx-icon-button>
3357
+ <odx-icon-button icon="core::chevron-right-end" @click=${() => this.lastPage()}></odx-icon-button>
3358
+ </odx-button-group>
3346
3359
  </odx-stack>
3347
3360
  `;
3348
3361
  }
@@ -3468,7 +3481,7 @@ var __decorateClass$r = (decorators, target, key, kind) => {
3468
3481
  };
3469
3482
  let OdxRadioButton = class extends CheckboxFormControl {
3470
3483
  connectedCallback() {
3471
- super.connectedCallback?.();
3484
+ super.connectedCallback();
3472
3485
  this.role = "radio";
3473
3486
  }
3474
3487
  render() {
@@ -3518,7 +3531,7 @@ const RadioGroupVariant = {
3518
3531
  LIST: "list"
3519
3532
  };
3520
3533
 
3521
- const styles$o = ":host{--min-inline-size: 180px;--max-inline-size: 240px;display:flex;flex-direction:column;block-size:100%;padding-inline:var(--odx-size-50);padding-block:var(--odx-size-150);gap:var(--odx-size-75);max-inline-size:var(--max-inline-size);min-inline-size:var(--min-inline-size);transition:var(--odx-transition-default);transition-property:min-inline-size,max-inline-size}.toggle-control{margin-block-start:auto}.toggle-icon{transition:var(--odx-transition-default);transition-property:transform}:host([collapsed]:not([collapsed=\"false\"])){--min-inline-size: var(--odx-size-400);--max-inline-size: var(--odx-size-400);.toggle-icon{transform:rotateY(-180deg)}}";
3534
+ const styles$o = ":host{--min-inline-size: 180px;--max-inline-size: 240px;display:flex;flex-direction:column;block-size:100%;padding-inline:var(--odx-size-50);padding-block:var(--odx-size-150);gap:var(--odx-size-75);max-inline-size:var(--max-inline-size);min-inline-size:var(--min-inline-size);transition:var(--odx-transition-default);transition-property:min-inline-size,max-inline-size}.toggle-control{margin-block-start:auto}.toggle-icon{transition:var(--odx-transition-default);transition-property:transform}:host([collapsed]:not([collapsed=\"false\"])){--min-inline-size: var(--odx-size-400);--max-inline-size: var(--odx-size-400);.toggle-icon{transform:rotateY(-180deg)}}::slotted(odx-spacer){--size: var(--odx-size-300);--gap-offset: var(--odx-size-75)}";
3522
3535
 
3523
3536
  var __defProp$p = Object.defineProperty;
3524
3537
  var __getOwnPropDesc$p = Object.getOwnPropertyDescriptor;
@@ -3648,7 +3661,7 @@ let OdxSearchBar = class extends CustomElement {
3648
3661
  this.dispatchEvent(new SearchEvent(value, this.inputElement.value));
3649
3662
  }
3650
3663
  connectedCallback() {
3651
- super.connectedCallback?.();
3664
+ super.connectedCallback();
3652
3665
  this.role = "presentation";
3653
3666
  }
3654
3667
  updated(props) {
@@ -3941,7 +3954,7 @@ let OdxSliderHandle = class extends IsDraggable(NumberControl(CustomElement)) {
3941
3954
  return Math.ceil(this.context.minRange / this.context.step) * this.context.step;
3942
3955
  }
3943
3956
  connectedCallback() {
3944
- super.connectedCallback?.();
3957
+ super.connectedCallback();
3945
3958
  this.role = "slider";
3946
3959
  this.slot = "thumbs";
3947
3960
  this.tabIndex = 0;
@@ -4086,7 +4099,7 @@ let OdxSliderMarks = class extends CustomElement {
4086
4099
  this.showLabels = false;
4087
4100
  }
4088
4101
  async connectedCallback() {
4089
- super.connectedCallback?.();
4102
+ super.connectedCallback();
4090
4103
  this.slot = "marks";
4091
4104
  }
4092
4105
  render() {
@@ -4231,7 +4244,7 @@ OdxSlider = __decorateClass$i([
4231
4244
  customElement("odx-slider", [styles$h])
4232
4245
  ], OdxSlider);
4233
4246
 
4234
- const styles$g = ":host{--gap-offset: 0;--size: 0;display:block;inline-size:100%;block-size:var(--size);margin:calc(-1 * var(--gap-offset)) 0}:host([dynamic]){block-size:100%;flex:1 1 auto;max-block-size:var(--size)}:host([horizontal]){block-size:100%;inline-size:var(--size);margin:0 calc(-1 * var(--gap-offset))}:host([dynamic][horizontal]){inline-size:100%;max-inline-size:var(--size)}:host([fill]){min-block-size:var(--size);flex:1 1 var(--size)}:host([fill][horizontal]){min-inline-size:var(--size);flex:1 1 var(--size)}:host([fill][dynamic]){min-block-size:auto;min-inline-size:auto;max-block-size:100%;flex:1 1 auto}:host-context(odx-rail-navigation){--size: var(--odx-size-300);--gap-offset: var(--odx-size-75)}";
4247
+ const styles$g = ":host{--gap-offset: 0;--size: 0;display:block;inline-size:100%;block-size:var(--size);margin:calc(-1 * var(--gap-offset)) 0}:host([dynamic]){block-size:100%;flex:1 1 auto;max-block-size:var(--size)}:host([horizontal]){block-size:100%;inline-size:var(--size);margin:0 calc(-1 * var(--gap-offset))}:host([dynamic][horizontal]){inline-size:100%;max-inline-size:var(--size)}:host([fill]){min-block-size:var(--size);flex:1 1 var(--size)}:host([fill][horizontal]){min-inline-size:var(--size);flex:1 1 var(--size)}:host([fill][dynamic]){min-block-size:auto;min-inline-size:auto;max-block-size:100%;flex:1 1 auto}";
4235
4248
 
4236
4249
  var __defProp$h = Object.defineProperty;
4237
4250
  var __getOwnPropDesc$h = Object.getOwnPropertyDescriptor;
@@ -4420,7 +4433,7 @@ const StackJustify = {
4420
4433
  SPACE_EVENLY: "space-evenly"
4421
4434
  };
4422
4435
 
4423
- const styles$d = "@layer base{:host{--_indicator-space: var(--odx-size-12);--_track-color-background: var(--odx-color-selection-control-fill);--_track-size: var(--odx-size-50);--_track-color-stroke: var(--odx-color-selection-control-stroke);--_thumb-color-background: var(--_track-color-background);--_thumb-color-stroke: var(--_track-color-stroke);--_thumb-size: calc(var(--odx-size-150) - var(--_indicator-space) * 2);--_thumb-position: 0;--_label-color-foreground: var(--odx-color-foreground-base);cursor:pointer;display:inline-flex;margin:var(--odx-size-37) var(--odx-size-75);user-select:none}:host,.indicator,.content{transition:var(--odx-transition-reduced)}.indicator{display:flex;place-items:center;block-size:var(--odx-size-150);position:relative;transition:var(--odx-transition-reduced);transition-property:background-color,border-color,outline-color,translate}.track,.thumb{border-radius:var(--_thumb-size);border-radius:var(--odx-border-radius-circle);border:var(--odx-border-width-thin) solid var(--_thumb-color-stroke);transition:inherit}.track{background-color:var(--_track-color-background);block-size:var(--_track-size);inline-size:var(--odx-size-225)}.thumb{display:flex;place-content:center;place-items:center;block-size:var(--_thumb-size);inline-size:var(--_thumb-size);background-color:var(--_thumb-color-background);color:var(--_indicator-color-foreground);position:absolute;inset-inline-start:0;box-shadow:var(--odx-shadow-level-0);outline:var(--odx-focus-ring-outline);outline-offset:var(--odx-focus-ring-offset);translate:var(--_thumb-position) 0}.label{display:inline-block;cursor:inherit}.content{padding-inline-end:var(--odx-size-25);color:var(--_label-color-foreground);transition-property:color}:host-context(odx-checkbox-group[variant=\"list\"]){border-block-end:var(--odx-border-width-thin) solid var(--odx-color-separator);padding:var(--odx-size-75);margin:0;inline-size:auto}}@layer state{:host(:not(:empty)) .indicator{margin-inline-end:var(--odx-size-75)}:host(:empty) .content{display:none}:host(:not(:is([aria-checked=\"true\"],[aria-disabled=\"true\"],[aria-readonly=\"true\"])):hover){--_track-color-stroke: var(--odx-color-selection-control-stroke-hover);--_thumb-color-background: var(--odx-color-selection-control-fill-hover)}:host(:focus-visible) .thumb{outline-color:var(--odx-focus-ring-color)}:host([aria-checked=\"true\"]){--_track-color-background: var(--odx-color-selection-control-fill-selected);--_track-color-stroke: var(--odx-color-selection-control-stroke-selected);--_thumb-position: calc(var(--odx-size-225) - 100%)}:host([aria-checked=\"true\"]:not(:is([aria-disabled=\"true\"],[aria-readonly=\"true\"])):hover){--_track-color-background: var(--odx-color-selection-control-fill-selected-hover)}:host([aria-disabled=\"true\"]){--_track-color-background: var(--odx-color-disabled-fill);--_track-color-stroke: var(--odx-color-disabled-stroke);--_label-color-foreground: var(--odx-color-disabled-foreground);cursor:not-allowed;.thumb{box-shadow:none}}:host([aria-disabled=\"true\"][aria-checked=\"true\"]){--_track-color-background: var(--odx-color-disabled-fill-selected)}:host([aria-readonly=\"true\"]){cursor:default}}";
4436
+ const styles$d = "@layer base{:host{--_indicator-space: var(--odx-size-12);--_track-color-background: var(--odx-color-selection-control-fill);--_track-size: var(--odx-size-50);--_track-color-stroke: var(--odx-color-selection-control-stroke);--_thumb-color-background: var(--_track-color-background);--_thumb-color-stroke: var(--_track-color-stroke);--_thumb-size: calc(var(--odx-size-150) - var(--_indicator-space) * 2);--_thumb-position: 0;--_label-color-foreground: var(--odx-color-foreground-base);cursor:pointer;display:inline-flex;margin:var(--odx-size-37) var(--odx-size-75);user-select:none}:host,.indicator,.content{transition:var(--odx-transition-reduced)}.indicator{display:flex;place-items:center;block-size:var(--odx-size-150);position:relative;transition:var(--odx-transition-reduced);transition-property:background-color,border-color,outline-color,translate}.track,.thumb{border-radius:var(--_thumb-size);border-radius:var(--odx-border-radius-circle);border:var(--odx-border-width-thin) solid var(--_thumb-color-stroke);transition:inherit}.track{background-color:var(--_track-color-background);block-size:var(--_track-size);inline-size:var(--odx-size-225)}.thumb{display:flex;place-content:center;place-items:center;block-size:var(--_thumb-size);inline-size:var(--_thumb-size);background-color:var(--_thumb-color-background);color:var(--_indicator-color-foreground);position:absolute;inset-inline-start:0;box-shadow:var(--odx-shadow-level-0);outline:var(--odx-focus-ring-outline);outline-offset:var(--odx-focus-ring-offset);translate:var(--_thumb-position) 0}.label{display:inline-block;cursor:inherit}.content{padding-inline-end:var(--odx-size-25);color:var(--_label-color-foreground);transition-property:color}}@layer state{:host(:not(:empty)) .indicator{margin-inline-end:var(--odx-size-75)}:host(:empty) .content{display:none}:host(:not(:is([aria-checked=\"true\"],[aria-disabled=\"true\"],[aria-readonly=\"true\"])):hover){--_track-color-stroke: var(--odx-color-selection-control-stroke-hover);--_thumb-color-background: var(--odx-color-selection-control-fill-hover)}:host(:focus-visible) .thumb{outline-color:var(--odx-focus-ring-color)}:host([aria-checked=\"true\"]){--_track-color-background: var(--odx-color-selection-control-fill-selected);--_track-color-stroke: var(--odx-color-selection-control-stroke-selected);--_thumb-position: calc(var(--odx-size-225) - 100%)}:host([aria-checked=\"true\"]:not(:is([aria-disabled=\"true\"],[aria-readonly=\"true\"])):hover){--_track-color-background: var(--odx-color-selection-control-fill-selected-hover)}:host([aria-disabled=\"true\"]){--_track-color-background: var(--odx-color-disabled-fill);--_track-color-stroke: var(--odx-color-disabled-stroke);--_label-color-foreground: var(--odx-color-disabled-foreground);cursor:not-allowed;.thumb{box-shadow:none}}:host([aria-disabled=\"true\"][aria-checked=\"true\"]){--_track-color-background: var(--odx-color-disabled-fill-selected)}:host([aria-readonly=\"true\"]){cursor:default}}";
4424
4437
 
4425
4438
  var __defProp$e = Object.defineProperty;
4426
4439
  var __getOwnPropDesc$e = Object.getOwnPropertyDescriptor;
@@ -4472,7 +4485,7 @@ var __decorateClass$d = (decorators, target, key, kind) => {
4472
4485
  };
4473
4486
  let OdxTableBody = class extends CustomElement {
4474
4487
  connectedCallback() {
4475
- super.connectedCallback?.();
4488
+ super.connectedCallback();
4476
4489
  this.role = "rowgroup";
4477
4490
  }
4478
4491
  render() {
@@ -4497,7 +4510,7 @@ var __decorateClass$c = (decorators, target, key, kind) => {
4497
4510
  };
4498
4511
  let OdxTableCell = class extends CustomElement {
4499
4512
  connectedCallback() {
4500
- super.connectedCallback?.();
4513
+ super.connectedCallback();
4501
4514
  this.role = "gridcell";
4502
4515
  }
4503
4516
  render() {
@@ -4527,16 +4540,15 @@ var __accessCheck$4 = (obj, member, msg) => member.has(obj) || __typeError$4("Ca
4527
4540
  var __privateAdd$4 = (obj, member, value) => member.has(obj) ? __typeError$4("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
4528
4541
  var __privateMethod$4 = (obj, member, method) => (__accessCheck$4(obj, member, "access private method"), method);
4529
4542
  var _OdxTableCheckboxCell_instances, handleChange_fn$1;
4530
- let OdxTableCheckboxCell = class extends CustomElement {
4543
+ let OdxTableCheckboxCell = class extends CanBeDisabled(CustomElement) {
4531
4544
  constructor() {
4532
4545
  super(...arguments);
4533
4546
  __privateAdd$4(this, _OdxTableCheckboxCell_instances);
4534
4547
  this.checked = false;
4535
- this.disabled = false;
4536
4548
  this.indeterminate = false;
4537
4549
  }
4538
4550
  connectedCallback() {
4539
- super.connectedCallback?.();
4551
+ super.connectedCallback();
4540
4552
  this.role = "gridcell";
4541
4553
  }
4542
4554
  click() {
@@ -4560,9 +4572,6 @@ __decorateClass$b([
4560
4572
  __decorateClass$b([
4561
4573
  property({ type: Boolean })
4562
4574
  ], OdxTableCheckboxCell.prototype, "checked", 2);
4563
- __decorateClass$b([
4564
- property({ type: Boolean })
4565
- ], OdxTableCheckboxCell.prototype, "disabled", 2);
4566
4575
  __decorateClass$b([
4567
4576
  property({ type: Boolean })
4568
4577
  ], OdxTableCheckboxCell.prototype, "indeterminate", 2);
@@ -4588,7 +4597,7 @@ let OdxTableHeaderCell = class extends CustomElement {
4588
4597
  this.sortable = false;
4589
4598
  }
4590
4599
  connectedCallback() {
4591
- super.connectedCallback?.();
4600
+ super.connectedCallback();
4592
4601
  this.role = "columnheader";
4593
4602
  }
4594
4603
  render() {
@@ -4631,7 +4640,7 @@ let OdxTableHeader = class extends CheckboxFormControl {
4631
4640
  __privateAdd$3(this, _OdxTableHeader_instances);
4632
4641
  }
4633
4642
  connectedCallback() {
4634
- super.connectedCallback?.();
4643
+ super.connectedCallback();
4635
4644
  this.role = "row";
4636
4645
  }
4637
4646
  render() {
@@ -4673,11 +4682,10 @@ var __privateGet$2 = (obj, member, getter) => (__accessCheck$2(obj, member, "rea
4673
4682
  var __privateAdd$2 = (obj, member, value) => member.has(obj) ? __typeError$2("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
4674
4683
  var __privateMethod$2 = (obj, member, method) => (__accessCheck$2(obj, member, "access private method"), method);
4675
4684
  var _OdxTableRow_instances, handleSelectedChange_fn, handleSelectableChange_fn, _handleClick, _handleChange$1, handleSlotchange_fn, isCheckboxCell_fn;
4676
- let OdxTableRow = class extends CustomElement {
4685
+ let OdxTableRow = class extends CanBeDisabled(CustomElement) {
4677
4686
  constructor() {
4678
4687
  super(...arguments);
4679
4688
  __privateAdd$2(this, _OdxTableRow_instances);
4680
- this.disabled = false;
4681
4689
  this.selected = false;
4682
4690
  this.selectable = true;
4683
4691
  this.value = "";
@@ -4695,7 +4703,7 @@ let OdxTableRow = class extends CustomElement {
4695
4703
  });
4696
4704
  }
4697
4705
  connectedCallback() {
4698
- super.connectedCallback?.();
4706
+ super.connectedCallback();
4699
4707
  this.role = "row";
4700
4708
  }
4701
4709
  render() {
@@ -4743,9 +4751,6 @@ isCheckboxCell_fn = function(element) {
4743
4751
  __decorateClass$8([
4744
4752
  queryAssignedElements({ selector: OdxTableCheckboxCell.selector, flatten: true })
4745
4753
  ], OdxTableRow.prototype, "checkboxCells", 2);
4746
- __decorateClass$8([
4747
- property({ type: Boolean, reflect: true })
4748
- ], OdxTableRow.prototype, "disabled", 2);
4749
4754
  __decorateClass$8([
4750
4755
  property({ type: Boolean, reflect: true })
4751
4756
  ], OdxTableRow.prototype, "selected", 2);
@@ -4813,7 +4818,7 @@ let OdxTable = class extends CustomElement {
4813
4818
  return Array.from(this.querySelectorAll(OdxTableRow.selector));
4814
4819
  }
4815
4820
  connectedCallback() {
4816
- super.connectedCallback?.();
4821
+ super.connectedCallback();
4817
4822
  this.role = "grid";
4818
4823
  }
4819
4824
  render() {
@@ -4947,7 +4952,7 @@ let OdxToggleButton = class extends CheckboxFormControl {
4947
4952
  this.pressed = false;
4948
4953
  }
4949
4954
  connectedCallback() {
4950
- super.connectedCallback?.();
4955
+ super.connectedCallback();
4951
4956
  this.role = "button";
4952
4957
  }
4953
4958
  updateAriaAttributes() {
@@ -5063,7 +5068,7 @@ let OdxTooltip = class extends PopoverHost(CustomElement) {
5063
5068
  });
5064
5069
  }
5065
5070
  connectedCallback() {
5066
- super.connectedCallback?.();
5071
+ super.connectedCallback();
5067
5072
  this.id ||= getUniqueId("odx-tooltip");
5068
5073
  this.role = "tooltip";
5069
5074
  }
@@ -22,6 +22,8 @@ export interface FormatOptions {
22
22
  }
23
23
  export interface LocalizationOptions {
24
24
  defaultLocale: () => LocaleInput;
25
+ fallbackLanguage: () => Intl.UnicodeBCP47LocaleIdentifier;
26
+ fallbackTranslation: (key: string) => string;
25
27
  }
26
28
  export type I18nOptions = LocalizationOptions & FormatOptions;
27
29
  export declare function setI18nOptions(options?: Partial<I18nOptions> | null): void;
@@ -12,4 +12,4 @@ export interface IsLocalized {
12
12
  formatRelativeTime: typeof formatRelativeTime;
13
13
  }
14
14
  export declare const IsLocalized: <T extends Constructor<CustomElement>>(superClass: T) => Constructor<IsLocalized> & T;
15
- //# sourceMappingURL=is-localized.mixin.d.ts.map
15
+ //# sourceMappingURL=is-localized.d.ts.map
@@ -1,9 +1,9 @@
1
1
  import { ReadonlySignal } from '@lit-labs/preact-signals';
2
2
  import { LocaleInput } from './models.js';
3
- export type TranslateContext = Record<string, string | number | boolean> | string | number | boolean | null;
4
3
  type Translation = {
5
4
  [key: string]: Translation | string;
6
5
  };
6
+ export type TranslateContext = Record<string, string | number | boolean> | string | number | boolean | null;
7
7
  export declare function interpolate(value: string, context: Record<string, string | number>): string;
8
8
  export declare function setTranslation(locale: LocaleInput, translation: Translation): void;
9
9
  export declare function translate(key: string, contextInput?: TranslateContext, locale?: LocaleInput | null): ReadonlySignal<string>;
@@ -1,6 +1,6 @@
1
1
  export * from './lib/config.js';
2
2
  export * from './lib/format.js';
3
- export * from './lib/is-localized.mixin.js';
3
+ export * from './lib/is-localized.js';
4
4
  export * from './lib/localization.js';
5
5
  export * from './lib/models.js';
6
6
  export * from './lib/translate.js';
package/dist/i18n.js CHANGED
@@ -5,6 +5,8 @@ import { k as flattenObject, l as isNotNil } from './vendor-C_WVAD3D.js';
5
5
 
6
6
  const I18nOptions = createOptions({
7
7
  defaultLocale: () => navigator.language,
8
+ fallbackLanguage: () => "en",
9
+ fallbackTranslation: (key) => key,
8
10
  relativeTimeFormatOptions: { minUnit: "minute" }
9
11
  });
10
12
  const i18nOptions = signal(null);
@@ -79,7 +81,6 @@ function syncDocumentLanguage(root = document.documentElement) {
79
81
  });
80
82
  }
81
83
 
82
- const fallbackLocale = "en";
83
84
  const translations = signal({});
84
85
  function interpolate(value, context) {
85
86
  return value.replaceAll(/\{\{\s*([^}\s]+)\s*}}/g, (match, variableName) => {
@@ -92,11 +93,13 @@ function setTranslation(locale, translation) {
92
93
  }
93
94
  function translate(key, contextInput, locale) {
94
95
  return computed(() => {
95
- const translationRecord = getTranslationRecord(locale);
96
- if (!translationRecord) return key;
97
- const value = translationRecord?.[key] ?? getTranslationRecord(fallbackLocale)?.[key] ?? "";
96
+ const translation = getTranslationRecord(locale);
97
+ if (!translation) return key;
98
+ const { fallbackLanguage, fallbackTranslation: fallbackTranslateKey } = getI18nOptions();
99
+ const fallbackTranslation = getTranslationRecord(fallbackLanguage());
100
+ const value = translation?.[key] ?? fallbackTranslation?.[key] ?? fallbackTranslateKey(key);
98
101
  const context = typeof contextInput === "object" || contextInput === void 0 ? flattenObject(contextInput ?? {}) : { $implicit: contextInput.toString() };
99
- return interpolate(value, { ...getTranslationRecord(fallbackLocale), ...translationRecord, ...context });
102
+ return interpolate(value, { ...fallbackTranslation, ...translation, ...context });
100
103
  });
101
104
  }
102
105
  function getTranslationRecord(localeInput) {
@@ -1,5 +1,4 @@
1
1
  import { CSSResultGroup, HTMLTemplateResult, LitElement, TemplateResult } from 'lit';
2
- export declare function isCustomElementClass(candidate: unknown): candidate is typeof CustomElement;
3
2
  export declare function customElement(selector?: keyof HTMLElementTagNameMap, styles?: Array<string | CSSResultGroup>): (target: typeof CustomElement) => void;
4
3
  export declare class CustomElement extends LitElement {
5
4
  static selector: string;
@@ -1,9 +1,15 @@
1
+ import { ContextProvider } from '@lit/context';
1
2
  import { CustomElement } from '../custom-element.js';
2
3
  import { Constructor } from './dedupe-mixin.js';
3
4
  export interface CanBeDisabled {
4
5
  disabled: boolean;
5
- _contextDisabled: boolean;
6
- isContextDisabled(): boolean;
6
+ }
7
+ export declare const DisabledContext: {
8
+ __context__: boolean;
9
+ };
10
+ export declare class DisabledContextProvider extends ContextProvider<typeof DisabledContext, CanBeDisabled & CustomElement> {
11
+ constructor(host: CanBeDisabled & CustomElement);
12
+ hostUpdated(): void;
7
13
  }
8
14
  export declare const CanBeDisabled: <T extends Constructor<CustomElement>>(superClass: T) => Constructor<CanBeDisabled> & T;
9
15
  //# sourceMappingURL=can-be-disabled.d.ts.map
package/dist/loader.js CHANGED
@@ -1,11 +1,10 @@
1
- import { isCustomElementClass } from '@odx/foundation';
2
1
  import * as cdkComponents from '@odx/foundation/cdk';
3
2
  import * as components from '@odx/foundation/components';
4
3
 
5
4
  async function defineCustomElements() {
6
5
  for (const entry of Object.values({ ...components, ...cdkComponents })) {
7
- if (!isCustomElementClass(entry)) continue;
8
- entry.define();
6
+ if (typeof entry !== "function") continue;
7
+ entry.define?.();
9
8
  }
10
9
  }
11
10
  defineCustomElements();
package/dist/main.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { r as round, t as toMerged, c as createFocusTrap, u as uniqBy, R as RovingTabindexController } from './vendor-C_WVAD3D.js';
2
- import { isServer, nothing, html, LitElement, unsafeCSS, CSSResult } from 'lit';
2
+ import { isServer, nothing, html, LitElement, unsafeCSS } from 'lit';
3
3
  import { directive, Directive } from 'lit/directive.js';
4
4
  import { property, queryAssignedElements } from 'lit/decorators.js';
5
+ import { createContext, ContextProvider, consume } from '@lit/context';
5
6
  export { effect } from '@lit-labs/preact-signals';
6
7
 
7
8
  function createMutationObserver(callback) {
@@ -154,26 +155,25 @@ class SlotFallbackDirective extends Directive {
154
155
  }
155
156
  const emptySlotFallbackFix = directive(SlotFallbackDirective);
156
157
 
157
- const customElementStyles = "@layer reset,base,variant,state,theme,override;@layer reset{:is(*){box-sizing:border-box;scrollbar-width:thin}:before,:after{box-sizing:border-box}[popover]{border:none;outline:none}img,picture,video,canvas,svg{display:block;max-width:100%;margin:0}input,button,textarea,select{font:inherit;margin:0}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word;margin:0}p{text-wrap:pretty}h1,h2,h3,h4,h5,h6{text-wrap:balance}#root,#__next{isolation:isolate;margin:0}}@layer base{h1,h2,h3,h4,h5,h6{display:block;font-family:var(--odx-typography-font-family-brand);font-size:var(--_font-size);font-weight:var(--odx-typography-font-weight-semibold);line-height:var(--_line-height)}h6{--_font-size: var(--odx-breakpoint-font-size-heading-6);--_line-height: var(--odx-breakpoint-line-height-heading-6)}h5{--_font-size: var(--odx-breakpoint-font-size-heading-5);--_line-height: var(--odx-breakpoint-line-height-heading-5)}h4{--_font-size: var(--odx-breakpoint-font-size-heading-4);--_line-height: var(--odx-breakpoint-line-height-heading-4)}h3{--_font-size: var(--odx-breakpoint-font-size-heading-3);--_line-height: var(--odx-breakpoint-line-height-heading-3)}h2{--_font-size: var(--odx-breakpoint-font-size-heading-2);--_line-height: var(--odx-breakpoint-line-height-heading-2)}h1{--_font-size: var(--odx-breakpoint-font-size-heading-1);--_line-height: var(--odx-breakpoint-line-height-heading-1)}[odxPreventTextOverflow]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}@layer reset{:host{border:none;border-color:transparent;outline:none}}";
158
+ const customElementStyles = "@layer reset,base,variant,state;@layer reset{:is(*){box-sizing:border-box;scrollbar-width:thin}:before,:after{box-sizing:border-box}[popover]{border:none;outline:none}img,picture,video,canvas,svg{display:block;max-width:100%;margin:0}input,button,textarea,select{font:inherit;margin:0}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word;margin:0}p{text-wrap:pretty}h1,h2,h3,h4,h5,h6{text-wrap:balance}#root,#__next{isolation:isolate;margin:0}}@layer base{h1,h2,h3,h4,h5,h6{display:block;font-family:var(--odx-typography-font-family-brand);font-size:var(--_font-size);font-weight:var(--odx-typography-font-weight-semibold);line-height:var(--_line-height)}h6{--_font-size: var(--odx-breakpoint-font-size-heading-6);--_line-height: var(--odx-breakpoint-line-height-heading-6)}h5{--_font-size: var(--odx-breakpoint-font-size-heading-5);--_line-height: var(--odx-breakpoint-line-height-heading-5)}h4{--_font-size: var(--odx-breakpoint-font-size-heading-4);--_line-height: var(--odx-breakpoint-line-height-heading-4)}h3{--_font-size: var(--odx-breakpoint-font-size-heading-3);--_line-height: var(--odx-breakpoint-line-height-heading-3)}h2{--_font-size: var(--odx-breakpoint-font-size-heading-2);--_line-height: var(--odx-breakpoint-line-height-heading-2)}h1{--_font-size: var(--odx-breakpoint-font-size-heading-1);--_line-height: var(--odx-breakpoint-line-height-heading-1)}[odxPreventTextOverflow]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}}@layer reset{:host{border:none;border-color:transparent;outline:none}}";
158
159
 
159
- function toCSSResult(value) {
160
- return value instanceof CSSResult || value instanceof CSSStyleSheet ? value : unsafeCSS(value);
161
- }
162
- function isCustomElementClass(candidate) {
163
- if (!candidate || typeof candidate !== "function") return false;
164
- return "selector" in candidate && "define" in candidate && typeof candidate.define === "function";
160
+ function mergeStyleSheets(...stylesheets) {
161
+ const mergedStyles = [];
162
+ for (const styles of stylesheets) {
163
+ if (!styles) continue;
164
+ mergedStyles.push(typeof styles === "string" ? unsafeCSS(styles) : styles);
165
+ }
166
+ return uniqBy(mergedStyles, String).flat(10);
165
167
  }
166
168
  function customElement(selector, styles = []) {
167
169
  return (target) => {
168
- const preparedStyles = [customElementStyles, target.styles ?? [], ...styles].filter(Boolean).flat(2).map(toCSSResult);
169
- if (selector) {
170
- target.styles = uniqBy(preparedStyles, String);
171
- target.selector = selector;
172
- target.define = () => {
173
- if (customElements.get(selector)) return;
174
- customElements.define(selector, target);
175
- };
176
- }
170
+ if (!selector) return;
171
+ target.selector = selector;
172
+ target.styles = mergeStyleSheets(customElementStyles, target.styles, ...styles);
173
+ target.define = () => {
174
+ if (customElements.get(selector)) return;
175
+ customElements.define(selector, target);
176
+ };
177
177
  };
178
178
  }
179
179
  class CustomElement extends LitElement {
@@ -225,32 +225,37 @@ var __decorateClass$c = (decorators, target, key, kind) => {
225
225
  if (kind && result) __defProp$c(target, key, result);
226
226
  return result;
227
227
  };
228
+ const DisabledContext = createContext(Symbol("odx-disabled-context"));
229
+ class DisabledContextProvider extends ContextProvider {
230
+ constructor(host) {
231
+ super(host, { context: DisabledContext, initialValue: false });
232
+ }
233
+ hostUpdated() {
234
+ if (this.host.disabled === this.value) return;
235
+ this.setValue(this.host.disabled);
236
+ }
237
+ }
228
238
  const CanBeDisabled = dedupeMixin((superClass) => {
229
239
  class CanBeDisabledMixin extends superClass {
230
240
  constructor() {
231
241
  super(...arguments);
232
242
  this.#initialTabIndex = null;
233
- this._contextDisabled = false;
234
243
  this.disabled = false;
235
244
  }
236
245
  #initialTabIndex;
237
- isContextDisabled() {
238
- return this._contextDisabled || this.disabled;
239
- }
240
246
  connectedCallback() {
241
- super.connectedCallback?.();
247
+ super.connectedCallback();
242
248
  this.#initialTabIndex = this.hasAttribute("tabindex") ? this.tabIndex : null;
243
249
  }
244
250
  willUpdate(props) {
245
251
  super.willUpdate?.(props);
246
- if (props.has("_contextDisabled") || props.has("disabled")) {
252
+ if (props.has("disabled")) {
247
253
  this.#handleDisabledChange();
248
254
  }
249
255
  }
250
256
  #handleDisabledChange() {
251
- const disabled = this.isContextDisabled();
252
- this.ariaDisabled = toAriaBooleanAttribute(disabled);
253
- if (disabled) {
257
+ this.ariaDisabled = toAriaBooleanAttribute(this.disabled);
258
+ if (this.disabled) {
254
259
  this.tabIndex = -1;
255
260
  } else if (this.#initialTabIndex !== null) {
256
261
  this.tabIndex = this.#initialTabIndex;
@@ -260,9 +265,7 @@ const CanBeDisabled = dedupeMixin((superClass) => {
260
265
  }
261
266
  }
262
267
  __decorateClass$c([
263
- property({ type: Boolean })
264
- ], CanBeDisabledMixin.prototype, "_contextDisabled", 2);
265
- __decorateClass$c([
268
+ consume({ context: DisabledContext, subscribe: true }),
266
269
  property({ type: Boolean })
267
270
  ], CanBeDisabledMixin.prototype, "disabled", 2);
268
271
  return CanBeDisabledMixin;
@@ -506,7 +509,7 @@ class CheckboxFormControl extends FormControl(CustomElement) {
506
509
  }
507
510
  connectedCallback() {
508
511
  this.tabIndex = 0;
509
- super.connectedCallback?.();
512
+ super.connectedCallback();
510
513
  this.role ||= "checkbox";
511
514
  }
512
515
  updateAriaAttributes() {
@@ -650,7 +653,7 @@ class OptionControl extends CanBeDisabled(CustomElement) {
650
653
  this.removeAttribute("odx-active");
651
654
  }
652
655
  connectedCallback() {
653
- super.connectedCallback?.();
656
+ super.connectedCallback();
654
657
  this.role ||= "option";
655
658
  }
656
659
  willUpdate(changes) {
@@ -700,7 +703,7 @@ class RadioGroupFormControl extends FormControl(CustomElement) {
700
703
  return this.elements.filter((element) => this.isControl(element));
701
704
  }
702
705
  connectedCallback() {
703
- super.connectedCallback?.();
706
+ super.connectedCallback();
704
707
  this.role ||= "radiogroup";
705
708
  }
706
709
  isControl(element) {
@@ -871,7 +874,7 @@ const CanBeExpanded = dedupeMixin((superClass) => {
871
874
  }
872
875
  toggle(force, emitEvent = false) {
873
876
  const newState = force ?? !this.expanded;
874
- if (this.isContextDisabled() || this.expanded === newState) return;
877
+ if (this.disabled || this.expanded === newState) return;
875
878
  const currentState = this.expanded;
876
879
  this.expanded = newState;
877
880
  if (!emitEvent || !this.emit(newState ? "expand" : "collapse", { composed: true, bubbles: true })) return;
@@ -1127,4 +1130,4 @@ class SharedResizeObserverInstance {
1127
1130
  }
1128
1131
  const SharedResizeObserver = new SharedResizeObserverInstance();
1129
1132
 
1130
- export { CanBeDisabled, CanBeExpanded, CanBeReadonly, CanBeRequired, CanBeSelected, CanBeValidated, CheckboxFormControl, CheckboxGroupFormControl, CustomElement, FocusTrapController, FormControl, KeyboardKey, NumberControl, OptionControl, RadioGroupFormControl, SelectFormControl, SharedIntersectionObserver, SharedResizeObserver, WithLoadingState, clearUniqueIdCache, createIntersectionObserver, createMutationObserver, createOptions, createResizeObserver, customElement, dedupeMixin, emptySlotFallbackFix, findClosestDocument, forwardEvent, fromAriaBooleanAttribute, getAssignedElements, getElementFromEvent, getKeyboardEventInfo, getUniqueId, isCustomElementClass, optionalAttr, optionalSlot, parseDate, requestUpdateOnAriaChange, searchTextContent, toAriaBooleanAttribute, toPx, toggleAttribute, waitForAnimations };
1133
+ export { CanBeDisabled, CanBeExpanded, CanBeReadonly, CanBeRequired, CanBeSelected, CanBeValidated, CheckboxFormControl, CheckboxGroupFormControl, CustomElement, DisabledContext, DisabledContextProvider, FocusTrapController, FormControl, KeyboardKey, NumberControl, OptionControl, RadioGroupFormControl, SelectFormControl, SharedIntersectionObserver, SharedResizeObserver, WithLoadingState, clearUniqueIdCache, createIntersectionObserver, createMutationObserver, createOptions, createResizeObserver, customElement, dedupeMixin, emptySlotFallbackFix, findClosestDocument, forwardEvent, fromAriaBooleanAttribute, getAssignedElements, getElementFromEvent, getKeyboardEventInfo, getUniqueId, optionalAttr, optionalSlot, parseDate, requestUpdateOnAriaChange, searchTextContent, toAriaBooleanAttribute, toPx, toggleAttribute, waitForAnimations };
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.0",
4
+ "version": "1.0.0-beta.2",
5
5
  "author": "Drägerwerk AG & Co.KGaA",
6
6
  "license": "SEE LICENSE IN LICENSE",
7
7
  "homepage": "https://odx.draeger.com",
@@ -21,8 +21,8 @@
21
21
  "devDependencies": {
22
22
  "@floating-ui/dom": "1.6.13",
23
23
  "@odx/typescript-config": "*",
24
- "@spectrum-web-components/reactive-controllers": "1.3.0",
25
- "es-toolkit": "1.33.0",
24
+ "@spectrum-web-components/reactive-controllers": "1.4.0",
25
+ "es-toolkit": "1.34.1",
26
26
  "focus-trap": "7.6.4",
27
27
  "ts-lit-plugin": "2.0.2",
28
28
  "vite": "6.2.3",
@@ -32,7 +32,7 @@
32
32
  "peerDependencies": {
33
33
  "@odx/icons": "^4.0.0-rc.15"
34
34
  },
35
- "sideEffects": ["dist/loader.js", "dist/i18n.js", "*.css"],
35
+ "sideEffects": ["dist/loader.js", "*.css"],
36
36
  "exports": {
37
37
  ".": {
38
38
  "import": "./dist/main.js",