@odx/foundation 1.0.0-beta.98 → 1.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/CHANGELOG.md +335 -0
  2. package/README.md +61 -29
  3. package/dist/lib/breakpoints.d.ts +61 -0
  4. package/dist/lib/breakpoints.js +139 -0
  5. package/dist/lib/format.d.ts +58 -0
  6. package/dist/lib/format.js +63 -0
  7. package/dist/lib/localization.d.ts +12 -0
  8. package/dist/lib/localization.js +28 -0
  9. package/dist/lib/models.d.ts +39 -0
  10. package/dist/lib/models.js +34 -0
  11. package/dist/lib/signals.d.ts +20 -0
  12. package/dist/lib/signals.js +47 -0
  13. package/dist/lib/theming.d.ts +18 -0
  14. package/dist/lib/theming.js +38 -0
  15. package/dist/lib/utils/breakpoint.d.ts +38 -0
  16. package/dist/lib/utils/breakpoint.js +103 -0
  17. package/dist/lib/utils/shared-media-observer.d.ts +4 -0
  18. package/dist/lib/utils/shared-media-observer.js +43 -0
  19. package/dist/main.d.ts +7 -0
  20. package/dist/main.js +5 -1206
  21. package/dist/oss-licenses.json +1 -0
  22. package/dist/styles.css +1 -1
  23. package/package.json +27 -50
  24. package/dist/_virtual_class-decorator-runtime.js +0 -13
  25. package/dist/components/accordion/accordion.d.ts +0 -25
  26. package/dist/components/accordion-item/accordion-item.d.ts +0 -26
  27. package/dist/components/accordion-panel/accordion-panel.d.ts +0 -13
  28. package/dist/components/action-button/action-button.d.ts +0 -27
  29. package/dist/components/anchor-navigation/anchor-navigation.d.ts +0 -21
  30. package/dist/components/anchor-navigation/anchor-observer.d.ts +0 -11
  31. package/dist/components/anchor-navigation/index.d.ts +0 -3
  32. package/dist/components/area-header/area-header.d.ts +0 -21
  33. package/dist/components/avatar/avatar.d.ts +0 -36
  34. package/dist/components/avatar-group/avatar-group.d.ts +0 -15
  35. package/dist/components/badge/badge.d.ts +0 -24
  36. package/dist/components/breadcrumbs/breadcrumbs-item.d.ts +0 -17
  37. package/dist/components/breadcrumbs/breadcrumbs.d.ts +0 -21
  38. package/dist/components/breadcrumbs/index.d.ts +0 -3
  39. package/dist/components/button/button.d.ts +0 -54
  40. package/dist/components/button-group/button-group.d.ts +0 -20
  41. package/dist/components/card/card.d.ts +0 -15
  42. package/dist/components/checkbox/checkbox.d.ts +0 -14
  43. package/dist/components/checkbox-group/checkbox-group.d.ts +0 -19
  44. package/dist/components/chip/chip.d.ts +0 -31
  45. package/dist/components/circular-progress-bar/circular-progress-bar.d.ts +0 -49
  46. package/dist/components/combobox/autocomplete.d.ts +0 -23
  47. package/dist/components/content-box/content-box.d.ts +0 -11
  48. package/dist/components/dropdown/dropdown.d.ts +0 -25
  49. package/dist/components/form-field/form-field.d.ts +0 -16
  50. package/dist/components/format/base-format.d.ts +0 -13
  51. package/dist/components/format/format-bytes.d.ts +0 -13
  52. package/dist/components/format/format-date.d.ts +0 -14
  53. package/dist/components/format/format-number.d.ts +0 -20
  54. package/dist/components/format/index.d.ts +0 -6
  55. package/dist/components/format/relative-time.d.ts +0 -21
  56. package/dist/components/header/header-actions.d.ts +0 -10
  57. package/dist/components/header/header.d.ts +0 -14
  58. package/dist/components/header/index.d.ts +0 -3
  59. package/dist/components/headline/headline.d.ts +0 -22
  60. package/dist/components/highlight/highlight.d.ts +0 -23
  61. package/dist/components/icon-button/icon-button.d.ts +0 -14
  62. package/dist/components/image/image.d.ts +0 -34
  63. package/dist/components/inline-message/inline-message.d.ts +0 -28
  64. package/dist/components/input/input.d.ts +0 -28
  65. package/dist/components/kpi/kpi.d.ts +0 -36
  66. package/dist/components/line-clamp/line-clamp.d.ts +0 -12
  67. package/dist/components/link/link.d.ts +0 -11
  68. package/dist/components/list/list.d.ts +0 -15
  69. package/dist/components/list-item/list-item.d.ts +0 -26
  70. package/dist/components/loader.d.ts +0 -2
  71. package/dist/components/loading-overlay/loading-overlay.d.ts +0 -20
  72. package/dist/components/loading-spinner/loading-spinner.d.ts +0 -12
  73. package/dist/components/logo/logo.d.ts +0 -21
  74. package/dist/components/main-menu/index.d.ts +0 -6
  75. package/dist/components/main-menu/main-menu-button.d.ts +0 -12
  76. package/dist/components/main-menu/main-menu-link.d.ts +0 -9
  77. package/dist/components/main-menu/main-menu-subtitle.d.ts +0 -12
  78. package/dist/components/main-menu/main-menu-title.d.ts +0 -12
  79. package/dist/components/main-menu/main-menu.d.ts +0 -17
  80. package/dist/components/main.d.ts +0 -72
  81. package/dist/components/menu/index.d.ts +0 -3
  82. package/dist/components/menu/menu-label.d.ts +0 -9
  83. package/dist/components/menu/menu.d.ts +0 -21
  84. package/dist/components/menu-item/menu-item.d.ts +0 -14
  85. package/dist/components/modal/modal.d.ts +0 -37
  86. package/dist/components/navigation-item/navigation-item.d.ts +0 -22
  87. package/dist/components/option/option.d.ts +0 -11
  88. package/dist/components/page/page.d.ts +0 -27
  89. package/dist/components/page-layout/page-layout.d.ts +0 -11
  90. package/dist/components/pagination/pagination.d.ts +0 -32
  91. package/dist/components/popover/popover-host.d.ts +0 -34
  92. package/dist/components/popover/popover-observer.d.ts +0 -11
  93. package/dist/components/popover/popover.d.ts +0 -13
  94. package/dist/components/progress-bar/progress-bar.d.ts +0 -30
  95. package/dist/components/radio-button/radio-button.d.ts +0 -13
  96. package/dist/components/radio-group/radio-group.d.ts +0 -16
  97. package/dist/components/rail-navigation/rail-navigation.d.ts +0 -19
  98. package/dist/components/search-bar/index.d.ts +0 -3
  99. package/dist/components/search-bar/search-bar.d.ts +0 -33
  100. package/dist/components/search-bar/search-bar.events.d.ts +0 -7
  101. package/dist/components/select/select.d.ts +0 -24
  102. package/dist/components/separator/separator.d.ts +0 -21
  103. package/dist/components/skeleton/skeleton.d.ts +0 -31
  104. package/dist/components/slider/index.d.ts +0 -5
  105. package/dist/components/slider/slider-handle.d.ts +0 -28
  106. package/dist/components/slider/slider-marks.d.ts +0 -16
  107. package/dist/components/slider/slider.d.ts +0 -26
  108. package/dist/components/slider/slider.models.d.ts +0 -29
  109. package/dist/components/spacer/spacer.d.ts +0 -13
  110. package/dist/components/spinbox/spinbox.d.ts +0 -22
  111. package/dist/components/stack/stack.d.ts +0 -38
  112. package/dist/components/status/status.d.ts +0 -23
  113. package/dist/components/switch/switch.d.ts +0 -12
  114. package/dist/components/table/index.d.ts +0 -9
  115. package/dist/components/table/table-body.d.ts +0 -12
  116. package/dist/components/table/table-cell.d.ts +0 -12
  117. package/dist/components/table/table-checkbox-cell.d.ts +0 -19
  118. package/dist/components/table/table-header-cell.d.ts +0 -13
  119. package/dist/components/table/table-header.d.ts +0 -14
  120. package/dist/components/table/table-row.d.ts +0 -20
  121. package/dist/components/table/table.d.ts +0 -20
  122. package/dist/components/table/table.models.d.ts +0 -10
  123. package/dist/components/text/text.d.ts +0 -33
  124. package/dist/components/title/title.d.ts +0 -22
  125. package/dist/components/toast/toast.d.ts +0 -24
  126. package/dist/components/toggle-button/toggle-button.d.ts +0 -13
  127. package/dist/components/toggle-button-group/toggle-button-group.d.ts +0 -10
  128. package/dist/components/toggle-content/toggle-content.d.ts +0 -12
  129. package/dist/components/tooltip/tooltip.d.ts +0 -37
  130. package/dist/components/translate/translate.d.ts +0 -16
  131. package/dist/components/visually-hidden/visually-hidden.d.ts +0 -11
  132. package/dist/components.js +0 -4478
  133. package/dist/i18n/config.d.ts +0 -32
  134. package/dist/i18n/format.d.ts +0 -6
  135. package/dist/i18n/is-localized.d.ts +0 -15
  136. package/dist/i18n/localization.d.ts +0 -5
  137. package/dist/i18n/main.d.ts +0 -7
  138. package/dist/i18n/models.d.ts +0 -7
  139. package/dist/i18n/translate.d.ts +0 -11
  140. package/dist/i18n.js +0 -145
  141. package/dist/lib/control/checkbox-form-control.d.ts +0 -15
  142. package/dist/lib/control/checkbox-group-form-control.d.ts +0 -22
  143. package/dist/lib/control/form-control.d.ts +0 -29
  144. package/dist/lib/control/listbox-form-control.d.ts +0 -25
  145. package/dist/lib/control/number-form-control.d.ts +0 -12
  146. package/dist/lib/control/option-control.d.ts +0 -24
  147. package/dist/lib/control/radio-group-form-control.d.ts +0 -22
  148. package/dist/lib/controllers/active-descendants-controller.d.ts +0 -29
  149. package/dist/lib/controllers/drag.controller.d.ts +0 -19
  150. package/dist/lib/controllers/expandable-controller.d.ts +0 -17
  151. package/dist/lib/custom-element.d.ts +0 -16
  152. package/dist/lib/interactive/interactive-element.d.ts +0 -23
  153. package/dist/lib/interactive/interactive-link.d.ts +0 -21
  154. package/dist/lib/main.d.ts +0 -28
  155. package/dist/lib/mixins/can-be-disabled.d.ts +0 -7
  156. package/dist/lib/mixins/can-be-expanded.d.ts +0 -10
  157. package/dist/lib/mixins/is-draggable.d.ts +0 -16
  158. package/dist/lib/models/drag-event.d.ts +0 -9
  159. package/dist/lib/models/placement.d.ts +0 -17
  160. package/dist/lib/models/shape.d.ts +0 -7
  161. package/dist/lib/models/size.d.ts +0 -11
  162. package/dist/lib/models/variant.d.ts +0 -12
  163. package/dist/lib/utils/compute-popover-placement.d.ts +0 -14
  164. package/dist/lib/utils/dom.d.ts +0 -27
  165. package/dist/lib/utils/get-unique-id.d.ts +0 -19
  166. package/dist/lib/utils/lit.d.ts +0 -4
  167. package/dist/lib/utils/shared-resize-observer.d.ts +0 -11
  168. package/dist/lib/utils/types.d.ts +0 -60
  169. package/dist/loader.js +0 -7
  170. package/dist/vendor.js +0 -1982
@@ -1,4478 +0,0 @@
1
- import { _ as __decorateClass } from './_virtual_class-decorator-runtime.js';
2
- import { CustomElement, ExpandableItemManager, customElement, CanBeExpanded, InteractiveElement, getUniqueId, toAriaBooleanAttribute, Size, Variant, optionalAttr, InteractiveLink, getElementFromEvent, Shape, CanBeDisabled, optionalSlot, CheckboxFormControl, CheckboxGroupFormControl, SharedResizeObserver, findClosestDocument, Placement, waitForAnimations, PopoverPlacementOptions, computePopoverPlacement, getKeyInfo, FormControl, ActiveDescendantsController, getAssignedElement, parseDate, forwardEvent, OptionControl, toPx, RadioGroupFormControl, ListboxFormControl, IsDraggable, NumberFormControl, IS_DRAG_ACTIVE_ATTRIBUTE, DragController } from '@odx/foundation';
3
- import { queryAssignedElements, property, query, state } from 'lit/decorators.js';
4
- import { html, isServer, unsafeCSS, css, nothing } from 'lit';
5
- import { p as pick, e, a as autoUpdate, t as throttle, R as RovingTabindexController, r as round, g as debounce, n, i as c, j as e$1 } from './vendor.js';
6
- import { when } from 'lit/directives/when.js';
7
- import { IsLocalized, setTranslation } from '@odx/foundation/i18n';
8
- import { signal, computed } from '@preact/signals-core';
9
- import 'lit/html.js';
10
-
11
- const styles$1g = ":host{display:block}:host(:not([compact])) ::slotted(odx-accordion-item){margin-block:var(--odx-spacing-37)}";
12
-
13
- const AccordionIndicatorPosition = { START: "start", END: "end" };
14
- const _OdxAccordion = class _OdxAccordion extends CustomElement {
15
- constructor() {
16
- super();
17
- this.compact = false;
18
- this.indicatorPosition = AccordionIndicatorPosition.END;
19
- this.multiple = false;
20
- new ExpandableItemManager(this, { getItems: () => this.items });
21
- }
22
- static {
23
- customElement("odx-accordion", styles$1g)(_OdxAccordion);
24
- }
25
- updated(props) {
26
- super.updated(props);
27
- if (props.has("size") && this.size !== void 0) {
28
- for (const item of this.items) {
29
- item.size = this.size;
30
- }
31
- }
32
- }
33
- toggleAll(state, emitEvent = false) {
34
- for (const item of this.items) {
35
- item.toggle(state, emitEvent);
36
- }
37
- }
38
- };
39
- __decorateClass([
40
- queryAssignedElements({ selector: "odx-accordion-item", flatten: true })
41
- ], _OdxAccordion.prototype, "items", 2);
42
- __decorateClass([
43
- property({ type: Boolean, reflect: true, useDefault: true })
44
- ], _OdxAccordion.prototype, "compact", 2);
45
- __decorateClass([
46
- property({ reflect: true, useDefault: true, attribute: "indicator-position" })
47
- ], _OdxAccordion.prototype, "indicatorPosition", 2);
48
- __decorateClass([
49
- property({ type: Boolean })
50
- ], _OdxAccordion.prototype, "multiple", 2);
51
- __decorateClass([
52
- property()
53
- ], _OdxAccordion.prototype, "size", 2);
54
- let OdxAccordion = _OdxAccordion;
55
-
56
- const styles$1f = ":host{display:block;block-size:auto;min-block-size:var(--_block-size)}[part~=label]{display:flex;flex-direction:column;row-gap:var(--odx-size-37)}:host([expanded])::part(indicator){--rotate: 180deg}:host([size=\"lg\"]){--_padding-block: var(--odx-spacing-75)}";
57
-
58
- const AccordionItemSize = pick(Size, ["MD", "LG"]);
59
- const _OdxAccordionItem = class _OdxAccordionItem extends CanBeExpanded(InteractiveElement) {
60
- constructor() {
61
- super(...arguments);
62
- this.size = AccordionItemSize.MD;
63
- }
64
- static {
65
- customElement("odx-accordion-item", styles$1f)(_OdxAccordionItem);
66
- }
67
- get panel() {
68
- if (this.nextElementSibling?.role === "region") {
69
- return this.nextElementSibling;
70
- }
71
- return null;
72
- }
73
- renderContent() {
74
- return html`
75
- ${super.renderContent()}
76
- <odx-icon part="indicator" name="core::chevron-down"></odx-icon>
77
- `;
78
- }
79
- willUpdate(props) {
80
- super.willUpdate(props);
81
- if (props.has("disabled") || props.has("expanded")) {
82
- this.#handleExpandedChange();
83
- }
84
- }
85
- #handleExpandedChange() {
86
- if (!this.panel) return;
87
- this.id ||= getUniqueId(this.localName);
88
- this.ariaExpanded = toAriaBooleanAttribute(this.expanded);
89
- this.setAttribute("aria-controls", this.panel.id);
90
- this.panel.setAttribute("aria-labelledby", this.id);
91
- this.panel.hidden = this.disabled || !this.expanded;
92
- if (this.expanded) return;
93
- this.panel.querySelector("odx-accordion")?.toggleAll(false);
94
- }
95
- };
96
- __decorateClass([
97
- property({ reflect: true, useDefault: true })
98
- ], _OdxAccordionItem.prototype, "size", 2);
99
- let OdxAccordionItem = _OdxAccordionItem;
100
-
101
- const styles$1e = ":host{display:block;border-block-end:var(--odx-size-px) solid transparent}.content{padding:var(--odx-size-50);padding-block-start:var(--odx-size-12)}:host(:not(:last-of-type)){border-block-end-color:var(--odx-color-stroke-neutral-subtle)}::slotted(odx-accordion){margin-block:calc(-1 * var(--odx-size-37));margin-inline-end:calc(-1 * var(--odx-size-50))}";
102
-
103
- const _OdxAccordionPanel = class _OdxAccordionPanel extends CustomElement {
104
- constructor() {
105
- super(...arguments);
106
- this.hidden = true;
107
- }
108
- static {
109
- customElement("odx-accordion-panel", styles$1e)(_OdxAccordionPanel);
110
- }
111
- connectedCallback() {
112
- super.connectedCallback();
113
- this.id ||= getUniqueId(this.localName);
114
- this.role ||= "region";
115
- }
116
- render() {
117
- return html`
118
- <odx-toggle-content ?hidden=${this.hidden}>
119
- <div class="content"><slot></slot></div>
120
- </odx-toggle-content>
121
- `;
122
- }
123
- };
124
- __decorateClass([
125
- property({ type: Boolean, reflect: true, useDefault: true })
126
- ], _OdxAccordionPanel.prototype, "hidden", 2);
127
- let OdxAccordionPanel = _OdxAccordionPanel;
128
-
129
- const styles$1d = "@layer base{:host{--_padding-inline: var(--odx-size-75);--_icon-margin: calc(-.5 * (var(--_icon-size) - var(--_padding-inline)) - var(--odx-size-px))}:host,[part=base]{place-content:center}[part~=base]{outline-offset:var(--odx-focus-ring-offset);font-weight:var(--odx-typography-font-weight-medium)}[part=label]{flex:initial}::slotted(odx-avatar){--_color-foreground: inherit}}@layer variant{:host([size=\"xs\"]){--_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);::slotted(odx-avatar){--_size: var(--odx-size-125);--_spacing: calc(var(--odx-size-37) + var(--odx-size-px));font-size:var(--odx-typography-font-size-1)}[part~=base]{outline-offset:0}}:host([size=\"sm\"]){--_block-size: var(--odx-size-200);--_icon-margin: calc(-1 * var(--odx-size-12) + var(--odx-size-px));--_padding-inline: var(--odx-size-37);--_font-size: var(--odx-typography-font-size-2);--_icon-size: var(--odx-typography-font-size-5);::slotted(odx-avatar){--_size: var(--odx-size-175);--_spacing: calc(var(--odx-size-25) + var(--odx-size-px));font-size:var(--odx-typography-font-size-2)}[part~=base]{outline-offset: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);::slotted(odx-avatar){--_size: var(--odx-size-250);--_spacing: calc(var(--odx-size-75) + var(--odx-size-px));font-size:var(--odx-typography-font-size-3)}}:host(:is([variant=\"neutral\"],:not([variant]))){--_color-background: var(--odx-color-background-neutral-rest);--_color-background-hover: var(--odx-color-background-neutral-hover);--_color-background-pressed: var(--odx-color-background-neutral-pressed)}:host(:is([variant=\"neutral\"],:not([variant])):not([disabled])){--_color-stroke-hover: var(--odx-color-stroke-control-hover);--_color-stroke-pressed: var(--odx-color-stroke-control-pressed)}:host(:is([variant=\"neutral\"],:not([variant]))[loading]){--_color-stroke: var(--odx-color-stroke-neutral-subtle)}:host([variant=\"primary\"]){--_color-background: var(--odx-color-background-primary-rest);--_color-background-hover: var(--odx-color-background-primary-hover);--_color-background-pressed: var(--odx-color-background-primary-pressed);--_color-foreground: var(--odx-color-foreground-inverse-static)}:host([variant=\"accent\"]){--_color-background: var(--odx-color-background-accent-rest);--_color-background-hover: var(--odx-color-background-accent-hover);--_color-background-pressed: var(--odx-color-background-accent-pressed);--_color-foreground: var(--odx-color-foreground-inverse-static)}:host([variant=\"danger\"]){--_color-background: var(--odx-color-background-danger-rest);--_color-background-hover: var(--odx-color-background-danger-hover);--_color-background-pressed: var(--odx-color-background-danger-pressed);--_color-foreground: var(--odx-color-foreground-inverse-static)}:host([variant=\"ghost\"]){--_color-background: var(--odx-color-background-transparent-rest);--_color-background-hover: var(--odx-color-background-transparent-hover);--_color-background-pressed: var(--odx-color-background-transparent-pressed);[part~=base]{outline-offset:0}}:host([loading]){--_color-background: var(--odx-color-background-neutral-subtle);--_color-foreground: var(--odx-color-foreground-rest-subtle)}:host([variant=\"primary\"][loading]){--_color-background: var(--odx-color-background-primary-subtle)}:host([variant=\"accent\"][loading]){--_color-background: var(--odx-color-background-accent-subtle)}:host([variant=\"danger\"][loading]){--_color-background: var(--odx-color-background-danger-subtle)}:host([variant=\"ghost\"][loading]){--_color-background: var(--odx-color-background-transparent-rest)}}";
130
-
131
- const ButtonBadgeAlign = { START: "start", CENTER: "center", END: "end" };
132
- const ButtonSize = pick(Size, ["XS", "SM", "MD", "LG"]);
133
- const ButtonVariant = pick(Variant, ["NEUTRAL", "PRIMARY", "ACCENT", "DANGER", "GHOST"]);
134
- const _OdxButton = class _OdxButton extends InteractiveElement {
135
- constructor() {
136
- super();
137
- /** @internal */
138
- this.#internals = this.attachInternals();
139
- this.type = "button";
140
- this.size = ButtonSize.MD;
141
- this.variant = ButtonVariant.NEUTRAL;
142
- this.#handleClick = (_event) => {
143
- if (this.type === "submit") {
144
- this.#internals.form?.requestSubmit();
145
- return;
146
- }
147
- if (this.type === "reset") {
148
- this.#internals.form?.reset();
149
- return;
150
- }
151
- };
152
- if (!isServer) {
153
- this.addEventListener("click", this.#handleClick);
154
- }
155
- }
156
- static {
157
- customElement("odx-button", styles$1d)(_OdxButton);
158
- }
159
- static {
160
- /** @internal */
161
- this.formAssociated = true;
162
- }
163
- #internals;
164
- connectedCallback() {
165
- super.connectedCallback();
166
- this.toggleAttribute("odx-button", true);
167
- }
168
- render() {
169
- return html`
170
- ${super.render()}
171
- <slot name="badge"></slot>
172
- `;
173
- }
174
- #handleClick;
175
- };
176
- __decorateClass([
177
- property({ reflect: true, attribute: "align-badge" })
178
- ], _OdxButton.prototype, "alignBadge", 2);
179
- __decorateClass([
180
- property()
181
- ], _OdxButton.prototype, "type", 2);
182
- __decorateClass([
183
- property({ reflect: true, useDefault: true })
184
- ], _OdxButton.prototype, "size", 2);
185
- __decorateClass([
186
- property({ reflect: true, useDefault: true })
187
- ], _OdxButton.prototype, "variant", 2);
188
- let OdxButton = _OdxButton;
189
-
190
- const styles$1c = "@layer variant{:host([done]){--_color-background: var(--_color-background-pressed);--_color-stroke: var(--_color-stroke-pressed);cursor:default;[part=base]{pointer-events:none}}}";
191
-
192
- const _OdxActionButton = class _OdxActionButton extends OdxButton {
193
- constructor() {
194
- super(...arguments);
195
- this.isStatusMessageShown = false;
196
- this.done = false;
197
- this.statusIcon = "core::check-filled-mono";
198
- this.statusMessage = "";
199
- this.statusTimeout = 2e3;
200
- this.statusMessageTimeout = 1500;
201
- this.replaceContent = false;
202
- this.#handleClick = (event) => {
203
- event.stopImmediatePropagation();
204
- if (this.done || this.emit("invoke")) return;
205
- this.done = true;
206
- };
207
- }
208
- static {
209
- customElement("odx-action-button", styles$1c)(_OdxActionButton);
210
- }
211
- /** @internal */
212
- #statusTimeout;
213
- firstUpdated(props) {
214
- super.firstUpdated(props);
215
- this.nativeElement.addEventListener("click", this.#handleClick);
216
- }
217
- render() {
218
- return html`
219
- ${super.render()}
220
- ${when(
221
- !this.replaceContent && this.statusMessage,
222
- (statusMessage) => html`
223
- <odx-tooltip placement="top" .popover=${"manual"} .show=${this.isStatusMessageShown} timeout=${this.statusMessageTimeout}>
224
- <odx-text size="sm" strong>${statusMessage}</odx-text>
225
- </odx-tooltip>
226
- `
227
- )}
228
- `;
229
- }
230
- renderContent() {
231
- return html`
232
- <slot name="prefix"></slot>
233
- ${when(
234
- this.replaceContent && this.statusMessage && this.done,
235
- () => this.statusMessage,
236
- () => html`<slot></slot>`
237
- )}
238
- ${when(
239
- this.loading,
240
- () => this.renderLoader(),
241
- () => html`<odx-icon name=${optionalAttr(this.done ? this.statusIcon : this.icon)} part="icon"></odx-icon>`
242
- )}
243
- <slot name="badge"></slot>
244
- `;
245
- }
246
- willUpdate(props) {
247
- super.updated(props);
248
- if (props.has("done") && this.done) {
249
- this.#handleDoneChange();
250
- }
251
- }
252
- #handleDoneChange() {
253
- const timeoutDuration = Math.max(0, this.statusTimeout);
254
- this.isStatusMessageShown = true;
255
- this.tooltip?.mountPopover(this.nativeElement);
256
- if (this.statusTimeout <= 0) return;
257
- clearTimeout(this.#statusTimeout);
258
- this.#statusTimeout = window.setTimeout(() => {
259
- this.done = false;
260
- this.isStatusMessageShown = false;
261
- }, timeoutDuration);
262
- }
263
- #handleClick;
264
- };
265
- __decorateClass([
266
- query("odx-tooltip")
267
- ], _OdxActionButton.prototype, "tooltip", 2);
268
- __decorateClass([
269
- state()
270
- ], _OdxActionButton.prototype, "isStatusMessageShown", 2);
271
- __decorateClass([
272
- property({ type: Boolean, reflect: true, useDefault: true })
273
- ], _OdxActionButton.prototype, "done", 2);
274
- __decorateClass([
275
- property({ reflect: true, useDefault: true })
276
- ], _OdxActionButton.prototype, "icon", 2);
277
- __decorateClass([
278
- property({ attribute: "status-icon" })
279
- ], _OdxActionButton.prototype, "statusIcon", 2);
280
- __decorateClass([
281
- property({ attribute: "status-message" })
282
- ], _OdxActionButton.prototype, "statusMessage", 2);
283
- __decorateClass([
284
- property({ type: Number, attribute: "status-timeout" })
285
- ], _OdxActionButton.prototype, "statusTimeout", 2);
286
- __decorateClass([
287
- property({ attribute: false })
288
- ], _OdxActionButton.prototype, "statusMessageTimeout", 2);
289
- __decorateClass([
290
- property({ type: Boolean, attribute: "replace-content" })
291
- ], _OdxActionButton.prototype, "replaceContent", 2);
292
- let OdxActionButton = _OdxActionButton;
293
-
294
- const styles$1b = ":host{display:inline;text-decoration:underline;color:var(--odx-color-foreground-accent-rest)}:host(:focus-visible){outline:none}[part~=base]{transition:var(--odx-transition-reduced);outline:var(--odx-focus-ring-outline);outline-offset:0;border-radius:var(--odx-border-radius-controls);padding-inline:var(--odx-size-px);text-decoration:inherit;color:inherit;&:focus-visible{outline-color:var(--odx-color-stroke-focus-outer)}}:host(:hover){color:var(--odx-color-foreground-accent-hover)}:host([strong]){font-weight:var(--odx-typography-font-weight-medium)}:host([disabled]),:host([subtle]:not(:hover)){text-decoration:none}:host([disabled]){color:var(--odx-color-foreground-rest-subtle);[part~=base]{cursor:default}}";
295
-
296
- const _OdxLink = class _OdxLink extends InteractiveLink {
297
- constructor() {
298
- super(...arguments);
299
- this.strong = false;
300
- this.subtle = false;
301
- }
302
- static {
303
- customElement("odx-link", styles$1b)(_OdxLink);
304
- }
305
- };
306
- __decorateClass([
307
- property({ type: Boolean, reflect: true, useDefault: true })
308
- ], _OdxLink.prototype, "strong", 2);
309
- __decorateClass([
310
- property({ type: Boolean, reflect: true, useDefault: true })
311
- ], _OdxLink.prototype, "subtle", 2);
312
- let OdxLink = _OdxLink;
313
-
314
- const styles$1a = ":host{display:flex;gap:var(--odx-size-50)}odx-link{display:block;transition:var(--odx-transition-reduced);transition-property:border-color,color;padding-inline:var(--odx-size-50);&[aria-current=true]{color:var(--odx-color-foreground-rest);font-weight:var(--odx-typography-font-weight-medium)}}:host(:not([vertical])){align-items:center;block-size:var(--odx-size-225);odx-link{--_outline-offset: var(--odx-focus-ring-offset);&[aria-current=true]{border-radius:0;text-decoration:underline}}}:host([vertical]){flex-direction:column;border-inline-start:var(--odx-border-width-thick) solid var(--odx-color-stroke-control-rest);odx-link{margin-inline-start:calc(-1 * var(--odx-border-width-thick));border-inline-start:inherit;&[aria-current=true]{border-inline-start-color:var(--odx-color-background-accent-rest)}}}";
315
-
316
- const ANCHOR_SELECTOR = "odx-anchor";
317
- class AnchorObserver {
318
- constructor(root) {
319
- this.#intersectionState = signal({});
320
- this.anchors = signal([]);
321
- this.visibleAnchors = computed(() => {
322
- return this.anchors.value.filter((anchor) => !!this.#intersectionState.value[anchor.id]);
323
- });
324
- this.updateAnchors = () => {
325
- const anchors = Array.from(this.root.querySelectorAll(`[${ANCHOR_SELECTOR}][id]`));
326
- for (const anchor of anchors) {
327
- if (!this.#isAnchor(anchor)) continue;
328
- this.#intersectionObserver?.observe(anchor);
329
- }
330
- this.anchors.value = anchors;
331
- };
332
- this.#handleIntersection = (entries) => {
333
- const state = this.#intersectionState.value;
334
- for (const entry of entries) {
335
- if (!this.#isAnchor(entry.target)) continue;
336
- state[entry.target.id] = entry.isIntersecting;
337
- }
338
- this.#intersectionState.value = { ...state };
339
- };
340
- this.root = root ?? document;
341
- this.#intersectionObserver = new IntersectionObserver(this.#handleIntersection, { root });
342
- this.#mutationObserver = new MutationObserver((mutations) => {
343
- if (mutations.length === 0) return;
344
- this.updateAnchors();
345
- });
346
- }
347
- #intersectionObserver;
348
- #intersectionState;
349
- #mutationObserver;
350
- observe() {
351
- this.#mutationObserver?.observe(this.root, { attributes: true, childList: true, subtree: true, attributeFilter: ["odx-anchor"] });
352
- this.updateAnchors();
353
- }
354
- disconnect() {
355
- this.#intersectionObserver?.disconnect();
356
- this.#mutationObserver?.disconnect();
357
- }
358
- #isAnchor(element) {
359
- return (element.ariaLabel || element.textContent) && element.hasAttribute(ANCHOR_SELECTOR);
360
- }
361
- #handleIntersection;
362
- }
363
-
364
- const _OdxAnchorNavigation = class _OdxAnchorNavigation extends e(CustomElement) {
365
- constructor() {
366
- super();
367
- this.vertical = false;
368
- this.#handleClick = (event) => {
369
- const target = getElementFromEvent(event, (node) => node instanceof OdxLink);
370
- if (!target) return;
371
- event.preventDefault();
372
- document.querySelector(target.href)?.scrollIntoView();
373
- };
374
- this.addEventListener("click", this.#handleClick);
375
- }
376
- static {
377
- customElement("odx-anchor-navigation", styles$1a)(_OdxAnchorNavigation);
378
- }
379
- #anchorObserver;
380
- connectedCallback() {
381
- super.connectedCallback();
382
- this.#handleContainerChange();
383
- }
384
- disconnectedCallback() {
385
- this.#anchorObserver?.disconnect();
386
- super.disconnectedCallback();
387
- }
388
- renderAnchorLink(anchor, isActive = false) {
389
- return when(
390
- anchor.ariaLabel || anchor.textContent,
391
- (label) => html`
392
- <odx-link href="#${anchor.id}" aria-current=${isActive} subtle>
393
- ${when(!this.vertical, () => html`<odx-icon name="core::link-internal"></odx-icon>`)}
394
- ${label}
395
- </odx-link>
396
- `
397
- );
398
- }
399
- render() {
400
- const anchors = this.#anchorObserver?.anchors.value ?? [];
401
- const visibleAnchors = this.#anchorObserver?.visibleAnchors.value;
402
- return html`${anchors.map((anchor) => this.renderAnchorLink(anchor, visibleAnchors?.[0] === anchor))}`;
403
- }
404
- updated(props) {
405
- if (props.has("container")) {
406
- this.#handleContainerChange();
407
- }
408
- }
409
- #handleContainerChange() {
410
- const root = this.container ? document.querySelector(this.container) : null;
411
- if (root === this.#anchorObserver?.root) return;
412
- this.#anchorObserver?.disconnect();
413
- this.#anchorObserver = new AnchorObserver(root);
414
- this.#anchorObserver?.observe();
415
- }
416
- #handleClick;
417
- };
418
- __decorateClass([
419
- property()
420
- ], _OdxAnchorNavigation.prototype, "container", 2);
421
- __decorateClass([
422
- property({ type: Boolean, reflect: true, useDefault: true })
423
- ], _OdxAnchorNavigation.prototype, "vertical", 2);
424
- let OdxAnchorNavigation = _OdxAnchorNavigation;
425
-
426
- const styles$19 = ":host{display:flex;gap:var(--odx-size-150);align-items:center;justify-content:space-between;padding:var(--odx-size-75)}.content{margin-inline-end:auto}";
427
-
428
- const AreaHeaderSize = pick(Size, ["SM", "MD", "LG", "XL"]);
429
- const _OdxAreaHeader = class _OdxAreaHeader extends CustomElement {
430
- constructor() {
431
- super(...arguments);
432
- this.size = AreaHeaderSize.MD;
433
- }
434
- static {
435
- customElement("odx-area-header", styles$19)(_OdxAreaHeader);
436
- }
437
- render() {
438
- return html`
439
- <slot name="prefix"></slot>
440
- <div class="content">
441
- <slot></slot>
442
- </div>
443
- <slot name="suffix"></slot>
444
- `;
445
- }
446
- };
447
- __decorateClass([
448
- property({ reflect: true, useDefault: true })
449
- ], _OdxAreaHeader.prototype, "size", 2);
450
- let OdxAreaHeader = _OdxAreaHeader;
451
-
452
- 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);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(--odx-typography-font-size-3);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=\"accent\"]){--color-background: var(--odx-color-background-accent-rest);--color-foreground: var(--odx-color-foreground-inverse-static)}: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);font-weight:var(--odx-typography-font-weight-medium);::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)}:host([size=\"xxl\"]){--_size: var(--odx-size-600);font-size:var(--odx-typography-font-size-8)}";
453
-
454
- const AvatarShape = pick(Shape, ["CIRCLE", "RECTANGLE"]);
455
- const AvatarSize = pick(Size, ["SM", "MD", "LG", "XL", "XXL"]);
456
- const AvatarVariant = pick(Variant, ["NEUTRAL", "PRIMARY", "ACCENT"]);
457
- const _OdxAvatar = class _OdxAvatar extends CustomElement {
458
- constructor() {
459
- super(...arguments);
460
- this.shape = AvatarShape.CIRCLE;
461
- this.size = AvatarSize.MD;
462
- this.variant = AvatarVariant.NEUTRAL;
463
- }
464
- static {
465
- customElement("odx-avatar", styles$18)(_OdxAvatar);
466
- }
467
- };
468
- __decorateClass([
469
- property({ reflect: true, useDefault: true })
470
- ], _OdxAvatar.prototype, "shape", 2);
471
- __decorateClass([
472
- property({ reflect: true, useDefault: true })
473
- ], _OdxAvatar.prototype, "size", 2);
474
- __decorateClass([
475
- property({ reflect: true, useDefault: true })
476
- ], _OdxAvatar.prototype, "variant", 2);
477
- let OdxAvatar = _OdxAvatar;
478
-
479
- const styles$17 = ":host{display:flex;padding-inline:var(--odx-size-25);width:min-content}::slotted(odx-avatar){flex:0 0 auto;z-index:1}::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)}";
480
-
481
- const _OdxAvatarGroup = class _OdxAvatarGroup extends CustomElement {
482
- constructor() {
483
- super(...arguments);
484
- this.size = AvatarSize.MD;
485
- this.variant = AvatarVariant.NEUTRAL;
486
- }
487
- static {
488
- customElement("odx-avatar-group", styles$17)(_OdxAvatarGroup);
489
- }
490
- updated(props) {
491
- super.updated(props);
492
- if (props.has("size") || props.has("variant")) {
493
- for (const avatar of this.avatars) {
494
- avatar.shape = AvatarShape.CIRCLE;
495
- avatar.size = this.size;
496
- avatar.variant = this.variant;
497
- }
498
- }
499
- }
500
- };
501
- __decorateClass([
502
- queryAssignedElements({ selector: OdxAvatar.tagName })
503
- ], _OdxAvatarGroup.prototype, "avatars", 2);
504
- __decorateClass([
505
- property({ reflect: true, useDefault: true })
506
- ], _OdxAvatarGroup.prototype, "size", 2);
507
- __decorateClass([
508
- property({ reflect: true, useDefault: true })
509
- ], _OdxAvatarGroup.prototype, "variant", 2);
510
- let OdxAvatarGroup = _OdxAvatarGroup;
511
-
512
- const styles$16 = ":host{--_block-size: var(--odx-size-100);display:inline-block;border-radius:var(--odx-border-radius-circle);background-color:var(--_color-background);cursor:default;padding-inline:var(--odx-size-25);block-size:var(--_block-size);min-inline-size:var(--_block-size);vertical-align:middle;text-align:center;line-height:var(--_block-size);color:var(--_color-foreground);font-size:var(--odx-typography-font-size-1);font-weight:var(--odx-typography-font-weight-medium);pointer-events:none;user-select:none}@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,:host([variant=\"neutral\"]){--_color-background: var(--odx-experience-color-secondary-rest);--_color-foreground: var(--odx-experience-color-secondary-foreground)}:host([variant=\"primary\"]){--_color-background: var(--odx-color-background-primary-rest);--_color-foreground: var(--odx-color-foreground-inverse-static)}:host([variant=\"accent\"]){--_color-background: var(--odx-color-background-accent-rest);--_color-foreground: var(--odx-color-foreground-inverse-static)}:host([variant=\"success\"]){--_color-background: var(--odx-color-background-success-rest);--_color-foreground: var(--odx-color-foreground-rest-static)}:host([variant=\"warning\"]){--_color-background: var(--odx-color-background-warning-rest);--_color-foreground: var(--odx-color-foreground-rest-static)}:host([variant=\"danger\"]){--_color-background: var(--odx-color-background-danger-rest);--_color-foreground: var(--odx-color-foreground-inverse-static)}:host([compact]){--_block-size: var(--odx-size-75);margin:var(--odx-size-12);padding:0;inline-size:var(--_block-size)}:host([pulse]){animation:pulse 1.25s infinite}";
513
-
514
- const BadgeVariant = pick(Variant, ["NEUTRAL", "PRIMARY", "ACCENT", "SUCCESS", "WARNING", "DANGER"]);
515
- const _OdxBadge = class _OdxBadge extends CustomElement {
516
- constructor() {
517
- super(...arguments);
518
- this.compact = false;
519
- this.pulse = false;
520
- this.variant = BadgeVariant.NEUTRAL;
521
- }
522
- static {
523
- customElement("odx-badge", styles$16)(_OdxBadge);
524
- }
525
- render() {
526
- if (this.compact) {
527
- return html`<odx-visually-hidden><slot></slot></odx-visually-hidden>`;
528
- }
529
- return super.render();
530
- }
531
- };
532
- __decorateClass([
533
- property({ type: Boolean, reflect: true, useDefault: true })
534
- ], _OdxBadge.prototype, "compact", 2);
535
- __decorateClass([
536
- property({ type: Boolean, reflect: true, useDefault: true })
537
- ], _OdxBadge.prototype, "pulse", 2);
538
- __decorateClass([
539
- property({ reflect: true, useDefault: true })
540
- ], _OdxBadge.prototype, "variant", 2);
541
- let OdxBadge = _OdxBadge;
542
-
543
- const styles$15 = ":host{--_gap: var(--odx-size-37);display:flex;flex-wrap:wrap;column-gap:var(--_gap);place-items:center;cursor:default;padding-block:var(--odx-size-37);padding-inline:var(--odx-size-75);min-block-size:var(--odx-size-225)}odx-breadcrumb-item,::slotted(odx-breadcrumb-item){gap:var(--_gap)}";
544
-
545
- const styles$14 = ":host{display:contents}.separator{--size: var(--odx-size-75);margin:var(--odx-size-37);color:var(--odx-color-foreground-rest-subtle)}:host([hidden]){display:none}:host([aria-current=\"page\"]) ::slotted(odx-link){color:var(--odx-color-foreground-rest-subtle)!important}::slotted(*){margin:0}";
546
-
547
- const _OdxBreadcrumbsItem = class _OdxBreadcrumbsItem extends CustomElement {
548
- constructor() {
549
- super(...arguments);
550
- this.fallback = false;
551
- }
552
- static {
553
- customElement("odx-breadcrumbs-item", styles$14)(_OdxBreadcrumbsItem);
554
- }
555
- isLast() {
556
- return !this.nextElementSibling;
557
- }
558
- get interactiveElement() {
559
- return this.linkElements[0] ?? null;
560
- }
561
- render() {
562
- return html`
563
- <slot></slot>
564
- ${when(!this.isLast(), () => html`<odx-icon class="separator" name="chevron-right"></odx-icon>`)}
565
- `;
566
- }
567
- updated(props) {
568
- super.updated(props);
569
- if (this.interactiveElement) {
570
- this.interactiveElement.subtle = true;
571
- this.interactiveElement.strong = this.isLast();
572
- this.interactiveElement.ariaCurrent = this.isLast() ? "page" : null;
573
- }
574
- }
575
- };
576
- __decorateClass([
577
- queryAssignedElements({ selector: OdxLink.tagName, flatten: true })
578
- ], _OdxBreadcrumbsItem.prototype, "linkElements", 2);
579
- __decorateClass([
580
- property({ type: Boolean })
581
- ], _OdxBreadcrumbsItem.prototype, "fallback", 2);
582
- let OdxBreadcrumbsItem = _OdxBreadcrumbsItem;
583
-
584
- const _OdxBreadcrumbs = class _OdxBreadcrumbs extends CustomElement {
585
- constructor() {
586
- super(...arguments);
587
- this.max = 4;
588
- }
589
- static {
590
- customElement("odx-breadcrumbs", styles$15)(_OdxBreadcrumbs);
591
- }
592
- firstUpdated(props) {
593
- super.firstUpdated(props);
594
- this.role = "navigation";
595
- this.ariaLabel ||= "Breadcrumbs";
596
- }
597
- render() {
598
- if (Array.isArray(this.items)) {
599
- const items = this.items.filter((...args) => this.#isItemVisible(...args));
600
- return html`${items.map(({ label, href }) => html`<odx-breadcrumbs-item><odx-link href=${href}>${label}</odx-link></odx-breadcrumbs-item>`)}`;
601
- }
602
- return html`<slot @slotchange=${this.#updateContext}></slot>`;
603
- }
604
- updated(props) {
605
- super.updated(props);
606
- if (props.has("max")) {
607
- this.#updateContext();
608
- }
609
- }
610
- #isItemVisible(_, index, items) {
611
- return index === 0 || index > items.length - this.max;
612
- }
613
- #updateContext() {
614
- for (const [index, item] of this.itemElements.entries()) {
615
- item.hidden = !this.#isItemVisible(item, index, this.itemElements);
616
- }
617
- const renderedItemElements = this.shadowRoot?.querySelectorAll(OdxBreadcrumbsItem.tagName) ?? [];
618
- if (renderedItemElements.length === 0) return;
619
- for (const item of Array.from(renderedItemElements)) {
620
- item.requestUpdate();
621
- }
622
- }
623
- };
624
- __decorateClass([
625
- queryAssignedElements({ selector: OdxBreadcrumbsItem.tagName, flatten: true })
626
- ], _OdxBreadcrumbs.prototype, "itemElements", 2);
627
- __decorateClass([
628
- property({ type: Number })
629
- ], _OdxBreadcrumbs.prototype, "max", 2);
630
- __decorateClass([
631
- property({ attribute: false })
632
- ], _OdxBreadcrumbs.prototype, "items", 2);
633
- let OdxBreadcrumbs = _OdxBreadcrumbs;
634
-
635
- const styles$13 = ":host{display:inline-flex;gap:var(--odx-size-px);align-items:center}::slotted([odx-button]:not(:first-child,:last-child)){border-radius:0}::slotted([odx-button]:is(:hover,:focus-within)){z-index:1}:host([block]){display:flex;::slotted([odx-button]){width:100%}}:host(:not([vertical])){::slotted([odx-button]:first-child:not(:last-child)){border-start-end-radius:0;border-end-end-radius:0}::slotted(*){margin-inline:0}::slotted([odx-button]:last-child:not(:first-child)){border-start-start-radius:0;border-end-start-radius:0}}:host([vertical]){flex-direction:column;::slotted(*){margin-block:0}::slotted([odx-button]:first-child){border-end-start-radius:0;border-end-end-radius:0}::slotted([odx-button]:last-child){border-start-start-radius:0;border-start-end-radius:0}}";
636
-
637
- const _OdxButtonGroup = class _OdxButtonGroup extends CanBeDisabled(CustomElement) {
638
- constructor() {
639
- super(...arguments);
640
- this.block = false;
641
- this.vertical = false;
642
- this.#updateButtonVariants = () => {
643
- if (!this.variant) return;
644
- for (const button of this.buttons) {
645
- button.variant = this.variant;
646
- }
647
- };
648
- }
649
- static {
650
- customElement("odx-button-group", styles$13)(_OdxButtonGroup);
651
- }
652
- render() {
653
- return html`
654
- <slot @slotchange=${this.#updateButtonVariants}></slot>
655
- `;
656
- }
657
- updated(props) {
658
- super.updated(props);
659
- if (props.has("variant")) {
660
- this.#updateButtonVariants();
661
- }
662
- }
663
- #updateButtonVariants;
664
- };
665
- __decorateClass([
666
- queryAssignedElements({ selector: "button, odx-button", flatten: true })
667
- ], _OdxButtonGroup.prototype, "buttons", 2);
668
- __decorateClass([
669
- property({ type: Boolean, reflect: true, useDefault: true })
670
- ], _OdxButtonGroup.prototype, "block", 2);
671
- __decorateClass([
672
- property({ type: Boolean, reflect: true, useDefault: true })
673
- ], _OdxButtonGroup.prototype, "vertical", 2);
674
- __decorateClass([
675
- property()
676
- ], _OdxButtonGroup.prototype, "variant", 2);
677
- let OdxButtonGroup = _OdxButtonGroup;
678
-
679
- 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)}";
680
-
681
- const _OdxCard = class _OdxCard extends CanBeDisabled(CustomElement) {
682
- constructor() {
683
- super(...arguments);
684
- this.interactive = false;
685
- }
686
- static {
687
- customElement("odx-card", styles$12)(_OdxCard);
688
- }
689
- updated(_changedProperties) {
690
- super.updated(_changedProperties);
691
- if (this.disabled) return;
692
- if (this.interactive) {
693
- this.tabIndex = 0;
694
- } else {
695
- this.removeAttribute("tabindex");
696
- }
697
- }
698
- render() {
699
- return html`
700
- ${optionalSlot(this, "header-actions")}
701
- ${optionalSlot(this, "image")}
702
- ${optionalSlot(this, "avatar")}
703
- ${optionalSlot(this, "header")}
704
- <div class="content">
705
- <slot></slot>
706
- </div>
707
- ${optionalSlot(this, "footer")}
708
- `;
709
- }
710
- };
711
- __decorateClass([
712
- property({ type: Boolean, reflect: true })
713
- ], _OdxCard.prototype, "interactive", 2);
714
- let OdxCard = _OdxCard;
715
-
716
- 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)}";
717
-
718
- const _OdxCheckbox = class _OdxCheckbox extends CheckboxFormControl {
719
- constructor() {
720
- super(...arguments);
721
- this.indeterminate = false;
722
- }
723
- static {
724
- customElement("odx-checkbox", styles$11)(_OdxCheckbox);
725
- }
726
- render() {
727
- return html`
728
- <div class="indicator">
729
- <odx-icon name=${this.indeterminate ? "core::minus" : "core::check"}></odx-icon>
730
- </div>
731
- <div class="content">
732
- <div class="label">
733
- <slot></slot>
734
- </div>
735
- <div class="description">
736
- <slot name="description"></slot>
737
- </div>
738
- </div>
739
- `;
740
- }
741
- willUpdate(props) {
742
- super.willUpdate(props);
743
- if (props.has("indeterminate")) {
744
- if (this.indeterminate) {
745
- this.ariaChecked = "mixed";
746
- }
747
- }
748
- }
749
- toggle(state, dispatchEvent = false) {
750
- super.toggle(state, dispatchEvent);
751
- if (this.disabled || this.readonly) return;
752
- this.indeterminate = false;
753
- }
754
- };
755
- __decorateClass([
756
- property({ type: Boolean, reflect: true, useDefault: true })
757
- ], _OdxCheckbox.prototype, "indeterminate", 2);
758
- let OdxCheckbox = _OdxCheckbox;
759
-
760
- const styles$10 = ":host{display:flex;column-gap:var(--odx-size-75)}::slotted(odx-checkbox-group){margin-inline-start:var(--odx-size-75)}:host(:not([layout=\"horizontal\"])){flex-direction:column}:host([layout=\"list\"]) ::slotted(:is(odx-checkbox,odx-switch):last-of-type){border-block-end:none}:host([layout=\"list\"]) ::slotted(:is(odx-checkbox,odx-switch)){margin:0;border-block-end:var(--odx-border-width-thin) solid var(--odx-color-stroke-neutral-subtle);padding:var(--odx-size-75);inline-size:auto}";
761
-
762
- const CheckboxGroupLayout = { VERTICAL: "vertical", HORIZONTAL: "horizontal", LIST: "list" };
763
- const _OdxCheckboxGroup = class _OdxCheckboxGroup extends CheckboxGroupFormControl {
764
- constructor() {
765
- super(...arguments);
766
- this.layout = CheckboxGroupLayout.VERTICAL;
767
- this.#handleSlotChange = () => {
768
- this.groupControl?.removeEventListener("change", this.#handleGroupControlChange);
769
- this.groupControl?.addEventListener("change", this.#handleGroupControlChange);
770
- };
771
- this.#handleGroupControlChange = (event) => {
772
- if (!this.isGroupControl(event.target)) return;
773
- event.stopImmediatePropagation();
774
- this.updateValue(event.target.checked ? this.controls.map((control) => control.value) : [], true);
775
- };
776
- }
777
- static {
778
- customElement("odx-checkbox-group", styles$10)(_OdxCheckboxGroup);
779
- }
780
- render() {
781
- return html`<slot @slotchange=${this.#handleSlotChange}></slot>`;
782
- }
783
- #handleSlotChange;
784
- #handleGroupControlChange;
785
- };
786
- __decorateClass([
787
- property({ reflect: true, useDefault: true })
788
- ], _OdxCheckboxGroup.prototype, "layout", 2);
789
- let OdxCheckboxGroup = _OdxCheckboxGroup;
790
-
791
- const styles$$ = ":host{--_color-background: var(--odx-experience-color-secondary-rest);--_color-background-hover: var(--odx-experience-color-secondary-hover);--_color-foreground: var(--odx-experience-color-secondary-foreground);--_block-size: var(--odx-size-150);--_border-radius: var(--_block-size);--_padding-inline: var(--odx-size-50);display:inline-flex;gap:var(--odx-size-25);place-items:center;outline:var(--odx-focus-ring-outline);outline-offset:var(--odx-focus-ring-offset);border-radius:var(--_border-radius);background-color:var(--_color-background);cursor:inherit;padding-inline:var(--_padding-inline);block-size:var(--_block-size);overflow:hidden;color:var(--_color-foreground)}:host,[part=base]{transition:var(--odx-transition-reduced);transition-property:color,background-color}[part=base]{min-inline-size:var(--odx-size-150);text-align:center;line-height:inherit;font-weight:var(--odx-typography-font-weight-medium);user-select:none}::slotted(odx-icon){font-size:var(--odx-font-size-text-md)}.action{margin-inline-end:calc(-1 * var(--_padding-inline));border-radius:inherit;&::part(base){outline-offset:calc(-1 * var(--odx-focus-ring-offset))}}:host(:focus-visible){outline-color:var(--odx-color-stroke-focus-outer)}:host([variant=\"primary\"]){--_color-background: var(--odx-color-background-primary-rest);--_color-background-hover: var(--odx-color-background-primary-hover);--_color-foreground: var(--odx-color-foreground-inverse-static)}:host([variant=\"accent\"]){--_color-background: var(--odx-color-background-accent-rest);--_color-background-hover: var(--odx-color-background-accent-hover);--_color-foreground: var(--odx-color-foreground-inverse-static)}:host([variant=\"success\"]){--_color-background: var(--odx-color-background-success-rest);--_color-background-hover: var(--odx-color-success-hover);--_color-foreground: var(--odx-color-success-text)}:host([variant=\"warning\"]){--_color-background: var(--odx-color-background-warning-rest);--_color-background-hover: var(--odx-color-background-warning-hover);--_color-foreground: var(--odx-color-foreground-rest)}:host([variant=\"danger\"]){--_color-background: var(--odx-color-background-danger-rest);--_color-background-hover: var(--odx-color-danger-rest-hover);--_color-foreground: var(--odx-color-foreground-inverse-static)}:host([disabled]){--_color-background: var(--odx-color-background-disabled-rest);--_color-foreground: var(--odx-color-foreground-disabled-rest);.action{pointer-events:none}}:host([interactive]){cursor:pointer}:host([interactive]:hover){--_color-background: var(--_color-background-hover)}:host([disabled][interactive]){--_color-background: var(--odx-color-background-disabled-rest);cursor:not-allowed}";
792
-
793
- const ChipVariant = pick(Variant, ["NEUTRAL", "PRIMARY", "ACCENT", "SUCCESS", "WARNING", "DANGER"]);
794
- const _OdxChip = class _OdxChip extends CanBeDisabled(CustomElement) {
795
- constructor() {
796
- super(...arguments);
797
- this.removable = false;
798
- this.interactive = false;
799
- this.variant = ChipVariant.NEUTRAL;
800
- this.#handleActionClick = (event) => {
801
- const actionElement = getElementFromEvent(event, (node) => !!this.actionElement && node === this.actionElement);
802
- if (!actionElement) return;
803
- event.stopPropagation();
804
- this.emit("remove");
805
- };
806
- this.#handleClick = (event) => {
807
- if (this.removable) {
808
- const actionElement = getElementFromEvent(event, (node) => !!this.actionElement && node === this.actionElement);
809
- if (actionElement) return;
810
- }
811
- };
812
- }
813
- static {
814
- customElement("odx-chip", styles$$)(_OdxChip);
815
- }
816
- render() {
817
- return html`
818
- <odx-text part="base" size="sm" strong odxPreventTextOverflow>
819
- <slot></slot>
820
- </odx-text>
821
- ${when(this.removable, () => this.renderAction())}
822
- `;
823
- }
824
- renderAction() {
825
- return html`
826
- <odx-icon-button class="action" icon="core::close" ?disabled=${this.disabled} @click=${this.#handleActionClick} variant="ghost" size="xs">
827
- </odx-icon-button>
828
- `;
829
- }
830
- willUpdate(props) {
831
- super.willUpdate(props);
832
- if ((props.has("interactive") || props.has("disabled")) && !this.disabled) {
833
- this.#updateTabIndex();
834
- }
835
- }
836
- #updateTabIndex() {
837
- if (this.interactive) {
838
- this.tabIndex = 0;
839
- if (!this.actionElement) return;
840
- this.actionElement.tabIndex = 0;
841
- } else {
842
- this.removeAttribute("tabindex");
843
- if (!this.actionElement) return;
844
- this.actionElement.removeAttribute("tabindex");
845
- }
846
- }
847
- updated(props) {
848
- if (props.has("removable") || props.has("interactive") || props.has("disabled")) {
849
- if (this.removable || this.interactive) {
850
- this.addEventListener("click", this.#handleClick, { capture: true });
851
- } else {
852
- this.removeEventListener("click", this.#handleClick);
853
- }
854
- }
855
- }
856
- #handleActionClick;
857
- #handleClick;
858
- };
859
- __decorateClass([
860
- query(".action")
861
- ], _OdxChip.prototype, "actionElement", 2);
862
- __decorateClass([
863
- property({ type: Boolean, reflect: true, useDefault: true })
864
- ], _OdxChip.prototype, "removable", 2);
865
- __decorateClass([
866
- property({ type: Boolean, reflect: true, useDefault: true })
867
- ], _OdxChip.prototype, "interactive", 2);
868
- __decorateClass([
869
- property({ reflect: true, useDefault: true })
870
- ], _OdxChip.prototype, "variant", 2);
871
- let OdxChip = _OdxChip;
872
-
873
- const styles$_ = ":host{--_indicator-color: var(--odx-color-background-primary-rest);--_track-color: var(--odx-palette-coolgray-10);display:flex;position:relative;place-content:center;place-items:center;block-size:100%;max-block-size:var(--_size);inline-size:100%;max-inline-size:var(--_size);color:currentcolor;aspect-ratio:1}:host::part(track),:host::part(indicator){fill:transparent}:host::part(indicator){stroke:var(--_indicator-color);transform:rotate(-90deg);transform-origin:center;transition:stroke-dashoffset var(--odx-motion-duration-fast) var(--odx-motion-easing-reduced)}:host::part(track){stroke:var(--_track-color)}:host([size=\"sm\"]){--_size: var(--odx-size-225)}:host([size=\"md\"]){--_size: var(--odx-size-300)}:host([size=\"lg\"]){--_size: var(--odx-size-400)}:host([indeterminate]:not([indeterminate=\"false\"]))::part(inner){animation:1.75s linear infinite odx-circular-progress-inner-animation}:host([indeterminate]:not([indeterminate=\"false\"]))::part(indicator){animation:1.75s ease infinite odx-circular-progress-indicator-animation both}@keyframes odx-circular-progress-indicator-animation{0%{stroke-dashoffset:100}25%{stroke-dashoffset:250;transform:rotate(180deg)}to{stroke-dashoffset:100;transform:rotate(270deg)}}@keyframes odx-circular-progress-inner-animation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}";
874
-
875
- const CircularProgressBarSize = pick(Size, ["SM", "MD", "LG"]);
876
- const _OdxCircularProgressBar = class _OdxCircularProgressBar extends CustomElement {
877
- constructor() {
878
- super(...arguments);
879
- this.#value = 0;
880
- this.viewPortSize = 100;
881
- this.stroke = 4;
882
- this.indeterminate = false;
883
- this.size = CircularProgressBarSize.SM;
884
- }
885
- static {
886
- customElement("odx-circular-progress-bar", styles$_)(_OdxCircularProgressBar);
887
- }
888
- #value;
889
- get #circumference() {
890
- return Math.floor(2 * this.#radius * Math.PI);
891
- }
892
- get #radius() {
893
- return Math.max(0, this.viewPortSize / 2 - this.#normalizedStrokeWidth / 2);
894
- }
895
- set value(val) {
896
- this.#value = Math.max(-1, Math.min(100, val));
897
- this.indeterminate = val === -1;
898
- this.setAttribute("aria-valuenow", `${this.indeterminate ? 0 : val}`);
899
- }
900
- get value() {
901
- return this.#value;
902
- }
903
- get #progressValue() {
904
- return this.indeterminate ? this.#circumference : Math.floor((1 - this.#value / 100) * this.#circumference);
905
- }
906
- get #normalizedStrokeWidth() {
907
- if (this.stroke < 0) return 0;
908
- const normalizeFactor = this.viewPortSize / (this.offsetWidth || 1);
909
- let stroke = normalizeFactor * this.stroke;
910
- if (normalizeFactor >= 3) {
911
- stroke = Math.max(0, stroke - normalizeFactor);
912
- }
913
- return stroke;
914
- }
915
- firstUpdated(changes) {
916
- super.firstUpdated(changes);
917
- SharedResizeObserver.observe(this, () => this.requestUpdate());
918
- this.#setAttributes();
919
- }
920
- disconnectedCallback() {
921
- super.disconnectedCallback();
922
- SharedResizeObserver.unobserve(this);
923
- }
924
- render() {
925
- return html`
926
- <svg part="inner" viewBox="0 0 ${this.viewPortSize} ${this.viewPortSize}">
927
- <circle
928
- part="track"
929
- stroke-width="${this.#normalizedStrokeWidth}"
930
- r="${this.#radius}"
931
- cx="50%"
932
- cy="50%"
933
- />
934
- <circle
935
- part="indicator"
936
- stroke-dasharray="${this.#circumference}"
937
- stroke-dashoffset="${this.#progressValue}"
938
- stroke-width="${this.#normalizedStrokeWidth}"
939
- r="${this.#radius}"
940
- cx="50%"
941
- cy="50%"
942
- />
943
- </svg>
944
- `;
945
- }
946
- #setAttributes() {
947
- this.setAttribute("aria-valuenow", `${this.indeterminate ? 0 : this.value}`);
948
- this.setAttribute("aria-valuemax", "100");
949
- this.setAttribute("aria-valuemin", "0");
950
- this.setAttribute("role", "meter");
951
- }
952
- };
953
- __decorateClass([
954
- property({ type: Number })
955
- ], _OdxCircularProgressBar.prototype, "value", 1);
956
- __decorateClass([
957
- property({ type: Number, reflect: true, useDefault: true })
958
- ], _OdxCircularProgressBar.prototype, "stroke", 2);
959
- __decorateClass([
960
- property({ type: Boolean, reflect: true, useDefault: true })
961
- ], _OdxCircularProgressBar.prototype, "indeterminate", 2);
962
- __decorateClass([
963
- property({ reflect: true, useDefault: true })
964
- ], _OdxCircularProgressBar.prototype, "size", 2);
965
- let OdxCircularProgressBar = _OdxCircularProgressBar;
966
-
967
- const styles$Z = "@layer base{:host{--max-block-size: 100%;--max-inline-size: 100%;--_popover-color-background: var(--odx-color-background-level-2);--_popover-color-foreground: var(--odx-color-foreground-rest);--_popover-min-block-size: inherit;--_popover-max-block-size: 100%;--_popover-min-inline-size: inherit;--_popover-max-inline-size: 100%;--_popover-transition: var(--odx-popover-transition, var(--odx-motion-duration-default));--_popover-offset: var(--odx-size-50);--_popover-shadow: var(--odx-popover-shadow, var(--odx-shadow-level-1));--_popover-outer-padding: var(--odx-size-75);--_popover-arrow-size: var(--odx-size-50);--_popover-arrow-offset: calc(var(--_popover-offset) - var(--_popover-arrow-size) / 2);--_max-block-size: min(var(--_popover-max-block-size), var(--max-block-size));--_max-inline-size: min(var(--_popover-max-inline-size), var(--max-inline-size));top:var(--_popover-position-y);left:var(--_popover-position-x);transform:translate3d(var(--_popover-transition-offset-x),var(--_popover-transition-offset-y),0);transition:opacity var(--_popover-transition),transform var(--_popover-transition) allow-discrete,overlay var(--_popover-transition) allow-discrete,display var(--_popover-transition) allow-discrete;opacity:0;margin:0;background-color:transparent;max-block-size:var(--_max-block-size);max-inline-size:var(--_max-inline-size)}:host(:not(:popover-open)){display:none}:host(:popover-open){display:flex;transform:translate(0);opacity:1;@starting-style{transform:translate(var(--_popover-transition-offset-x),var(--_popover-transition-offset-y));opacity:0}}odx-popover::part(arrow){transform:rotate(45deg)}}@layer state{:host([popover-placement^=\"top\"]){--_popover-transition-offset-x: 0;--_popover-transition-offset-y: calc(-1 * var(--_popover-offset));padding-block:var(--_popover-outer-padding) var(--_popover-offset);max-block-size:calc(var(--_max-block-size) - var(--_popover-outer-padding));odx-popover::part(arrow){bottom:var(--_popover-arrow-offset)}}:host([popover-placement^=\"right\"]){--_popover-transition-offset-x: var(--_popover-offset);--_popover-transition-offset-y: 0;padding-inline:var(--_popover-offset) var(--_popover-outer-padding);max-inline-size:calc(var(--_max-inline-size) - var(--_popover-outer-padding));odx-popover::part(arrow){left:var(--_popover-arrow-offset)}}:host([popover-placement^=\"bottom\"]){--_popover-transition-offset-x: 0;--_popover-transition-offset-y: var(--_popover-offset);--_popover-arrow-offset-y: calc(var(--_popover-offset) - 6px);padding-block:var(--_popover-offset) var(--_popover-outer-padding);max-block-size:calc(var(--_max-block-size) - var(--_popover-outer-padding));odx-popover::part(arrow){top:var(--_popover-arrow-offset)}}:host([popover-placement^=\"left\"]){--_popover-transition-offset-x: calc(-1 * var(--_popover-offset));--_popover-transition-offset-y: 0;--_popover-arrow-offset-x: calc(var(--_popover-offset) - var(--_arrow-size) / 2);--_popover-arrow-offset-y: 0;padding-inline:var(--_popover-offset) var(--_popover-outer-padding);max-inline-size:calc(var(--_max-inline-size) - var(--_popover-outer-padding));odx-popover::part(arrow){right:var(--_popover-offset)}}}";
968
-
969
- const popoverTargetAttribute = "odx-popovertarget";
970
- class PopoverObserver {
971
- #referenceElements = /* @__PURE__ */ new WeakMap();
972
- #mutationObserver;
973
- constructor(host) {
974
- this.host = host;
975
- this.root = findClosestDocument(host);
976
- }
977
- hasMountedPopover(element) {
978
- return this.#referenceElements.has(element);
979
- }
980
- observe() {
981
- this.#mutationObserver ??= new MutationObserver((mutations) => {
982
- if (mutations.length === 0) return;
983
- this.#updateReferenceElements();
984
- });
985
- this.#mutationObserver.observe(this.root, { attributes: true, subtree: true, childList: true, attributeFilter: [popoverTargetAttribute] });
986
- this.#updateReferenceElements();
987
- }
988
- disconnect() {
989
- this.#mutationObserver?.disconnect();
990
- }
991
- #updateReferenceElements() {
992
- for (const element of Array.from(this.root.querySelectorAll(`[${popoverTargetAttribute}]`))) {
993
- const popoverId = element.getAttribute(popoverTargetAttribute);
994
- if (popoverId !== this.host.id) continue;
995
- this.#referenceElements.set(element, popoverId);
996
- this.host.mountPopover(element);
997
- }
998
- }
999
- }
1000
-
1001
- class PopoverHost extends CanBeDisabled(CustomElement) {
1002
- constructor() {
1003
- super();
1004
- this.#currentReferenceElement = null;
1005
- this.#openPopovers = /* @__PURE__ */ new WeakSet();
1006
- this.placement = Placement.BOTTOM;
1007
- this.fpsLimit = 60;
1008
- this.#handleToggle = async (event) => {
1009
- if (this.isPopoverOpen()) {
1010
- await this.onBeforePopoverShow?.();
1011
- await waitForAnimations(this);
1012
- await this.onPopoverShow?.();
1013
- } else {
1014
- await this.onBeforePopoverHide?.();
1015
- await waitForAnimations(this);
1016
- await this.onPopoverHide?.();
1017
- }
1018
- if (!this.referenceElement) return;
1019
- if (event.newState === "open") {
1020
- this.#openPopovers.add(this.referenceElement);
1021
- } else {
1022
- this.#openPopovers.delete(this.referenceElement);
1023
- }
1024
- };
1025
- if (!isServer) {
1026
- this.addEventListener("toggle", this.#handleToggle);
1027
- }
1028
- }
1029
- static {
1030
- this.styles = unsafeCSS(styles$Z);
1031
- }
1032
- #currentReferenceElement;
1033
- #openPopovers;
1034
- #positionUpdater;
1035
- #observer;
1036
- set referenceElement(value) {
1037
- if (this.#currentReferenceElement === value) return;
1038
- this.#currentReferenceElement = value;
1039
- }
1040
- get referenceElement() {
1041
- return this.#currentReferenceElement;
1042
- }
1043
- get options() {
1044
- return PopoverPlacementOptions({ arrowElement: this.popoverElement.arrowElement, placement: this.placement });
1045
- }
1046
- connectedCallback() {
1047
- super.connectedCallback();
1048
- this.popover ??= "auto";
1049
- this.#connectObserver();
1050
- }
1051
- disconnectedCallback() {
1052
- super.disconnectedCallback();
1053
- this.#disconnectObserver();
1054
- if (!this.referenceElement) return;
1055
- this.unmountPopover(this.referenceElement);
1056
- this.hidePopover();
1057
- }
1058
- hasMountedPopover(element) {
1059
- return this.#observer?.hasMountedPopover(element) ?? false;
1060
- }
1061
- mountPopover(referenceElement) {
1062
- if (!referenceElement) return;
1063
- this.referenceElement = referenceElement;
1064
- }
1065
- unmountPopover(_referenceElement) {
1066
- this.referenceElement = null;
1067
- }
1068
- isPopoverOpen() {
1069
- return !!this.referenceElement && this.#openPopovers.has(this.referenceElement);
1070
- }
1071
- async showPopover() {
1072
- if (!this.referenceElement || this.disabled || this.canPopoverShow?.() === false) return;
1073
- await 0;
1074
- computePopoverPlacement(this.referenceElement, this, this.options);
1075
- super.showPopover();
1076
- this.#openPopovers.add(this.referenceElement);
1077
- this.#positionUpdater?.();
1078
- this.#positionUpdater = autoUpdate(
1079
- this.referenceElement,
1080
- this,
1081
- throttle(() => this.referenceElement && computePopoverPlacement(this.referenceElement, this, this.options), 1e3 / this.fpsLimit)
1082
- );
1083
- }
1084
- hidePopover() {
1085
- if (!this.isPopoverOpen() || this.canPopoverHide?.() === false) return;
1086
- this.#positionUpdater?.();
1087
- super.hidePopover();
1088
- if (this.referenceElement) {
1089
- this.#openPopovers.delete(this.referenceElement);
1090
- }
1091
- this.#positionUpdater = void 0;
1092
- }
1093
- togglePopover(state) {
1094
- const isOpen = state ?? !this.isPopoverOpen();
1095
- if (isOpen) {
1096
- this.showPopover();
1097
- } else {
1098
- this.hidePopover();
1099
- }
1100
- return isOpen;
1101
- }
1102
- updateReferenceElementFromEvent(event) {
1103
- const referenceElement = getElementFromEvent(event, (element) => this.hasMountedPopover(element));
1104
- if (!referenceElement) return;
1105
- this.referenceElement = referenceElement;
1106
- }
1107
- willUpdate(props) {
1108
- super.willUpdate(props);
1109
- if (props.has("referenceElement") && this.referenceElement !== props.get("referenceElement")) {
1110
- const previousReferenceElement = props.get("referenceElement");
1111
- if (previousReferenceElement) {
1112
- this.#openPopovers.delete(previousReferenceElement);
1113
- }
1114
- }
1115
- }
1116
- #connectObserver() {
1117
- this.#disconnectObserver();
1118
- this.#observer = new PopoverObserver(this);
1119
- this.#observer?.observe();
1120
- }
1121
- #disconnectObserver() {
1122
- this.#observer?.disconnect();
1123
- this.#observer = void 0;
1124
- }
1125
- #handleToggle;
1126
- }
1127
- __decorateClass([
1128
- query("odx-popover", true)
1129
- ], PopoverHost.prototype, "popoverElement", 2);
1130
- __decorateClass([
1131
- property({ attribute: false })
1132
- ], PopoverHost.prototype, "referenceElement", 1);
1133
- __decorateClass([
1134
- property({ reflect: true, useDefault: true })
1135
- ], PopoverHost.prototype, "placement", 2);
1136
- __decorateClass([
1137
- property({ attribute: false })
1138
- ], PopoverHost.prototype, "fpsLimit", 2);
1139
-
1140
- const styles$Y = ":host{--_popover-offset: var(--odx-size-37)}";
1141
-
1142
- const DropdownPlacement = { TOP: Placement.TOP, BOTTOM: Placement.BOTTOM };
1143
- const _OdxDropdown = class _OdxDropdown extends PopoverHost {
1144
- constructor() {
1145
- super(...arguments);
1146
- this.matchReferenceWidth = false;
1147
- this.placement = DropdownPlacement.BOTTOM;
1148
- this.#handleClick = (event) => {
1149
- if (event?.defaultPrevented) return;
1150
- this.updateReferenceElementFromEvent(event);
1151
- this.togglePopover();
1152
- };
1153
- this.#handleKeyboardEvent = (event) => {
1154
- const key = getKeyInfo(event);
1155
- if (!key.enter || event.defaultPrevented) return;
1156
- if (!this.isPopoverOpen()) {
1157
- event.stopImmediatePropagation();
1158
- }
1159
- this.showPopover();
1160
- };
1161
- }
1162
- static {
1163
- customElement("odx-dropdown", styles$Y)(_OdxDropdown);
1164
- }
1165
- get options() {
1166
- return PopoverPlacementOptions({
1167
- ...super.options,
1168
- matchReferenceWidth: this.matchReferenceWidth
1169
- });
1170
- }
1171
- connectedCallback() {
1172
- super.connectedCallback();
1173
- this.id ||= getUniqueId("odx-dropdown");
1174
- }
1175
- mountPopover(referenceElement) {
1176
- super.mountPopover(referenceElement);
1177
- if (!referenceElement) return;
1178
- this.#updateAriaAttributes(referenceElement, this.id);
1179
- referenceElement.addEventListener("click", this.#handleClick);
1180
- referenceElement.addEventListener("keydown", this.#handleKeyboardEvent);
1181
- }
1182
- unmountPopover(referenceElement) {
1183
- super.unmountPopover(referenceElement);
1184
- if (!referenceElement) return;
1185
- this.#updateAriaAttributes(referenceElement, null);
1186
- referenceElement.removeEventListener("click", this.#handleClick);
1187
- referenceElement.removeEventListener("keydown", this.#handleKeyboardEvent);
1188
- }
1189
- render() {
1190
- return html`
1191
- <odx-popover>
1192
- <slot></slot>
1193
- </odx-popover>
1194
- `;
1195
- }
1196
- willUpdate(props) {
1197
- super.willUpdate(props);
1198
- if (props.has("id") && this.referenceElement) {
1199
- this.#updateAriaAttributes(this.referenceElement, this.id);
1200
- }
1201
- }
1202
- #updateAriaAttributes(referenceElement, id) {
1203
- const ariaAttribute = this.role === "listbox" ? "aria-controls" : "aria-describedby";
1204
- if (id) {
1205
- referenceElement.setAttribute(ariaAttribute, id);
1206
- } else {
1207
- referenceElement.removeAttribute(ariaAttribute);
1208
- }
1209
- }
1210
- #handleClick;
1211
- #handleKeyboardEvent;
1212
- };
1213
- __decorateClass([
1214
- property({ type: Boolean, reflect: true, useDefault: true, attribute: "match-reference-width" })
1215
- ], _OdxDropdown.prototype, "matchReferenceWidth", 2);
1216
- __decorateClass([
1217
- property({ reflect: true, useDefault: true })
1218
- ], _OdxDropdown.prototype, "placement", 2);
1219
- let OdxDropdown = _OdxDropdown;
1220
-
1221
- const styles$X = "::highlight(odx-highlight){background-color:var(--odx-color-foreground-accent-rest);color:var(--odx-color-foreground-inverse-static)}:host([subtle]) ::highlight(odx-highlight){background-color:var(--odx-color-background-accent-subtle);color:var(--odx-color-foreground-accent-rest)}";
1222
-
1223
- const highlightAttribute = "odx-highlight";
1224
- const _OdxHighlight = class _OdxHighlight extends CanBeDisabled(CustomElement) {
1225
- constructor() {
1226
- super(...arguments);
1227
- this.root = this;
1228
- this.minlength = 0;
1229
- this.subtle = false;
1230
- }
1231
- static {
1232
- customElement("odx-highlight", styles$X)(_OdxHighlight);
1233
- }
1234
- updated(props) {
1235
- super.updated(props);
1236
- if (props.has("query") || props.has("selector") || props.has("minlength") && !this.disabled) {
1237
- this.#updateHighlight(this.query ?? "", this.minlength);
1238
- }
1239
- if (props.has("disabled") && this.disabled) {
1240
- CSS.highlights.delete(highlightAttribute);
1241
- return;
1242
- }
1243
- }
1244
- #updateHighlight(query, minlength) {
1245
- if (!CSS.highlights) return;
1246
- const selection = this.#searchTextContent(query.trim().toLowerCase(), minlength);
1247
- if (selection.length > 0) {
1248
- CSS.highlights.set(highlightAttribute, new Highlight(...selection));
1249
- } else {
1250
- CSS.highlights.delete(highlightAttribute);
1251
- }
1252
- }
1253
- #searchTextContent(query, minlength) {
1254
- const ranges = [];
1255
- if (!query || query.length < Math.max(minlength ?? 1, 1)) return ranges;
1256
- const walker = document.createTreeWalker(this.root, NodeFilter.SHOW_TEXT);
1257
- while (walker.nextNode()) {
1258
- const content = walker.currentNode.textContent?.toLowerCase();
1259
- if (!content?.includes(query)) continue;
1260
- const parentElement = walker.currentNode.parentElement;
1261
- if (this.selector && !parentElement?.closest(this.selector)) continue;
1262
- this.#createRange(content, query, (index) => {
1263
- const range = new Range();
1264
- range.setStart(walker.currentNode, index);
1265
- range.setEnd(walker.currentNode, index + query.length);
1266
- ranges.push(range);
1267
- });
1268
- }
1269
- return ranges;
1270
- }
1271
- #createRange(value, query, callback) {
1272
- let index = 0;
1273
- while (index < value.length) {
1274
- index = value.indexOf(query, index);
1275
- if (index === -1) break;
1276
- callback?.(index);
1277
- index += query.length;
1278
- }
1279
- }
1280
- };
1281
- __decorateClass([
1282
- property({ attribute: false })
1283
- ], _OdxHighlight.prototype, "root", 2);
1284
- __decorateClass([
1285
- property()
1286
- ], _OdxHighlight.prototype, "query", 2);
1287
- __decorateClass([
1288
- property()
1289
- ], _OdxHighlight.prototype, "selector", 2);
1290
- __decorateClass([
1291
- property({ type: Number })
1292
- ], _OdxHighlight.prototype, "minlength", 2);
1293
- __decorateClass([
1294
- property({ type: Boolean, reflect: true, useDefault: true })
1295
- ], _OdxHighlight.prototype, "subtle", 2);
1296
- let OdxHighlight = _OdxHighlight;
1297
-
1298
- const styles$W = ":host{display:block}odx-dropdown{--max-block-size: 320px}::slotted([hidden]){display:none}::slotted([slot=\"control\"]){inline-size:100%}";
1299
-
1300
- const _OdxAutocomplete = class _OdxAutocomplete extends FormControl {
1301
- constructor() {
1302
- super(...arguments);
1303
- this.activeDescendants = new ActiveDescendantsController(this, {
1304
- getItems: () => this.options,
1305
- onChange: (_, option, firstChange) => {
1306
- option?.scrollIntoView();
1307
- if (!option || firstChange || option.selected) return;
1308
- }
1309
- });
1310
- this.minQueryLength = 1;
1311
- this.searchFn = (option, query2) => {
1312
- if (!query2) return true;
1313
- return option.label.toLowerCase().includes(query2.toLowerCase().trim());
1314
- };
1315
- this.#handleControlSlotChange = () => {
1316
- if (!this.control) return;
1317
- this.control.addEventListener("blur", this.#handleControlFocusOut);
1318
- this.control.addEventListener("clear", this.#handleControlClear);
1319
- this.control.addEventListener("click", (event) => event.preventDefault());
1320
- this.control.addEventListener("focus", this.#handleControlFocusIn);
1321
- this.control.addEventListener("input", this.#handleControlInput);
1322
- this.control.addEventListener("keydown", this.#handleControlKeyboardEvent);
1323
- this.dropdown.popover = "manual";
1324
- this.dropdown.mountPopover(this.control);
1325
- };
1326
- this.#handleControlFocusIn = () => {
1327
- if (this.dropdown.canPopoverShow?.() === false) return;
1328
- this.dropdown.showPopover();
1329
- this.activeDescendants.activate();
1330
- };
1331
- this.#handleControlFocusOut = () => {
1332
- if (this.dropdown.canPopoverHide?.() === false) return;
1333
- this.activeDescendants.deactivate();
1334
- this.dropdown.hidePopover();
1335
- };
1336
- this.#handleControlClear = () => {
1337
- if (!this.dropdown.isPopoverOpen()) return;
1338
- this.#handleControlValueChange(void 0);
1339
- };
1340
- this.#handleControlInput = () => {
1341
- if (this.controlValue.length >= this.minQueryLength) {
1342
- this.dropdown.showPopover();
1343
- } else if (this.controlValue.length === 0) {
1344
- this.dropdown.hidePopover();
1345
- }
1346
- if (!this.dropdown.isPopoverOpen()) return;
1347
- this.#handleControlValueChange(this.controlValue);
1348
- };
1349
- this.#handleControlKeyboardEvent = (event) => {
1350
- if (!this.control) return;
1351
- const key = getKeyInfo(event);
1352
- if (key.enter || key.start || key.end || key.down || key.up) {
1353
- event.preventDefault();
1354
- }
1355
- if (key.space) {
1356
- event.stopImmediatePropagation();
1357
- }
1358
- if (this.activeDescendants.activeItem && key.enter) {
1359
- this.#handleControlValueChange(this.activeDescendants.activeItem.label);
1360
- }
1361
- };
1362
- }
1363
- static {
1364
- customElement("odx-autocomplete", styles$W)(_OdxAutocomplete);
1365
- }
1366
- get control() {
1367
- return getAssignedElement(this.shadowRoot, { slot: "control" });
1368
- }
1369
- get controlValue() {
1370
- return this.control?.value ?? "";
1371
- }
1372
- firstUpdated(props) {
1373
- super.firstUpdated(props);
1374
- const canPopoverShow = this.dropdown.canPopoverShow;
1375
- this.dropdown.canPopoverShow = () => {
1376
- return this.controlValue.length >= this.minQueryLength && canPopoverShow?.() !== false;
1377
- };
1378
- }
1379
- render() {
1380
- return html`
1381
- <slot name="control" @slotchange=${this.#handleControlSlotChange}></slot>
1382
- <odx-dropdown
1383
- part="dropdown"
1384
- role="listbox"
1385
- tabindex="-1"
1386
- ?disabled=${this.disabled}
1387
- match-reference-width
1388
- >
1389
- <odx-highlight minlength=${this.minQueryLength} selector="odx-option" subtle .root=${this}>
1390
- <odx-stack gap="xs">
1391
- <slot></slot>
1392
- </odx-stack>
1393
- </odx-highlight>
1394
- </odx-dropdown>
1395
- `;
1396
- }
1397
- #handleControlValueChange(value) {
1398
- if (!this.control) return;
1399
- this.control.value = value ?? "";
1400
- this.highlight.query = this.control.value;
1401
- let activeOptionIndex;
1402
- let selectedValue = "";
1403
- const allOptionsHidden = this.options.reduce((state, option, index) => {
1404
- option.hidden = !this.searchFn(option, this.controlValue);
1405
- option.selected = option.label === this.controlValue;
1406
- if (!option.hidden && activeOptionIndex === void 0) {
1407
- activeOptionIndex = index;
1408
- }
1409
- if (option.selected) {
1410
- selectedValue = option.value;
1411
- }
1412
- return state && option.hidden;
1413
- }, true);
1414
- if (allOptionsHidden) {
1415
- this.dropdown.hidePopover();
1416
- return;
1417
- }
1418
- if (this.activeDescendants.activeItem?.hidden) {
1419
- this.activeDescendants.update(activeOptionIndex);
1420
- }
1421
- if (this.value !== selectedValue) {
1422
- this.value = selectedValue;
1423
- this.emit("change");
1424
- }
1425
- }
1426
- #handleControlSlotChange;
1427
- #handleControlFocusIn;
1428
- #handleControlFocusOut;
1429
- #handleControlClear;
1430
- #handleControlInput;
1431
- #handleControlKeyboardEvent;
1432
- };
1433
- __decorateClass([
1434
- queryAssignedElements({ selector: '[role="option"]', flatten: true })
1435
- ], _OdxAutocomplete.prototype, "options", 2);
1436
- __decorateClass([
1437
- query(OdxHighlight.tagName, true)
1438
- ], _OdxAutocomplete.prototype, "highlight", 2);
1439
- __decorateClass([
1440
- query(OdxDropdown.tagName, true)
1441
- ], _OdxAutocomplete.prototype, "dropdown", 2);
1442
- __decorateClass([
1443
- property({ type: Number, attribute: "min-query-length" })
1444
- ], _OdxAutocomplete.prototype, "minQueryLength", 2);
1445
- let OdxAutocomplete = _OdxAutocomplete;
1446
-
1447
- const styles$V = ":host{display:block;background-color:var(--odx-color-background-level-1);padding:var(--odx-breakpoint-spacing-200)}::slotted(:is([slot=\"header\"],[slot=\"footer\"])){margin-inline:calc(-1 * var(--odx-size-75))}";
1448
-
1449
- class OdxContentBox extends CustomElement {
1450
- static {
1451
- customElement("odx-content-box", styles$V)(OdxContentBox);
1452
- }
1453
- render() {
1454
- return html`
1455
- <slot name="header"></slot>
1456
- <slot></slot>
1457
- <slot name="footer"></slot>
1458
- `;
1459
- }
1460
- }
1461
-
1462
- const styles$U = ":host{display:block}";
1463
-
1464
- const FORM_FIELD_CONTROL_SELECTOR = "odx-form-field-control";
1465
- const _OdxFormField = class _OdxFormField extends CustomElement {
1466
- static {
1467
- customElement("odx-form-field", styles$U)(_OdxFormField);
1468
- }
1469
- get control() {
1470
- return this.elements.find((element) => element.hasAttribute(FORM_FIELD_CONTROL_SELECTOR));
1471
- }
1472
- connectedCallback() {
1473
- super.connectedCallback();
1474
- }
1475
- render() {
1476
- const isValid = this.control?.checkValidity();
1477
- return html`
1478
- <slot @slotchange=${this.#handleSlotChange}></slot>
1479
- ${when(isValid === false, () => this.renderErrorMessage())}
1480
-
1481
- `;
1482
- }
1483
- renderErrorMessage() {
1484
- return html`
1485
- <odx-inline-message variant="danger">
1486
- ${this.control?.validationMessage}
1487
- </odx-inline-message>
1488
- `;
1489
- }
1490
- #handleSlotChange = () => {
1491
- this.control?.addEventListener("change", () => this.requestUpdate());
1492
- };
1493
- };
1494
- __decorateClass([
1495
- queryAssignedElements({ flatten: true })
1496
- ], _OdxFormField.prototype, "elements", 2);
1497
- let OdxFormField = _OdxFormField;
1498
-
1499
- class BaseFormat extends IsLocalized(CustomElement) {
1500
- static {
1501
- this.styles = [css`:host { display: inline; }`];
1502
- }
1503
- render() {
1504
- if (this.value != null) {
1505
- try {
1506
- return html`${this.transform(this.value) || this.fallbackValue}`;
1507
- } catch {
1508
- return html`${this.fallbackValue ?? nothing}`;
1509
- }
1510
- }
1511
- return html`${this.fallbackValue ?? nothing}`;
1512
- }
1513
- }
1514
- __decorateClass([
1515
- property()
1516
- ], BaseFormat.prototype, "fallbackValue", 2);
1517
-
1518
- const _OdxFormatBytes = class _OdxFormatBytes extends BaseFormat {
1519
- constructor() {
1520
- super(...arguments);
1521
- this.unit = "byte";
1522
- }
1523
- static {
1524
- customElement("odx-format-bytes")(_OdxFormatBytes);
1525
- }
1526
- static #unitPrefixesMap = {
1527
- bit: ["bit", "kilobit", "megabit", "gigabit", "terabit"],
1528
- byte: ["byte", "kilobyte", "megabyte", "gigabyte", "terabyte", "petabyte"]
1529
- };
1530
- transform(value) {
1531
- const units = _OdxFormatBytes.#unitPrefixesMap[this.unit];
1532
- const index = Math.min(Math.max(0, Math.floor(Math.log10(value) / 3)), units.length - 1);
1533
- const transformedValue = value / 1e3 ** index;
1534
- return this.formatNumber(transformedValue, {
1535
- maximumFractionDigits: 2,
1536
- style: "unit",
1537
- unit: units[index]
1538
- });
1539
- }
1540
- };
1541
- __decorateClass([
1542
- property({ type: Number })
1543
- ], _OdxFormatBytes.prototype, "value", 2);
1544
- __decorateClass([
1545
- property()
1546
- ], _OdxFormatBytes.prototype, "unit", 2);
1547
- let OdxFormatBytes = _OdxFormatBytes;
1548
-
1549
- const _OdxFormatDate = class _OdxFormatDate extends BaseFormat {
1550
- static {
1551
- customElement("odx-format-date")(_OdxFormatDate);
1552
- }
1553
- get valueAsDate() {
1554
- if (this.value == null || this.value === "") {
1555
- return null;
1556
- }
1557
- return parseDate(this.value);
1558
- }
1559
- transform(value) {
1560
- return this.formatDate(value, { dateStyle: this.dateStyle });
1561
- }
1562
- };
1563
- __decorateClass([
1564
- property()
1565
- ], _OdxFormatDate.prototype, "value", 2);
1566
- __decorateClass([
1567
- property()
1568
- ], _OdxFormatDate.prototype, "dateStyle", 2);
1569
- let OdxFormatDate = _OdxFormatDate;
1570
-
1571
- const _OdxFormatNumber = class _OdxFormatNumber extends BaseFormat {
1572
- static {
1573
- customElement("odx-format-number")(_OdxFormatNumber);
1574
- }
1575
- transform(value) {
1576
- return this.formatNumber(value, {
1577
- currency: this.currency,
1578
- currencyDisplay: this.currencyDisplay,
1579
- minimumFractionDigits: this.minimumFractionDigits,
1580
- maximumFractionDigits: this.maximumFractionDigits,
1581
- minimumIntegerDigits: this.minimumIntegerDigits,
1582
- unit: this.unit,
1583
- style: this.type
1584
- });
1585
- }
1586
- };
1587
- __decorateClass([
1588
- property({ type: Number })
1589
- ], _OdxFormatNumber.prototype, "value", 2);
1590
- __decorateClass([
1591
- property()
1592
- ], _OdxFormatNumber.prototype, "currency", 2);
1593
- __decorateClass([
1594
- property()
1595
- ], _OdxFormatNumber.prototype, "currencyDisplay", 2);
1596
- __decorateClass([
1597
- property({ type: Number })
1598
- ], _OdxFormatNumber.prototype, "minimumFractionDigits", 2);
1599
- __decorateClass([
1600
- property({ type: Number })
1601
- ], _OdxFormatNumber.prototype, "maximumFractionDigits", 2);
1602
- __decorateClass([
1603
- property({ type: Number })
1604
- ], _OdxFormatNumber.prototype, "minimumIntegerDigits", 2);
1605
- __decorateClass([
1606
- property()
1607
- ], _OdxFormatNumber.prototype, "type", 2);
1608
- __decorateClass([
1609
- property()
1610
- ], _OdxFormatNumber.prototype, "unit", 2);
1611
- __decorateClass([
1612
- property()
1613
- ], _OdxFormatNumber.prototype, "unitDisplay", 2);
1614
- let OdxFormatNumber = _OdxFormatNumber;
1615
-
1616
- const _OdxRelativeTime = class _OdxRelativeTime extends BaseFormat {
1617
- constructor() {
1618
- super(...arguments);
1619
- this.value = Date.now();
1620
- this.syncInterval = null;
1621
- }
1622
- static {
1623
- customElement("odx-relative-time")(_OdxRelativeTime);
1624
- }
1625
- #syncInterval;
1626
- get valueAsDate() {
1627
- if (this.value == null || this.value === "") {
1628
- return null;
1629
- }
1630
- return parseDate(this.value);
1631
- }
1632
- disconnectedCallback() {
1633
- super.disconnectedCallback();
1634
- clearInterval(this.#syncInterval);
1635
- }
1636
- willUpdate(props) {
1637
- super.willUpdate(props);
1638
- if (props.has("syncInterval")) {
1639
- this.#setupSyncInterval();
1640
- }
1641
- }
1642
- transform(value) {
1643
- const relativeTime = this.formatRelativeTime(value, { style: this.format, numeric: this.numeric, minUnit: this.minUnit });
1644
- return html`<time datetime=${optionalAttr(this.valueAsDate?.toISOString())}>${relativeTime}</time>`;
1645
- }
1646
- #setupSyncInterval() {
1647
- clearInterval(this.#syncInterval);
1648
- if (typeof this.syncInterval !== "number") return;
1649
- this.#syncInterval = window.setInterval(() => this.requestUpdate(), Math.max(this.syncInterval, 1e3));
1650
- }
1651
- };
1652
- __decorateClass([
1653
- property()
1654
- ], _OdxRelativeTime.prototype, "value", 2);
1655
- __decorateClass([
1656
- property()
1657
- ], _OdxRelativeTime.prototype, "format", 2);
1658
- __decorateClass([
1659
- property()
1660
- ], _OdxRelativeTime.prototype, "minUnit", 2);
1661
- __decorateClass([
1662
- property()
1663
- ], _OdxRelativeTime.prototype, "numeric", 2);
1664
- __decorateClass([
1665
- property({ type: Number })
1666
- ], _OdxRelativeTime.prototype, "syncInterval", 2);
1667
- let OdxRelativeTime = _OdxRelativeTime;
1668
-
1669
- const styles$T = ":host{display:block;line-height:inherit;color:inherit;font-family:var(--odx-typography-font-family-brand);font-size:inherit;font-weight:var(--odx-typography-font-weight-semibold)}:host([size=\"xs\"]){line-height:var(--odx-breakpoint-line-height-heading-6);font-size:var(--odx-breakpoint-font-size-heading-6);font-weight:var(--odx-typography-font-weight-semibold)}:host([size=\"sm\"]){line-height:var(--odx-breakpoint-line-height-heading-5);font-size:var(--odx-breakpoint-font-size-heading-5);font-weight:var(--odx-typography-font-weight-semibold)}:host([size=\"md\"]){line-height:var(--odx-breakpoint-line-height-heading-4);font-size:var(--odx-breakpoint-font-size-heading-4);font-weight:var(--odx-typography-font-weight-semibold)}:host([size=\"lg\"]){line-height:var(--odx-breakpoint-line-height-heading-3);font-size:var(--odx-breakpoint-font-size-heading-3);font-weight:var(--odx-typography-font-weight-semibold)}:host([size=\"xl\"]){line-height:var(--odx-breakpoint-line-height-heading-2);font-size:var(--odx-breakpoint-font-size-heading-2);font-weight:var(--odx-typography-font-weight-semibold)}:host([size=\"xxl\"]){line-height:var(--odx-breakpoint-line-height-heading-1);font-size:var(--odx-breakpoint-font-size-heading-1);font-weight:var(--odx-typography-font-weight-semibold)}";
1670
-
1671
- const TitleSize = pick(Size, ["XS", "SM", "MD", "LG", "XL", "XXL"]);
1672
- const _OdxTitle = class _OdxTitle extends CustomElement {
1673
- constructor() {
1674
- super(...arguments);
1675
- this.size = TitleSize.SM;
1676
- }
1677
- static {
1678
- customElement("odx-title", styles$T)(_OdxTitle);
1679
- }
1680
- willUpdate(props) {
1681
- super.willUpdate(props);
1682
- if (props.has("level")) {
1683
- this.role = typeof this.level === "number" ? "heading" : null;
1684
- this.ariaLevel = typeof this.level === "number" ? `${this.level}` : null;
1685
- }
1686
- }
1687
- };
1688
- __decorateClass([
1689
- property({ reflect: true, useDefault: true })
1690
- ], _OdxTitle.prototype, "size", 2);
1691
- __decorateClass([
1692
- property({ type: Number })
1693
- ], _OdxTitle.prototype, "level", 2);
1694
- let OdxTitle = _OdxTitle;
1695
-
1696
- const styles$S = ":host{display:block;position:relative}.base{display:flex;position:relative;column-gap:var(--odx-size-150);place-items:center;z-index:1;background-color:var(--odx-color-background-level-1);padding-inline:var(--odx-size-150);block-size:var(--odx-size-300)}.background{position:absolute;inset:0;z-index:0;box-shadow:0 0 0 100vmax var(--odx-color-background-level-1);background-color:var(--odx-color-background-level-1);clip-path:inset(0 -100vmax)}odx-logo{flex:0 0 auto}::slotted(odx-title){width:max-content}::slotted(odx-main-menu-button){margin-inline-end:calc(-1 * var(--odx-size-75))}::slotted(odx-header-actions){margin-inline-start:auto}@media screen and (width <= 600px){odx-logo{display:none}}";
1697
-
1698
- const _OdxHeader = class _OdxHeader extends CustomElement {
1699
- static {
1700
- customElement("odx-header", styles$S)(_OdxHeader);
1701
- }
1702
- connectedCallback() {
1703
- super.connectedCallback();
1704
- this.role = "banner";
1705
- }
1706
- render() {
1707
- return html`
1708
- <div class="base">
1709
- <slot name="prefix"></slot>
1710
- <odx-logo size="sm"></odx-logo>
1711
- <slot @slotchange=${this.#handleSlotChange}></slot>
1712
- <slot name="actions"></slot>
1713
- </div>
1714
- <div class="background"></div>
1715
- `;
1716
- }
1717
- #handleSlotChange = () => {
1718
- const [titleElement] = this.titleElements;
1719
- if (!titleElement) return;
1720
- titleElement.ariaLevel = "1";
1721
- titleElement.role = "heading";
1722
- titleElement.size = TitleSize.XS;
1723
- titleElement.setAttribute("odxPreventTextOverflow", "true");
1724
- };
1725
- };
1726
- __decorateClass([
1727
- queryAssignedElements({ selector: OdxTitle.tagName, flatten: true })
1728
- ], _OdxHeader.prototype, "titleElements", 2);
1729
- let OdxHeader = _OdxHeader;
1730
-
1731
- const styles$R = ":host{display:flex;gap:var(--odx-size-75);align-items:center;block-size:100%}::slotted(odx-separator){--min-size: var(--odx-size-150);--margin-inline: 0}";
1732
-
1733
- class OdxHeaderActions extends CustomElement {
1734
- static {
1735
- customElement("odx-header-actions", styles$R)(OdxHeaderActions);
1736
- }
1737
- connectedCallback() {
1738
- super.connectedCallback();
1739
- this.slot = "actions";
1740
- }
1741
- }
1742
-
1743
- const styles$Q = ":host{display:block;font-family:var(--odx-typography-font-family-brand);font-weight:var(--odx-typography-font-weight-semibold)}:host,:host([size=\"md\"]){line-height:var(--odx-breakpoint-line-height-display-md);font-size:var(--odx-breakpoint-font-size-display-md)}:host([size=\"sm\"]){line-height:var(--odx-breakpoint-line-height-display-sm);font-size:var(--odx-breakpoint-font-size-display-sm)}:host([size=\"lg\"]){line-height:var(--odx-breakpoint-line-height-display-lg);font-size:var(--odx-breakpoint-font-size-display-lg)}:host([size=\"xl\"]){line-height:var(--odx-breakpoint-line-height-display-xl);font-size:var(--odx-breakpoint-font-size-display-xl)}";
1744
-
1745
- const HeadlineSize = pick(Size, ["SM", "MD", "LG", "XL"]);
1746
- const _OdxHeadline = class _OdxHeadline extends CustomElement {
1747
- constructor() {
1748
- super(...arguments);
1749
- this.size = HeadlineSize.MD;
1750
- }
1751
- static {
1752
- customElement("odx-headline", styles$Q)(_OdxHeadline);
1753
- }
1754
- willUpdate(props) {
1755
- super.willUpdate(props);
1756
- if (props.has("level")) {
1757
- this.role = typeof this.level === "number" ? "heading" : null;
1758
- this.ariaLevel = typeof this.level === "number" ? `${this.level}` : null;
1759
- }
1760
- }
1761
- };
1762
- __decorateClass([
1763
- property({ reflect: true, useDefault: true })
1764
- ], _OdxHeadline.prototype, "size", 2);
1765
- __decorateClass([
1766
- property({ type: Number })
1767
- ], _OdxHeadline.prototype, "level", 2);
1768
- let OdxHeadline = _OdxHeadline;
1769
-
1770
- const styles$P = ":host{--icon-rotation: 0deg}[part=icon]{--rotate: var(--icon-rotation);transition:inherit}:host([float]){margin:var(--odx-size-100);border-radius:var(--odx-border-radius-circle);box-shadow:var(--odx-shadow-level-3)}";
1771
-
1772
- const _OdxIconButton = class _OdxIconButton extends OdxButton {
1773
- constructor() {
1774
- super(...arguments);
1775
- this.float = false;
1776
- }
1777
- static {
1778
- customElement("odx-icon-button", styles$P)(_OdxIconButton);
1779
- }
1780
- renderContent() {
1781
- return html`
1782
- ${when(
1783
- this.loading,
1784
- () => this.renderLoader(),
1785
- () => html`<odx-icon name=${optionalAttr(this.icon)} part="icon"></odx-icon>`
1786
- )}
1787
- <odx-visually-hidden>
1788
- <slot></slot>
1789
- </odx-visually-hidden>
1790
- <slot name="badge"></slot>
1791
- `;
1792
- }
1793
- };
1794
- __decorateClass([
1795
- property({ type: Boolean, reflect: true, useDefault: true })
1796
- ], _OdxIconButton.prototype, "float", 2);
1797
- __decorateClass([
1798
- property()
1799
- ], _OdxIconButton.prototype, "icon", 2);
1800
- let OdxIconButton = _OdxIconButton;
1801
-
1802
- const styles$O = ":host{display:block}";
1803
-
1804
- class ResourceLoader {
1805
- async load(resource) {
1806
- const response = await fetch(resource.src);
1807
- return this.parseResponse(response);
1808
- }
1809
- parseResponse(response) {
1810
- return response.blob();
1811
- }
1812
- }
1813
- class ImageLoader extends ResourceLoader {
1814
- load(options) {
1815
- return new Promise((resolve, reject) => {
1816
- const image = new Image();
1817
- image.src = options.src;
1818
- image.onload = () => resolve(image);
1819
- image.onerror = () => reject(new Error("Failed to load image"));
1820
- });
1821
- }
1822
- }
1823
- const _OdxImage = class _OdxImage extends CustomElement {
1824
- constructor() {
1825
- super(...arguments);
1826
- this.loadingError = false;
1827
- this.loading = true;
1828
- }
1829
- static {
1830
- customElement("odx-image", styles$O)(_OdxImage);
1831
- }
1832
- static {
1833
- this.loader = new ImageLoader();
1834
- }
1835
- render() {
1836
- return html`
1837
- ${when(!this.loadingError && this.image, () => this.image)}
1838
- ${when(this.loading, this.renderLoader)}
1839
- `;
1840
- }
1841
- renderLoader() {
1842
- return html`
1843
- <odx-loading-spinner></odx-loading-spinner>
1844
- `;
1845
- }
1846
- updated(props) {
1847
- super.updated(props);
1848
- if (props.has("src") && this.src) {
1849
- this.load(this.src);
1850
- this.checkVisibility();
1851
- }
1852
- if (props.has("height") || props.has("width")) {
1853
- this.#handleDimensionChange();
1854
- }
1855
- }
1856
- async load(src) {
1857
- this.image = void 0;
1858
- this.loading = true;
1859
- this.loadingError = false;
1860
- try {
1861
- this.image = await _OdxImage.loader.load({ src });
1862
- this.loading = false;
1863
- } catch {
1864
- this.loadingError = true;
1865
- }
1866
- }
1867
- #handleDimensionChange() {
1868
- if (!this.image) return;
1869
- this.image.width = this.width ?? this.image.width;
1870
- this.image.height = this.height ?? this.image.height;
1871
- }
1872
- };
1873
- __decorateClass([
1874
- state()
1875
- ], _OdxImage.prototype, "loadingError", 2);
1876
- __decorateClass([
1877
- state()
1878
- ], _OdxImage.prototype, "loading", 2);
1879
- __decorateClass([
1880
- state()
1881
- ], _OdxImage.prototype, "image", 2);
1882
- __decorateClass([
1883
- property()
1884
- ], _OdxImage.prototype, "src", 2);
1885
- __decorateClass([
1886
- property()
1887
- ], _OdxImage.prototype, "alt", 2);
1888
- __decorateClass([
1889
- property({ type: Number })
1890
- ], _OdxImage.prototype, "height", 2);
1891
- __decorateClass([
1892
- property({ type: Number })
1893
- ], _OdxImage.prototype, "width", 2);
1894
- let OdxImage = _OdxImage;
1895
-
1896
- const styles$N = ":host{display:flex;gap:var(--odx-size-75);align-items:flex-start;transition:var(--odx-transition-reduced);transition-property:background-color,color,display,opacity;border-color:var(--odx-color-stroke-neutral-subtle);background-color:var(--odx-color-background-level-1);padding:var(--odx-size-75);line-height:var(--odx-typography-line-height-base);color:var(--odx-color-foreground-rest);transition-behavior:allow-discrete;@starting-style{opacity:0}}.icon{--size: var(--odx-size-150)}.base{flex:1 1 auto;line-height:var(--odx-typography-line-height-base);font-size:var(--odx-typography-font-size-2)}.action{--_color-foreground: inherit;margin-block-start:calc(-1 * var(--odx-size-37));margin-inline-end:calc(-1 * var(--odx-size-37))}:host([strong]){border-block-end-width:var(--odx-border-width-thick);border-block-end-style:solid;padding-block-end:calc(var(--odx-size-75) - var(--odx-border-width-thick))}:host([variant=\"primary\"]){border-color:var(--odx-color-stroke-primary-rest);background-color:var(--odx-color-background-primary-subtle)}:host([variant=\"danger\"]){border-color:var(--odx-color-stroke-danger-rest);background-color:var(--odx-color-background-danger-subtle);color:var(--odx-color-foreground-danger-rest)}:host([variant=\"warning\"]){border-color:var(--odx-color-stroke-warning-rest);background-color:var(--odx-color-background-warning-subtle)}:host([variant=\"success\"]){border-color:var(--odx-color-stroke-success-rest);background-color:var(--odx-color-background-success-subtle)}:host([hidden]){display:none;opacity:0}";
1897
-
1898
- const iconMap = {
1899
- neutral: "core::info",
1900
- primary: "core::announcement",
1901
- success: "core::check-filled-mono",
1902
- warning: "core::warning",
1903
- danger: "core::error"
1904
- };
1905
- const InlineMessageVariant = pick(Variant, ["NEUTRAL", "PRIMARY", "SUCCESS", "WARNING", "DANGER"]);
1906
- const _OdxInlineMessage = class _OdxInlineMessage extends CustomElement {
1907
- constructor() {
1908
- super(...arguments);
1909
- this.closable = false;
1910
- this.strong = false;
1911
- this.variant = InlineMessageVariant.NEUTRAL;
1912
- }
1913
- static {
1914
- customElement("odx-inline-message", styles$N)(_OdxInlineMessage);
1915
- }
1916
- show() {
1917
- this.ariaHidden = toAriaBooleanAttribute(false);
1918
- }
1919
- async hide() {
1920
- if (this.emit("close")) return;
1921
- this.hidden = true;
1922
- await waitForAnimations(this);
1923
- this.emit("after-close", { cancelable: false });
1924
- }
1925
- render() {
1926
- const resolvedIcon = this.icon === void 0 ? this.variant ? iconMap[this.variant] : null : this.icon;
1927
- return html`
1928
- ${when(resolvedIcon, (icon) => html`<odx-icon class="icon" name=${icon}></odx-icon>`)}
1929
- <div class="base">
1930
- <slot></slot>
1931
- </div>
1932
- ${when(this.closable, () => html`<odx-icon-button class="action" icon="core::close" variant="ghost" @click=${() => this.hide()}></odx-icon-button>`)}
1933
- `;
1934
- }
1935
- };
1936
- __decorateClass([
1937
- property({ type: Boolean })
1938
- ], _OdxInlineMessage.prototype, "closable", 2);
1939
- __decorateClass([
1940
- property({ type: Boolean, reflect: true, useDefault: true })
1941
- ], _OdxInlineMessage.prototype, "strong", 2);
1942
- __decorateClass([
1943
- property()
1944
- ], _OdxInlineMessage.prototype, "icon", 2);
1945
- __decorateClass([
1946
- property({ reflect: true, useDefault: true })
1947
- ], _OdxInlineMessage.prototype, "variant", 2);
1948
- let OdxInlineMessage = _OdxInlineMessage;
1949
-
1950
- const styles$M = ":host{--_stroke-color: var(--odx-color-stroke-control-rest);display:inline-flex;position:relative;gap:var(--odx-size-37);place-items:center;transition:var(--odx-transition-reduced);transition-property:background-color,border-color;outline:var(--odx-focus-ring-outline);outline-offset:-2px;border-radius:var(--odx-border-radius-controls);background-color:var(--odx-color-background-control-rest);padding-inline:var(--odx-size-50);block-size:var(--odx-size-225);min-inline-size:15ch;overflow:hidden;font-size:var(--odx-font-size-text-md);&:after{position:absolute;inset-inline:0;bottom:0;transition:inherit;background-color:var(--_stroke-color);block-size:var(--odx-border-width-thin);content:\"\"}}[part~=control]{--_icon-size: var(--odx-typography-font-size-5);--_icon-margin: 0;--odx-color-background-disabled-rest: transparent}[part=input]{appearance:textfield;flex:1 1 auto;outline:none;border:none;background-color:transparent;padding:0;width:100%;block-size:100%;min-width:auto;text-align:inherit;color:inherit;font-weight:var(--odx-typography-font-weight-medium);&::placeholder{color:var(--odx-color-foreground-rest-subtle);font-weight:var(--odx-typography-font-weight-normal)}&::-webkit-inner-spin-button,&::-webkit-outer-spin-button,&::-webkit-search-decoration,&::-webkit-search-cancel-button,&::-webkit-search-results-button,&::-webkit-search-results-decoration{appearance:none;margin:0}}::slotted(odx-icon){--size: var(--odx-typography-font-size-5)}:host(:hover){border-bottom-color:var(--odx-color-stroke-control-hover);background-color:var(--odx-color-background-control-hover)}:host(:focus-within){outline-color:var(--odx-color-stroke-focus-outer);&:after{content:none}}:host(:is([clearable],[type=\"number\"]):not([readonly])){padding-inline-end:var(--odx-size-px)}:host([clearable]) [part=input]:placeholder-shown~[part*=control-clear]{display:none}:host([block]){display:block}:host([disabled]:not([readonly])){--_stroke-color: var(--odx-color-stroke-disabled-rest);background-color:var(--odx-color-background-disabled-rest);color:var(--odx-color-foreground-disabled-rest);[part~=input]::placeholder{color:var(--odx-color-foreground-disabled-rest)}}:host([readonly]){--_stroke-color: var(--odx-color-stroke-control-readonly);background-color:var(--odx-color-background-control-readonly);[part=input]{cursor:default}}:host([type=\"number\"]){min-inline-size:3ch;&:not([readonly]){text-align:center}}";
1951
-
1952
- const _OdxInput = class _OdxInput extends FormControl {
1953
- constructor() {
1954
- super(...arguments);
1955
- this.block = false;
1956
- this.clearable = false;
1957
- this.hideControls = false;
1958
- this.placeholder = "";
1959
- this.type = "text";
1960
- this.value = "";
1961
- this.#handleInput = (event) => {
1962
- this.value = event.target.value;
1963
- };
1964
- this.#handleKeyDown = (event) => {
1965
- if (!getKeyInfo(event).escape) return;
1966
- event.preventDefault();
1967
- this.clear();
1968
- };
1969
- }
1970
- static {
1971
- customElement("odx-input", styles$M)(_OdxInput);
1972
- }
1973
- clear() {
1974
- if (!this.#isClearable() || this.emit("clear")) return;
1975
- this.value = "";
1976
- this.focus();
1977
- }
1978
- stepUp() {
1979
- if (!this.nativeInput) return;
1980
- this.nativeInput.stepUp();
1981
- this.value = this.nativeInput.value;
1982
- this.requestUpdate();
1983
- }
1984
- stepDown() {
1985
- if (!this.nativeInput) return;
1986
- this.nativeInput.stepDown();
1987
- this.value = this.nativeInput.value;
1988
- this.requestUpdate();
1989
- }
1990
- willUpdate(props) {
1991
- if (props.has("type") && this.type === "number") {
1992
- this.min ||= 0;
1993
- this.max ||= 100;
1994
- this.step ||= 1;
1995
- this.value ||= String(this.min);
1996
- }
1997
- }
1998
- render() {
1999
- const isNumberInput = this.type === "number";
2000
- const min = isNumberInput ? this.min : void 0;
2001
- const max = isNumberInput ? this.max : void 0;
2002
- const canStepUp = max == null || this.value == null || Number(this.value) < max;
2003
- const canStepDown = min == null || this.value == null || Number(this.value) > min;
2004
- return html`
2005
- <slot name="prefix"></slot>
2006
- <input
2007
- placeholder=${this.disabled || this.readonly ? "" : this.placeholder}
2008
- part="input"
2009
- min=${optionalAttr(min)}
2010
- max=${optionalAttr(max)}
2011
- step=${optionalAttr(this.step)}
2012
- type=${this.type}
2013
- ?disabled=${this.disabled}
2014
- ?readonly=${this.readonly}
2015
- .value=${this.value}
2016
- size="1"
2017
- @keydown=${this.#handleKeyDown}
2018
- @change=${forwardEvent(this)}
2019
- @input=${this.#handleInput}
2020
- @search=${forwardEvent(this)}
2021
- />
2022
- ${when(
2023
- !this.readonly && isNumberInput,
2024
- () => html`
2025
- <odx-button-group>
2026
- ${this.renderControl("decrement", "core::minus", () => this.stepDown(), this.disabled || !canStepDown)}
2027
- ${this.renderControl("increment", "core::plus", () => this.stepUp(), this.disabled || !canStepUp)}
2028
- </odx-button-group>
2029
- `,
2030
- () => when(!(this.disabled || this.readonly) && this.clearable, () => this.renderControl("clear", "core::cancel", () => this.clear(), this.disabled))
2031
- )}
2032
- <slot name="suffix"></slot>
2033
- `;
2034
- }
2035
- renderControl(type, icon, listener, disabled) {
2036
- if (this.hideControls || this.readonly) return nothing;
2037
- return html`
2038
- <odx-icon-button part="control control-${type}" icon=${icon} size="sm" tabindex="-1" variant="ghost" ?disabled=${disabled} @click=${listener}>
2039
- </odx-icon-button>
2040
- `;
2041
- }
2042
- #isClearable() {
2043
- return this.clearable && !this.disabled && !this.readonly && !this.required && !!this.value;
2044
- }
2045
- #handleInput;
2046
- #handleKeyDown;
2047
- };
2048
- __decorateClass([
2049
- query("input")
2050
- ], _OdxInput.prototype, "nativeInput", 2);
2051
- __decorateClass([
2052
- property({ type: Boolean, reflect: true, useDefault: true })
2053
- ], _OdxInput.prototype, "block", 2);
2054
- __decorateClass([
2055
- property({ type: Boolean, reflect: true, useDefault: true })
2056
- ], _OdxInput.prototype, "clearable", 2);
2057
- __decorateClass([
2058
- property({ type: Boolean, reflect: true, useDefault: true, attribute: "hide-controls" })
2059
- ], _OdxInput.prototype, "hideControls", 2);
2060
- __decorateClass([
2061
- property()
2062
- ], _OdxInput.prototype, "placeholder", 2);
2063
- __decorateClass([
2064
- property({ type: Number, reflect: true })
2065
- ], _OdxInput.prototype, "min", 2);
2066
- __decorateClass([
2067
- property({ type: Number, reflect: true })
2068
- ], _OdxInput.prototype, "max", 2);
2069
- __decorateClass([
2070
- property({ type: Number, reflect: true })
2071
- ], _OdxInput.prototype, "step", 2);
2072
- __decorateClass([
2073
- property({ reflect: true, useDefault: true })
2074
- ], _OdxInput.prototype, "type", 2);
2075
- __decorateClass([
2076
- property()
2077
- ], _OdxInput.prototype, "value", 2);
2078
- let OdxInput = _OdxInput;
2079
-
2080
- const styles$L = ":host{padding:var(--odx-size-50)}";
2081
-
2082
- const KpiSize = pick(Size, ["SM", "MD", "LG"]);
2083
- const KpiVariant = pick(Variant, ["NEUTRAL", "ACCENT", "DANGER", "SUCCESS"]);
2084
- const _OdxKpi = class _OdxKpi extends CustomElement {
2085
- constructor() {
2086
- super(...arguments);
2087
- this.label = "";
2088
- this.value = "";
2089
- this.size = KpiSize.MD;
2090
- this.variant = KpiVariant.NEUTRAL;
2091
- this.vertical = false;
2092
- }
2093
- static {
2094
- customElement("odx-kpi", styles$L)(_OdxKpi);
2095
- }
2096
- render() {
2097
- return html`
2098
- <odx-stack class="base" horizontal align="center" gap=${this.size}>
2099
- <odx-avatar size=${this.size}><slot></slot></odx-avatar>
2100
- <odx-stack gap="none">
2101
- <odx-text size=${this.size}>${this.label}</odx-text>
2102
- <odx-title size=${this.size}>
2103
- <odx-text variant=${optionalAttr(this.variant)} inline>
2104
- ${this.value} ${when(this.unit, (unit) => html`<odx-text inline size=${this.size}>${unit}</odx-text>`)}
2105
- </odx-text>
2106
- </odx-title>
2107
- </odx-stack>
2108
- </odx-stack>
2109
- `;
2110
- }
2111
- };
2112
- __decorateClass([
2113
- property()
2114
- ], _OdxKpi.prototype, "label", 2);
2115
- __decorateClass([
2116
- property()
2117
- ], _OdxKpi.prototype, "unit", 2);
2118
- __decorateClass([
2119
- property()
2120
- ], _OdxKpi.prototype, "value", 2);
2121
- __decorateClass([
2122
- property({ reflect: true, useDefault: true })
2123
- ], _OdxKpi.prototype, "size", 2);
2124
- __decorateClass([
2125
- property({ reflect: true, useDefault: true })
2126
- ], _OdxKpi.prototype, "variant", 2);
2127
- __decorateClass([
2128
- property({ type: Boolean, reflect: true, useDefault: true })
2129
- ], _OdxKpi.prototype, "vertical", 2);
2130
- let OdxKpi = _OdxKpi;
2131
-
2132
- const styles$K = ":host{display:-webkit-box;min-inline-size:min-content;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:var(--max, 2)}";
2133
-
2134
- const _OdxLineClamp = class _OdxLineClamp extends CustomElement {
2135
- static {
2136
- customElement("odx-line-clamp", styles$K)(_OdxLineClamp);
2137
- }
2138
- updated(props) {
2139
- super.updated(props);
2140
- if (typeof this.max === "number" && this.max > 0) {
2141
- this.style.setProperty("--max", String(this.max));
2142
- } else {
2143
- this.style.removeProperty("--max");
2144
- }
2145
- if (typeof this.max === "number" && this.max > 0) {
2146
- this.style.setProperty("--min", String(this.max));
2147
- } else {
2148
- this.style.removeProperty("--max");
2149
- }
2150
- }
2151
- };
2152
- __decorateClass([
2153
- property({ type: Number })
2154
- ], _OdxLineClamp.prototype, "max", 2);
2155
- let OdxLineClamp = _OdxLineClamp;
2156
-
2157
- const styles$J = ":host{--item-indent-level: 0;display:block}::slotted([role=\"listitem\"]){--indent-level: var(--item-indent-level)}";
2158
-
2159
- const _OdxList = class _OdxList extends CustomElement {
2160
- constructor() {
2161
- super();
2162
- this.multiple = false;
2163
- new ExpandableItemManager(this, { getItems: () => this.items });
2164
- }
2165
- static {
2166
- customElement("odx-list", styles$J)(_OdxList);
2167
- }
2168
- connectedCallback() {
2169
- super.connectedCallback();
2170
- this.role = "list";
2171
- }
2172
- toggleAll(state, emitEvent = false) {
2173
- for (const item of this.items) {
2174
- item.toggle(state, emitEvent);
2175
- }
2176
- }
2177
- };
2178
- __decorateClass([
2179
- queryAssignedElements({ selector: '[role="listitem"]', flatten: true })
2180
- ], _OdxList.prototype, "items", 2);
2181
- __decorateClass([
2182
- property({ type: Boolean, reflect: true, useDefault: true })
2183
- ], _OdxList.prototype, "multiple", 2);
2184
- let OdxList = _OdxList;
2185
-
2186
- const styles$I = "@layer base{:host{--indent-level: 0;--_block-size: var(--odx-size-300);--_padding-block: var(--odx-size-75);display:flex;flex-direction:column;place-items:initial;block-size:auto;max-inline-size:100%}[part=base]{place-content:flex-start;z-index:1;outline-offset:calc(-1 * var(--odx-focus-ring-offset));padding-inline-start:calc(var(--odx-size-50) + var(--indent-level) * var(--odx-size-200));block-size:var(--_block-size);text-align:start;line-height:var(--odx-typography-line-height-2);>*{--odx-focus-ring-offset: 0}}[part=separator]{--margin-block: 0;--margin-inline: var(--odx-size-50)}[part=expand-control]::part(icon){transition:var(--odx-transition-reduced)}::slotted(odx-list){--item-indent-level: calc(var(--indent-level) + 1)}:host(:last-of-type) [part=separator]{opacity:0}}@layer variant{[part=base]:has([part=expand-control]:active){--_color-background-pressed: var(--_color-background-hover)}:host(:not([compact])){::slotted(odx-icon){margin-inline:var(--odx-size-37)}}:host([compact]){--_block-size: var(--odx-size-225);[part=expand-control]{--_icon-size: var(--odx-size-150)}}}@layer state{:host(:not([subtle]):hover):after{opacity:0}:host([subtle]:not([disabled])){--_color-background-hover: var(--_color-background);--_color-background-pressed: var(--_color-background);cursor:default}:host([aria-current]){--_color-background: var(--odx-color-background-transparent-selected-hover);--_color-background-hover: var(--odx-color-background-transparent-selected-hover)}:host([aria-current][disabled]){--_color-background: var(--odx-color-background-disabled-selected);--_color-background-hover: var(--_color-background);--_color-background-pressed: var(--_color-background);--_color-foreground: var(--odx-color-foreground-disabled-selected);cursor:not-allowed}:host([expanded]){[part=separator]{opacity:1}[part=expand-control]{--icon-rotation: 180deg}}}";
2187
-
2188
- const _OdxListItem = class _OdxListItem extends CanBeExpanded(InteractiveElement) {
2189
- constructor() {
2190
- super(...arguments);
2191
- this.compact = false;
2192
- this.subtle = false;
2193
- this.selected = false;
2194
- this.withExpandControl = false;
2195
- this.withExpandIndicator = false;
2196
- }
2197
- static {
2198
- customElement("odx-list-item", styles$I)(_OdxListItem);
2199
- }
2200
- isExpandable() {
2201
- return !(this.disabled || this.loading) && this.expandableItems.length > 0;
2202
- }
2203
- getExpandControl() {
2204
- if (!this.isExpandable()) return null;
2205
- return this.renderRoot.querySelector(this.withExpandControl ? '[part="expand-control"]' : '[part="base"]');
2206
- }
2207
- connectedCallback() {
2208
- super.connectedCallback();
2209
- this.role = "listitem";
2210
- }
2211
- render() {
2212
- const expandSlot = html`<slot name="expand" @slotchange=${() => this.requestUpdate()}></slot>`;
2213
- return html`
2214
- ${super.render()}
2215
- <odx-separator part="separator"></odx-separator>
2216
- ${when(
2217
- this.isExpandable(),
2218
- () => html`<odx-toggle-content part="content" id="list-item-content" role="region" ?hidden=${!this.expanded}>${expandSlot}</odx-toggle-content>`,
2219
- () => html`<odx-visually-hidden>${expandSlot}</odx-visually-hidden>`
2220
- )}
2221
- `;
2222
- }
2223
- renderContent() {
2224
- const controlSize = this.compact ? ButtonSize.SM : void 0;
2225
- return html`
2226
- ${super.renderContent(true)}
2227
- ${when(
2228
- this.withExpandIndicator || this.isExpandable(),
2229
- () => html`
2230
- <odx-icon-button
2231
- id="expand-control"
2232
- part="expand-control"
2233
- icon="core::chevron-down"
2234
- variant="ghost"
2235
- size=${optionalAttr(controlSize)}
2236
- ?disabled=${this.disabled}
2237
- .inert=${!this.withExpandControl}
2238
- >
2239
- </odx-icon-button>
2240
- `
2241
- )}
2242
- `;
2243
- }
2244
- willUpdate(props) {
2245
- super.updated(props);
2246
- if (props.has("disabled") || props.has("expanded")) {
2247
- this.#handleExpandedChange();
2248
- }
2249
- if (props.has("selected")) {
2250
- this.ariaCurrent = this.selected ? "page" : null;
2251
- }
2252
- }
2253
- #handleExpandedChange() {
2254
- const expandControl = this.getExpandControl();
2255
- if (!(this.region && expandControl)) return;
2256
- this.region.setAttribute("aria-labelledby", "expand-control");
2257
- expandControl.ariaExpanded = toAriaBooleanAttribute(this.expanded);
2258
- expandControl.setAttribute("aria-controls", this.region.id);
2259
- if (this.expanded) return;
2260
- this.querySelector("odx-list")?.toggleAll(false);
2261
- }
2262
- };
2263
- __decorateClass([
2264
- queryAssignedElements({ slot: "expand" })
2265
- ], _OdxListItem.prototype, "expandableItems", 2);
2266
- __decorateClass([
2267
- query("#list-item-content")
2268
- ], _OdxListItem.prototype, "region", 2);
2269
- __decorateClass([
2270
- property({ type: Boolean, reflect: true, useDefault: true })
2271
- ], _OdxListItem.prototype, "compact", 2);
2272
- __decorateClass([
2273
- property({ type: Boolean, reflect: true, useDefault: true })
2274
- ], _OdxListItem.prototype, "subtle", 2);
2275
- __decorateClass([
2276
- property({ type: Boolean, reflect: true, useDefault: true })
2277
- ], _OdxListItem.prototype, "selected", 2);
2278
- __decorateClass([
2279
- property({ type: Boolean, attribute: "with-expand-control" })
2280
- ], _OdxListItem.prototype, "withExpandControl", 2);
2281
- __decorateClass([
2282
- property({ type: Boolean, attribute: "with-expand-indicator" })
2283
- ], _OdxListItem.prototype, "withExpandIndicator", 2);
2284
- let OdxListItem = _OdxListItem;
2285
-
2286
- const styles$H = ":host{--_overlay-fill-color: var(--odx-color-backdrop, rgb(255 255 255 / 25%));display:contents;border-radius:inherit;overflow:hidden}:host::part(overlay){display:flex;position:absolute;inset:0;flex-direction:column;place-content:center;place-items:center;transition:var(--odx-transition-reduced) allow-discrete;visibility:hidden;opacity:0;border-radius:inherit;overflow:hidden;pointer-events:none}:host::part(content){min-inline-size:var(--odx-size-225);text-align:center}:host([loading])::part(overlay){visibility:visible;opacity:1;z-index:9999;background-color:var(--_overlay-fill-color);pointer-events:all;backdrop-filter:blur(var(--odx-size-12))}";
2287
-
2288
- const LOADING_OVERLAY_HOST_DIRECTIVE = "odx-loading-overlay-host";
2289
- const _OdxLoadingOverlay = class _OdxLoadingOverlay extends CustomElement {
2290
- constructor() {
2291
- super(...arguments);
2292
- this.#loadingContainerPosition = "";
2293
- this.loading = false;
2294
- }
2295
- static {
2296
- customElement("odx-loading-overlay", styles$H)(_OdxLoadingOverlay);
2297
- }
2298
- #loadingContainerPosition;
2299
- get loadingContainer() {
2300
- return this.parentElement ?? this;
2301
- }
2302
- disconnectedCallback() {
2303
- super.disconnectedCallback();
2304
- this.hideOverlay();
2305
- }
2306
- async updated(props) {
2307
- if (props.has("loading")) {
2308
- if (this.loading) {
2309
- this.showOverlay();
2310
- } else {
2311
- await waitForAnimations(this.overlay);
2312
- this.hideOverlay();
2313
- }
2314
- }
2315
- }
2316
- render() {
2317
- return html`
2318
- <div part="overlay">
2319
- <div class="content">
2320
- <odx-loading-spinner></odx-loading-spinner>
2321
- </div>
2322
- </div>
2323
- `;
2324
- }
2325
- showOverlay() {
2326
- this.loadingContainer.toggleAttribute(LOADING_OVERLAY_HOST_DIRECTIVE, true);
2327
- this.#loadingContainerPosition = window.getComputedStyle(this.loadingContainer).position;
2328
- if (this.#loadingContainerPosition !== "static") return;
2329
- this.loadingContainer.style.position = "relative";
2330
- this.loadingContainer.inert = true;
2331
- this.loadingContainer.ariaBusy = "true";
2332
- }
2333
- hideOverlay() {
2334
- this.loadingContainer.toggleAttribute(LOADING_OVERLAY_HOST_DIRECTIVE, false);
2335
- if (this.#loadingContainerPosition !== "static") return;
2336
- this.loadingContainer.style.position = "";
2337
- this.loadingContainer.inert = false;
2338
- this.loadingContainer.ariaBusy = "false";
2339
- }
2340
- };
2341
- __decorateClass([
2342
- query('[part="overlay"]', true)
2343
- ], _OdxLoadingOverlay.prototype, "overlay", 2);
2344
- __decorateClass([
2345
- property({ type: Boolean, reflect: true, useDefault: true })
2346
- ], _OdxLoadingOverlay.prototype, "loading", 2);
2347
- let OdxLoadingOverlay = _OdxLoadingOverlay;
2348
-
2349
- const styles$G = ":host{--_animation-duration: 1.5s;--_animation-delay: 0s;--_size: var(--odx-size-225);--_space: var(--odx-size-37);--_track-size: calc(var(--odx-size-37) - var(--odx-size-px));--_track-color: var(--odx-color-background-transparent-pressed);display:flex;place-content:center;place-items:center;block-size:1em;color:inherit;font-size:var(--_size)}.base{display:block;block-size:100%;inline-size:100%;aspect-ratio:1;animation:loading-spinner-rotation-animation 1.5s linear infinite}:host(:not([variant=\"dots\"])){inline-size:1em;.track,.indicator{stroke-width:var(--_track-size)}.track{stroke:var(--_track-color)}.indicator{animation:loading-spinner-animation 1.5s ease-in-out infinite;color:inherit;stroke:currentcolor;stroke-dasharray:90,180;stroke-dashoffset:-5;stroke-linecap:round}:not(svg){transform-origin:0 0}}:host([variant=\"dots\"]){gap:calc(var(--_space) / 2);padding:var(--_space);animation:loading-spinner-dots-entry-animation .25s linear both;.indicator{flex:0 0 calc(var(--_size) / 3);z-index:3;border-radius:var(--odx-border-radius-circle);background-color:currentcolor;block-size:calc(var(--_size) / 3);animation:loading-spinner-dots-animation var(--_animation-duration) var(--_animation-delay) infinite cubic-bezier(.96,.21,.41,.76) forwards;&:nth-child(1){--_animation-delay: calc(-1 * var(--_animation-duration) / 6)}&:nth-child(2){--_animation-delay: calc(-1 * var(--_animation-duration) / 12)}&:nth-child(3){--_animation-delay: 0s}}}@keyframes loading-spinner-animation{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes loading-spinner-rotation-animation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes loading-spinner-dots-entry-animation{0%{opacity:0}to{opacity:1}}@keyframes loading-spinner-dots-animation{0%,75%,to{transform:scale(.667);background-color:var(--odx-color-background-transparent-pressed)}50%{transform:scale(1);background-color:currentcolor}}";
2350
-
2351
- const _OdxLoadingSpinner = class _OdxLoadingSpinner extends CustomElement {
2352
- static {
2353
- customElement("odx-loading-spinner", styles$G)(_OdxLoadingSpinner);
2354
- }
2355
- render() {
2356
- if (this.variant === "dots") {
2357
- return html`<div class="indicator"></div><div class="indicator"></div><div class="indicator"></div>`;
2358
- }
2359
- return html`
2360
- <svg class="base" role="progressbar" aria-label="Loading" fill="none" viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg">
2361
- <circle class="track" cx="24" cy="24" r="20" fill="none"></circle>
2362
- <circle class="indicator" cx="24" cy="24" r="20" fill="none"></circle>
2363
- </svg>
2364
- `;
2365
- }
2366
- };
2367
- __decorateClass([
2368
- property({ reflect: true })
2369
- ], _OdxLoadingSpinner.prototype, "variant", 2);
2370
- let OdxLoadingSpinner = _OdxLoadingSpinner;
2371
-
2372
- const styles$F = ":host{display:inline-block;background-color:currentcolor;aspect-ratio:92 / 36;mask-image:url(\"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20?%3e%3csvg%20id='Layer_1'%20data-name='Layer%201'%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2091.6%2035.43'%3e%3cpath%20d='m81.18,29.07h5.63v-14.43c0-1.06,0-1.38.21-1.7.32-.74,1.17-1.17,2.23-1.17.96,0,1.59.21,2.34.74v-4.24c-6.27.11-8.29.53-10.41,2.23v18.56Zm-12.11-10.93v-4.24c0-1.59.74-2.44,2.34-2.44,1.49,0,2.34.85,2.34,2.33v4.35h-4.68Zm10.31,3.29v-8.06c0-3.4-1.81-4.99-5.63-4.99h-4.68c-2.02,0-2.87.21-3.93,1.06-1.06.96-1.7,2.33-1.7,3.93v10.71c0,1.48.43,2.55,1.38,3.61,1.06,1.06,2.02,1.38,4.25,1.38h10.2v-4.24c-2.87.85-4.57,1.06-6.69,1.06-2.44,0-3.51-.53-3.51-1.91v-2.55h10.31Zm-27.63,6.37c0-1.59.74-2.44,2.34-2.44s2.44.85,2.44,2.44v2.33c0,1.38-.85,2.23-2.34,2.23-1.59,0-2.44-.85-2.44-2.23v-2.33Zm10.41-.53c0-1.59-.32-2.65-1.17-3.61-1.06-1.17-2.23-1.49-4.46-1.49h-4.68c-2.12,0-2.97.21-4.04,1.06-1.06.95-1.7,2.44-1.7,4.03v3.08c0,1.49.53,2.76,1.38,3.61,1.06,1.17,2.02,1.48,4.36,1.48h4.68c2.02,0,2.98-.21,4.04-1.06,1.06-.95,1.59-2.12,1.59-4.03v-3.08Zm-10.41-13.58c0-1.38.85-2.23,2.44-2.23s2.44.85,2.44,2.23v2.44c0,1.38-.96,2.23-2.44,2.23-1.59,0-2.44-.85-2.44-2.23v-2.44Zm9.99-5.3h-9.99c-1.91,0-2.66.21-3.72,1.06-1.06.96-1.59,2.33-1.59,3.93v3.08c0,1.27.43,2.55,1.28,3.5,1.06,1.17,1.91,1.49,4.04,1.49h4.57c2.02,0,2.87-.32,3.83-1.06,1.06-.95,1.59-2.23,1.59-3.93v-8.06Zm-22.63,17.4h-2.44c-.96,0-1.7-.32-2.13-1.06-.21-.32-.21-.42-.21-1.38v-1.91c0-1.59.74-2.33,2.34-2.33h2.44v6.68Zm0-9.97h-4.89c-1.91,0-2.76.21-3.72,1.17-1.06.85-1.59,2.12-1.59,3.82v3.29c0,1.48.32,2.55,1.17,3.5,1.06,1.17,2.02,1.48,4.25,1.48h10.52v-15.81c0-1.38-.43-2.55-1.38-3.5-1.17-1.17-2.13-1.49-4.25-1.49h-8.5v4.24c2.13-.85,3.51-1.17,5.42-1.17,2.02,0,2.97.64,2.97,2.02v2.44Zm2.34-15.81c-1.81,0-3.19,1.38-3.19,3.08,0,1.8,1.38,3.18,3.19,3.18,1.7,0,3.08-1.38,3.08-3.18,0-1.7-1.38-3.08-3.08-3.08Zm-7.55,0c-1.81,0-3.19,1.38-3.19,3.08,0,1.8,1.38,3.18,3.19,3.18,1.7,0,3.08-1.38,3.08-3.18,0-1.7-1.38-3.08-3.08-3.08Zm-14.77,29.07h5.63v-14.43c0-1.06,0-1.38.21-1.7.32-.74,1.17-1.17,2.23-1.17.96,0,1.59.21,2.34.74v-4.24c-6.27.11-8.29.53-10.41,2.23v18.56ZM0,.72v2.97h9.14c1.06,0,1.59.21,2.13.74.43.53.43.74.43,2.65v15.29c0,2.87-.53,3.4-3.08,3.4h-2.55V6.67H0v22.4h11.26c2.66,0,3.4-.21,4.68-1.49,1.17-1.17,1.38-2.02,1.38-5.31V6.24c0-2.02-.21-2.76-1.06-3.82-1.06-1.17-2.44-1.7-4.36-1.7H0Z'%20/%3e%3c/svg%3e\");mask-repeat:no-repeat;mask-origin:content-box;mask-position:center center}:host([compact]){aspect-ratio:1;mask-image:url(\"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2017%2028'%3e%3cpath%20d='M0%200v2.97h9.14c1.06%200%201.59.21%202.13.74.43.53.43.74.43%202.65v15.29c0%202.87-.53%203.4-3.08%203.4H6.07V5.95H0v22.4h11.26c2.66%200%203.4-.21%204.68-1.49%201.17-1.17%201.38-2.02%201.38-5.31V5.52c0-2.02-.21-2.76-1.06-3.82C15.2.53%2013.82%200%2011.9%200H0Z'%20/%3e%3c/svg%3e\")}:host,:host([size=\"sm\"]){margin-block:var(--odx-size-37);block-size:var(--odx-size-150)}:host([size=\"xs\"]){margin-block:var(--odx-size-25);block-size:calc(var(--odx-size-150) - 2 * var(--odx-size-25))}:host([size=\"md\"]){margin-block:var(--odx-size-37);block-size:var(--odx-size-225)}:host([size=\"lg\"]){margin-block:var(--odx-size-37);block-size:var(--odx-size-300)}:host([size=\"xl\"]){margin-block:var(--odx-size-37);block-size:var(--odx-size-400)}";
2373
-
2374
- const LogoSize = pick(Size, ["XS", "SM", "MD", "LG", "XL"]);
2375
- const _OdxLogo = class _OdxLogo extends CustomElement {
2376
- constructor() {
2377
- super(...arguments);
2378
- this.size = LogoSize.SM;
2379
- this.compact = false;
2380
- }
2381
- static {
2382
- customElement("odx-logo", styles$F)(_OdxLogo);
2383
- }
2384
- connectedCallback() {
2385
- super.connectedCallback();
2386
- this.ariaLabel ||= "Dräger";
2387
- this.ariaRoleDescription ||= "Logo";
2388
- this.role = "img";
2389
- this.translate = false;
2390
- }
2391
- };
2392
- __decorateClass([
2393
- property({ reflect: true, useDefault: true })
2394
- ], _OdxLogo.prototype, "size", 2);
2395
- __decorateClass([
2396
- property({ type: Boolean, reflect: true, useDefault: true })
2397
- ], _OdxLogo.prototype, "compact", 2);
2398
- let OdxLogo = _OdxLogo;
2399
-
2400
- const styles$E = ":host{--_transition-duration: var(--odx-motion-duration-default);display:grid;grid-template-rows:auto 1fr auto;transform:translate(-100%);transition:var(--odx-motion-duration-default) var(--odx-motion-easing-default) allow-discrete;visibility:hidden;margin:0;border:none;box-shadow:var(--odx-shadow-level-2);background-color:var(--odx-color-background-brand);padding:0;block-size:100%;inline-size:var(--odx-main-menu-max-width, min(100dvw, 384px));color:var(--odx-color-foreground-inverse-static)}.header,.link-navigation{padding:var(--odx-size-75) var(--odx-size-150)}.navigation{padding:var(--odx-size-75);overflow-y:auto}.link-navigation{column-gap:var(--odx-size-100)}::slotted(:is(odx-link,a)[slot=\"link-navigation\"][disabled]){color:var(--odx-color-foreground-disabled-brand)}:host(:popover-open){display:grid;transform:translate(0);visibility:visible;@starting-style{transform:translate(-100%);visibility:hidden}}:host::backdrop{transition:all var(--odx-motion-duration-default) linear;opacity:0;background-color:var(--odx-color-backdrop);cursor:default;backdrop-filter:blur(0)}:host(:popover-open)::backdrop{backdrop-filter:blur(var(--odx-elevation-blur));opacity:1;@starting-style{backdrop-filter:blur(0);opacity:0}}";
2401
-
2402
- const _OdxMainMenu = class _OdxMainMenu extends CustomElement {
2403
- static {
2404
- customElement("odx-main-menu", styles$E)(_OdxMainMenu);
2405
- }
2406
- connectedCallback() {
2407
- super.connectedCallback();
2408
- this.popover = "auto";
2409
- }
2410
- toggle() {
2411
- this.togglePopover();
2412
- }
2413
- open() {
2414
- this.showPopover();
2415
- }
2416
- close() {
2417
- this.hidePopover();
2418
- }
2419
- render() {
2420
- return html`
2421
- <odx-stack class="header">
2422
- <odx-stack horizontal justify="space-between">
2423
- <odx-logo size="sm"></odx-logo>
2424
- <odx-icon-button icon="core::close" variant="primary" @click=${this.close}></odx-icon-button>
2425
- </odx-stack>
2426
- <odx-stack gap="xs">
2427
- <slot name="title"></slot>
2428
- <slot name="subtitle"></slot>
2429
- </odx-stack>
2430
- </odx-stack>
2431
- <odx-stack role="navigation" class="navigation">
2432
- <slot @slotchange=${this.#handleSlotChange}></slot>
2433
- </odx-stack>
2434
- <odx-stack class="link-navigation" gap="xs" horizontal wrap>
2435
- <slot name="link-navigation"></slot>
2436
- </odx-stack>
2437
- `;
2438
- }
2439
- #handleSlotChange = () => {
2440
- for (const link of this.links) {
2441
- link.slot ||= "link-navigation";
2442
- link.subtle = true;
2443
- }
2444
- };
2445
- };
2446
- __decorateClass([
2447
- queryAssignedElements({ selector: "odx-link", flatten: true })
2448
- ], _OdxMainMenu.prototype, "links", 2);
2449
- let OdxMainMenu = _OdxMainMenu;
2450
-
2451
- class OdxMainMenuButton extends CustomElement {
2452
- static {
2453
- customElement("odx-main-menu-button")(OdxMainMenuButton);
2454
- }
2455
- render() {
2456
- return html`
2457
- <odx-icon-button aria-label="Open main menu" icon="core::menu" variant="ghost" @click=${this.#handleClick}>
2458
- </odx-icon-button>
2459
- `;
2460
- }
2461
- #handleClick = () => {
2462
- document.querySelector("odx-main-menu")?.open();
2463
- };
2464
- }
2465
-
2466
- const styles$D = ":host{--_color-background: var(--odx-color-background-transparent-rest);--_color-foreground: inherit;user-select:none}[part=base]{display:flex;gap:var(--odx-size-50);place-items:center;transition:var(--odx-transition-default);outline:var(--odx-focus-ring-outline);outline-offset:var(--odx-focus-ring-offset);border-radius:var(--odx-border-radius-sm);background-color:var(--_color-background);padding-inline:var(--odx-size-100);block-size:var(--odx-size-300);text-decoration:none;color:var(--_color-foreground);font-weight:var(--odx-font-weight-medium);&:focus-visible{outline-color:var(--odx-color-stroke-focus-outer)}}:host(:is([active],:active,:hover)){--_color-background: var(--odx-color-background-transparent-selected)}:host([disabled]){--_color-foreground: var(--odx-color-foreground-disabled-brand);pointer-events:none}";
2467
-
2468
- class OdxMainMenuLink extends InteractiveLink {
2469
- static {
2470
- customElement("odx-main-menu-link", styles$D)(OdxMainMenuLink);
2471
- }
2472
- }
2473
-
2474
- class OdxMainMenuSubtitle extends CustomElement {
2475
- constructor() {
2476
- super(...arguments);
2477
- this.slot = "subtitle";
2478
- }
2479
- static {
2480
- customElement("odx-main-menu-subtitle")(OdxMainMenuSubtitle);
2481
- }
2482
- render() {
2483
- return html`
2484
- <odx-text size="md">
2485
- <slot></slot>
2486
- </odx-text>
2487
- `;
2488
- }
2489
- }
2490
-
2491
- class OdxMainMenuTitle extends CustomElement {
2492
- constructor() {
2493
- super(...arguments);
2494
- this.slot = "title";
2495
- }
2496
- static {
2497
- customElement("odx-main-menu-title")(OdxMainMenuTitle);
2498
- }
2499
- render() {
2500
- return html`
2501
- <odx-title size="sm">
2502
- <slot></slot>
2503
- </odx-title>
2504
- `;
2505
- }
2506
- }
2507
-
2508
- const styles$C = ":host{--min-inline-size: 160px;--max-inline-size: 280px;--_gap: var(--odx-size-37)}.base{display:flex;flex-direction:column;gap:var(--_gap);block-size:100%;min-inline-size:var(--min-inline-size);max-inline-size:var(--max-inline-size)}::slotted(odx-separator){--margin-block: 0}";
2509
-
2510
- const MENU_ITEM_ROLES = ["menuitem", "menuitemcheckbox", "menuitemradio"];
2511
- const MENU_ITEMS_SELECTOR = MENU_ITEM_ROLES.map((role) => `[role="${role}"]`).join(",");
2512
- class OdxMenu extends PopoverHost {
2513
- static {
2514
- customElement("odx-menu", styles$C)(OdxMenu);
2515
- }
2516
- #tabindexController = new RovingTabindexController(this, {
2517
- elements: () => this.getItems(),
2518
- direction: "vertical"
2519
- });
2520
- getItems() {
2521
- return Array.from(this.querySelectorAll(MENU_ITEMS_SELECTOR)).filter((item) => !item.disabled);
2522
- }
2523
- connectedCallback() {
2524
- super.connectedCallback();
2525
- this.role ||= "menu";
2526
- }
2527
- mountPopover(referenceElement) {
2528
- super.mountPopover(referenceElement);
2529
- referenceElement?.addEventListener("click", this.#handleReferenceInteraction);
2530
- referenceElement?.addEventListener("keydown", this.#handleReferenceKeyDown);
2531
- }
2532
- unmountPopover(referenceElement) {
2533
- referenceElement.removeEventListener("keydown", this.#handleReferenceKeyDown);
2534
- referenceElement.removeEventListener("click", this.#handleReferenceInteraction);
2535
- super.unmountPopover(referenceElement);
2536
- }
2537
- onBeforePopoverShow() {
2538
- this.#tabindexController.update({ elements: () => this.getItems() });
2539
- this.#tabindexController.currentIndex = 0;
2540
- this.#tabindexController.focus();
2541
- }
2542
- onPopoverShow() {
2543
- this.addEventListener("keydown", this.#handleKeyDown);
2544
- }
2545
- onBeforePopoverHide() {
2546
- this.removeEventListener("keydown", this.#handleKeyDown);
2547
- }
2548
- isMenuItem(element) {
2549
- return MENU_ITEM_ROLES.includes(element.getAttribute?.("role") ?? "");
2550
- }
2551
- render() {
2552
- return html`
2553
- <odx-popover>
2554
- <div class="base">
2555
- <slot @click=${this.#handleClick}></slot>
2556
- </div>
2557
- </odx-popover>
2558
- `;
2559
- }
2560
- #handleReferenceInteraction = (event) => {
2561
- this.updateReferenceElementFromEvent(event);
2562
- this.togglePopover();
2563
- };
2564
- #handleClick = (event) => {
2565
- const eventPath = event.composedPath();
2566
- const closestMenu = eventPath.find((element) => element.localName === this.localName);
2567
- if (this !== closestMenu) return;
2568
- const item = eventPath.find((element) => this.isMenuItem(element));
2569
- if (!item) return;
2570
- this.emit("select", { detail: { item } });
2571
- this.hidePopover();
2572
- };
2573
- #handleKeyDown = (event) => {
2574
- const key = getKeyInfo(event);
2575
- if (!(this.isPopoverOpen() && (key.tab || key.backTab))) return;
2576
- event?.preventDefault();
2577
- event.stopPropagation();
2578
- this.hidePopover();
2579
- };
2580
- #handleReferenceKeyDown = (event) => {
2581
- if (!getKeyInfo(event).down) return;
2582
- this.showPopover();
2583
- };
2584
- }
2585
-
2586
- const styles$B = ":host{display:flex;gap:var(--odx-size-50);place-items:center;padding-inline:var(--odx-size-50);font-weight:var(--odx-typography-font-weight-medium);user-select:none}odx-icon,::slotted(odx-icon){--size: var(--odx-typography-font-size-5)}";
2587
-
2588
- class OdxMenuLabel extends CustomElement {
2589
- static {
2590
- customElement("odx-menu-label", styles$B)(OdxMenuLabel);
2591
- }
2592
- }
2593
-
2594
- const _OdxMenuItem = class _OdxMenuItem extends InteractiveElement {
2595
- static {
2596
- customElement("odx-menu-item")(_OdxMenuItem);
2597
- }
2598
- renderContent() {
2599
- return html`
2600
- ${when(!this.loading && this.icon, (icon) => html`<odx-icon name="${icon}"></odx-icon>`)}
2601
- ${when(this.loading, () => this.renderLoader())}
2602
- <odx-line-clamp part="label" .max=${2}>
2603
- <slot></slot>
2604
- </odx-line-clamp>
2605
- <slot name="suffix"></slot>
2606
- `;
2607
- }
2608
- connectedCallback() {
2609
- super.connectedCallback();
2610
- this.role ||= "menuitem";
2611
- }
2612
- };
2613
- __decorateClass([
2614
- property()
2615
- ], _OdxMenuItem.prototype, "icon", 2);
2616
- let OdxMenuItem = _OdxMenuItem;
2617
-
2618
- const styles$A = "@layer base{:host{--max-inline-size: 640px;--margin-block-start: var(--odx-size-450);--_modal-transition: var(--odx-popover-transition, var(--odx-motion-duration-default));--_modal-transition-offset-x: 0;--_modal-transition-offset-y: calc(-1 * var(--_modal-offset));--_modal-outer-padding: var(--odx-breakpoint-spacing-150);display:contents;transition-property:display}:host,.base,.base::backdrop{transition:var(--odx-transition-default);transition-behavior:allow-discrete}.base,.base::backdrop{opacity:0}.base{transform:translateY(var(--odx-size-100));transition-property:opacity,display,overlay,transform,outline;margin-block-start:var(--margin-block-start);border:0;border-radius:var(--odx-border-radius-ml);box-shadow:var(--odx-shadow-level-2);background:transparent;padding:0;inline-size:min(var(--max-inline-size),100% - 2 * var(--_modal-outer-padding));overflow:unset;color:var(--odx-color-foreground-rest);&::backdrop{transition-property:opacity;background-color:var(--odx-color-backdrop);backdrop-filter:blur(var(--odx-elevation-blur))}}.inner{display:flex;flex-direction:column;border-radius:inherit;background-color:var(--odx-color-background-level-1);padding:var(--odx-spacing-50) var(--odx-breakpoint-spacing-150);max-block-size:calc(100dvh - 2 * var(--_modal-outer-padding))}.header,.footer{min-block-size:var(--odx-size-300)}.content{padding:var(--odx-size-75) 0}.dismiss-action{margin-inline-start:auto}}@layer state{:host(:not([open])){display:none}.base:focus-visible{outline-color:var(--odx-color-stroke-focus-outer)}.base[open]{transform:translate(0);&,&::backdrop{opacity:1;@starting-style{opacity:0}}@starting-style{transform:translateY(var(--odx-size-100))}}}";
2619
-
2620
- const ModalLayout = { MODAL: "modal", SIDESHEET: "sidesheet" };
2621
- (async () => {
2622
- await 0;
2623
- if (isServer) return;
2624
- window.addEventListener("click", (event) => {
2625
- const source = getElementFromEvent(
2626
- event,
2627
- (node) => node.hasAttribute("odx-modal-toggle") && node.ariaBusy !== "true" && node.ariaDisabled !== "true"
2628
- );
2629
- const modalId = source?.getAttribute("odx-modal-toggle");
2630
- const modal = modalId ? source.ownerDocument.getElementById(modalId) : source?.closest("odx-modal");
2631
- if (!modal) return;
2632
- modal.open = !source.closest("odx-modal");
2633
- });
2634
- })();
2635
- const _OdxModal = class _OdxModal extends CustomElement {
2636
- constructor() {
2637
- super();
2638
- this.#closeRequested = false;
2639
- this.#showRequested = false;
2640
- this.dismissible = true;
2641
- this.open = false;
2642
- this.layout = ModalLayout.MODAL;
2643
- this.#handleKeyDown = (event) => {
2644
- if (!getKeyInfo(event).escape) return;
2645
- event.preventDefault();
2646
- this.dismiss();
2647
- };
2648
- this.#handleClick = (event) => {
2649
- if (this.backdropDisabled || !event.target.isConnected || getElementFromEvent(event, (node) => node === this.modalContainer)) return;
2650
- this.dismiss();
2651
- };
2652
- if (!isServer) {
2653
- this.addEventListener("click", this.#handleClick);
2654
- }
2655
- }
2656
- static {
2657
- customElement("odx-modal", styles$A)(_OdxModal);
2658
- }
2659
- #closeRequested;
2660
- #showRequested;
2661
- connectedCallback() {
2662
- super.connectedCallback();
2663
- this.id ||= getUniqueId("odx-modal");
2664
- }
2665
- async show() {
2666
- if (this.dialog.open || this.#showRequested) return;
2667
- this.#showRequested = true;
2668
- const canShow = await this.canShow?.(this) ?? true;
2669
- if (!canShow) return;
2670
- await this.beforeShow?.(this);
2671
- this.dialog.showModal();
2672
- await waitForAnimations(this.dialog, true);
2673
- await this.afterShow?.(this);
2674
- this.open = true;
2675
- this.#showRequested = false;
2676
- }
2677
- async close(returnValue) {
2678
- if (!this.dialog.open || this.#closeRequested) return;
2679
- this.#closeRequested = true;
2680
- const canClose = await this.canClose?.(this) ?? true;
2681
- if (!canClose) return;
2682
- await this.beforeClose?.(this);
2683
- this.dialog.close(returnValue);
2684
- await waitForAnimations(this.dialog, true);
2685
- await this.afterClose?.(this);
2686
- this.open = false;
2687
- this.#closeRequested = false;
2688
- }
2689
- async dismiss() {
2690
- if (!this.dismissible) return;
2691
- await this.close();
2692
- }
2693
- render() {
2694
- return html`
2695
- <dialog class="base" @close=${forwardEvent(this)} @keydown=${this.#handleKeyDown}>
2696
- <div class="inner">
2697
- <odx-stack class="header" align="center" horizontal>
2698
- <slot name="header"></slot>
2699
- ${when(
2700
- this.dismissible,
2701
- () => html`<odx-icon-button class="dismiss-action" icon="core::close" variant="ghost" @click=${this.dismiss} .autofocus=${true}></odx-icon-button>`
2702
- )}
2703
- </odx-stack>
2704
- <div class="content">
2705
- <slot></slot>
2706
- </div>
2707
- <odx-stack class="footer" align="center" justify="end" horizontal>
2708
- <slot name="footer"></slot>
2709
- </odx-stack>
2710
- </div>
2711
- </dialog>
2712
- `;
2713
- }
2714
- updated(props) {
2715
- super.updated(props);
2716
- if (props.has("open")) {
2717
- this.#handleOpenChange(props.get("open"));
2718
- }
2719
- }
2720
- #handleOpenChange(previousValue) {
2721
- if (Boolean(previousValue) === this.open) return;
2722
- if (this.open) {
2723
- this.show();
2724
- } else {
2725
- this.close();
2726
- }
2727
- }
2728
- #handleKeyDown;
2729
- #handleClick;
2730
- };
2731
- __decorateClass([
2732
- query("dialog", true)
2733
- ], _OdxModal.prototype, "dialog", 2);
2734
- __decorateClass([
2735
- query(".inner", true)
2736
- ], _OdxModal.prototype, "modalContainer", 2);
2737
- __decorateClass([
2738
- property({ type: Boolean, attribute: "backdrop-disabled" })
2739
- ], _OdxModal.prototype, "backdropDisabled", 2);
2740
- __decorateClass([
2741
- property({ type: Boolean })
2742
- ], _OdxModal.prototype, "dismissible", 2);
2743
- __decorateClass([
2744
- property({ type: Boolean, reflect: true, useDefault: true })
2745
- ], _OdxModal.prototype, "open", 2);
2746
- __decorateClass([
2747
- property({ reflect: true, useDefault: true })
2748
- ], _OdxModal.prototype, "layout", 2);
2749
- let OdxModal = _OdxModal;
2750
-
2751
- const styles$z = "@layer base{:host{--_icon-margin: calc(-.5 * (var(--_icon-size) - var(--_padding-inline)) - var(--odx-size-px));--_padding-inline: var(--odx-size-75)}odx-avatar,::slotted(odx-avatar){--_size: var(--odx-size-150);--_spacing: calc(var(--odx-size-37));font-size:var(--odx-typography-font-size-5)}}@layer state{:host([aria-current]){--_color-background: var(--odx-color-background-transparent-selected);--_color-background-hover: var(--odx-color-background-transparent-selected-hover)}:host([aria-current][disabled]){--_color-background: var(--odx-color-background-disabled-selected);--_color-foreground: var(--odx-color-foreground-disabled-selected);cursor:not-allowed}}@layer variant{:host([size=\"lg\"]){--_block-size: var(--odx-size-300);--_padding-inline: var(--odx-size-100);--_font-size: var(--odx-typography-font-size-3);--_icon-size: var(--odx-size-200);odx-avatar,::slotted(odx-avatar){--_size: var(--odx-size-200);--_spacing: calc(var(--odx-size-50));font-size:var(--odx-typography-font-size-5)}}}";
2752
-
2753
- const NavigationItemSize = pick(Size, ["MD", "LG"]);
2754
- const _OdxNavigationItem = class _OdxNavigationItem extends InteractiveElement {
2755
- constructor() {
2756
- super(...arguments);
2757
- this.size = NavigationItemSize.MD;
2758
- this.selected = false;
2759
- }
2760
- static {
2761
- customElement("odx-navigation-item", styles$z)(_OdxNavigationItem);
2762
- }
2763
- willUpdate(props) {
2764
- super.willUpdate(props);
2765
- if (props.has("selected")) {
2766
- this.ariaCurrent = this.selected ? "page" : null;
2767
- }
2768
- }
2769
- };
2770
- __decorateClass([
2771
- property({ reflect: true, useDefault: true })
2772
- ], _OdxNavigationItem.prototype, "size", 2);
2773
- __decorateClass([
2774
- property({ type: Boolean, reflect: true, useDefault: true })
2775
- ], _OdxNavigationItem.prototype, "selected", 2);
2776
- let OdxNavigationItem = _OdxNavigationItem;
2777
-
2778
- 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)}";
2779
-
2780
- class OdxOption extends OptionControl {
2781
- static {
2782
- customElement("odx-option", styles$y)(OdxOption);
2783
- }
2784
- render() {
2785
- return html`
2786
- ${when(
2787
- this.type === "checkbox",
2788
- () => html`<odx-checkbox .checked=${this.selected} ?disabled=${this.disabled} inert></odx-checkbox>`,
2789
- () => html`<slot name="prefix"></slot>`
2790
- )}
2791
- <div class="label">
2792
- <slot></slot>
2793
- </div>
2794
- <slot name="suffix"></slot>
2795
- `;
2796
- }
2797
- }
2798
-
2799
- const styles$x = ":host{--max-inline-size: var(--odx-page-max-inline-size, 100%);--scroll-margin-block-start: calc(var(--header-size, 0px) + var(--subheader-size, 0px));display:grid;grid-template-areas:\"header\" \"subheader\" \"content\" \"footer\";grid-template-rows:minmax(0,auto) minmax(0,auto) minmax(0,1fr) minmax(0,auto);grid-template-columns:100%;min-block-size:100dvh}.header,.subheader{position:sticky;z-index:99}.subheader,.content{background-color:var(--odx-color-background-base);padding-inline:var(--odx-size-75);inline-size:100%;max-inline-size:var(--max-inline-size)}.header{inset-block-start:0;grid-area:header}.subheader{inset-block-start:var(--header-size, 0);grid-area:subheader}.content{grid-area:content;block-size:100%}.footer{grid-area:footer}::slotted(odx-page-layout){min-block-size:100%}:host([alignment=\"center\"]){.subheader,.content{margin-inline:auto}}:host([layout=\"narrow\"]){--max-inline-size: var(--odx-page-max-inline-size-narrow)}:host([layout=\"wide\"]){--max-inline-size: var(--odx-page-max-inline-size-wide)}";
2800
-
2801
- const PageAlignment = { CENTER: "center" };
2802
- const PageLayout = { AUTO: "auto", NARROW: "narrow", WIDE: "wide" };
2803
- const _OdxPage = class _OdxPage extends CustomElement {
2804
- constructor() {
2805
- super(...arguments);
2806
- this.layout = PageLayout.AUTO;
2807
- }
2808
- static {
2809
- customElement("odx-page", styles$x)(_OdxPage);
2810
- }
2811
- firstUpdated(props) {
2812
- super.firstUpdated(props);
2813
- SharedResizeObserver.observe(this, () => {
2814
- this.style.setProperty("--header-size", toPx(this.headerElement.offsetHeight));
2815
- this.style.setProperty("--subheader-size", toPx(this.subheaderElement.offsetHeight));
2816
- });
2817
- }
2818
- disconnectedCallback() {
2819
- super.disconnectedCallback();
2820
- SharedResizeObserver.unobserve(this);
2821
- }
2822
- render() {
2823
- return html`
2824
- <div class="header" part="header">
2825
- <slot name="header"></slot>
2826
- </div>
2827
- <div class="subheader" part="subheader">
2828
- <slot name="subheader"></slot>
2829
- </div>
2830
- <div class="content" part="content">
2831
- <slot></slot>
2832
- </div>
2833
- <div class="footer" part="footer">
2834
- <slot name="footer"></slot>
2835
- </div>
2836
- `;
2837
- }
2838
- };
2839
- __decorateClass([
2840
- query(".header", true)
2841
- ], _OdxPage.prototype, "headerElement", 2);
2842
- __decorateClass([
2843
- query(".subheader", true)
2844
- ], _OdxPage.prototype, "subheaderElement", 2);
2845
- __decorateClass([
2846
- property({ reflect: true, useDefault: true })
2847
- ], _OdxPage.prototype, "alignment", 2);
2848
- __decorateClass([
2849
- property({ reflect: true, useDefault: true })
2850
- ], _OdxPage.prototype, "layout", 2);
2851
- let OdxPage = _OdxPage;
2852
-
2853
- const styles$w = ":host{display:grid;grid-template-areas:\"navigation header sidebar\" \"navigation content sidebar\" \"footer footer footer\";grid-template-rows:minmax(0,auto) minmax(0,1fr) minmax(0,auto);grid-template-columns:minmax(0,auto) minmax(0,100%) minmax(0,auto);justify-content:start;padding-inline:var(--odx-size-75);inline-size:100%;max-inline-size:var(--max-inline-size)}.header,.navigation,.sidebar{position:sticky;inset-block-start:var(--scroll-margin-block-start);z-index:98;background-color:var(--odx-color-background-base)}.navigation,.sidebar{--_size: calc(100dvh - var(--scroll-margin-block-start));inset-block-end:0;max-block-size:var(--_size);overflow:auto}.content{display:flex;flex-direction:column;grid-area:content;margin-block-end:var(--odx-size-150)}.footer{grid-area:footer}.header{grid-area:header}.navigation{grid-area:navigation;padding-inline-end:var(--odx-size-75)}.sidebar{grid-area:sidebar;padding-inline-start:var(--odx-size-75)}";
2854
-
2855
- class OdxPageLayout extends CustomElement {
2856
- static {
2857
- customElement("odx-page-layout", styles$w)(OdxPageLayout);
2858
- }
2859
- render() {
2860
- return html`
2861
- ${optionalSlot(this, "navigation")}
2862
- ${optionalSlot(this, "header")}
2863
- <div class="content">
2864
- <slot></slot>
2865
- </div>
2866
- ${optionalSlot(this, "sidebar")}
2867
- ${optionalSlot(this, "footer")}
2868
- `;
2869
- }
2870
- }
2871
-
2872
- const styles$v = ":host{display:block}[odx-button]::part(base){outline-offset:0}";
2873
-
2874
- setTranslation("en", {
2875
- odx: {
2876
- pagination: {
2877
- "pageCount.default": "Page {{odx.pagination.pageCount.compact}}",
2878
- "pageCount.compact": "{{ page }} of {{ totalPages }}",
2879
- summary: "{{ pageStart }} to {{ pageEnd }} of {{ totalItems }}"
2880
- }
2881
- }
2882
- });
2883
- const _OdxPagination = class _OdxPagination extends IsLocalized(CustomElement) {
2884
- constructor() {
2885
- super(...arguments);
2886
- this.page = 0;
2887
- this.pageSize = 10;
2888
- this.totalItems = 0;
2889
- }
2890
- static {
2891
- customElement("odx-pagination", styles$v)(_OdxPagination);
2892
- }
2893
- get paginationContext() {
2894
- return {
2895
- pageStart: Math.min(Math.max(0, this.page * this.pageSize), this.totalItems),
2896
- pageEnd: Math.min(Math.max(0, (this.page + 1) * this.pageSize - 1), this.totalItems),
2897
- page: Math.min(Math.max(1, this.page), this.totalPages),
2898
- totalPages: this.totalPages,
2899
- totalItems: this.totalItems,
2900
- hasPreviousPage: this.page > 0,
2901
- hasNextPage: this.page < this.totalPages
2902
- };
2903
- }
2904
- get totalPages() {
2905
- if (this.totalItems === 0) return 1;
2906
- return Math.ceil(this.totalItems / this.pageSize);
2907
- }
2908
- previousPage() {
2909
- this.page = Math.max(this.page - 1, 0);
2910
- }
2911
- nextPage() {
2912
- this.page = Math.min(this.page + 1, this.totalPages - 1);
2913
- }
2914
- firstPage() {
2915
- this.page = 0;
2916
- }
2917
- lastPage() {
2918
- this.page = this.totalPages - 1;
2919
- }
2920
- render() {
2921
- const { hasPreviousPage, hasNextPage } = this.paginationContext;
2922
- return html`
2923
- <odx-stack align="center" gap="xs" justify="end" horizontal>
2924
- <span>${this.t("odx.pagination.summary", this.paginationContext)}</span>
2925
- <odx-button-group ?disabled=${!hasPreviousPage}>
2926
- <odx-icon-button icon="core::chevron-left-end" @click=${() => this.firstPage()} variant="ghost"></odx-icon-button>
2927
- <odx-icon-button icon="core::chevron-left" @click=${() => this.previousPage()} variant="ghost"></odx-icon-button>
2928
- </odx-button-group>
2929
- <span>${this.t("odx.pagination.pageCount.default", this.paginationContext)}</span>
2930
- <odx-button-group ?disabled=${!hasNextPage}>
2931
- <odx-icon-button icon="core::chevron-right" @click=${() => this.nextPage()} variant="ghost"></odx-icon-button>
2932
- <odx-icon-button icon="core::chevron-right-end" @click=${() => this.lastPage()} variant="ghost"></odx-icon-button>
2933
- </odx-button-group>
2934
- </odx-stack>
2935
- `;
2936
- }
2937
- updated(props) {
2938
- super.updated(props);
2939
- if (props.has("page") && props.get("page") !== this.page) {
2940
- this.emit("change", { detail: this.paginationContext });
2941
- }
2942
- }
2943
- };
2944
- __decorateClass([
2945
- property({ type: Number })
2946
- ], _OdxPagination.prototype, "page", 2);
2947
- __decorateClass([
2948
- property({ type: Number })
2949
- ], _OdxPagination.prototype, "pageSize", 2);
2950
- __decorateClass([
2951
- property({ type: Number })
2952
- ], _OdxPagination.prototype, "totalItems", 2);
2953
- let OdxPagination = _OdxPagination;
2954
-
2955
- const styles$u = ":host{display:flex;border-radius:var(--odx-border-radius-controls);box-shadow:var(--_popover-shadow);background-color:var(--_popover-color-background)}[part~=base]{display:flex;position:relative;inset-block-start:0!important;inset-inline-start:0!important;flex-direction:column;z-index:2;border-radius:inherit;block-size:fit-content;min-block-size:var(--_popover-min-block-size);max-block-size:100%;min-inline-size:var(--_popover-min-inline-size);max-inline-size:100%;overflow:auto;scrollbar-width:thin;scroll-behavior:smooth;scroll-padding-block:calc(var(--odx-size-150) + var(--_popover-outer-padding))}[part~=content]{display:flex;flex-direction:column;padding:var(--odx-size-75);color:var(--_popover-color-foreground)}[part~=arrow]{position:absolute;z-index:3;background-color:inherit;block-size:var(--_popover-arrow-size);inline-size:var(--_popover-arrow-size)}";
2956
-
2957
- const _OdxPopover = class _OdxPopover extends CustomElement {
2958
- constructor() {
2959
- super(...arguments);
2960
- this.showArrow = false;
2961
- }
2962
- static {
2963
- customElement("odx-popover", styles$u)(_OdxPopover);
2964
- }
2965
- render() {
2966
- return html`
2967
- <div part="base">
2968
- <div part="content">
2969
- <slot></slot>
2970
- </div>
2971
- </div>
2972
- ${when(this.showArrow, () => html`<div part="arrow"></div>`)}
2973
- `;
2974
- }
2975
- };
2976
- __decorateClass([
2977
- query('[part="arrow"]')
2978
- ], _OdxPopover.prototype, "arrowElement", 2);
2979
- __decorateClass([
2980
- property({ type: Boolean, reflect: true, useDefault: true })
2981
- ], _OdxPopover.prototype, "showArrow", 2);
2982
- let OdxPopover = _OdxPopover;
2983
-
2984
- const styles$t = ":host{--_color-foreground: inherit;--_indicator-color: var(--odx-color-background-primary-rest);--_track-color: var(--odx-palette-coolgray-10);--_track-size: var(--odx-size-50);--_value-percentage: 0;display:flex;flex-wrap:wrap;gap:var(--odx-size-50);align-items:center;padding-block:var(--odx-size-25);padding-inline:var(--odx-size-75);line-height:1rem;color:var(--_color-foreground)}.base,.indicator{inline-size:100%}.base{position:relative;border-radius:var(--odx-border-radius-md);background:var(--_track-color);block-size:var(--_track-size);inline-size:100%;overflow:hidden}.indicator{transform:scaleX(calc(var(--_value-percentage) / 100));transform-origin:0% 50%;transition:var(--odx-transition-reduced);transition-property:background-color,transform;background-color:var(--_indicator-color);block-size:100%}[part=label]{flex:1;margin-block:calc(-1 * var(--odx-size-25));padding-block:var(--odx-size-25);text-align:start}[part=value]{align-self:flex-end;margin-inline-start:auto;text-align:end}:host([condensed]){flex-wrap:nowrap;padding-block:0;[part=label]{flex:1 1 auto}[part=value]{order:99}}:host([variant=\"confirm\"]){--_indicator-color: var(--odx-color-background-confirmation-rest)}:host([variant=\"danger\"]){--_indicator-color: var(--odx-color-background-danger-rest);color:var(--odx-color-foreground-danger-rest);font-weight:var(--odx-font-weight-medium)}:host([variant=\"success\"]){--_indicator-color: var(--odx-color-background-success-rest)}:host([indeterminate]) .indicator{animation:indeterminate 1.5s linear infinite}@keyframes indeterminate{0%{transform:translate(0) scaleX(0)}40%{transform:translate(0) scaleX(.4)}to{transform:translate(100%) scaleX(.5)}}";
2985
-
2986
- const ProgressBarVariant = {
2987
- ...pick(Variant, ["NEUTRAL", "DANGER", "SUCCESS"]),
2988
- CONFIRM: "confirm"
2989
- };
2990
- const _OdxProgressBar = class _OdxProgressBar extends CustomElement {
2991
- constructor() {
2992
- super(...arguments);
2993
- this.min = 0;
2994
- this.max = 100;
2995
- this.value = 0;
2996
- this.condensed = false;
2997
- this.hideValue = false;
2998
- this.indeterminate = false;
2999
- this.variant = ProgressBarVariant.NEUTRAL;
3000
- }
3001
- static {
3002
- customElement("odx-progress-bar", styles$t)(_OdxProgressBar);
3003
- }
3004
- get valuePercentage() {
3005
- return Math.min(Math.max(this.min, round(this.value - this.min / this.max - this.min, 2)), this.max);
3006
- }
3007
- get valueHidden() {
3008
- return this.hideValue || !this.valueText && this.indeterminate;
3009
- }
3010
- render() {
3011
- const valueText = this.valueText || `${this.valuePercentage}%`;
3012
- return html`
3013
- ${when(this.label, (label) => html`<div part="label" aria-hidden="true" odxPreventTextOverflow>${label}</div>`)}
3014
- ${when(!this.valueHidden, () => html`<odx-text part="value" aria-hidden="true">${valueText}</odx-text>`)}
3015
- <div
3016
- class="base"
3017
- role="progressbar"
3018
- title=${optionalAttr(this.title)}
3019
- aria-label=${optionalAttr(this.label)}
3020
- aria-valuemin="0"
3021
- aria-valuemax="100"
3022
- aria-valuenow=${this.indeterminate ? 0 : this.value}
3023
- style="--_value-percentage: ${this.valuePercentage}"
3024
- >
3025
- <div class="indicator"></div>
3026
- </div>
3027
- `;
3028
- }
3029
- };
3030
- __decorateClass([
3031
- queryAssignedElements()
3032
- ], _OdxProgressBar.prototype, "content", 2);
3033
- __decorateClass([
3034
- property({ type: Number })
3035
- ], _OdxProgressBar.prototype, "min", 2);
3036
- __decorateClass([
3037
- property({ type: Number })
3038
- ], _OdxProgressBar.prototype, "max", 2);
3039
- __decorateClass([
3040
- property({ type: Number })
3041
- ], _OdxProgressBar.prototype, "value", 2);
3042
- __decorateClass([
3043
- property()
3044
- ], _OdxProgressBar.prototype, "label", 2);
3045
- __decorateClass([
3046
- property()
3047
- ], _OdxProgressBar.prototype, "valueText", 2);
3048
- __decorateClass([
3049
- property({ type: Boolean, reflect: true, useDefault: true })
3050
- ], _OdxProgressBar.prototype, "condensed", 2);
3051
- __decorateClass([
3052
- property({ type: Boolean, reflect: true, useDefault: true })
3053
- ], _OdxProgressBar.prototype, "hideValue", 2);
3054
- __decorateClass([
3055
- property({ type: Boolean, reflect: true, useDefault: true })
3056
- ], _OdxProgressBar.prototype, "indeterminate", 2);
3057
- __decorateClass([
3058
- property({ reflect: true, useDefault: true })
3059
- ], _OdxProgressBar.prototype, "variant", 2);
3060
- let OdxProgressBar = _OdxProgressBar;
3061
-
3062
- const styles$s = "@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-background-control-rest);--_indicator-color-stroke: var(--odx-color-stroke-control-subtle);--_indicator-stroke-width: var(--odx-border-width-thin);--_label-color-foreground: inherit;display:inline-flex;margin:var(--odx-size-37) var(--odx-size-75);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,border-width,box-shadow;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-width:var(--_indicator-stroke-width);border-radius:var(--odx-border-radius-circle);border-color:var(--_indicator-color-stroke);background-color:var(--_indicator-color-background);block-size:var(--_indicator-size);inline-size:var(--_indicator-size)}.label{display:inline-block}.content{transition-property:color;margin-block:calc(-1 * var(--_indicator-space));color:var(--_label-color-foreground)}}@layer state{:host(:empty) .content{display:none}:host(:not(:empty)) .indicator{margin-inline-end:var(--odx-size-75)}:host(:hover){--_indicator-color-background: var(--odx-color-background-control-hover);--_indicator-color-stroke: var(--odx-color-stroke-control-hover)}:host(:focus-visible) .indicator{outline-color:var(--odx-color-stroke-focus-outer)}:host([checked]){--_indicator-color-background: var(--odx-color-stroke-control-selected);--_indicator-color-foreground: var(--odx-color-foreground-inverse-static);--_indicator-color-stroke: var(--odx-color-background-control-selected);--_indicator-stroke-width: var(--odx-size-37)}:host([checked]:not(:is([readonly],[disabled])):hover){--_indicator-color-stroke: 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-disabled-stroke);--_label-color-foreground: var(--odx-color-foreground-disabled-rest);cursor:not-allowed}:host([readonly]){--_indicator-color-background: var(--odx-color-background-control-readonly);--_indicator-color-stroke: var(--odx-color-stroke-control-readonly);--_label-color-foreground: var(--odx-color-foreground-rest);cursor:default}:host([readonly][checked]){--_indicator-color-background: var(--odx-color-background-control-selected);--_indicator-color-stroke: var(--odx-color-stroke-control-readonly);--_indicator-stroke-width: var(--odx-size-px);.indicator{box-shadow:0 0 0 var(--odx-size-37) var(--odx-color-background-control-rest) inset}}:host([disabled][checked]:not([readonly])){--_indicator-color-background: var(--odx-color-background-disabled-selected);--_indicator-color-stroke: var(--odx-color-background-disabled-selected);--_indicator-stroke-width: var(--odx-size-px);.indicator{box-shadow:0 0 0 var(--odx-size-37) var(--odx-color-foreground-disabled-selected) inset}}}";
3063
-
3064
- class OdxRadioButton extends CheckboxFormControl {
3065
- static {
3066
- customElement("odx-radio-button", styles$s)(OdxRadioButton);
3067
- }
3068
- connectedCallback() {
3069
- super.connectedCallback();
3070
- this.role = "radio";
3071
- }
3072
- render() {
3073
- return html`
3074
- <div class="indicator"></div>
3075
- <div class="content">
3076
- <div class="label">
3077
- <slot></slot>
3078
- </div>
3079
- <div class="description">
3080
- <slot name="description"></slot>
3081
- </div>
3082
- </div>
3083
- `;
3084
- }
3085
- toggle(state, emitEvent = false) {
3086
- super.toggle(state ?? true, emitEvent);
3087
- }
3088
- }
3089
-
3090
- const styles$r = ":host{display:flex}:host(:not([layout=\"horizontal\"])){flex-direction:column}:host([layout=\"list\"]){::slotted(odx-radio-button:last-of-type){border-block-end:none}::slotted(odx-radio-button){margin:0;border-block-end:var(--odx-border-width-thin) solid var(--odx-color-stroke-neutral-subtle);padding:var(--odx-size-75);inline-size:auto}}";
3091
-
3092
- const RadioGroupLayout = { VERTICAL: "vertical", HORIZONTAL: "horizontal", LIST: "list" };
3093
- const _OdxRadioGroup = class _OdxRadioGroup extends RadioGroupFormControl {
3094
- constructor() {
3095
- super(...arguments);
3096
- this.layout = RadioGroupLayout.VERTICAL;
3097
- }
3098
- static {
3099
- customElement("odx-radio-group", styles$r)(_OdxRadioGroup);
3100
- }
3101
- };
3102
- __decorateClass([
3103
- property({ reflect: true, useDefault: true })
3104
- ], _OdxRadioGroup.prototype, "layout", 2);
3105
- let OdxRadioGroup = _OdxRadioGroup;
3106
-
3107
- const styles$q = ":host{--min-inline-size: 180px;--max-inline-size: 240px;display:flex;flex-direction:column;gap:var(--odx-size-75);transition:var(--odx-transition-default);transition-property:min-inline-size,max-inline-size;padding-block:var(--odx-size-150);padding-inline:var(--odx-size-50);block-size:100%;min-inline-size:var(--min-inline-size);max-inline-size:var(--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{--rotate: 180deg}}::slotted(odx-spacer){--size: var(--odx-size-300);--gap-offset: var(--odx-size-75)}";
3108
-
3109
- setTranslation("en", {
3110
- odx: { railNavigation: { controlText: { collapsed: "Expand navigation", expanded: "Collapse navigation" } } }
3111
- });
3112
- setTranslation("de", {
3113
- /* cspell:disable-next-line */
3114
- odx: { railNavigation: { controlText: { collapsed: "Navigation ausklappen", expanded: "Navigation einklappen" } } }
3115
- });
3116
- const _OdxRailNavigation = class _OdxRailNavigation extends IsLocalized(CustomElement) {
3117
- constructor() {
3118
- super(...arguments);
3119
- this.collapsed = false;
3120
- this.#handleSlotChange = () => {
3121
- for (const item of this.navigationItems) {
3122
- item.size = NavigationItemSize.LG;
3123
- }
3124
- };
3125
- this.#handleControlClick = () => {
3126
- this.collapsed = !this.collapsed;
3127
- };
3128
- }
3129
- static {
3130
- customElement("odx-rail-navigation", styles$q)(_OdxRailNavigation);
3131
- }
3132
- render() {
3133
- return html`
3134
- <slot @slotchange=${this.#handleSlotChange}></slot>
3135
- <odx-navigation-item class="toggle-control" size="lg" @click=${this.#handleControlClick} odxPreventTextOverflow>
3136
- <odx-icon class="toggle-icon" name="core::chevron-left" slot="prefix"></odx-icon>
3137
- <odx-visually-hidden>
3138
- ${this.t(`odx.railNavigation.controlText.${this.collapsed ? "collapsed" : "expanded"}`)}
3139
- </odx-visually-hidden>
3140
- </odx-navigation-item>
3141
- `;
3142
- }
3143
- getItems() {
3144
- return this.navigationItems;
3145
- }
3146
- #handleSlotChange;
3147
- #handleControlClick;
3148
- };
3149
- __decorateClass([
3150
- queryAssignedElements({ selector: OdxNavigationItem.tagName, flatten: true })
3151
- ], _OdxRailNavigation.prototype, "navigationItems", 2);
3152
- __decorateClass([
3153
- property({ type: Boolean, reflect: true, useDefault: true })
3154
- ], _OdxRailNavigation.prototype, "collapsed", 2);
3155
- let OdxRailNavigation = _OdxRailNavigation;
3156
-
3157
- class SearchEvent extends CustomEvent {
3158
- constructor(value, rawValue) {
3159
- super("search", { detail: { rawValue, value } });
3160
- }
3161
- }
3162
-
3163
- const styles$p = ":host{--odx-search-max-inline-size: 35em;display:block;max-inline-size:var(--odx-search-max-inline-size)}.input{inline-size:100%}";
3164
-
3165
- const SearchBarBehavior = { INSTANT: "instant", SUBMIT: "submit" };
3166
- const _OdxSearchBar = class _OdxSearchBar extends CanBeDisabled(CustomElement) {
3167
- constructor() {
3168
- super(...arguments);
3169
- this.#search = this.search.bind(this);
3170
- this.behavior = SearchBarBehavior.SUBMIT;
3171
- this.placeholder = "";
3172
- this.readonly = false;
3173
- this.#handleSearch = (event) => {
3174
- event.preventDefault();
3175
- this.search(this.#inputValue);
3176
- };
3177
- this.#handleInput = (event) => {
3178
- if (this.behavior !== SearchBarBehavior.INSTANT) return;
3179
- event.preventDefault();
3180
- this.#search(this.#inputValue);
3181
- };
3182
- this.#handleClear = (event) => {
3183
- forwardEvent(this)(event);
3184
- if (event.defaultPrevented) return;
3185
- this.search("");
3186
- };
3187
- }
3188
- static {
3189
- customElement("odx-search-bar", styles$p)(_OdxSearchBar);
3190
- }
3191
- #value;
3192
- #search;
3193
- get #inputValue() {
3194
- return (this.inputElement.value ?? "").replace(/\s\s+/g, " ").trim();
3195
- }
3196
- get value() {
3197
- return this.#value ?? "";
3198
- }
3199
- search(value, options) {
3200
- if (this.#value === value && options?.forceUpdate !== true) return;
3201
- this.#updateValue(value, options?.updateInput);
3202
- if (options?.emitEvent === false) return;
3203
- this.dispatchEvent(new SearchEvent(value, this.inputElement.value));
3204
- }
3205
- connectedCallback() {
3206
- super.connectedCallback();
3207
- this.role = "presentation";
3208
- }
3209
- updated(props) {
3210
- if (props.has("debounceTime")) {
3211
- this.#search = typeof this.debounceTime === "number" ? debounce(this.search.bind(this), this.debounceTime) : this.search.bind(this);
3212
- }
3213
- }
3214
- render() {
3215
- return html`
3216
- <odx-input
3217
- clearable
3218
- class="input"
3219
- spellcheck="false"
3220
- autocomplete="off"
3221
- placeholder=${this.placeholder}
3222
- type="search"
3223
- ?disabled=${this.disabled}
3224
- ?readonly=${this.readonly}
3225
- @clear=${this.#handleClear}
3226
- @input=${this.#handleInput}
3227
- @search=${this.#handleSearch}
3228
- >
3229
- <odx-icon name="core::search" slot="prefix"></odx-icon>
3230
- </odx-input>
3231
- `;
3232
- }
3233
- #handleSearch;
3234
- #handleInput;
3235
- #handleClear;
3236
- #updateValue(value, updateInput = false) {
3237
- this.#value = value;
3238
- if (!updateInput) return;
3239
- this.inputElement.value = value;
3240
- }
3241
- };
3242
- __decorateClass([
3243
- query(".input", true)
3244
- ], _OdxSearchBar.prototype, "inputElement", 2);
3245
- __decorateClass([
3246
- property()
3247
- ], _OdxSearchBar.prototype, "behavior", 2);
3248
- __decorateClass([
3249
- property({ type: Number })
3250
- ], _OdxSearchBar.prototype, "debounceTime", 2);
3251
- __decorateClass([
3252
- property()
3253
- ], _OdxSearchBar.prototype, "placeholder", 2);
3254
- __decorateClass([
3255
- property({ type: Boolean, useDefault: true })
3256
- ], _OdxSearchBar.prototype, "readonly", 2);
3257
- let OdxSearchBar = _OdxSearchBar;
3258
-
3259
- 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)}}}";
3260
-
3261
- const _OdxSelect = class _OdxSelect extends ListboxFormControl {
3262
- constructor() {
3263
- super();
3264
- this.maxVisibleSelectedOptions = 2;
3265
- this.#handleSlotChange = () => {
3266
- super.handleSlotChange();
3267
- this.updateOptions((option) => {
3268
- option.type = this.multiple ? "checkbox" : null;
3269
- });
3270
- };
3271
- this.#handleBlur = () => {
3272
- this.hideDropdown();
3273
- };
3274
- this.#handleToggleAll = (event) => {
3275
- if (this.disabled || this.readonly) return;
3276
- event.stopPropagation();
3277
- event.preventDefault();
3278
- this.value = this.value.length === this.options.length ? [] : this.options.map((option) => option.value);
3279
- };
3280
- this.#handleClear = (event) => {
3281
- event.stopPropagation();
3282
- event.preventDefault();
3283
- if (!this.#isClearable() || this.emit("clear")) return;
3284
- this.updateValue(void 0);
3285
- };
3286
- this.#handleSelect = () => {
3287
- if (this.autoSelect && !this.isDropdownOpen() || this.multiple) return;
3288
- this.hideDropdown();
3289
- };
3290
- if (!isServer) {
3291
- this.addEventListener("select", this.#handleSelect);
3292
- this.addEventListener("blur", this.#handleBlur);
3293
- }
3294
- }
3295
- static {
3296
- customElement("odx-select", styles$o)(_OdxSelect);
3297
- }
3298
- connectedCallback() {
3299
- super.connectedCallback();
3300
- this.role = "combobox";
3301
- }
3302
- firstUpdated(props) {
3303
- super.firstUpdated(props);
3304
- this.dropdown.mountPopover(this.shadowRoot?.querySelector(".base") ?? null);
3305
- }
3306
- isDropdownOpen() {
3307
- return this.dropdown?.isPopoverOpen();
3308
- }
3309
- showDropdown() {
3310
- this.dropdown.showPopover();
3311
- }
3312
- hideDropdown() {
3313
- this.dropdown.hidePopover();
3314
- }
3315
- render() {
3316
- const allSelected = this.value.length === this.options.length;
3317
- const dropdownDisabled = this.disabled || this.readonly && (!this.multiple || this.selectedOptions.length === 0);
3318
- return html`
3319
- <div class="base" tabindex="0" aria-haspopup="listbox">
3320
- <div class="value" odxPreventTextOverflow>
3321
- ${when(
3322
- this.selectedOptions.length,
3323
- () => html`${this.selectedOptions.map((option) => option.label).join(", ")}`,
3324
- () => when(!(this.disabled || this.readonly), () => html`<slot name="placeholder">${this.placeholder}</slot>`)
3325
- )}
3326
- </div>
3327
- ${when(
3328
- this.#isClearable(),
3329
- () => html`<odx-icon-button icon="core::cancel" size="sm" tabindex="-1" variant="ghost" @click=${this.#handleClear}></odx-icon-button>`
3330
- )}
3331
- <odx-icon class="indicator" name="core::chevron-down"></odx-icon>
3332
- </div>
3333
- <odx-dropdown part="dropdown" role="listbox" ?disabled=${dropdownDisabled} match-reference-width>
3334
- ${when(
3335
- !dropdownDisabled && this.multiple,
3336
- () => html`
3337
- <odx-option type="checkbox" @click=${this.#handleToggleAll} ?readonly=${this.readonly} ?selected=${allSelected} aria-hidden="true">Toggle all</odx-option>
3338
- `
3339
- )}
3340
- <slot @slotchange=${this.#handleSlotChange}></slot>
3341
- </odx-dropdown>
3342
- `;
3343
- }
3344
- updated(props) {
3345
- super.updated(props);
3346
- if (props.has("readonly")) {
3347
- this.updateOptions((option) => {
3348
- option.readonly = this.readonly;
3349
- });
3350
- }
3351
- }
3352
- #isClearable() {
3353
- return !(this.disabled || this.readonly || this.required) && this.selectedOptions.length > 0;
3354
- }
3355
- #handleSlotChange;
3356
- #handleBlur;
3357
- #handleToggleAll;
3358
- #handleClear;
3359
- #handleSelect;
3360
- };
3361
- __decorateClass([
3362
- queryAssignedElements({ selector: '[role="option"]', flatten: true })
3363
- ], _OdxSelect.prototype, "options", 2);
3364
- __decorateClass([
3365
- query(OdxDropdown.tagName, true)
3366
- ], _OdxSelect.prototype, "dropdown", 2);
3367
- __decorateClass([
3368
- property({ type: Number })
3369
- ], _OdxSelect.prototype, "maxVisibleSelectedOptions", 2);
3370
- let OdxSelect = _OdxSelect;
3371
-
3372
- const styles$n = ":host{--color: var(--odx-color-stroke-neutral-subtle);--size: var(--odx-size-px);--min-size: var(--odx-size-75);--margin-block: var(--odx-size-75);--margin-inline: var(--odx-size-12);display:block;transition:var(--odx-transition-default);transition-property:opacity;margin-block:calc(var(--margin-block) - .5 * var(--size));margin-inline:var(--margin-inline)}.base{display:flex;align-items:center;text-align:center}.base:before,.base:after{display:block;flex:1 1 auto;background-color:var(--color);block-size:var(--size);content:\"\";pointer-events:none}:host(:not(:empty)){:before{margin-inline-end:var(--odx-size-37)}:after{margin-inline-start:var(--odx-size-37)}}:host([vertical]){margin-block:var(--margin-block);margin-inline:calc(var(--margin-inline) - .5 * var(--size));.base{flex-direction:column}:after,:before{block-size:calc(100% - var(--margin-block) * 2);min-block-size:calc(var(--min-size) / 2);inline-size:var(--size)}}:host(:not([vertical])){:after,:before{min-inline-size:calc(var(--min-size) / 2)}}:host([strong]){--color: var(--odx-color-stroke-neutral-strong)}:host([align=\"start\"]){.base:before{flex:0 0 var(--min-size)}}:host([align=\"end\"]){.base:after{flex:0 0 var(--min-size)}}";
3373
-
3374
- const SeparatorAlign = { START: "start", CENTER: "center", END: "end" };
3375
- const _OdxSeparator = class _OdxSeparator extends CustomElement {
3376
- constructor() {
3377
- super(...arguments);
3378
- this.align = SeparatorAlign.CENTER;
3379
- this.strong = false;
3380
- this.vertical = false;
3381
- }
3382
- static {
3383
- customElement("odx-separator", styles$n)(_OdxSeparator);
3384
- }
3385
- connectedCallback() {
3386
- super.connectedCallback();
3387
- this.role = "separator";
3388
- }
3389
- render() {
3390
- return html`<div class="base"><slot></slot></div>`;
3391
- }
3392
- };
3393
- __decorateClass([
3394
- property({ reflect: true, useDefault: true })
3395
- ], _OdxSeparator.prototype, "align", 2);
3396
- __decorateClass([
3397
- property({ type: Boolean, reflect: true, useDefault: true })
3398
- ], _OdxSeparator.prototype, "strong", 2);
3399
- __decorateClass([
3400
- property({ type: Boolean, reflect: true, useDefault: true })
3401
- ], _OdxSeparator.prototype, "vertical", 2);
3402
- let OdxSeparator = _OdxSeparator;
3403
-
3404
- const styles$m = ":host{--inline-size: 100%;--_block-size: var(--odx-size-100);--_border-radius: var(--odx-border-radius-controls);--_color-fill: var(--odx-color-background-disabled-rest);display:block;block-size:var(--_block-size);inline-size:var(--inline-size);max-inline-size:100%;overflow:hidden}.base{border-radius:var(--_border-radius);background:var(--_color-fill) linear-gradient(90deg,transparent 33%,var(--odx-color-background-transparent-pressed) 50%,transparent 66%);background-position:150% 100%;background-size:200% 100%;block-size:100%;animation:odx-skeleton-loading 3s infinite linear}@keyframes odx-skeleton-loading{0%{background-position:150% 100%}33%,to{background-position:-50% 100%}}:host([size=\"sm\"]){--_block-size: var(--odx-typography-font-size-1)}:host([size=\"lg\"]){--_block-size: var(--odx-typography-font-size-5)}:host([size=\"xl\"]){--_block-size: var(--odx-typography-font-size-7)}:host([shape=\"button\"]){--inline-size: 6rem;--_block-size: var(--odx-size-225)}:host([shape=\"button\"][size=\"sm\"]){--inline-size: 5rem;--_block-size: var(--odx-size-150)}:host([shape=\"button\"]:is([size=\"lg\"],[size=\"xl\"])){--inline-size: 7rem;--_block-size: var(--odx-size-300)}:host([shape=\"circle\"]){--_border-radius: var(--odx-border-radius-circle)}:host([shape=\"rectangle\"]){--_border-radius: var(--odx-border-radius-md)}:host(:is([shape=\"circle\"],[shape=\"rectangle\"])){--inline-size: var(--_block-size);--_block-size: var(--odx-size-150);flex:0 0 auto}:host(:is([shape=\"circle\"],[shape=\"rectangle\"])[size=\"sm\"]){--_block-size: var(--odx-size-125)}:host(:is([shape=\"circle\"],[shape=\"rectangle\"])[size=\"lg\"]){--_block-size: var(--odx-size-225)}:host(:is([shape=\"circle\"],[shape=\"rectangle\"])[size=\"xl\"]){--_block-size: var(--odx-size-300)}:host([strong]){--_color-fill: var(--odx-color-background-disabled-selected)}:host([subtle]) .base{animation:none}";
3405
-
3406
- const SkeletonSize = pick(Size, ["SM", "MD", "LG", "XL"]);
3407
- const SkeletonShape = { NONE: "none", BUTTON: "button", ...pick(Shape, ["CIRCLE", "RECTANGLE"]) };
3408
- const _OdxSkeleton = class _OdxSkeleton extends CustomElement {
3409
- constructor() {
3410
- super(...arguments);
3411
- this.strong = false;
3412
- this.subtle = false;
3413
- this.shape = SkeletonShape.NONE;
3414
- this.size = SkeletonSize.MD;
3415
- }
3416
- static {
3417
- customElement("odx-skeleton", styles$m)(_OdxSkeleton);
3418
- }
3419
- render() {
3420
- return html`<div class="base"></div>`;
3421
- }
3422
- };
3423
- __decorateClass([
3424
- property({ type: Boolean, reflect: true, useDefault: true })
3425
- ], _OdxSkeleton.prototype, "strong", 2);
3426
- __decorateClass([
3427
- property({ type: Boolean, reflect: true, useDefault: true })
3428
- ], _OdxSkeleton.prototype, "subtle", 2);
3429
- __decorateClass([
3430
- property({ type: String, reflect: true, useDefault: true })
3431
- ], _OdxSkeleton.prototype, "shape", 2);
3432
- __decorateClass([
3433
- property({ type: String, reflect: true, useDefault: true })
3434
- ], _OdxSkeleton.prototype, "size", 2);
3435
- let OdxSkeleton = _OdxSkeleton;
3436
-
3437
- const SliderLabelVisibility = { AUTO: "auto", HIDDEN: "hidden" };
3438
- const SliderTrackVisibility = { AUTO: "auto", HIDDEN: "hidden", VISIBLE: "visible" };
3439
- const sliderContext = {
3440
- context: n("odx-slider::context"),
3441
- defaultValue: { step: 1, min: 0, max: 100, minRange: 0, maxRange: 0, range: 100, labelVisibility: SliderLabelVisibility.AUTO, unit: "" }
3442
- };
3443
-
3444
- const styles$l = ":host{--_track-size: var(--odx-size-25);--_track-color: var(--odx-slider-track-color, var(--odx-color-background-primary-rest));--_layer-background: 0;--_layer-interactive-disabled: 1;--_layer-interactive: 2;--_layer-foreground: 3;display:flex;flex-direction:column;place-content:center;cursor:pointer;padding-block:var(--odx-size-75) var(--odx-size-50);padding-inline:var(--odx-size-75);min-block-size:var(--odx-size-300);min-inline-size:120px}:host(:active){cursor:grabbing}:host::part(container){position:relative;border-radius:var(--odx-border-radius-sm);background-color:var(--odx-color-background-control-rest);block-size:var(--_track-size)}";
3445
-
3446
- const styles$k = "*{box-sizing:border-box;margin:0;padding:0}:host{--_thumb-color: var(--_track-color);--_thumb-size: var(--odx-size-150);--_previous-position: 0%;--_position: 0%;--_next-position: 0%;display:contents}:host::part(track),:host::part(thumb),:host::part(label){position:absolute}:host::part(track),:host::part(label){pointer-events:none}:host::part(thumb),:host::part(label){inset-inline-start:var(--_position)}:host::part(track){inset:0 calc(100% - var(--_position)) 0 var(--_previous-position);z-index:var(--_layer-background);border-radius:var(--_track-size);background-color:var(--_track-color)}:host::part(thumb){display:flex;inset-block-start:50%;place-content:center;place-items:center;transform:translate(-50%,-50%);z-index:var(--_layer-interactive);outline:0 solid var(--odx-color-background-transparent-selected);border-radius:var(--odx-border-radius-circle);box-shadow:var(--odx-shadow-level-0);background-color:var(--_thumb-color);cursor:grab;block-size:var(--_thumb-size);inline-size:var(--_thumb-size)}:host::part(label){inset-block-end:100%;transform:translate(-50%) translateY(calc(-1 * var(--odx-size-75))) scale(0);opacity:0;z-index:var(--_layer-foreground);border-radius:var(--odx-border-radius-sm);background-color:var(--odx-color-background-primary-rest);padding-inline:var(--odx-size-50);line-height:var(--odx-size-150);color:var(--odx-color-foreground-inverse-static)}:host::part(with-motion){transition:var(--odx-transition-reduced)}:host([odx-drag-active])::part(with-motion){transition-property:outline}:host::part(thumb):active,:host(:active)::part(thumb){outline-width:var(--odx-size-50)}:host(:hover),:host(:focus-within){--_thumb-color: var(--odx-color-background-accent-rest)}:host(:focus-within)::part(label),:host(:hover)::part(label){transform:translate(-50%) translateY(calc(-1 * var(--odx-size-75))) scale(1);opacity:1}:host([disabled]){pointer-events:none}:host([disabled])::part(thumb){--_thumb-color: var(--odx-color-background-disabled);z-index:var(--_layer-interactive-disabled)}";
3447
-
3448
- const _OdxSliderHandle = class _OdxSliderHandle extends IsDraggable(NumberFormControl) {
3449
- constructor() {
3450
- super(...arguments);
3451
- this.context = sliderContext.defaultValue;
3452
- this.#previousHandle = null;
3453
- this.#nextHandle = null;
3454
- }
3455
- static {
3456
- customElement("odx-slider-handle", styles$k)(_OdxSliderHandle);
3457
- }
3458
- #previousHandle;
3459
- #nextHandle;
3460
- get minRange() {
3461
- return Math.ceil(this.context.minRange / this.context.step) * this.context.step;
3462
- }
3463
- connectedCallback() {
3464
- super.connectedCallback();
3465
- this.role = "slider";
3466
- this.slot = "thumbs";
3467
- this.tabIndex = 0;
3468
- }
3469
- beforeDragStart(event) {
3470
- super.beforeDragStart?.(event);
3471
- this.#nextHandle?.toggleAttribute(IS_DRAG_ACTIVE_ATTRIBUTE, true);
3472
- this.value = this.#findClosestValue(this.#getValueFromPosition(event.position));
3473
- this.focus();
3474
- }
3475
- dragStart(event) {
3476
- super.dragStart?.(event);
3477
- this.#updatePosition(this.#getValueFromPosition(event.position));
3478
- }
3479
- dragMove(event) {
3480
- super.dragMove?.(event);
3481
- const value = this.#getValueFromPosition(event.position);
3482
- const closestValue = this.#findClosestValue(value);
3483
- if (this.value !== closestValue) {
3484
- this.value = closestValue;
3485
- }
3486
- this.#updatePosition(value);
3487
- }
3488
- afterDragEnd(event) {
3489
- super.afterDragEnd?.(event);
3490
- this.#nextHandle?.toggleAttribute(IS_DRAG_ACTIVE_ATTRIBUTE, false);
3491
- this.#updatePosition(this.#findClosestValue(this.value));
3492
- }
3493
- getDistance(containerElement, event) {
3494
- const rect = containerElement.getBoundingClientRect();
3495
- const relativePosition = round((event.x - rect.x) / rect.width) * 100;
3496
- return Math.abs(this.value - this.#calculateValue(relativePosition));
3497
- }
3498
- getValueText() {
3499
- return this.context.unit ? `${this.value}${this.context.unit}` : super.getValueText();
3500
- }
3501
- willUpdate(props) {
3502
- super.willUpdate(props);
3503
- if (props.has("value")) {
3504
- this.value = this.#limitValue(this.value);
3505
- this.ariaValueNow = String(this.value);
3506
- }
3507
- if (props.has("disabled")) {
3508
- this.dragDisabled = this.disabled;
3509
- }
3510
- }
3511
- updated(props) {
3512
- super.updated(props);
3513
- if (this.isDragActive) return;
3514
- this.#previousHandle = this.#findPreviousHandle();
3515
- this.#nextHandle = this.#findNextHandle();
3516
- this.#updatePosition(this.#findClosestValue(this.value));
3517
- }
3518
- render() {
3519
- const label = this.getValueText() || this.value;
3520
- return html`
3521
- ${when(this.#isTrackVisible(), () => html`<div part="track with-motion"></div>`)}
3522
- <div part="thumb with-motion" tabindex="0"></div>
3523
- ${when(this.#isLabelVisible(), () => html`<odx-text part="label with-motion" size="sm">${label}</odx-text>`)}
3524
- `;
3525
- }
3526
- #isLabelVisible() {
3527
- return this.context.labelVisibility !== SliderLabelVisibility.HIDDEN;
3528
- }
3529
- #isTrackVisible() {
3530
- if (this.trackVisibility === SliderTrackVisibility.VISIBLE) {
3531
- return true;
3532
- }
3533
- if (this.trackVisibility === SliderTrackVisibility.HIDDEN) {
3534
- return false;
3535
- }
3536
- return !!this.#previousHandle || !(this.#previousHandle || this.#nextHandle);
3537
- }
3538
- #findClosestValue(value) {
3539
- const closestValue = value - value % this.context.step;
3540
- const isNextValue = value - closestValue > this.context.step / 2;
3541
- return this.#limitValue(closestValue + (isNextValue ? this.context.step : 0));
3542
- }
3543
- #updatePosition(value) {
3544
- const valuePercentage = `${round(Math.min(Math.max(0, (value - this.context.min) / this.context.range), 1) * 100, 3)}%`;
3545
- this.style.setProperty("--_position", valuePercentage);
3546
- this.#nextHandle?.style.setProperty("--_previous-position", valuePercentage);
3547
- this.#previousHandle?.style.setProperty("--_next-position", valuePercentage);
3548
- }
3549
- #getValueFromPosition(position) {
3550
- return this.#limitValue(this.#calculateValue(position.x));
3551
- }
3552
- #calculateValue(relativePosition) {
3553
- return Math.min(Math.max(0, relativePosition / 100), 1) * this.context.range + this.context.min;
3554
- }
3555
- #limitValue(value) {
3556
- const startLimit = this.#previousHandle ? Math.max(this.#previousHandle.value, this.min - this.minRange) + this.minRange : this.min;
3557
- const endLimit = this.#nextHandle ? Math.min(this.#nextHandle.value, this.max + this.minRange) - this.minRange : this.max;
3558
- return Math.min(Math.max(startLimit, value), endLimit);
3559
- }
3560
- #findPreviousHandle() {
3561
- let sibling = this.previousElementSibling;
3562
- while (sibling) {
3563
- if (sibling instanceof _OdxSliderHandle) return sibling;
3564
- sibling = sibling.previousElementSibling;
3565
- }
3566
- return null;
3567
- }
3568
- #findNextHandle() {
3569
- let sibling = this.nextElementSibling;
3570
- while (sibling) {
3571
- if (sibling instanceof _OdxSliderHandle) return sibling;
3572
- sibling = sibling.nextElementSibling;
3573
- }
3574
- return null;
3575
- }
3576
- };
3577
- __decorateClass([
3578
- c({ context: sliderContext.context, subscribe: true })
3579
- ], _OdxSliderHandle.prototype, "context", 2);
3580
- __decorateClass([
3581
- property()
3582
- ], _OdxSliderHandle.prototype, "trackVisibility", 2);
3583
- let OdxSliderHandle = _OdxSliderHandle;
3584
-
3585
- const _OdxSlider = class _OdxSlider extends CustomElement {
3586
- constructor() {
3587
- super();
3588
- this.dragController = new DragController(this, {
3589
- getDraggableElements: () => Array.from(this.querySelectorAll(OdxSliderHandle.tagName)),
3590
- getContainer: () => this.container
3591
- });
3592
- this.context = sliderContext.defaultValue;
3593
- this.#handleKeyboardEvent = (event) => {
3594
- const key = getKeyInfo(event);
3595
- const target = event.target;
3596
- if (target.localName !== OdxSliderHandle.tagName || key.tab || key.backTab || target.disabled) return;
3597
- event.preventDefault();
3598
- event.stopPropagation();
3599
- if (key.left || key.down) {
3600
- target.value -= this.step;
3601
- } else if (key.right || key.up) {
3602
- target.value += this.step;
3603
- } else if (key.start) {
3604
- target.value = this.context.min;
3605
- } else if (key.end) {
3606
- target.value = this.context.max;
3607
- }
3608
- };
3609
- this.#handleSlotChange = () => {
3610
- const elements = this.dragController.draggableElements;
3611
- const min = elements.reduce((min2, element) => Math.min(min2, element.min), Number.POSITIVE_INFINITY);
3612
- const max = elements.reduce((max2, element) => Math.max(max2, element.max ?? 0), Number.NEGATIVE_INFINITY);
3613
- this.context = { ...this.context, min, max, range: Math.abs(max - min) };
3614
- };
3615
- if (!isServer) {
3616
- this.addEventListener("keydown", this.#handleKeyboardEvent);
3617
- }
3618
- }
3619
- static {
3620
- customElement("odx-slider", styles$l)(_OdxSlider);
3621
- }
3622
- set step(value) {
3623
- this.context = { ...this.context, step: Math.max(1, value) };
3624
- }
3625
- get step() {
3626
- return this.context.step;
3627
- }
3628
- set minRange(value) {
3629
- this.context = { ...this.context, minRange: Math.max(0, value) };
3630
- }
3631
- get minRange() {
3632
- return this.context.minRange;
3633
- }
3634
- set labelVisibility(value) {
3635
- this.context = { ...this.context, labelVisibility: value };
3636
- }
3637
- get labelVisibility() {
3638
- return this.context.labelVisibility;
3639
- }
3640
- set unit(value) {
3641
- this.context = { ...this.context, unit: value.trim() };
3642
- }
3643
- get unit() {
3644
- return this.context.unit;
3645
- }
3646
- render() {
3647
- return html`
3648
- <div part="container" role="presentation">
3649
- <slot name="thumbs" @slotchange=${this.#handleSlotChange}></slot>
3650
- <slot name="marks"></slot>
3651
- </div>
3652
- `;
3653
- }
3654
- #handleKeyboardEvent;
3655
- #handleSlotChange;
3656
- };
3657
- __decorateClass([
3658
- e$1({ context: sliderContext.context })
3659
- ], _OdxSlider.prototype, "context", 2);
3660
- __decorateClass([
3661
- query('[part="container"]', true)
3662
- ], _OdxSlider.prototype, "container", 2);
3663
- __decorateClass([
3664
- property({ type: Number })
3665
- ], _OdxSlider.prototype, "step", 1);
3666
- __decorateClass([
3667
- property({ type: Number })
3668
- ], _OdxSlider.prototype, "minRange", 1);
3669
- __decorateClass([
3670
- property()
3671
- ], _OdxSlider.prototype, "labelVisibility", 1);
3672
- __decorateClass([
3673
- property()
3674
- ], _OdxSlider.prototype, "unit", 1);
3675
- let OdxSlider = _OdxSlider;
3676
-
3677
- const styles$j = ":host{--_mark-color: var(--odx-slider-mark-color, var(--odx-color-background-brand));--_mark-tick-block-size: var(--odx-size-37);--_mark-tick-inline-size: var(--odx-size-12);display:flex;position:absolute;inset:0;flex-direction:row;align-items:center;z-index:0;pointer-events:none}[part~=mark]{position:relative;flex:1 0 auto}[part~=mark][last]{flex:0 0 0}[part~=mark-tick]{display:block;inset-inline-end:0;transform:translate(calc(-.5 * var(--_mark-tick-inline-size)));background-color:var(--_mark-color);width:2px;height:var(--_mark-tick-block-size)}[part~=mark][last] [part~=mark-tick]{transform:none}[part~=mark-label]{position:absolute;inset-block-start:0;transform:translate(-50%) translateY(var(--odx-size-100));text-align:center;line-height:inherit}[part~=mark]:not(:last-of-type){border-inline-end-color:var(--_mark-color)}[part~=mark][active]:not([active=false]){border-inline-end-color:red}";
3678
-
3679
- const _OdxSliderMarks = class _OdxSliderMarks extends CustomElement {
3680
- constructor() {
3681
- super(...arguments);
3682
- this.context = sliderContext.defaultValue;
3683
- this.showLabels = false;
3684
- }
3685
- static {
3686
- customElement("odx-slider-marks", styles$j)(_OdxSliderMarks);
3687
- }
3688
- connectedCallback() {
3689
- super.connectedCallback();
3690
- this.slot = "marks";
3691
- }
3692
- render() {
3693
- const step = this.step ?? this.context.step;
3694
- const markCount = Math.floor(this.context.range / step);
3695
- const marks = new Array(markCount).fill(null).map((_, index) => step * index + this.context.min);
3696
- return html`
3697
- ${marks.map((value) => this.renderMark(value))}
3698
- ${this.renderMark(this.context.max, true)}
3699
- `;
3700
- }
3701
- renderMark(value, last = false) {
3702
- const label = this.showLabels ? html`<odx-text part="mark-label" size="xs" strong>${value}</odx-text>` : nothing;
3703
- return html`
3704
- <div part="mark" ?last=${last}>
3705
- <span part="mark-tick"></span>
3706
- ${label}
3707
- </div>
3708
- `;
3709
- }
3710
- };
3711
- __decorateClass([
3712
- c({ context: sliderContext.context, subscribe: true })
3713
- ], _OdxSliderMarks.prototype, "context", 2);
3714
- __decorateClass([
3715
- property({ type: Number })
3716
- ], _OdxSliderMarks.prototype, "step", 2);
3717
- __decorateClass([
3718
- property({ type: Boolean, reflect: true, useDefault: true })
3719
- ], _OdxSliderMarks.prototype, "showLabels", 2);
3720
- let OdxSliderMarks = _OdxSliderMarks;
3721
-
3722
- const styles$i = ":host{--gap-offset: 0;--size: 0;display:block;margin:calc(-1 * var(--gap-offset)) 0;block-size:var(--size);inline-size:100%}:host([dynamic]){flex:1 1 auto;block-size:100%;max-block-size:var(--size)}:host([horizontal]){margin:0 calc(-1 * var(--gap-offset));block-size:100%;inline-size:var(--size)}:host([dynamic][horizontal]){inline-size:100%;max-inline-size:var(--size)}:host([fill]){flex:1 1 var(--size);min-block-size:var(--size)}:host([fill][horizontal]){flex:1 1 var(--size);min-inline-size:var(--size)}:host([fill][dynamic]){flex:1 1 auto;min-block-size:auto;max-block-size:100%;min-inline-size:auto}";
3723
-
3724
- const _OdxSpacer = class _OdxSpacer extends CustomElement {
3725
- constructor() {
3726
- super(...arguments);
3727
- this.horizontal = false;
3728
- this.dynamic = false;
3729
- this.fill = false;
3730
- }
3731
- static {
3732
- customElement("odx-spacer", styles$i)(_OdxSpacer);
3733
- }
3734
- render() {
3735
- return "";
3736
- }
3737
- };
3738
- __decorateClass([
3739
- property({ type: Boolean, reflect: true, useDefault: true })
3740
- ], _OdxSpacer.prototype, "horizontal", 2);
3741
- __decorateClass([
3742
- property({ type: Boolean, reflect: true, useDefault: true })
3743
- ], _OdxSpacer.prototype, "dynamic", 2);
3744
- __decorateClass([
3745
- property({ type: Boolean, reflect: true, useDefault: true })
3746
- ], _OdxSpacer.prototype, "fill", 2);
3747
- let OdxSpacer = _OdxSpacer;
3748
-
3749
- const styles$h = ":host{display:inline-flex;gap:var(--odx-size-37);align-items:center;outline:var(--odx-focus-ring-outline);border-radius:var(--odx-border-radius-controls);block-size:var(--odx-size-225);min-inline-size:20ch}:host(:focus-visible){outline-color:var(--odx-color-stroke-focus-outer)}::slotted(odx-option){flex:1 1 auto;justify-content:center}::slotted(odx-option[hidden]){display:none}";
3750
-
3751
- const _OdxSpinbox = class _OdxSpinbox extends FormControl {
3752
- constructor() {
3753
- super();
3754
- this.selectedIndex = 0;
3755
- this.value = "";
3756
- this.#handleKeyDown = (event) => {
3757
- if (this.disabled || this.readonly || event.composedPath()[0] !== this) return;
3758
- const key = getKeyInfo(event);
3759
- if (key.left) {
3760
- this.previous();
3761
- } else if (key.right) {
3762
- this.next();
3763
- } else if (key.start) {
3764
- this.selectedIndex = 0;
3765
- } else if (key.end) {
3766
- this.selectedIndex = this.options.length - 1;
3767
- }
3768
- };
3769
- if (!isServer) {
3770
- this.addEventListener("keydown", this.#handleKeyDown);
3771
- }
3772
- }
3773
- static {
3774
- customElement("odx-spinbox", styles$h)(_OdxSpinbox);
3775
- }
3776
- static {
3777
- this.shadowRootOptions = {
3778
- ...FormControl.shadowRootOptions,
3779
- delegatesFocus: false
3780
- };
3781
- }
3782
- willUpdate(props) {
3783
- super.willUpdate(props);
3784
- if (props.has("selectedIndex")) {
3785
- const option = this.options[this.selectedIndex];
3786
- if (option) {
3787
- this.value = option.value;
3788
- this.emit("change", { detail: { index: this.selectedIndex, option } });
3789
- }
3790
- }
3791
- }
3792
- updated(props) {
3793
- super.updated(props);
3794
- if (props.has("disabled") || props.has("selectedIndex")) {
3795
- this.options.forEach((option, index) => {
3796
- option.toggleAttribute("hidden", this.selectedIndex !== index);
3797
- option.disabled = this.disabled;
3798
- });
3799
- }
3800
- }
3801
- previous() {
3802
- if (this.disabled || this.readonly) return;
3803
- this.selectedIndex = (this.selectedIndex - 1 + this.options.length) % this.options.length;
3804
- }
3805
- next() {
3806
- if (this.disabled || this.readonly) return;
3807
- this.selectedIndex = (this.selectedIndex + 1) % this.options.length;
3808
- }
3809
- connectedCallback() {
3810
- super.connectedCallback();
3811
- this.tabIndex = 0;
3812
- }
3813
- render() {
3814
- return html`
3815
- <odx-icon-button icon="core::chevron-left" variant="ghost" ?disabled=${this.disabled} @click=${() => this.previous()}></odx-icon-button>
3816
- <slot></slot>
3817
- <odx-icon-button icon="core::chevron-right" variant="ghost" ?disabled=${this.disabled} @click=${() => this.next()}></odx-icon-button>
3818
- `;
3819
- }
3820
- #handleKeyDown;
3821
- };
3822
- __decorateClass([
3823
- queryAssignedElements({ selector: '[role="option"]', flatten: true })
3824
- ], _OdxSpinbox.prototype, "options", 2);
3825
- __decorateClass([
3826
- property({ type: Number, attribute: "selected-index" })
3827
- ], _OdxSpinbox.prototype, "selectedIndex", 2);
3828
- __decorateClass([
3829
- property()
3830
- ], _OdxSpinbox.prototype, "value", 2);
3831
- let OdxSpinbox = _OdxSpinbox;
3832
-
3833
- const styles$g = ":host{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;max-inline-size:100%;text-align:start}:host([horizontal]){flex-direction:row}:host([wrap]){flex-wrap:wrap}:host,:host([gap=\"md\"]){gap:var(--odx-spacing-75)}:host([gap=\"none\"]){gap:0}:host([gap=\"xs\"]){gap:var(--odx-spacing-25)}:host([gap=\"sm\"]){gap:var(--odx-spacing-50)}:host([gap=\"lg\"]){gap:var(--odx-spacing-150)}:host([gap=\"xl\"]){gap:var(--odx-size-225)}:host([align=\"start\"]){align-items:flex-start}:host([align=\"center\"]){align-items:center}:host([align=\"end\"]){align-items:end}:host([justify=\"start\"]){justify-content:flex-start}:host([justify=\"end\"]){justify-content:flex-end}:host([justify=\"center\"]){justify-content:center}:host([justify=\"space-between\"]){justify-content:space-between}:host([justify=\"space-around\"]){justify-content:space-around}:host([justify=\"space-evenly\"]){justify-content:space-evenly}";
3834
-
3835
- const StackAlign = {
3836
- START: "start",
3837
- CENTER: "center",
3838
- END: "end"
3839
- };
3840
- const StackGap = {
3841
- NONE: "none",
3842
- ...pick(Size, ["XS", "SM", "MD", "LG", "XL"])
3843
- };
3844
- const StackJustify = {
3845
- START: "start",
3846
- END: "end",
3847
- CENTER: "center",
3848
- SPACE_BETWEEN: "space-between",
3849
- SPACE_AROUND: "space-around",
3850
- SPACE_EVENLY: "space-evenly"
3851
- };
3852
- const _OdxStack = class _OdxStack extends CustomElement {
3853
- constructor() {
3854
- super(...arguments);
3855
- this.horizontal = false;
3856
- this.wrap = false;
3857
- }
3858
- static {
3859
- customElement("odx-stack", styles$g)(_OdxStack);
3860
- }
3861
- };
3862
- __decorateClass([
3863
- property({ reflect: true })
3864
- ], _OdxStack.prototype, "align", 2);
3865
- __decorateClass([
3866
- property({ reflect: true })
3867
- ], _OdxStack.prototype, "justify", 2);
3868
- __decorateClass([
3869
- property({ reflect: true })
3870
- ], _OdxStack.prototype, "gap", 2);
3871
- __decorateClass([
3872
- property({ type: Boolean, reflect: true, useDefault: true })
3873
- ], _OdxStack.prototype, "horizontal", 2);
3874
- __decorateClass([
3875
- property({ type: Boolean, reflect: true, useDefault: true })
3876
- ], _OdxStack.prototype, "wrap", 2);
3877
- let OdxStack = _OdxStack;
3878
-
3879
- const styles$f = ":host{display:inline-flex;gap:var(--odx-size-37);align-items:center;border-radius:var(--odx-border-radius-circle);background-color:var(--odx-color-background-level-1);cursor:default;padding-inline:var(--odx-size-37) var(--odx-size-50);block-size:var(--odx-size-150);font-weight:var(--odx-typography-font-weight-medium)}:host([variant=\"primary\"]){background-color:var(--odx-color-background-primary-subtle)}:host([variant=\"danger\"]){background-color:var(--odx-color-background-danger-subtle);color:var(--odx-color-foreground-danger-rest)}:host([variant=\"warning\"]){background-color:var(--odx-color-background-warning-subtle)}:host([variant=\"success\"]){background-color:var(--odx-color-background-success-subtle)}";
3880
-
3881
- const StatusVariant = pick(Variant, ["NEUTRAL", "PRIMARY", "SUCCESS", "WARNING", "DANGER"]);
3882
- const _OdxStatus = class _OdxStatus extends CustomElement {
3883
- constructor() {
3884
- super(...arguments);
3885
- this.pulse = false;
3886
- this.variant = StatusVariant.NEUTRAL;
3887
- }
3888
- static {
3889
- customElement("odx-status", styles$f)(_OdxStatus);
3890
- }
3891
- render() {
3892
- return html`
3893
- <odx-badge compact ?pulse=${this.pulse} variant=${optionalAttr(this.variant)}></odx-badge>
3894
- <slot></slot>
3895
- `;
3896
- }
3897
- };
3898
- __decorateClass([
3899
- property({ type: Boolean, reflect: true, useDefault: true })
3900
- ], _OdxStatus.prototype, "pulse", 2);
3901
- __decorateClass([
3902
- property({ reflect: true, useDefault: true })
3903
- ], _OdxStatus.prototype, "variant", 2);
3904
- let OdxStatus = _OdxStatus;
3905
-
3906
- const styles$e = "@layer base{:host{--_color-background: var(--odx-color-background-control-rest);--_color-stroke: var(--odx-color-stroke-control-subtle);--_color-foreground: var(--odx-color-foreground-rest-subtle);--_label-color-foreground: var(--odx-color-foreground-rest);--_thumb-size: var(--odx-size-125);--_thumb-position: 0;display:inline-flex;margin:var(--odx-size-37) var(--odx-size-75);cursor:pointer;user-select:none}.indicator,.content{transition:var(--odx-transition-reduced)}.indicator{display:flex;position:relative;place-items:center;transition-property:background-color,border-color,translate;block-size:var(--odx-size-150);color:var(--_color-foreground)}.track,.thumb{transition:inherit;border:var(--odx-border-width-thin) solid var(--_color-stroke);border-radius:var(--odx-border-radius-circle)}.track{background-color:var(--_color-background);block-size:var(--odx-size-50);inline-size:var(--odx-size-225)}.thumb{display:flex;position:absolute;inset-inline-start:0;place-content:center;place-items:center;backface-visibility:hidden;outline:var(--odx-focus-ring-outline);outline-offset:var(--odx-focus-ring-offset);background-color:var(--_color-background);block-size:var(--odx-size-125);inline-size:var(--odx-size-125);translate:var(--_thumb-position) 0}.label{display:inline-block;cursor:inherit}.content{transition-property:color;padding-inline-end:var(--odx-size-25);color:var(--_label-color-foreground)}}@layer state{:host(:not(:empty)) .indicator{margin-inline-end:var(--odx-size-75)}:host(:empty) .content{display:none}:host(:not(:is([checked],[disabled],[readonly])):hover){--_color-stroke: var(--odx-color-stroke-control-hover);--_color-background: var(--odx-color-background-control-hover);--_color-foreground: var(--odx-color-foreground-rest)}:host(:focus-visible) .thumb{outline-color:var(--odx-color-stroke-focus-outer);&:after{position:absolute;inset:-3px;border:var(--odx-focus-ring-offset) solid var(--odx-color-stroke-focus-inner);border-radius:inherit;content:\"\"}}:host([checked]){--_color-background: var(--odx-color-background-control-selected);--_color-stroke: var(--_color-background);--_color-foreground: var(--odx-color-foreground-inverse);--_thumb-position: calc(var(--odx-size-225) - 100%)}:host([checked]:not(:is([readonly],[disabled])):hover){--_color-background: var(--odx-color-background-control-selected-hover)}:host([disabled]:not([readonly])){--_color-background: var(--odx-color-background-disabled-rest);--_color-stroke: var(--odx-color-disabled-stroke);--_color-foreground: var(--odx-color-foreground-disabled-rest);--_label-color-foreground: var(--odx-color-foreground-disabled-rest);cursor:not-allowed}:host([disabled][checked]:not([readonly])){--_color-background: var(--odx-color-background-disabled-selected);--_color-foreground: var(--odx-color-foreground-disabled-selected)}:host([readonly]){--_color-stroke: var(--odx-color-stroke-control-readonly);--_color-background: var(--odx-color-background-control-rest);--_color-foreground: var(--odx-color-foreground-rest);cursor:default}}";
3907
-
3908
- class OdxSwitch extends CheckboxFormControl {
3909
- static {
3910
- customElement("odx-switch", styles$e)(OdxSwitch);
3911
- }
3912
- connectedCallback() {
3913
- super.connectedCallback();
3914
- this.role = "switch";
3915
- }
3916
- render() {
3917
- return html`
3918
- <div class="indicator">
3919
- <div class="track"></div>
3920
- <div class="thumb">
3921
- <odx-icon name=${this.checked ? "core::check" : "core::close"}></odx-icon>
3922
- </div>
3923
- </div>
3924
- <div class="content">
3925
- <div class="label">
3926
- <slot></slot>
3927
- </div>
3928
- <div class="description">
3929
- <slot name="description"></slot>
3930
- </div>
3931
- </div>
3932
- `;
3933
- }
3934
- }
3935
-
3936
- const styles$d = ":host{display:flex;flex-direction:column;background-color:var(--odx-color-background-level-1)}";
3937
-
3938
- const styles$c = ":host{display:block;block-size:auto;flex:0 0 auto;padding-inline:var(--odx-size-75);line-height:var(--odx-size-300)}.checkbox{padding:var(--odx-size-37)}";
3939
-
3940
- const _OdxTableCheckboxCell = class _OdxTableCheckboxCell extends CanBeDisabled(CustomElement) {
3941
- constructor() {
3942
- super(...arguments);
3943
- this.checked = false;
3944
- this.indeterminate = false;
3945
- this.#handleChange = (event) => {
3946
- event.preventDefault();
3947
- event.stopPropagation();
3948
- this.checked = event.target.checked;
3949
- this.indeterminate = false;
3950
- this.emit("change");
3951
- };
3952
- }
3953
- static {
3954
- customElement("odx-table-checkbox-cell", styles$c)(_OdxTableCheckboxCell);
3955
- }
3956
- connectedCallback() {
3957
- super.connectedCallback();
3958
- this.role = "gridcell";
3959
- }
3960
- click() {
3961
- this.control.click();
3962
- }
3963
- render() {
3964
- return html`<odx-checkbox class="checkbox" ?checked=${this.checked} ?disabled=${this.disabled} ?indeterminate=${this.indeterminate} @change=${this.#handleChange}></odx-checkbox>`;
3965
- }
3966
- #handleChange;
3967
- };
3968
- __decorateClass([
3969
- query(".checkbox")
3970
- ], _OdxTableCheckboxCell.prototype, "control", 2);
3971
- __decorateClass([
3972
- property({ type: Boolean, reflect: true, useDefault: true })
3973
- ], _OdxTableCheckboxCell.prototype, "checked", 2);
3974
- __decorateClass([
3975
- property({ type: Boolean })
3976
- ], _OdxTableCheckboxCell.prototype, "indeterminate", 2);
3977
- let OdxTableCheckboxCell = _OdxTableCheckboxCell;
3978
-
3979
- const styles$b = ":host{display:flex;align-items:center;border-block-end:var(--odx-border-sm);border-color:var(--odx-color-outline-surface);padding-inline:var(--odx-size-75)}odx-checkbox{pointer-events:none;margin-inline-start:var(--odx-size-75)}";
3980
-
3981
- const _OdxTableHeader = class _OdxTableHeader extends CheckboxFormControl {
3982
- constructor() {
3983
- super(...arguments);
3984
- this.selected = false;
3985
- }
3986
- static {
3987
- customElement("odx-table-header", styles$b)(_OdxTableHeader);
3988
- }
3989
- connectedCallback() {
3990
- super.connectedCallback();
3991
- this.role = "row";
3992
- }
3993
- render() {
3994
- return html` <slot @change=${this.#handleChange}></slot>`;
3995
- }
3996
- async #handleChange(event) {
3997
- if (event.target.localName !== OdxTableCheckboxCell.tagName) return;
3998
- this.selected = event.target.checked;
3999
- await 0;
4000
- if (!event.defaultPrevented) return;
4001
- this.selected = !this.selected;
4002
- }
4003
- };
4004
- __decorateClass([
4005
- property({ type: Boolean, reflect: true, useDefault: true })
4006
- ], _OdxTableHeader.prototype, "selected", 2);
4007
- let OdxTableHeader = _OdxTableHeader;
4008
-
4009
- const styles$a = ":host{--_color-fill: transparent;display:flex;align-items:center;transition:var(--odx-transition-reduced);transition-property:background-color;border-block-end:var(--odx-border-width-thin) solid var(--odx-color-stroke-neutral-subtle);background-color:var(--_color-fill);cursor:pointer;padding-inline:var(--odx-size-75);inline-size:100%}:host(:not(:last-of-type)){border-color:var(--odx-color-stroke-neutral-subtle)}:host([selectable]:hover){--_color-fill: var(--odx-color-background-transparent-hover)}:host([selected]){--_color-fill: var(--odx-color-background-transparent-selected)}odx-checkbox{margin-inline-start:var(--odx-size-75);pointer-events:none}";
4010
-
4011
- const _OdxTableRow = class _OdxTableRow extends CanBeDisabled(CustomElement) {
4012
- constructor() {
4013
- super(...arguments);
4014
- this.selected = false;
4015
- this.selectable = true;
4016
- this.value = "";
4017
- this.#handleClick = (event) => {
4018
- const isCheckboxCell = event.composedPath().some((node) => node.localName === OdxTableCheckboxCell.tagName);
4019
- if (isCheckboxCell) return;
4020
- const [checkboxCell] = this.checkboxCells;
4021
- checkboxCell?.click();
4022
- };
4023
- this.#handleChange = async (event) => {
4024
- this.selected = event.target.checked;
4025
- await 0;
4026
- if (!event.defaultPrevented) return;
4027
- this.selected = !this.selected;
4028
- };
4029
- this.#handleSlotchange = ({ target }) => {
4030
- this.selectable = target.assignedElements().some((element) => element.localName === OdxTableCheckboxCell.tagName);
4031
- };
4032
- }
4033
- static {
4034
- customElement("odx-table-row", styles$a)(_OdxTableRow);
4035
- }
4036
- connectedCallback() {
4037
- super.connectedCallback();
4038
- this.role = "row";
4039
- }
4040
- render() {
4041
- return html`
4042
- <slot @change=${this.#handleChange} @slotchange=${this.#handleSlotchange}></slot>
4043
- `;
4044
- }
4045
- willUpdate(props) {
4046
- super.willUpdate(props);
4047
- if (props.has("selected")) {
4048
- this.#handleSelectedChange();
4049
- }
4050
- if (props.has("selectable")) {
4051
- this.#handleSelectableChange();
4052
- }
4053
- }
4054
- async #handleSelectedChange() {
4055
- await this.updateComplete;
4056
- if (this.selectable) {
4057
- this.ariaSelected = toAriaBooleanAttribute(this.selected, false);
4058
- } else {
4059
- this.ariaSelected = null;
4060
- }
4061
- const [checkboxCell] = this.checkboxCells;
4062
- if (!checkboxCell) return;
4063
- checkboxCell.checked = this.selected;
4064
- }
4065
- #handleSelectableChange() {
4066
- if (this.selectable) {
4067
- this.addEventListener("click", this.#handleClick);
4068
- } else {
4069
- this.removeEventListener("click", this.#handleClick);
4070
- }
4071
- }
4072
- #handleClick;
4073
- #handleChange;
4074
- #handleSlotchange;
4075
- };
4076
- __decorateClass([
4077
- queryAssignedElements({ selector: OdxTableCheckboxCell.tagName, flatten: true })
4078
- ], _OdxTableRow.prototype, "checkboxCells", 2);
4079
- __decorateClass([
4080
- property({ type: Boolean, reflect: true, useDefault: true })
4081
- ], _OdxTableRow.prototype, "selected", 2);
4082
- __decorateClass([
4083
- property({ type: Boolean, reflect: true, useDefault: true })
4084
- ], _OdxTableRow.prototype, "selectable", 2);
4085
- __decorateClass([
4086
- property({ type: String })
4087
- ], _OdxTableRow.prototype, "value", 2);
4088
- let OdxTableRow = _OdxTableRow;
4089
-
4090
- const _OdxTable = class _OdxTable extends CustomElement {
4091
- constructor() {
4092
- super(...arguments);
4093
- this.#selectedSet = /* @__PURE__ */ new Set();
4094
- this.mode = "selection";
4095
- this.selected = [];
4096
- this.items = [];
4097
- this.#handleChange = (event) => {
4098
- if (event.target.localName !== OdxTableCheckboxCell.tagName) return;
4099
- event.stopPropagation();
4100
- const rowElement = event.target.parentElement;
4101
- if (!rowElement) return;
4102
- const isSelected = event.target.checked;
4103
- if (rowElement.localName === OdxTableHeader.tagName) {
4104
- if (event.target.checked) {
4105
- this.#selectAllRows();
4106
- } else {
4107
- this.#deselectAllRows();
4108
- }
4109
- } else if (isSelected) {
4110
- this.#selectedSet.add(rowElement.value);
4111
- } else {
4112
- this.#selectedSet.delete(rowElement.value);
4113
- }
4114
- };
4115
- }
4116
- static {
4117
- customElement("odx-table", styles$d)(_OdxTable);
4118
- }
4119
- #selectedSet;
4120
- get headerElements() {
4121
- return Array.from(this.querySelectorAll(OdxTableHeader.tagName));
4122
- }
4123
- get rowElements() {
4124
- return Array.from(this.querySelectorAll(OdxTableRow.tagName));
4125
- }
4126
- connectedCallback() {
4127
- super.connectedCallback();
4128
- this.role = "grid";
4129
- }
4130
- render() {
4131
- return html`<slot @change=${this.#handleChange}></slot>`;
4132
- }
4133
- #selectAllRows() {
4134
- for (const row of this.rowElements) {
4135
- row.selected = true;
4136
- this.#selectedSet.add(row.value);
4137
- }
4138
- }
4139
- #deselectAllRows() {
4140
- this.#selectedSet.clear();
4141
- for (const row of this.rowElements) {
4142
- if (!row.selected) continue;
4143
- row.selected = false;
4144
- }
4145
- }
4146
- #handleChange;
4147
- };
4148
- __decorateClass([
4149
- property()
4150
- ], _OdxTable.prototype, "mode", 2);
4151
- __decorateClass([
4152
- property({ type: Array })
4153
- ], _OdxTable.prototype, "selected", 2);
4154
- __decorateClass([
4155
- property({ type: Array })
4156
- ], _OdxTable.prototype, "items", 2);
4157
- let OdxTable = _OdxTable;
4158
-
4159
- const tableContext = {
4160
- context: n("odx-table::context"),
4161
- defaultValue: { hasCheckboxes: true }
4162
- };
4163
-
4164
- const styles$9 = ":host{display:block;flex-grow:1}";
4165
-
4166
- class OdxTableBody extends CustomElement {
4167
- static {
4168
- customElement("odx-table-body", styles$9)(OdxTableBody);
4169
- }
4170
- connectedCallback() {
4171
- super.connectedCallback();
4172
- this.role = "rowgroup";
4173
- }
4174
- render() {
4175
- return html`<slot></slot>`;
4176
- }
4177
- }
4178
-
4179
- const styles$8 = ":host{display:block;block-size:auto;flex:1 1 0%;padding-inline:var(--odx-size-75);line-height:var(--odx-size-300)}";
4180
-
4181
- class OdxTableCell extends CustomElement {
4182
- static {
4183
- customElement("odx-table-cell", styles$8)(OdxTableCell);
4184
- }
4185
- connectedCallback() {
4186
- super.connectedCallback();
4187
- this.role = "gridcell";
4188
- }
4189
- render() {
4190
- return html`<slot></slot>`;
4191
- }
4192
- }
4193
-
4194
- const styles$7 = ":host{display:block;block-size:auto;flex:1 1 0%;padding-inline:var(--odx-size-75);line-height:var(--odx-size-225)}";
4195
-
4196
- const _OdxTableHeaderCell = class _OdxTableHeaderCell extends CustomElement {
4197
- constructor() {
4198
- super(...arguments);
4199
- this.sortable = false;
4200
- }
4201
- static {
4202
- customElement("odx-table-header-cell", styles$7)(_OdxTableHeaderCell);
4203
- }
4204
- connectedCallback() {
4205
- super.connectedCallback();
4206
- this.role = "columnheader";
4207
- }
4208
- render() {
4209
- return html`
4210
- <odx-title size="xs">
4211
- <slot></slot> (${this.sortable ? "sortable" : "not sortable"})
4212
- </odx-title>
4213
- `;
4214
- }
4215
- };
4216
- __decorateClass([
4217
- property({ type: Boolean })
4218
- ], _OdxTableHeaderCell.prototype, "sortable", 2);
4219
- let OdxTableHeaderCell = _OdxTableHeaderCell;
4220
-
4221
- const styles$6 = "@layer base{:host{display:block;text-decoration:inherit;line-height:inherit;color:inherit;font-size:inherit;font-weight:inherit}:host([inline]){display:inline-block}}@layer variant{:host([strong]){font-weight:var(--odx-typography-font-weight-medium)}:host([subtle]){color:var(--odx-color-foreground-rest-subtle)}:host([size=\"xs\"]){line-height:var(--odx-typography-line-height-1);font-size:var(--odx-typography-font-size-1)}:host([size=\"sm\"]){line-height:var(--odx-typography-line-height-2);font-size:var(--odx-typography-font-size-2)}:host([size=\"md\"]){line-height:var(--odx-typography-line-height-3);font-size:var(--odx-typography-font-size-3)}:host([size=\"lg\"]){line-height:var(--odx-typography-line-height-4);font-size:var(--odx-typography-font-size-4)}:host([variant=\"accent\"]){color:var(--odx-color-background-accent-rest)}:host([variant=\"success\"]){color:var(--odx-color-background-success-rest)}:host([variant=\"danger\"]){color:var(--odx-color-foreground-danger-rest)}}";
4222
-
4223
- const TextSize = pick(Size, ["XS", "SM", "MD", "LG"]);
4224
- const TextVariant = pick(Variant, ["NEUTRAL", "ACCENT", "SUCCESS", "DANGER"]);
4225
- const _OdxText = class _OdxText extends CustomElement {
4226
- constructor() {
4227
- super(...arguments);
4228
- this.strong = false;
4229
- this.subtle = false;
4230
- this.inline = false;
4231
- this.variant = TextVariant.NEUTRAL;
4232
- }
4233
- static {
4234
- customElement("odx-text", styles$6)(_OdxText);
4235
- }
4236
- };
4237
- __decorateClass([
4238
- property({ type: Boolean, reflect: true, useDefault: true })
4239
- ], _OdxText.prototype, "strong", 2);
4240
- __decorateClass([
4241
- property({ type: Boolean, reflect: true, useDefault: true })
4242
- ], _OdxText.prototype, "subtle", 2);
4243
- __decorateClass([
4244
- property({ type: Boolean, reflect: true, useDefault: true })
4245
- ], _OdxText.prototype, "inline", 2);
4246
- __decorateClass([
4247
- property({ reflect: true })
4248
- ], _OdxText.prototype, "size", 2);
4249
- __decorateClass([
4250
- property({ reflect: true, useDefault: true })
4251
- ], _OdxText.prototype, "variant", 2);
4252
- let OdxText = _OdxText;
4253
-
4254
- const styles$5 = ":host{display:inline-block}";
4255
-
4256
- const ToastVariant = pick(Variant, ["NEUTRAL", "PRIMARY", "SUCCESS", "WARNING", "DANGER"]);
4257
- const _OdxToast = class _OdxToast extends CustomElement {
4258
- constructor() {
4259
- super(...arguments);
4260
- this.variant = ToastVariant.NEUTRAL;
4261
- }
4262
- static {
4263
- customElement("odx-toast", styles$5)(_OdxToast);
4264
- }
4265
- render() {
4266
- return html`
4267
- <odx-inline-message icon=${optionalAttr(this.icon)} variant=${this.variant}>
4268
- <slot name="title"></slot>
4269
- <slot></slot>
4270
- </odx-inline-message>
4271
- `;
4272
- }
4273
- };
4274
- __decorateClass([
4275
- property()
4276
- ], _OdxToast.prototype, "icon", 2);
4277
- __decorateClass([
4278
- property({ reflect: true, useDefault: true })
4279
- ], _OdxToast.prototype, "variant", 2);
4280
- let OdxToast = _OdxToast;
4281
-
4282
- const styles$4 = ":host{--_border-radius: var(--odx-border-radius-sm);--_color-background: var(--odx-color-background-control-rest);--_color-stroke: var(--odx-color-stroke-control-subtle);--_color-foreground: var(--odx-color-foreground-rest);--_size: var(--odx-size-225);--_padding-inline: var(--odx-size-75);display:inline-flex;position:relative;align-items:center;justify-content:center;transition:var(--odx-transition-default);transition-property:color,background-color,border-color,outline-color;outline:var(--odx-focus-ring-outline);outline-offset:var(--odx-focus-ring-offset);border:var(--odx-border-width-thin) solid var(--_color-stroke);border-radius:var(--odx-border-radius-controls);background-color:var(--_color-background);cursor:pointer;padding-inline:var(--_padding-inline);block-size:var(--_size);color:var(--_color-foreground);font-weight:var(--odx-typography-font-weight-medium);user-select:none}::slotted(odx-icon){margin-inline:calc(-1 * var(--odx-size-37) - var(--odx-border-width-thin))}::part(label){display:inline-block}:host(:hover){--_color-background: var(--odx-color-background-control-hover);--_color-stroke: var(--odx-color-stroke-control-hover)}:host(:active){--_color-background: var(--odx-color-background-control-pressed);--_color-stroke: var(--odx-color-stroke-control-pressed)}:host(:focus-visible){outline-color:var(--odx-color-stroke-focus-outer)}:host([readonly][checked]),:host([checked]){--_color-background: var(--odx-color-background-control-selected);--_color-foreground: var(--odx-color-foreground-inverse-static);--_color-stroke: var(--odx-color-stroke-control-selected)}:host([checked]:not(:is([readonly],[disabled])):hover){--_color-background: var(--odx-color-background-control-selected-hover)}:host([disabled]:not([readonly])){--_color-background: var(--odx-color-background-disabled-rest);--_color-foreground: var(--odx-color-foreground-disabled-rest);--_color-stroke: var(--odx-color-stroke-disabled-rest);cursor:not-allowed}:host([disabled][checked]:not([readonly])){--_color-background: var(--odx-color-background-disabled-selected);--_color-foreground: var(--odx-color-foreground-disabled-selected)}:host([readonly]){--_color-background: var(--odx-color-background-control-readonly);--_color-stroke: var(--odx-color-stroke-control-subtle);--_color-foreground: var(--odx-color-foreground-rest-subtle);cursor:default}";
4283
-
4284
- class OdxToggleButton extends CheckboxFormControl {
4285
- static {
4286
- customElement("odx-toggle-button", styles$4)(OdxToggleButton);
4287
- }
4288
- connectedCallback() {
4289
- super.connectedCallback();
4290
- this.role = "button";
4291
- }
4292
- updateAriaAttributes() {
4293
- this.ariaPressed = toAriaBooleanAttribute(this.checked, false);
4294
- }
4295
- render() {
4296
- return html`
4297
- <slot></slot>
4298
- `;
4299
- }
4300
- }
4301
-
4302
- const styles$3 = ":host{display:inline-flex;gap:0;align-items:center}::slotted(*){margin-block:0}::slotted(odx-toggle-button:first-child){z-index:1;border-start-end-radius:0;border-end-end-radius:0}::slotted(odx-toggle-button:last-child){border-start-start-radius:0;border-end-start-radius:0}::slotted(odx-toggle-button:not(:first-child,:last-child)){margin-inline:calc(-1 * var(--odx-border-width-thin));border-radius:0}::slotted(odx-toggle-button:is(:hover,:focus-within)){position:relative}::slotted(odx-toggle-button:not(:first-child,:last-child):is(:hover,:focus-within)){z-index:2}:host([block]){display:flex;::slotted(odx-toggle-button){width:100%}}";
4303
-
4304
- const _OdxToggleButtonGroup = class _OdxToggleButtonGroup extends RadioGroupFormControl {
4305
- constructor() {
4306
- super(...arguments);
4307
- this.block = false;
4308
- }
4309
- static {
4310
- customElement("odx-toggle-button-group", styles$3)(_OdxToggleButtonGroup);
4311
- }
4312
- };
4313
- __decorateClass([
4314
- property({ type: Boolean, reflect: true, useDefault: true })
4315
- ], _OdxToggleButtonGroup.prototype, "block", 2);
4316
- let OdxToggleButtonGroup = _OdxToggleButtonGroup;
4317
-
4318
- const styles$2 = ":host{--offset-y: -100%;--transition: var(--odx-transition-default);display:grid;grid-template-rows:1fr;transition:var(--transition)}.base{overflow:hidden}.content{transition:var(--transition);transition-property:transform,opacity}:host([hidden]){grid-template-rows:0fr;.content{transform:translateY(var(--offset-y));opacity:0}}";
4319
-
4320
- const _OdxToggleContent = class _OdxToggleContent extends CustomElement {
4321
- constructor() {
4322
- super(...arguments);
4323
- this.hidden = false;
4324
- }
4325
- static {
4326
- customElement("odx-toggle-content", styles$2)(_OdxToggleContent);
4327
- }
4328
- render() {
4329
- return html`
4330
- <div class="base">
4331
- <div class="content">
4332
- <slot></slot>
4333
- </div>
4334
- </div>
4335
- `;
4336
- }
4337
- };
4338
- __decorateClass([
4339
- property({ type: Boolean, reflect: true, useDefault: true })
4340
- ], _OdxToggleContent.prototype, "hidden", 2);
4341
- let OdxToggleContent = _OdxToggleContent;
4342
-
4343
- const styles$1 = ":host{--_popover-color-background: var(--odx-color-background-level-3);--_popover-color-foreground: var(--odx-color-foreground-inverse-static)}:host(:not([interactive])){pointer-events:none;user-select:none}odx-popover{border-radius:var(--odx-border-radius-md);&::part(content){padding-block:var(--odx-size-37);padding-inline:var(--odx-size-75)}}";
4344
-
4345
- const TooltipPlacement = pick(Placement, ["TOP", "RIGHT", "BOTTOM", "LEFT"]);
4346
- const _OdxTooltip = class _OdxTooltip extends PopoverHost {
4347
- constructor() {
4348
- super(...arguments);
4349
- this.show = false;
4350
- this.placement = TooltipPlacement.TOP;
4351
- this.#handleReferenceMouseLeave = (event) => {
4352
- if (event.relatedTarget === this) return;
4353
- this.#handleMouseEvents(event);
4354
- };
4355
- this.#handleMouseEvents = (event) => {
4356
- if (event.type !== "mouseenter" && event.type !== "mouseleave") return;
4357
- this.updateReferenceElementFromEvent(event);
4358
- this.togglePopover(event.type === "mouseenter");
4359
- };
4360
- this.#handleKeyboardFocus = (event) => {
4361
- if (event.key !== "Tab") return;
4362
- this.updateReferenceElementFromEvent(event);
4363
- this.togglePopover(event.type !== "keydown");
4364
- };
4365
- }
4366
- static {
4367
- customElement("odx-tooltip", styles$1)(_OdxTooltip);
4368
- }
4369
- #timeout;
4370
- connectedCallback() {
4371
- super.connectedCallback();
4372
- this.id ||= getUniqueId("odx-tooltip");
4373
- this.role = "tooltip";
4374
- }
4375
- onPopoverShow() {
4376
- super.onPopoverShow?.();
4377
- if (typeof this.timeout !== "number" || this.timeout <= 0) return;
4378
- this.#timeout = window.setTimeout(() => this.togglePopover(false), this.timeout);
4379
- }
4380
- onBeforePopoverHide() {
4381
- super.onBeforePopoverHide?.();
4382
- clearTimeout(this.#timeout);
4383
- }
4384
- mountPopover(referenceElement) {
4385
- super.mountPopover(referenceElement);
4386
- if (!referenceElement) return;
4387
- this.#updateAriaAttributes(referenceElement, this.id);
4388
- if (this.popover === "manual") return;
4389
- referenceElement.addEventListener("mouseenter", this.#handleMouseEvents);
4390
- referenceElement.addEventListener("mouseleave", this.#handleReferenceMouseLeave);
4391
- referenceElement.addEventListener("keyup", this.#handleKeyboardFocus);
4392
- referenceElement.addEventListener("keydown", this.#handleKeyboardFocus);
4393
- }
4394
- unmountPopover(referenceElement) {
4395
- super.unmountPopover(referenceElement);
4396
- this.#updateAriaAttributes(referenceElement, null);
4397
- referenceElement.removeEventListener("keyup", this.#handleKeyboardFocus);
4398
- referenceElement.removeEventListener("keydown", this.#handleKeyboardFocus);
4399
- referenceElement.removeEventListener("mouseenter", this.#handleMouseEvents);
4400
- referenceElement.removeEventListener("mouseleave", this.#handleReferenceMouseLeave);
4401
- }
4402
- render() {
4403
- return html`
4404
- <odx-popover showArrow>
4405
- <slot></slot>
4406
- </odx-popover>
4407
- `;
4408
- }
4409
- willUpdate(props) {
4410
- super.willUpdate(props);
4411
- if (!this.referenceElement) return;
4412
- if (props.has("id")) {
4413
- this.#updateAriaAttributes(this.referenceElement, this.id);
4414
- }
4415
- if (props.has("show")) {
4416
- this.togglePopover(this.show);
4417
- }
4418
- }
4419
- #updateAriaAttributes(referenceElement, id) {
4420
- if (id) {
4421
- referenceElement.setAttribute("aria-describedby", id);
4422
- } else {
4423
- referenceElement.removeAttribute("aria-describedby");
4424
- }
4425
- }
4426
- #handleReferenceMouseLeave;
4427
- #handleMouseEvents;
4428
- #handleKeyboardFocus;
4429
- };
4430
- __decorateClass([
4431
- property({ type: Boolean })
4432
- ], _OdxTooltip.prototype, "show", 2);
4433
- __decorateClass([
4434
- property({ type: Number })
4435
- ], _OdxTooltip.prototype, "timeout", 2);
4436
- __decorateClass([
4437
- property({ reflect: true, useDefault: true })
4438
- ], _OdxTooltip.prototype, "placement", 2);
4439
- let OdxTooltip = _OdxTooltip;
4440
-
4441
- const TranslateContextConverter = {
4442
- fromAttribute(value) {
4443
- try {
4444
- return value ? JSON.parse(value) : null;
4445
- } catch {
4446
- return value ?? null;
4447
- }
4448
- }
4449
- };
4450
- const _OdxTranslate = class _OdxTranslate extends IsLocalized(CustomElement) {
4451
- static {
4452
- customElement("odx-translate")(_OdxTranslate);
4453
- }
4454
- updated(props) {
4455
- super.updated(props);
4456
- this.textContent = this.t(this.key ?? "", this.context);
4457
- }
4458
- };
4459
- __decorateClass([
4460
- property()
4461
- ], _OdxTranslate.prototype, "key", 2);
4462
- __decorateClass([
4463
- property({ converter: TranslateContextConverter })
4464
- ], _OdxTranslate.prototype, "context", 2);
4465
- let OdxTranslate = _OdxTranslate;
4466
-
4467
- const styles = ":host{all:initial;border:0!important;clip:rect(1px,1px,1px,1px)!important;block-size:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;inset-block-start:0;inline-size:1px!important}";
4468
-
4469
- class OdxVisuallyHidden extends CustomElement {
4470
- static {
4471
- customElement("odx-visually-hidden", styles)(OdxVisuallyHidden);
4472
- }
4473
- render() {
4474
- return html`<slot></slot>`;
4475
- }
4476
- }
4477
-
4478
- export { AccordionIndicatorPosition, AccordionItemSize, AnchorObserver, AreaHeaderSize, AvatarShape, AvatarSize, AvatarVariant, BadgeVariant, BaseFormat, ButtonBadgeAlign, ButtonSize, ButtonVariant, CheckboxGroupLayout, ChipVariant, CircularProgressBarSize, DropdownPlacement, HeadlineSize, InlineMessageVariant, KpiSize, KpiVariant, LOADING_OVERLAY_HOST_DIRECTIVE, LogoSize, ModalLayout, NavigationItemSize, OdxAccordion, OdxAccordionItem, OdxAccordionPanel, OdxActionButton, OdxAnchorNavigation, OdxAreaHeader, OdxAutocomplete, OdxAvatar, OdxAvatarGroup, OdxBadge, OdxBreadcrumbs, OdxBreadcrumbsItem, OdxButton, OdxButtonGroup, OdxCard, OdxCheckbox, OdxCheckboxGroup, OdxChip, OdxCircularProgressBar, OdxContentBox, OdxDropdown, OdxFormField, OdxFormatBytes, OdxFormatDate, OdxFormatNumber, OdxHeader, OdxHeaderActions, OdxHeadline, OdxHighlight, OdxIconButton, OdxImage, OdxInlineMessage, OdxInput, OdxKpi, OdxLineClamp, OdxLink, OdxList, OdxListItem, OdxLoadingOverlay, OdxLoadingSpinner, OdxLogo, OdxMainMenu, OdxMainMenuButton, OdxMainMenuLink, OdxMainMenuSubtitle, OdxMainMenuTitle, OdxMenu, OdxMenuItem, OdxMenuLabel, OdxModal, OdxNavigationItem, OdxOption, OdxPage, OdxPageLayout, OdxPagination, OdxPopover, OdxProgressBar, OdxRadioButton, OdxRadioGroup, OdxRailNavigation, OdxRelativeTime, OdxSearchBar, OdxSelect, OdxSeparator, OdxSkeleton, OdxSlider, OdxSliderHandle, OdxSliderMarks, OdxSpacer, OdxSpinbox, OdxStack, OdxStatus, OdxSwitch, OdxTable, OdxTableBody, OdxTableCell, OdxTableCheckboxCell, OdxTableHeader, OdxTableHeaderCell, OdxTableRow, OdxText, OdxTitle, OdxToast, OdxToggleButton, OdxToggleButtonGroup, OdxToggleContent, OdxTooltip, OdxTranslate, OdxVisuallyHidden, PageAlignment, PageLayout, ProgressBarVariant, RadioGroupLayout, SearchBarBehavior, SearchEvent, SeparatorAlign, SkeletonShape, SkeletonSize, SliderLabelVisibility, SliderTrackVisibility, StackAlign, StackGap, StackJustify, StatusVariant, TextSize, TextVariant, TitleSize, ToastVariant, TooltipPlacement, sliderContext, tableContext };